Skip to content

Commit

Permalink
Audit log ITs + fixes
Browse files Browse the repository at this point in the history
  • Loading branch information
marcos-lg committed May 19, 2021
1 parent 3399241 commit e21b4bf
Show file tree
Hide file tree
Showing 18 changed files with 970 additions and 78 deletions.
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
package org.gbif.registry.persistence.mapper.collections.dto;
package org.gbif.registry.domain.collections;

import org.gbif.api.model.collections.CollectionEntityType;

import java.util.Date;
import java.util.UUID;

public class AuditLogDto {
public class AuditLog {

private long key;
private long traceId;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -141,7 +141,6 @@
* <li>grscicoll/{collection|institution}/changeSuggestion BAN
* </ul>
*/
// TODO: clear grscicoll cache
public class VarnishPurgeListener {

private static final Logger LOG = LoggerFactory.getLogger(VarnishPurgeListener.class);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,22 +1,21 @@
package org.gbif.registry.events.collections;

import org.gbif.api.model.collections.CollectionEntity;
import org.gbif.registry.events.EventManager;
import org.gbif.registry.persistence.mapper.collections.AuditLogMapper;
import org.gbif.registry.persistence.mapper.collections.dto.AuditLogDto;
import org.gbif.registry.domain.collections.AuditLog;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.event.EventListener;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.stereotype.Component;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.google.common.eventbus.Subscribe;

import brave.Tracer;

// TODO: listeners que sean @Async?? luego poner @EnableAsync en Application

@Component
public class AuditLogger {

Expand All @@ -25,81 +24,84 @@ public class AuditLogger {
private final ObjectMapper objectMapper;

@Autowired
public AuditLogger(Tracer tracer, AuditLogMapper auditLogMapper, ObjectMapper objectMapper) {
public AuditLogger(
Tracer tracer,
AuditLogMapper auditLogMapper,
ObjectMapper objectMapper,
EventManager eventManager) {
this.tracer = tracer;
this.auditLogMapper = auditLogMapper;
this.objectMapper = objectMapper;
eventManager.register(this);
}

@EventListener
@Subscribe
public <T extends CollectionEntity> void logCreatedEvents(CreateCollectionEntityEvent<T> event) {
AuditLogDto dto = collectionBaseEventToDto(event);
dto.setCollectionEntityKey(event.getNewObject().getKey());
dto.setPostState(toJson(event.getNewObject()));
auditLogMapper.create(dto);
AuditLog auditLog = collectionBaseEventToAuditLog(event);
auditLog.setCollectionEntityKey(event.getNewObject().getKey());
auditLog.setPostState(toJson(event.getNewObject()));
auditLogMapper.create(auditLog);
}

@EventListener
@Subscribe
public <T extends CollectionEntity> void logUpdatedEvents(UpdateCollectionEntityEvent<T> event) {
AuditLogDto dto = collectionBaseEventToDto(event);
dto.setCollectionEntityKey(event.getNewObject().getKey());
dto.setPreState(toJson(event.getOldObject()));
dto.setPostState(toJson(event.getNewObject()));
auditLogMapper.create(dto);
AuditLog auditLog = collectionBaseEventToAuditLog(event);
auditLog.setCollectionEntityKey(event.getNewObject().getKey());
auditLog.setPreState(toJson(event.getOldObject()));
auditLog.setPostState(toJson(event.getNewObject()));
auditLogMapper.create(auditLog);
}

@EventListener
@Subscribe
public <T extends CollectionEntity> void logDeletedEvents(DeleteCollectionEntityEvent<T> event) {
AuditLogDto dto = collectionBaseEventToDto(event);
dto.setCollectionEntityKey(event.getOldObject().getKey());
dto.setPreState(toJson(event.getOldObject()));
dto.setPostState(toJson(event.getDeletedObject()));
auditLogMapper.create(dto);
AuditLog auditLog = collectionBaseEventToAuditLog(event);
auditLog.setCollectionEntityKey(event.getOldObject().getKey());
auditLog.setPreState(toJson(event.getOldObject()));
auditLog.setPostState(toJson(event.getDeletedObject()));
auditLogMapper.create(auditLog);
}

@EventListener
@Subscribe
public <T extends CollectionEntity> void logReplacedEvents(ReplaceEntityEvent<T> event) {
AuditLogDto dto = collectionBaseEventToDto(event);
dto.setCollectionEntityKey(event.getTargetEntityKey());
dto.setReplacementKey(event.getReplacementKey());
auditLogMapper.create(dto);
AuditLog auditLog = collectionBaseEventToAuditLog(event);
auditLog.setCollectionEntityKey(event.getTargetEntityKey());
auditLog.setReplacementKey(event.getReplacementKey());
auditLogMapper.create(auditLog);
}

@EventListener
@Subscribe
public <T extends CollectionEntity, R> void logSubEntityEvents(
SubEntityCollectionEvent<T, R> event) {
AuditLogDto dto = subEntityToDto(event);
auditLogMapper.create(dto);
AuditLog auditLog = subEntityEventToAuditLog(event);
auditLogMapper.create(auditLog);
}

private <T extends CollectionEntity, R> AuditLogDto subEntityToDto(
private <T extends CollectionEntity, R> AuditLog subEntityEventToAuditLog(
SubEntityCollectionEvent<T, R> event) {
AuditLogDto dto = collectionBaseEventToDto(event);
dto.setSubEntityType(event.getSubEntity().getClass().getSimpleName());
dto.setCollectionEntityKey(event.getCollectionEntityKey());
dto.setSubEntityKey(event.getSubEntityKey());
AuditLog auditLog = collectionBaseEventToAuditLog(event);
auditLog.setSubEntityType(event.getSubEntityClass().getSimpleName());
auditLog.setCollectionEntityKey(event.getCollectionEntityKey());
auditLog.setSubEntityKey(event.getSubEntityKey());

if (event.getEventType() == EventType.CREATE) {
dto.setPostState(toJson(event.getSubEntity()));
auditLog.setPostState(toJson(event.getSubEntity()));
} else if (event.getEventType() == EventType.DELETE) {
dto.setPreState(toJson(event.getSubEntity()));
auditLog.setPreState(toJson(event.getSubEntity()));
}

return dto;
return auditLog;
}

private <T extends CollectionEntity> AuditLogDto collectionBaseEventToDto(
private <T extends CollectionEntity> AuditLog collectionBaseEventToAuditLog(
CollectionsBaseEvent<T> event) {
AuditLogDto dto = new AuditLogDto();
dto.setTraceId(tracer.currentSpan().context().traceId());
dto.setCollectionEntityType(event.getCollectionEntityType());
dto.setOperation(event.getEventType().name());
dto.setCreatedBy(getUsername());
return dto;
AuditLog auditLog = new AuditLog();
auditLog.setTraceId(getTraceId());
auditLog.setCollectionEntityType(event.getCollectionEntityType());
auditLog.setOperation(event.getEventType().name());
auditLog.setCreatedBy(getUsername());
return auditLog;
}

// TODO: getusername y toJson deberian ir a una clase de utils ya q lo uso en changeSuggestion tb

protected String getUsername() {
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
return authentication.getName();
Expand All @@ -112,4 +114,11 @@ protected String toJson(Object entity) {
throw new IllegalArgumentException("Cannot serialize entity", e);
}
}

private long getTraceId() {
if (tracer.currentSpan() != null) {
return tracer.currentSpan().context().traceId();
}
return tracer.newTrace().context().traceId();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -107,7 +107,8 @@ public class TestCaseDatabaseInitializer implements BeforeEachCallback {
"pipeline_process",
"pipeline_execution",
"derived_dataset",
"change_suggestion");
"change_suggestion",
"grscicoll_audit_log");

public TestCaseDatabaseInitializer() {}

Expand Down
Loading

0 comments on commit e21b4bf

Please sign in to comment.