diff --git a/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/AuditController.java b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/AuditController.java deleted file mode 100644 index b8b7f6476..000000000 --- a/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/AuditController.java +++ /dev/null @@ -1,56 +0,0 @@ -package com.iqser.red.persistence.service.v1.external.api.impl.controller; - -import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.SEARCH_AUDIT_LOG; -import static com.knecon.fforesight.databasetenantcommons.providers.utils.MagicConverter.convert; - -import java.util.List; - -import org.springframework.security.access.prepost.PreAuthorize; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RestController; - -import com.knecon.fforesight.keycloakcommons.security.KeycloakSecurity; -import com.iqser.red.service.persistence.management.v1.processor.service.persistence.AuditPersistenceService; -import com.iqser.red.service.persistence.service.v1.api.external.resource.AuditResource; -import com.iqser.red.service.persistence.service.v1.api.shared.model.AuditCategory; -import com.iqser.red.service.persistence.service.v1.api.shared.model.AuditResponse; -import com.iqser.red.service.persistence.service.v1.api.shared.model.audit.AuditModel; -import com.iqser.red.service.persistence.service.v1.api.shared.model.audit.AuditRequest; -import com.iqser.red.service.persistence.service.v1.api.shared.model.audit.AuditSearchRequest; -import com.iqser.red.service.persistence.service.v1.api.shared.model.audit.CategoryModel; - -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; - -@Slf4j -@RestController -@RequiredArgsConstructor -public class AuditController implements AuditResource { - - private final AuditPersistenceService auditPersistenceService; - - - @Override - @PreAuthorize("hasAuthority('" + SEARCH_AUDIT_LOG + "')") - public AuditResponse searchAuditLog(@RequestBody AuditSearchRequest auditSearchRequest) { - - var auditModels = convert(auditPersistenceService.search(auditSearchRequest), AuditModel.class); - auditPersistenceService.insertRecord(AuditRequest.builder() - .userId(KeycloakSecurity.getUserId()) - .objectId(auditSearchRequest.getObjectId()) - .category(AuditCategory.AUDIT.name()) - .message("Audit Log has been viewed.") - .build()); - - return new AuditResponse(auditModels.getElements(), auditModels.getTotalHits(), auditModels.getPage(), auditModels.getPageSize()); - } - - - @Override - @PreAuthorize("hasAuthority('" + SEARCH_AUDIT_LOG + "')") - public List getAuditCategories() { - - return auditPersistenceService.getCategories(); - } - -} diff --git a/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/ComponentLogController.java b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/ComponentLogController.java index ff50b5db4..a0f5d777b 100644 --- a/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/ComponentLogController.java +++ b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/ComponentLogController.java @@ -1,34 +1,32 @@ package com.iqser.red.persistence.service.v1.external.api.impl.controller; -import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.GET_RSS; - -import java.util.List; -import java.util.Map; -import java.util.Optional; -import java.util.stream.Collectors; - +import com.iqser.red.service.persistence.management.v1.processor.exception.BadRequestException; +import com.iqser.red.service.persistence.management.v1.processor.model.audit.AuditCategory; +import com.iqser.red.service.persistence.management.v1.processor.model.audit.AuditDetail; +import com.iqser.red.service.persistence.management.v1.processor.model.audit.AuditDetailAction; +import com.iqser.red.service.persistence.management.v1.processor.service.ComponentLogService; +import com.iqser.red.service.persistence.management.v1.processor.service.ComponentOverrideService; +import com.iqser.red.service.persistence.service.v1.api.external.resource.ComponentLogResource; +import com.iqser.red.service.persistence.service.v1.api.shared.model.analysislog.componentlog.ComponentLog; +import com.iqser.red.service.persistence.service.v1.api.shared.model.analysislog.componentlog.ComponentLogEntry; +import com.iqser.red.service.persistence.service.v1.api.shared.model.analysislog.componentlog.ComponentLogEntryValue; +import com.iqser.red.service.persistence.service.v1.api.shared.model.component.ComponentsOverrides; +import com.iqser.red.service.persistence.service.v1.api.shared.model.component.RevertOverrideRequest; +import com.knecon.fforesight.auditor.Auditor; +import lombok.AccessLevel; +import lombok.RequiredArgsConstructor; +import lombok.experimental.FieldDefaults; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RestController; -import com.iqser.red.service.persistence.management.v1.processor.exception.BadRequestException; -import com.iqser.red.service.persistence.management.v1.processor.service.ComponentLogService; -import com.iqser.red.service.persistence.management.v1.processor.service.ComponentOverrideService; -import com.iqser.red.service.persistence.management.v1.processor.service.persistence.AuditPersistenceService; -import com.iqser.red.service.persistence.service.v1.api.external.resource.ComponentLogResource; -import com.iqser.red.service.persistence.service.v1.api.shared.model.AuditCategory; -import com.iqser.red.service.persistence.service.v1.api.shared.model.analysislog.componentlog.ComponentLog; -import com.iqser.red.service.persistence.service.v1.api.shared.model.analysislog.componentlog.ComponentLogEntry; -import com.iqser.red.service.persistence.service.v1.api.shared.model.analysislog.componentlog.ComponentLogEntryValue; -import com.iqser.red.service.persistence.service.v1.api.shared.model.audit.AuditRequest; -import com.iqser.red.service.persistence.service.v1.api.shared.model.component.ComponentsOverrides; -import com.iqser.red.service.persistence.service.v1.api.shared.model.component.RevertOverrideRequest; -import com.knecon.fforesight.keycloakcommons.security.KeycloakSecurity; +import java.util.List; +import java.util.Optional; +import java.util.stream.Collectors; -import lombok.AccessLevel; -import lombok.RequiredArgsConstructor; -import lombok.experimental.FieldDefaults; +import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.GET_RSS; +import static com.knecon.fforesight.auditor.model.Detail.d; @RestController @RequiredArgsConstructor @@ -37,8 +35,8 @@ public class ComponentLogController implements ComponentLogResource { ComponentLogService componentLogService; ComponentOverrideService componentOverrideService; - AuditPersistenceService auditPersistenceService; + private final Auditor auditor; @Override public ComponentLog getComponentLog(String dossierId, String fileId, boolean includeOverrides) { @@ -87,28 +85,12 @@ public class ComponentLogController implements ComponentLogResource { private void auditOverride(String dossierId, String fileId, String componentName, String overrideValue, List allComponentLogEntries) { Optional component = allComponentLogEntries.stream().filter(c -> c.getName().equals(componentName)).findFirst(); - String originalValue = getOriginalValue(component); String value = getValue(component); - auditPersistenceService.audit(AuditRequest.builder() - .userId(KeycloakSecurity.getUserId()) - .objectId(fileId) - .category(AuditCategory.DOCUMENT.name()) - .message("The component is overwritten with value") - .details(Map.of(DOSSIER_ID, - dossierId, - FILE_ID, - fileId, - "ComponentName", - componentName, - "Action", - "MODIFY", - "OriginalValue", - originalValue, - "OldValue", - value, - "NewValue", - overrideValue)) - .build()); + auditor.audit(AuditCategory.DOCUMENT.name(), "The component is overwritten with value", + d(AuditDetail.DOSSIER_ID, dossierId), d(AuditDetail.FILE_ID, fileId), + d(AuditDetail.COMPONENT_NAME, componentName), + d(AuditDetail.ACTION, AuditDetailAction.MODIFY.getID()), + d(AuditDetail.VALUE, value)); } @@ -116,27 +98,11 @@ public class ComponentLogController implements ComponentLogResource { Optional component = allComponentLogEntries.stream().filter(c -> c.getName().equals(componentNameToRevert)).findFirst(); String originalValue = getOriginalValue(component); - String value = getValue(component); - auditPersistenceService.audit(AuditRequest.builder() - .userId(KeycloakSecurity.getUserId()) - .objectId(fileId) - .category(AuditCategory.DOCUMENT.name()) - .message("The component override for was reverted") - .details(Map.of(DOSSIER_ID, - dossierId, - FILE_ID, - fileId, - "ComponentName", - componentNameToRevert, - "Action", - "REVERT", - "OriginalValue", - originalValue, - "OldValue", - value, - "NewValue", - originalValue)) - .build()); + auditor.audit(AuditCategory.DOCUMENT.name(), "The component is overwritten with value", + d(AuditDetail.DOSSIER_ID, dossierId), d(AuditDetail.FILE_ID, fileId), + d(AuditDetail.COMPONENT_NAME, componentNameToRevert), + d(AuditDetail.ACTION, AuditDetailAction.REVERT.getID()), + d(AuditDetail.VALUE, originalValue)); } diff --git a/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/DictionaryController.java b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/DictionaryController.java index 30d2e34c0..a78375517 100644 --- a/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/DictionaryController.java +++ b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/DictionaryController.java @@ -1,51 +1,40 @@ package com.iqser.red.persistence.service.v1.external.api.impl.controller; -import java.io.ByteArrayInputStream; -import java.io.IOException; -import java.io.InputStream; -import java.nio.charset.StandardCharsets; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.Map; -import java.util.stream.Collectors; + import com.iqser.red.service.persistence.management.v1.processor.exception.BadRequestException; + import com.iqser.red.service.persistence.management.v1.processor.model.audit.AuditCategory; + import com.iqser.red.service.persistence.management.v1.processor.model.audit.AuditDetail; + import com.iqser.red.service.persistence.management.v1.processor.service.DictionaryService; + import com.iqser.red.service.persistence.management.v1.processor.utils.StringEncodingUtils; + import com.iqser.red.service.persistence.management.v1.processor.utils.TypeValueMapper; + import com.iqser.red.service.persistence.service.v1.api.external.resource.DictionaryResource; + import com.iqser.red.service.persistence.service.v1.api.shared.model.*; + import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.configuration.Colors; + import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.type.DictionaryEntryType; + import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.type.Type; + import com.knecon.fforesight.auditor.Auditor; + import com.knecon.fforesight.databasetenantcommons.providers.utils.MagicConverter; + import feign.FeignException; + import jakarta.validation.Valid; + import lombok.RequiredArgsConstructor; + import lombok.extern.slf4j.Slf4j; + import org.springframework.core.io.InputStreamResource; + import org.springframework.http.HttpHeaders; + import org.springframework.http.HttpStatus; + import org.springframework.http.MediaType; + import org.springframework.http.ResponseEntity; + import org.springframework.web.bind.annotation.*; + import org.springframework.web.multipart.MultipartFile; + import java.io.ByteArrayInputStream; + import java.io.IOException; + import java.io.InputStream; + import java.nio.charset.StandardCharsets; + import java.util.ArrayList; + import java.util.Arrays; + import java.util.List; + import java.util.stream.Collectors; -import org.springframework.core.io.InputStreamResource; -import org.springframework.http.HttpHeaders; -import org.springframework.http.HttpStatus; -import org.springframework.http.MediaType; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.RequestPart; -import org.springframework.web.bind.annotation.RestController; -import org.springframework.web.multipart.MultipartFile; - -import com.knecon.fforesight.keycloakcommons.security.KeycloakSecurity; -import com.iqser.red.service.persistence.management.v1.processor.exception.BadRequestException; -import com.iqser.red.service.persistence.management.v1.processor.service.DictionaryService; -import com.iqser.red.service.persistence.management.v1.processor.service.persistence.AuditPersistenceService; -import com.knecon.fforesight.databasetenantcommons.providers.utils.MagicConverter; -import com.iqser.red.service.persistence.management.v1.processor.utils.StringEncodingUtils; -import com.iqser.red.service.persistence.management.v1.processor.utils.TypeValueMapper; -import com.iqser.red.service.persistence.service.v1.api.external.resource.DictionaryResource; -import com.iqser.red.service.persistence.service.v1.api.shared.model.AuditCategory; -import com.iqser.red.service.persistence.service.v1.api.shared.model.CreateTypeValue; -import com.iqser.red.service.persistence.service.v1.api.shared.model.Dictionary; -import com.iqser.red.service.persistence.service.v1.api.shared.model.TypeResponse; -import com.iqser.red.service.persistence.service.v1.api.shared.model.TypeValue; -import com.iqser.red.service.persistence.service.v1.api.shared.model.UpdateTypeValue; -import com.iqser.red.service.persistence.service.v1.api.shared.model.audit.AuditRequest; -import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.configuration.Colors; -import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.type.DictionaryEntryType; -import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.type.Type; - -import feign.FeignException; -import jakarta.validation.Valid; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; + import static com.knecon.fforesight.auditor.model.Detail.d; @Slf4j @RestController @@ -53,8 +42,7 @@ import lombok.extern.slf4j.Slf4j; public class DictionaryController implements DictionaryResource { private final DictionaryService dictionaryService; - private final AuditPersistenceService auditClient; - + private final Auditor auditor; @Override public void addEntry(@PathVariable(TYPE_PARAMETER_NAME) String type, @@ -65,13 +53,8 @@ public class DictionaryController implements DictionaryResource { @RequestParam(value = DICTIONARY_ENTRY_TYPE_PARAM, required = false, defaultValue = DEFAULT_DICTIONARY_ENTRY_TYPE) DictionaryEntryType dictionaryEntryType) { addEntries(type, dossierTemplateId, entries, removeCurrent, dossierId, dictionaryEntryType); - auditClient.insertRecord(AuditRequest.builder() - .userId(KeycloakSecurity.getUserId()) - .objectId(dossierTemplateId) - .category(AuditCategory.DICTIONARY.name()) - .message("Dictionary entries were added.") - .details(Map.of("Type", type, "Number", entries.size())) - .build()); + auditor.audit(AuditCategory.DICTIONARY.name(), "Dictionary entries were added.", + d(AuditDetail.DOSSIER_TEMPLATE_ID, dossierTemplateId), d(AuditDetail.TYPE, type), d(AuditDetail.NUMBER, entries.size())); } @@ -93,13 +76,8 @@ public class DictionaryController implements DictionaryResource { @RequestParam(value = DICTIONARY_ENTRY_TYPE_PARAM, required = false, defaultValue = DEFAULT_DICTIONARY_ENTRY_TYPE) DictionaryEntryType dictionaryEntryType) { deleteEntries(type, dossierTemplateId, Arrays.asList(entry), dossierId, dictionaryEntryType); - auditClient.insertRecord(AuditRequest.builder() - .userId(KeycloakSecurity.getUserId()) - .objectId(dossierTemplateId) - .category(AuditCategory.DICTIONARY.name()) - .message("Dictionary entry was deleted.") - .details(Map.of("Type", type, "Value", entry)) - .build()); + auditor.audit(AuditCategory.DICTIONARY.name(), "Dictionary entry was deleted.", + d(AuditDetail.DOSSIER_TEMPLATE_ID, dossierTemplateId), d(AuditDetail.TYPE, type), d(AuditDetail.VALUE, entry)); } @@ -115,14 +93,8 @@ public class DictionaryController implements DictionaryResource { } else { dictionaryService.deleteDossierEntries(type, dossierTemplateId, entries, dossierId, dictionaryEntryType); } - - auditClient.insertRecord(AuditRequest.builder() - .userId(KeycloakSecurity.getUserId()) - .objectId(dossierTemplateId) - .category(AuditCategory.DICTIONARY.name()) - .message("Dictionary entries were deleted.") - .details(Map.of("Type", type, "Number", entries.size())) - .build()); + auditor.audit(AuditCategory.DICTIONARY.name(), "Dictionary entries were deleted.", + d(AuditDetail.DOSSIER_TEMPLATE_ID, dossierTemplateId), d(AuditDetail.TYPE, type), d(AuditDetail.NUMBER, entries.size())); } @@ -133,13 +105,8 @@ public class DictionaryController implements DictionaryResource { dictionaryService.updateGlobalType(type, dossierTemplateId, typeValue); - auditClient.insertRecord(AuditRequest.builder() - .userId(KeycloakSecurity.getUserId()) - .objectId(dossierTemplateId) - .category(AuditCategory.DICTIONARY.name()) - .message("Dictionary type was updated.") - .details(Map.of("Type", type)) - .build()); + auditor.audit(AuditCategory.DICTIONARY.name(), "Dictionary type was updated.", + AuditDetail.DOSSIER_TEMPLATE_ID, dossierTemplateId, AuditDetail.TYPE, type); } @@ -148,13 +115,8 @@ public class DictionaryController implements DictionaryResource { Type result = dictionaryService.addGlobalType(typeValue); - auditClient.insertRecord(AuditRequest.builder() - .userId(KeycloakSecurity.getUserId()) - .objectId(typeValue.getDossierTemplateId()) - .category(AuditCategory.DICTIONARY.name()) - .message("Dictionary type was added.") - .details(Map.of("Type", typeValue.getType())) - .build()); + auditor.audit(AuditCategory.DICTIONARY.name(), "Dictionary type was added.", + AuditDetail.DOSSIER_TEMPLATE_ID, typeValue.getDossierTemplateId(), AuditDetail.TYPE, typeValue.getType()); return MagicConverter.convert(result, TypeValue.class, new TypeValueMapper()); } @@ -166,13 +128,8 @@ public class DictionaryController implements DictionaryResource { dictionaryService.deleteGlobalType(type, dossierTemplateId); - auditClient.insertRecord(AuditRequest.builder() - .userId(KeycloakSecurity.getUserId()) - .objectId(dossierTemplateId) - .category(AuditCategory.DICTIONARY.name()) - .message("Dictionary type was deleted.") - .details(Map.of("Type", type)) - .build()); + auditor.audit(AuditCategory.DICTIONARY.name(), "Dictionary type was deleted.", + AuditDetail.DOSSIER_TEMPLATE_ID, dossierTemplateId, AuditDetail.TYPE, type); } @@ -186,13 +143,8 @@ public class DictionaryController implements DictionaryResource { try { dictionaryService.deleteGlobalType(type, dossierTemplateId); - auditClient.insertRecord(AuditRequest.builder() - .userId(KeycloakSecurity.getUserId()) - .objectId(dossierTemplateId) - .category(AuditCategory.DICTIONARY.name()) - .message("Dictionary type was deleted.") - .details(Map.of("Type", type)) - .build()); + auditor.audit(AuditCategory.DICTIONARY.name(), "Dictionary type was deleted.", + AuditDetail.DOSSIER_TEMPLATE_ID, dossierTemplateId, AuditDetail.TYPE, type); } catch (FeignException e) { errorIds.add(type); } @@ -236,13 +188,8 @@ public class DictionaryController implements DictionaryResource { throw new BadRequestException("Could not upload file.", e); } - auditClient.insertRecord(AuditRequest.builder() - .userId(KeycloakSecurity.getUserId()) - .objectId(dossierTemplateId) - .category(AuditCategory.DICTIONARY.name()) - .message("Dictionary has been uploaded.") - .details(Map.of("Type", type)) - .build()); + auditor.audit(AuditCategory.DICTIONARY.name(), "Dictionary has been uploaded.", + AuditDetail.DOSSIER_TEMPLATE_ID, dossierTemplateId, AuditDetail.TYPE, type); } @@ -305,12 +252,7 @@ public class DictionaryController implements DictionaryResource { dictionaryService.setColors(dossierTemplateId, colors); - auditClient.insertRecord(AuditRequest.builder() - .userId(KeycloakSecurity.getUserId()) - .objectId(dossierTemplateId) - .category(AuditCategory.DOSSIER_TEMPLATE.name()) - .message("Colors have been changed.") - .build()); + auditor.audit(AuditCategory.DICTIONARY.name(), "Colors have been changed.", AuditDetail.DOSSIER_TEMPLATE_ID, dossierTemplateId); } } diff --git a/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/DigitalSignatureController.java b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/DigitalSignatureController.java index 631e592c5..35da1719a 100644 --- a/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/DigitalSignatureController.java +++ b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/DigitalSignatureController.java @@ -1,41 +1,38 @@ package com.iqser.red.persistence.service.v1.external.api.impl.controller; -import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.READ_DIGITAL_SIGNATURE; -import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.WRITE_DIGITAL_SIGNATURE; - -import java.util.Base64; - +import com.iqser.red.service.persistence.management.v1.processor.entity.configuration.DigitalSignatureEntity; +import com.iqser.red.service.persistence.management.v1.processor.entity.configuration.DigitalSignatureKmsEntity; +import com.iqser.red.service.persistence.management.v1.processor.model.audit.AuditCategory; +import com.iqser.red.service.persistence.management.v1.processor.model.audit.AuditDetail; +import com.iqser.red.service.persistence.management.v1.processor.service.DigitalSignatureKmsService; +import com.iqser.red.service.persistence.management.v1.processor.service.DigitalSignatureService; +import com.iqser.red.service.persistence.management.v1.processor.service.DigitalSignatureTypeService; +import com.iqser.red.service.persistence.service.v1.api.external.resource.DigitalSignatureResource; +import com.iqser.red.service.persistence.service.v1.api.shared.model.DigitalSignatureKms; +import com.iqser.red.service.persistence.service.v1.api.shared.model.DigitalSignatureKmsViewModel; +import com.iqser.red.service.persistence.service.v1.api.shared.model.DigitalSignatureViewModel; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.configuration.DigitalSignature; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.configuration.DigitalSignatureType; +import com.knecon.fforesight.auditor.Auditor; +import lombok.RequiredArgsConstructor; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RestController; -import com.iqser.red.service.persistence.management.v1.processor.entity.configuration.DigitalSignatureEntity; -import com.iqser.red.service.persistence.management.v1.processor.entity.configuration.DigitalSignatureKmsEntity; -import com.iqser.red.service.persistence.management.v1.processor.service.DigitalSignatureKmsService; -import com.iqser.red.service.persistence.management.v1.processor.service.DigitalSignatureService; -import com.iqser.red.service.persistence.management.v1.processor.service.DigitalSignatureTypeService; -import com.iqser.red.service.persistence.management.v1.processor.service.persistence.AuditPersistenceService; -import com.iqser.red.service.persistence.service.v1.api.external.resource.DigitalSignatureResource; -import com.iqser.red.service.persistence.service.v1.api.shared.model.AuditCategory; -import com.iqser.red.service.persistence.service.v1.api.shared.model.DigitalSignatureKms; -import com.iqser.red.service.persistence.service.v1.api.shared.model.DigitalSignatureKmsViewModel; -import com.iqser.red.service.persistence.service.v1.api.shared.model.DigitalSignatureViewModel; -import com.iqser.red.service.persistence.service.v1.api.shared.model.audit.AuditRequest; -import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.configuration.DigitalSignature; -import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.configuration.DigitalSignatureType; -import com.knecon.fforesight.keycloakcommons.security.KeycloakSecurity; +import java.util.Base64; -import lombok.RequiredArgsConstructor; +import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.READ_DIGITAL_SIGNATURE; +import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.WRITE_DIGITAL_SIGNATURE; @RestController @RequiredArgsConstructor public class DigitalSignatureController implements DigitalSignatureResource { private static final String DIGITAL_SIGNATURE_AUDIT_ID = "DigitalSignature"; + private final Auditor auditor; private final DigitalSignatureTypeService digitalSignatureTypeService; private final DigitalSignatureService digitalSignatureService; private final DigitalSignatureKmsService digitalSignatureKmsService; - private final AuditPersistenceService auditPersistenceService; @Override @@ -51,12 +48,8 @@ public class DigitalSignatureController implements DigitalSignatureResource { public void setActiveDigitalSignatureType(DigitalSignatureType digitalSignatureType) { digitalSignatureTypeService.setActiveDigitalSignatureType(digitalSignatureType); - auditPersistenceService.insertRecord(AuditRequest.builder() - .userId(KeycloakSecurity.getUserId()) - .objectId(DIGITAL_SIGNATURE_AUDIT_ID) - .category(AuditCategory.SETTINGS.name()) - .message("Digital signature type has been updated.") - .build()); + auditor.audit(AuditCategory.SETTINGS.name(), "Digital signature type has been updated.", + AuditDetail.OBJECT_ID, DIGITAL_SIGNATURE_AUDIT_ID); } @@ -65,12 +58,8 @@ public class DigitalSignatureController implements DigitalSignatureResource { public DigitalSignatureViewModel saveDigitalSignature(@RequestBody DigitalSignature digitalSignatureModel) { DigitalSignatureViewModel digitalSignatureViewModel = convertToView(digitalSignatureService.saveDigitalSignature(convert(digitalSignatureModel))); - auditPersistenceService.insertRecord(AuditRequest.builder() - .userId(KeycloakSecurity.getUserId()) - .objectId(DIGITAL_SIGNATURE_AUDIT_ID) - .category(AuditCategory.SETTINGS.name()) - .message("Digital signature has been saved.") - .build()); + auditor.audit(AuditCategory.SETTINGS.name(), "Digital signature has been saved.", + AuditDetail.OBJECT_ID, DIGITAL_SIGNATURE_AUDIT_ID); return digitalSignatureViewModel; } @@ -81,12 +70,8 @@ public class DigitalSignatureController implements DigitalSignatureResource { public void updateDigitalSignature(@RequestBody DigitalSignatureViewModel digitalSignatureModel) { digitalSignatureService.updateDigitalSignature(convert(digitalSignatureModel)); - auditPersistenceService.insertRecord(AuditRequest.builder() - .userId(KeycloakSecurity.getUserId()) - .objectId(DIGITAL_SIGNATURE_AUDIT_ID) - .category(AuditCategory.SETTINGS.name()) - .message("Digital signature has been updated.") - .build()); + auditor.audit(AuditCategory.SETTINGS.name(), "Digital signature has been updated.", + AuditDetail.OBJECT_ID, DIGITAL_SIGNATURE_AUDIT_ID); } @@ -103,12 +88,8 @@ public class DigitalSignatureController implements DigitalSignatureResource { public void deleteDigitalSignature() { digitalSignatureService.deleteDigitalSignature(); - auditPersistenceService.insertRecord(AuditRequest.builder() - .userId(KeycloakSecurity.getUserId()) - .objectId(DIGITAL_SIGNATURE_AUDIT_ID) - .category(AuditCategory.SETTINGS.name()) - .message("Digital signature has been deleted.") - .build()); + auditor.audit(AuditCategory.SETTINGS.name(), "Digital signature has been deleted.", + AuditDetail.OBJECT_ID, DIGITAL_SIGNATURE_AUDIT_ID); } @@ -117,12 +98,8 @@ public class DigitalSignatureController implements DigitalSignatureResource { public DigitalSignatureKmsViewModel saveDigitalSignatureKms(@RequestBody DigitalSignatureKms digitalSignature) { DigitalSignatureKmsViewModel result = convert(digitalSignatureKmsService.saveDigitalSignature(digitalSignature)); - auditPersistenceService.insertRecord(AuditRequest.builder() - .userId(KeycloakSecurity.getUserId()) - .objectId(DIGITAL_SIGNATURE_AUDIT_ID) - .category(AuditCategory.SETTINGS.name()) - .message("Digital KMS signature has been saved.") - .build()); + auditor.audit(AuditCategory.SETTINGS.name(), "Digital KMS signature has been saved.", + AuditDetail.OBJECT_ID, DIGITAL_SIGNATURE_AUDIT_ID); return result; } @@ -140,12 +117,8 @@ public class DigitalSignatureController implements DigitalSignatureResource { public void deleteDigitalSignatureKms() { digitalSignatureKmsService.deleteDigitalSignature(); - auditPersistenceService.insertRecord(AuditRequest.builder() - .userId(KeycloakSecurity.getUserId()) - .objectId(DIGITAL_SIGNATURE_AUDIT_ID) - .category(AuditCategory.SETTINGS.name()) - .message("Digital KMS signature has been deleted.") - .build()); + auditor.audit(AuditCategory.SETTINGS.name(), "Digital KMS signature has been deleted.", + AuditDetail.OBJECT_ID, DIGITAL_SIGNATURE_AUDIT_ID); } diff --git a/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/DossierAttributesController.java b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/DossierAttributesController.java index aeb4b4754..959f61089 100644 --- a/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/DossierAttributesController.java +++ b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/DossierAttributesController.java @@ -1,43 +1,35 @@ package com.iqser.red.persistence.service.v1.external.api.impl.controller; -import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.READ_DOSSIER_ATTRIBUTES; -import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.READ_DOSSIER_ATTRIBUTES_CONFIG; -import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.WRITE_DOSSIER_ATTRIBUTES; -import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.WRITE_DOSSIER_ATTRIBUTES_CONFIG; -import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.WRITE_FILE_ATTRIBUTES; - -import java.util.List; -import java.util.Map; - +import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.DossierAttributeConfigEntity; +import com.iqser.red.service.persistence.management.v1.processor.model.audit.AuditCategory; +import com.iqser.red.service.persistence.management.v1.processor.model.audit.AuditDetail; +import com.iqser.red.service.persistence.management.v1.processor.service.AccessControlService; +import com.iqser.red.service.persistence.management.v1.processor.service.DossierAttributesManagementService; +import com.iqser.red.service.persistence.management.v1.processor.service.persistence.DossierAttributeConfigPersistenceService; +import com.iqser.red.service.persistence.service.v1.api.external.resource.DossierAttributesResource; +import com.iqser.red.service.persistence.service.v1.api.shared.model.DossierAttributes; +import com.iqser.red.service.persistence.service.v1.api.shared.model.DossierAttributesConfig; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.DossierAttributeConfig; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.DossierAttribute; +import com.knecon.fforesight.auditor.Auditor; +import com.knecon.fforesight.databasetenantcommons.providers.utils.MagicConverter; +import lombok.RequiredArgsConstructor; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; -import com.knecon.fforesight.keycloakcommons.security.KeycloakSecurity; -import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.DossierAttributeConfigEntity; -import com.iqser.red.service.persistence.management.v1.processor.service.AccessControlService; -import com.iqser.red.service.persistence.management.v1.processor.service.DossierAttributesManagementService; -import com.iqser.red.service.persistence.management.v1.processor.service.persistence.AuditPersistenceService; -import com.iqser.red.service.persistence.management.v1.processor.service.persistence.DossierAttributeConfigPersistenceService; -import com.knecon.fforesight.databasetenantcommons.providers.utils.MagicConverter; -import com.iqser.red.service.persistence.service.v1.api.external.resource.DossierAttributesResource; -import com.iqser.red.service.persistence.service.v1.api.shared.model.AuditCategory; -import com.iqser.red.service.persistence.service.v1.api.shared.model.DossierAttributes; -import com.iqser.red.service.persistence.service.v1.api.shared.model.DossierAttributesConfig; -import com.iqser.red.service.persistence.service.v1.api.shared.model.audit.AuditRequest; -import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.DossierAttributeConfig; -import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.DossierAttribute; +import java.util.List; -import lombok.RequiredArgsConstructor; +import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.*; @RestController @RequiredArgsConstructor public class DossierAttributesController implements DossierAttributesResource { + private final Auditor auditor; private final DossierAttributeConfigPersistenceService dossierAttributeConfigPersistenceService; - private final AuditPersistenceService auditPersistenceService; private final DossierAttributesManagementService dossierAttributesManagementService; private final AccessControlService accessControlService; @@ -48,12 +40,7 @@ public class DossierAttributesController implements DossierAttributesResource { var result = MagicConverter.convert(dossierAttributeConfigPersistenceService.setDossierAttributesConfig(dossierTemplateId, MagicConverter.convert(dossierAttributesConfig.getDossierAttributeConfigs(), DossierAttributeConfigEntity.class)), DossierAttributeConfig.class); - auditPersistenceService.insertRecord(AuditRequest.builder() - .userId(KeycloakSecurity.getUserId()) - .objectId(dossierTemplateId) - .category(AuditCategory.DOSSIER_TEMPLATE.name()) - .message("Changed dossier attributes base configuration.") - .build()); + auditor.audit(AuditCategory.DOSSIER_TEMPLATE.name(), "Changed dossier attributes base configuration.", AuditDetail.DOSSIER_TEMPLATE_ID, dossierTemplateId); return new DossierAttributesConfig(result); } @@ -66,12 +53,7 @@ public class DossierAttributesController implements DossierAttributesResource { var result = MagicConverter.convert(dossierAttributeConfigPersistenceService.addOrUpdateDossierAttribute(dossierTemplateId, MagicConverter.convert(dossierAttribute, DossierAttributeConfigEntity.class)), DossierAttributeConfig.class); - auditPersistenceService.insertRecord(AuditRequest.builder() - .userId(KeycloakSecurity.getUserId()) - .objectId(dossierTemplateId) - .category(AuditCategory.DOSSIER_TEMPLATE.name()) - .message("Dossier attributes added/updated") - .build()); + auditor.audit(AuditCategory.DOSSIER_TEMPLATE.name(), "Dossier attributes added/updated", AuditDetail.DOSSIER_TEMPLATE_ID, dossierTemplateId); return result; } @@ -82,13 +64,8 @@ public class DossierAttributesController implements DossierAttributesResource { public void deleteDossierAttributeConfig(@PathVariable(DOSSIER_TEMPLATE_ID) String dossierTemplateId, @PathVariable(DOSSIER_ATTRIBUTE_ID) String dossierAttributeId) { dossierAttributeConfigPersistenceService.deleteDossierAttribute(dossierAttributeId); - auditPersistenceService.insertRecord(AuditRequest.builder() - .userId(KeycloakSecurity.getUserId()) - .objectId(dossierTemplateId) - .category(AuditCategory.DOSSIER_TEMPLATE.name()) - .message("Dossier attributes removed") - .details(Map.of("DossierAttributeId", dossierAttributeId)) - .build()); + auditor.audit(AuditCategory.DOSSIER_TEMPLATE.name(), "Dossier attributes removed", + AuditDetail.DOSSIER_TEMPLATE_ID, dossierTemplateId, AuditDetail.DOSSIER_ATTRIBUTE_ID, dossierAttributeId); } @@ -97,13 +74,9 @@ public class DossierAttributesController implements DossierAttributesResource { public void deleteDossierAttributesConfig(@PathVariable(DOSSIER_TEMPLATE_ID) String dossierTemplateId, @RequestParam(DOSSIER_ATTRIBUTE_IDS) List dossierAttributeIds) { dossierAttributeConfigPersistenceService.deleteDossierAttributes(dossierAttributeIds); - auditPersistenceService.insertRecord(AuditRequest.builder() - .userId(KeycloakSecurity.getUserId()) - .objectId(dossierTemplateId) - .category(AuditCategory.DOSSIER_TEMPLATE.name()) - .message("Dossier attributes removed") - .details(Map.of("DossierAttributeId", dossierAttributeIds)) - .build()); + dossierAttributeIds.forEach(dossierAttributeId -> auditor.audit(AuditCategory.DOSSIER_TEMPLATE.name(), "Dossier attribute removed", + AuditDetail.DOSSIER_TEMPLATE_ID, dossierTemplateId, AuditDetail.DOSSIER_ATTRIBUTE_ID, dossierAttributeId)); + } @@ -120,12 +93,7 @@ public class DossierAttributesController implements DossierAttributesResource { accessControlService.verifyUserIsDossierOwner(dossierId); var result = dossierAttributesManagementService.setDossierAttributes(dossierId, dossierAttributes.getDossierAttributeList()); - auditPersistenceService.insertRecord(AuditRequest.builder() - .userId(KeycloakSecurity.getUserId()) - .objectId(dossierId) - .category(AuditCategory.DOSSIER.name()) - .message("Changed dossier attributes.") - .build()); + auditor.audit(AuditCategory.DOSSIER.name(), "Changed dossier attributes.", AuditDetail.DOSSIER_ID, dossierId); return new DossierAttributes(result); } @@ -136,12 +104,7 @@ public class DossierAttributesController implements DossierAttributesResource { accessControlService.verifyUserIsDossierOwner(dossierId); DossierAttribute result = dossierAttributesManagementService.addOrUpdateDossierAttribute(dossierId, dossierAttribute); - auditPersistenceService.insertRecord(AuditRequest.builder() - .userId(KeycloakSecurity.getUserId()) - .objectId(dossierId) - .category(AuditCategory.DOSSIER.name()) - .message("Added or updated dossier attributes.") - .build()); + auditor.audit(AuditCategory.DOSSIER.name(), "Added or updated dossier attributes.", AuditDetail.DOSSIER_ID, dossierId); return new DossierAttributes(List.of(result)); // TODO should be single Object??? } @@ -150,12 +113,7 @@ public class DossierAttributesController implements DossierAttributesResource { public DossierAttributes getDossierAttributes(String dossierId) { var result = dossierAttributesManagementService.getDossierAttributes(dossierId); - auditPersistenceService.insertRecord(AuditRequest.builder() - .userId(KeycloakSecurity.getUserId()) - .objectId(dossierId) - .category(AuditCategory.DOSSIER.name()) - .message("Got dossier attributes.") - .build()); + auditor.audit(AuditCategory.DOSSIER.name(), "Got dossier attributes.", AuditDetail.DOSSIER_ID, dossierId); return new DossierAttributes(result); } @@ -166,13 +124,7 @@ public class DossierAttributesController implements DossierAttributesResource { accessControlService.verifyUserIsDossierOwner(dossierId); dossierAttributesManagementService.deleteDossierAttribute(dossierId, dossierAttributeId); - auditPersistenceService.insertRecord(AuditRequest.builder() - .userId(KeycloakSecurity.getUserId()) - .objectId(dossierId) - .category(AuditCategory.DOSSIER.name()) - .message("Changed dossier attributes.") - .build()); - + auditor.audit(AuditCategory.DOSSIER.name(), "Changed dossier attributes.", AuditDetail.DOSSIER_ID, dossierId); } } diff --git a/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/DossierController.java b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/DossierController.java index 18d2044eb..d6f57e43a 100644 --- a/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/DossierController.java +++ b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/DossierController.java @@ -1,24 +1,31 @@ package com.iqser.red.persistence.service.v1.external.api.impl.controller; -import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.ADD_UPDATE_DOSSIER; -import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.ARCHIVE_DOSSIER; -import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.DELETE_DOSSIER; -import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.READ_DOSSIER; -import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.UNARCHIVE_DOSSIER; - -import java.time.OffsetDateTime; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; -import java.util.LinkedHashSet; -import java.util.List; -import java.util.Map; -import java.util.Objects; -import java.util.Set; -import java.util.TreeSet; -import java.util.stream.Collectors; - +import com.google.common.collect.Lists; +import com.iqser.red.service.persistence.management.v1.processor.acl.custom.dossier.DossierACLService; +import com.iqser.red.service.persistence.management.v1.processor.exception.BadRequestException; +import com.iqser.red.service.persistence.management.v1.processor.model.audit.AuditCategory; +import com.iqser.red.service.persistence.management.v1.processor.model.audit.AuditDetail; +import com.iqser.red.service.persistence.management.v1.processor.roles.ApplicationRoles; +import com.iqser.red.service.persistence.management.v1.processor.service.AccessControlService; import com.iqser.red.service.persistence.management.v1.processor.service.DossierCreatorService; +import com.iqser.red.service.persistence.management.v1.processor.service.DossierManagementService; +import com.iqser.red.service.persistence.management.v1.processor.service.FileStatusManagementService; +import com.iqser.red.service.persistence.management.v1.processor.service.persistence.NotificationPersistenceService; +import com.iqser.red.service.persistence.management.v1.processor.service.users.UserService; +import com.iqser.red.service.persistence.management.v1.processor.service.users.model.User; +import com.iqser.red.service.persistence.service.v1.api.external.resource.DossierResource; +import com.iqser.red.service.persistence.service.v1.api.shared.model.AddNotificationRequest; +import com.iqser.red.service.persistence.service.v1.api.shared.model.DossierChangeEntry; +import com.iqser.red.service.persistence.service.v1.api.shared.model.DossierInformation; +import com.iqser.red.service.persistence.service.v1.api.shared.model.DossierRequest; +import com.iqser.red.service.persistence.service.v1.api.shared.model.common.JSONPrimitive; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.CreateOrUpdateDossierRequest; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.Dossier; +import com.iqser.red.service.persistence.service.v1.api.shared.model.notification.NotificationType; +import com.knecon.fforesight.auditor.Auditor; +import com.knecon.fforesight.keycloakcommons.security.KeycloakSecurity; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; @@ -33,32 +40,11 @@ import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; -import com.google.common.collect.Lists; -import com.iqser.red.service.persistence.management.v1.processor.acl.custom.dossier.DossierACLService; -import com.iqser.red.service.persistence.management.v1.processor.exception.BadRequestException; -import com.iqser.red.service.persistence.management.v1.processor.roles.ApplicationRoles; -import com.iqser.red.service.persistence.management.v1.processor.service.AccessControlService; -import com.iqser.red.service.persistence.management.v1.processor.service.DossierManagementService; -import com.iqser.red.service.persistence.management.v1.processor.service.FileStatusManagementService; -import com.iqser.red.service.persistence.management.v1.processor.service.persistence.AuditPersistenceService; -import com.iqser.red.service.persistence.management.v1.processor.service.persistence.NotificationPersistenceService; -import com.iqser.red.service.persistence.management.v1.processor.service.users.UserService; -import com.iqser.red.service.persistence.management.v1.processor.service.users.model.User; -import com.iqser.red.service.persistence.service.v1.api.external.resource.DossierResource; -import com.iqser.red.service.persistence.service.v1.api.shared.model.AuditCategory; -import com.iqser.red.service.persistence.service.v1.api.shared.model.DossierChangeEntry; -import com.iqser.red.service.persistence.service.v1.api.shared.model.DossierInformation; -import com.iqser.red.service.persistence.service.v1.api.shared.model.DossierRequest; -import com.iqser.red.service.persistence.service.v1.api.shared.model.audit.AddNotificationRequest; -import com.iqser.red.service.persistence.service.v1.api.shared.model.audit.AuditRequest; -import com.iqser.red.service.persistence.service.v1.api.shared.model.common.JSONPrimitive; -import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.CreateOrUpdateDossierRequest; -import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.Dossier; -import com.iqser.red.service.persistence.service.v1.api.shared.model.notification.NotificationType; -import com.knecon.fforesight.keycloakcommons.security.KeycloakSecurity; +import java.time.OffsetDateTime; +import java.util.*; +import java.util.stream.Collectors; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; +import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.*; @Slf4j @RestController @@ -66,11 +52,10 @@ import lombok.extern.slf4j.Slf4j; public class DossierController implements DossierResource { private static final Set VALID_MEMBER_ROLES = Set.of(ApplicationRoles.RED_USER_ROLE, ApplicationRoles.RED_MANAGER_ROLE); - + private final Auditor auditor; private final DossierManagementService dossierManagementService; private final UserService userService; private final FileStatusManagementService fileStatusManagementService; - private final AuditPersistenceService auditPersistenceService; private final NotificationPersistenceService notificationPersistenceService; private final AccessControlService accessControlService; private final DossierACLService dossierACLService; @@ -143,12 +128,7 @@ public class DossierController implements DossierResource { updateFileStatusForDossierFiles(updatedDossier.getId(), members); - auditPersistenceService.audit(AuditRequest.builder() - .userId(KeycloakSecurity.getUserId()) - .objectId(updatedDossier.getId()) - .category(AuditCategory.DOSSIER.name()) - .message("Dossier has been updated.") - .build()); + auditor.audit(AuditCategory.DOSSIER.name(), "Dossier has been updated.", AuditDetail.DOSSIER_ID, updatedDossier.getId()); if (existingDossier.getOwnerId() == null || !existingDossier.getOwnerId().equals(ownerId)) { if (ownerId != null && !ownerId.equals(KeycloakSecurity.getUserId())) { @@ -221,12 +201,7 @@ public class DossierController implements DossierResource { } else { Dossier created = createNewDossier(dossierRequest, ownerId, members, approvers); - auditPersistenceService.audit(AuditRequest.builder() - .userId(KeycloakSecurity.getUserId()) - .objectId(created.getId()) - .category(AuditCategory.DOSSIER.name()) - .message("Dossier has been created.") - .build()); + auditor.audit(AuditCategory.DOSSIER.name(), "Dossier has been created.", AuditDetail.DOSSIER_ID, created.getId()); HttpHeaders httpHeaders = new HttpHeaders(); httpHeaders.setContentType(MediaType.APPLICATION_JSON); @@ -353,12 +328,7 @@ public class DossierController implements DossierResource { dossierManagementService.delete(dossierId); - auditPersistenceService.audit(AuditRequest.builder() - .userId(KeycloakSecurity.getUserId()) - .objectId(dossierId) - .category(AuditCategory.DOSSIER.name()) - .message("Dossier moved to trash.") - .build()); + auditor.audit(AuditCategory.DOSSIER.name(), "Dossier moved to trash.", AuditDetail.DOSSIER_ID, dossierId); dossierToBeDeleted.getMemberIds() .stream() @@ -367,7 +337,7 @@ public class DossierController implements DossierResource { .userId(member) .issuerId(KeycloakSecurity.getUserId()) .notificationType(NotificationType.DOSSIER_DELETED.name()) - .target(Map.of("dossierId", dossierId, "dossierName", dossierToBeDeleted.getDossierName())) + .target(Map.of(AuditDetail.DOSSIER_ID, dossierId, "dossierName", dossierToBeDeleted.getDossierName())) .build())); } @@ -443,12 +413,7 @@ public class DossierController implements DossierResource { dossierManagementService.archiveDossiers(dossierIds); for (String dossierId : dossierIds) { - auditPersistenceService.audit(AuditRequest.builder() - .userId(KeycloakSecurity.getUserId()) - .objectId(dossierId) - .category(AuditCategory.DOSSIER.name()) - .message("Dossier archived.") - .build()); + auditor.audit(AuditCategory.DOSSIER.name(), "Dossier archived.", AuditDetail.DOSSIER_ID, dossierId); } } @@ -459,12 +424,7 @@ public class DossierController implements DossierResource { dossierManagementService.unarchiveDossiers(dossierIds); for (String dossierId : dossierIds) { - auditPersistenceService.audit(AuditRequest.builder() - .userId(KeycloakSecurity.getUserId()) - .objectId(dossierId) - .category(AuditCategory.DOSSIER.name()) - .message("Dossier restored from archive.") - .build()); + auditor.audit(AuditCategory.DOSSIER.name(), "Dossier restored from archive.", AuditDetail.DOSSIER_ID, dossierId); } } @@ -479,14 +439,7 @@ public class DossierController implements DossierResource { dossierManagementService.hardDeleteDossiers(dossierIds); for (String dossierId : dossierIds) { - - auditPersistenceService.audit(AuditRequest.builder() - .userId(KeycloakSecurity.getUserId()) - .objectId(dossierId) - .category(AuditCategory.DOSSIER.name()) - .message("Dossier permanently deleted.") - .build()); - + auditor.audit(AuditCategory.DOSSIER.name(), "Dossier permanently deleted.", AuditDetail.DOSSIER_ID, dossierId); } } @@ -497,14 +450,7 @@ public class DossierController implements DossierResource { dossierManagementService.undeleteDossiers(dossierIds); for (String dossierId : dossierIds) { - - auditPersistenceService.audit(AuditRequest.builder() - .userId(KeycloakSecurity.getUserId()) - .objectId(dossierId) - .category(AuditCategory.DOSSIER.name()) - .message("Dossier restored from trash.") - .build()); - + auditor.audit(AuditCategory.DOSSIER.name(), "Dossier restored from trash.", AuditDetail.DOSSIER_ID, dossierId); } } diff --git a/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/DossierTemplateController.java b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/DossierTemplateController.java index a90da71b6..8d17d2089 100644 --- a/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/DossierTemplateController.java +++ b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/DossierTemplateController.java @@ -1,67 +1,50 @@ package com.iqser.red.persistence.service.v1.external.api.impl.controller; -import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.READ_DOSSIER_TEMPLATES; -import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.WRITE_DOSSIER_TEMPLATES; -import static com.iqser.red.service.persistence.management.v1.processor.service.FeignExceptionHandler.processFeignException; - -import java.io.IOException; -import java.util.ArrayList; -import java.util.HashSet; -import java.util.List; -import java.util.Locale; -import java.util.Map; -import java.util.Set; -import java.util.stream.Collectors; - -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.BeanUtils; -import org.springframework.security.access.prepost.PreAuthorize; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.RequestPart; -import org.springframework.web.bind.annotation.RestController; -import org.springframework.web.multipart.MultipartFile; - import com.iqser.red.service.persistence.management.v1.processor.acl.custom.dossier.DossierACLService; import com.iqser.red.service.persistence.management.v1.processor.exception.BadRequestException; import com.iqser.red.service.persistence.management.v1.processor.exception.ConflictException; +import com.iqser.red.service.persistence.management.v1.processor.model.audit.AuditCategory; +import com.iqser.red.service.persistence.management.v1.processor.model.audit.AuditDetail; import com.iqser.red.service.persistence.management.v1.processor.service.DossierManagementService; import com.iqser.red.service.persistence.management.v1.processor.service.DossierTemplateManagementService; import com.iqser.red.service.persistence.management.v1.processor.service.DossierTemplateStatsService; -import com.iqser.red.service.persistence.management.v1.processor.service.persistence.AuditPersistenceService; -import com.iqser.red.service.persistence.management.v1.processor.service.users.UserService; import com.iqser.red.service.persistence.service.v1.api.external.resource.DossierTemplateResource; -import com.iqser.red.service.persistence.service.v1.api.shared.model.AuditCategory; import com.iqser.red.service.persistence.service.v1.api.shared.model.DossierTemplateModel; import com.iqser.red.service.persistence.service.v1.api.shared.model.DownloadResponse; -import com.iqser.red.service.persistence.service.v1.api.shared.model.audit.AuditRequest; -import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.CloneDossierTemplateRequest; -import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.CreateOrUpdateDossierTemplateRequest; -import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.DossierTemplate; -import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.DossierTemplateStats; -import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.DossierTemplateStatus; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.*; import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.Dossier; import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.importexport.ExportDownloadRequest; import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.importexport.ImportDossierTemplateRequest; +import com.knecon.fforesight.auditor.Auditor; import com.knecon.fforesight.keycloakcommons.security.KeycloakSecurity; - import feign.FeignException; import io.micrometer.core.annotation.Timed; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.BeanUtils; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import java.io.IOException; +import java.util.*; +import java.util.stream.Collectors; + +import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.READ_DOSSIER_TEMPLATES; +import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.WRITE_DOSSIER_TEMPLATES; +import static com.iqser.red.service.persistence.management.v1.processor.service.FeignExceptionHandler.processFeignException; @Slf4j @RestController @RequiredArgsConstructor public class DossierTemplateController implements DossierTemplateResource { + private final Auditor auditor; private final DossierTemplateManagementService dossierTemplateManagementService; private final DossierTemplateStatsService dossierTemplateStatsService; - private final AuditPersistenceService auditPersistenceService; private final DossierManagementService dossierManagementService; private final DossierACLService dossierACLService; - private final UserService userService; @Override @@ -75,13 +58,8 @@ public class DossierTemplateController implements DossierTemplateResource { BeanUtils.copyProperties(dossierTemplateModel, dossierTemplate); try { DossierTemplateModel response = convert(dossierTemplateManagementService.createOrUpdateDossierTemplate(dossierTemplate)); - - auditPersistenceService.audit(AuditRequest.builder() - .userId(KeycloakSecurity.getUserId()) - .objectId(response.getDossierTemplateId()) - .category(AuditCategory.DOSSIER_TEMPLATE.name()) - .message("Dossier Template has been added or updated") - .build()); + auditor.audit(AuditCategory.DOSSIER_TEMPLATE.name(), "Dossier Template has been added or updated", + AuditDetail.DOSSIER_TEMPLATE_ID, response.getDossierTemplateId()); return response; } catch (FeignException e) { throw processFeignException(e); @@ -122,12 +100,8 @@ public class DossierTemplateController implements DossierTemplateResource { } dossierTemplateManagementService.deleteDossierTemplate(dossierTemplateId, userId); - auditPersistenceService.audit(AuditRequest.builder() - .userId(KeycloakSecurity.getUserId()) - .objectId(dossierTemplateId) - .category(AuditCategory.DOSSIER_TEMPLATE.name()) - .message("Dossier Template has been deleted") - .build()); + auditor.audit(AuditCategory.DOSSIER_TEMPLATE.name(), "Dossier Template has been deleted", + AuditDetail.DOSSIER_TEMPLATE_ID, dossierTemplateId); } @@ -146,12 +120,8 @@ public class DossierTemplateController implements DossierTemplateResource { } dossierTemplateManagementService.deleteDossierTemplate(dossierTemplateId, userId); - auditPersistenceService.audit(AuditRequest.builder() - .userId(KeycloakSecurity.getUserId()) - .objectId(dossierTemplateId) - .category(AuditCategory.DOSSIER_TEMPLATE.name()) - .message("Dossier template has been deleted") - .build()); + auditor.audit(AuditCategory.DOSSIER_TEMPLATE.name(), "Dossier Template has been deleted", + AuditDetail.DOSSIER_TEMPLATE_ID, dossierTemplateId); } catch (FeignException e) { errorIds.add(dossierTemplateId); } @@ -168,17 +138,12 @@ public class DossierTemplateController implements DossierTemplateResource { public DossierTemplateModel cloneDossierTemplate(@PathVariable(DOSSIER_TEMPLATE_ID) String dossierTemplateId, @RequestBody CloneDossierTemplateRequest cloneDossierTemplateRequest) { - String userId = KeycloakSecurity.getUserId(); - try { DossierTemplateModel response = convert(dossierTemplateManagementService.cloneDossierTemplate(dossierTemplateId, cloneDossierTemplateRequest)); - auditPersistenceService.audit(AuditRequest.builder() - .userId(userId) - .objectId(response.getDossierTemplateId()) - .category(AuditCategory.DOSSIER_TEMPLATE.name()) - .message("Dossier Template has been cloned") - .build()); + + auditor.audit(AuditCategory.DOSSIER_TEMPLATE.name(), "Dossier Template has been cloned", + AuditDetail.DOSSIER_TEMPLATE_ID, response.getDossierTemplateId()); return response; } catch (FeignException e) { throw processFeignException(e); @@ -220,13 +185,9 @@ public class DossierTemplateController implements DossierTemplateResource { try { ExportDownloadRequest request = ExportDownloadRequest.builder().dossierTemplateId(dossierTemplateId).userId(KeycloakSecurity.getUserId()).build(); var response = dossierTemplateManagementService.prepareExportDownload(request); - auditPersistenceService.audit(AuditRequest.builder() - .userId(KeycloakSecurity.getUserId()) - .objectId(response.getValue()) - .category(AuditCategory.DOWNLOAD.name()) - .message("Export Download was prepared") - .details(Map.of("dossierTemplateId", request.getDossierTemplateId())) - .build()); + auditor.audit(AuditCategory.DOSSIER_TEMPLATE.name(), "Export Download was prepared", + AuditDetail.OBJECT_ID, response.getValue(), AuditDetail.DOSSIER_TEMPLATE_ID, request.getDossierTemplateId()); + return new DownloadResponse(response.getValue()); } catch (FeignException e) { throw processFeignException(e); @@ -261,13 +222,9 @@ public class DossierTemplateController implements DossierTemplateResource { .archive(file.getBytes()) .build(); DossierTemplate loadedDossierTemplate = dossierTemplateManagementService.importDossierTemplate(request); - auditPersistenceService.audit(AuditRequest.builder() - .userId(KeycloakSecurity.getUserId()) - .objectId(loadedDossierTemplate.getId()) - .category(AuditCategory.DOSSIER_TEMPLATE.name()) - .message("Dossier template was imported") - .details(Map.of("dossierTemplateId", loadedDossierTemplate.getId())) - .build()); + auditor.audit(AuditCategory.DOSSIER_TEMPLATE.name(), "Dossier template was imported", + AuditDetail.DOSSIER_TEMPLATE_ID, loadedDossierTemplate.getId()); + return convert(loadedDossierTemplate); } catch (IOException e) { throw new BadRequestException(e.getMessage(), e); diff --git a/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/DownloadController.java b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/DownloadController.java index 7db4dd501..0d32aceca 100644 --- a/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/DownloadController.java +++ b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/DownloadController.java @@ -1,50 +1,14 @@ package com.iqser.red.persistence.service.v1.external.api.impl.controller; -import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.PROCESS_DOWNLOAD; -import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.READ_DOWNLOAD_STATUS; - -import java.io.BufferedInputStream; -import java.util.List; -import java.util.Map; -import java.util.Optional; -import java.util.concurrent.CompletableFuture; -import java.util.regex.Pattern; -import java.util.stream.Collectors; - -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.core.io.InputStreamResource; -import org.springframework.http.HttpHeaders; -import org.springframework.http.HttpStatus; -import org.springframework.http.MediaType; -import org.springframework.http.ResponseEntity; -import org.springframework.security.access.prepost.PreAuthorize; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.RestController; -import org.springframework.web.context.request.RequestAttributes; -import org.springframework.web.context.request.RequestContextHolder; -import org.springframework.web.context.request.ServletRequestAttributes; - import com.iqser.red.persistence.service.v1.external.api.impl.service.OneTimeTokenService; import com.iqser.red.service.persistence.management.v1.processor.exception.BadRequestException; import com.iqser.red.service.persistence.management.v1.processor.exception.NotFoundException; -import com.iqser.red.service.persistence.management.v1.processor.service.AccessControlService; -import com.iqser.red.service.persistence.management.v1.processor.service.DossierManagementService; -import com.iqser.red.service.persistence.management.v1.processor.service.DownloadService; -import com.iqser.red.service.persistence.management.v1.processor.service.FileManagementStorageService; -import com.iqser.red.service.persistence.management.v1.processor.service.FileStatusService; -import com.iqser.red.service.persistence.management.v1.processor.service.persistence.AuditPersistenceService; +import com.iqser.red.service.persistence.management.v1.processor.model.audit.AuditCategory; +import com.iqser.red.service.persistence.management.v1.processor.model.audit.AuditDetail; +import com.iqser.red.service.persistence.management.v1.processor.service.*; import com.iqser.red.service.persistence.management.v1.processor.utils.StringEncodingUtils; import com.iqser.red.service.persistence.service.v1.api.external.resource.DownloadResource; -import com.iqser.red.service.persistence.service.v1.api.shared.model.AuditCategory; -import com.iqser.red.service.persistence.service.v1.api.shared.model.DownloadResponse; -import com.iqser.red.service.persistence.service.v1.api.shared.model.DownloadStatusResponse; -import com.iqser.red.service.persistence.service.v1.api.shared.model.PrepareDownloadRequest; -import com.iqser.red.service.persistence.service.v1.api.shared.model.PrepareDownloadWithOptionRequest; -import com.iqser.red.service.persistence.service.v1.api.shared.model.RemoveDownloadRequest; -import com.iqser.red.service.persistence.service.v1.api.shared.model.audit.AuditRequest; +import com.iqser.red.service.persistence.service.v1.api.shared.model.*; import com.iqser.red.service.persistence.service.v1.api.shared.model.common.JSONPrimitive; import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.DownloadFileType; import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.file.FileModel; @@ -53,13 +17,35 @@ import com.iqser.red.service.persistence.service.v1.api.shared.model.download.Do import com.iqser.red.service.persistence.service.v1.api.shared.model.download.DownloadStatus; import com.iqser.red.service.persistence.service.v1.api.shared.model.download.DownloadWithOptionRequest; import com.iqser.red.storage.commons.service.StorageService; +import com.knecon.fforesight.auditor.Auditor; +import com.knecon.fforesight.auditor.UserAuditor; +import com.knecon.fforesight.auditor.service.AuditingService; import com.knecon.fforesight.keycloakcommons.security.KeycloakSecurity; import com.knecon.fforesight.tenantcommons.TenantContext; - import jakarta.servlet.http.HttpServletResponse; import lombok.RequiredArgsConstructor; import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.core.io.InputStreamResource; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.context.request.RequestContextHolder; +import org.springframework.web.context.request.ServletRequestAttributes; + +import java.io.BufferedInputStream; +import java.util.List; +import java.util.Optional; +import java.util.regex.Pattern; +import java.util.stream.Collectors; + +import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.PROCESS_DOWNLOAD; +import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.READ_DOWNLOAD_STATUS; +import static com.knecon.fforesight.auditor.model.Detail.d; @Slf4j @RestController @@ -68,11 +54,11 @@ public class DownloadController implements DownloadResource { private static final Pattern COLOR_PATTERN = Pattern.compile("^#[\\da-f]{6,6}$"); + private final AuditingService auditing; private final DossierManagementService dossierService; private final FileStatusService fileStatusService; private final DownloadService downloadService; private final StorageService storageService; - private final AuditPersistenceService auditPersistenceService; private final OneTimeTokenService oneTimeTokenDownloadService; private final AccessControlService accessControlService; private final FileManagementStorageService fileManagementStorageService; @@ -93,13 +79,8 @@ public class DownloadController implements DownloadResource { // check the user is non-member or reviewer accessControlService.verifyUserIsDossierOwnerOrApprover(request.getDossierId()); var response = downloadService.prepareDownload(convert(request)); - auditPersistenceService.insertRecord(AuditRequest.builder() - .userId(KeycloakSecurity.getUserId()) - .objectId(response.getValue()) - .category(AuditCategory.DOWNLOAD.name()) - .message("Download was prepared") - .details(Map.of("dossierId", request.getDossierId())) - .build()); + auditing.audit(KeycloakSecurity.getUserId(), AuditCategory.DOWNLOAD.name(), "Download was prepared", + d(AuditDetail.OBJECT_ID, response.getValue()), d(AuditDetail.DOSSIER_ID, request.getDossierId())); return new DownloadResponse(response.getValue()); } @@ -125,13 +106,8 @@ public class DownloadController implements DownloadResource { } var response = downloadService.prepareDownload(convert(request)); - auditPersistenceService.audit(AuditRequest.builder() - .userId(KeycloakSecurity.getUserId()) - .objectId(response.getValue()) - .category(AuditCategory.DOWNLOAD.name()) - .message("Download was prepared") - .details(Map.of("dossierId", request.getDossierId())) - .build()); + auditing.audit(KeycloakSecurity.getUserId(), AuditCategory.DOWNLOAD.name(), "Download was prepared", + d(AuditDetail.OBJECT_ID, response.getValue()), d(AuditDetail.DOSSIER_ID, request.getDossierId())); return new DownloadResponse(response.getValue()); } @@ -206,12 +182,8 @@ public class DownloadController implements DownloadResource { fileManagementStorageService.deleteObject(storageIdForAzure); } - auditPersistenceService.audit(AuditRequest.builder() - .userId(KeycloakSecurity.getUserId()) - .objectId(storageId) - .category(AuditCategory.DOWNLOAD.name()) - .message("Remove Prepared Download") - .build()); + auditing.audit(KeycloakSecurity.getUserId(), AuditCategory.DOWNLOAD.name(), "Remove Prepared Download", + d(AuditDetail.OBJECT_ID, storageId)); }); } @@ -258,13 +230,8 @@ public class DownloadController implements DownloadResource { try { var response = storageService.getObject(TenantContext.getTenantId(), storageId); - - auditPersistenceService.audit(AuditRequest.builder() - .userId(userId) - .objectId(storageId) - .category(AuditCategory.DOWNLOAD.name()) - .message("File was downloaded.") - .build()); + auditing.audit(userId, AuditCategory.DOWNLOAD.name(), "File was downloaded.", + d(AuditDetail.OBJECT_ID, storageId)); downloadService.setDownloaded(JSONPrimitive.of(storageId)); return new InputStreamResource(new BufferedInputStream(response.getInputStream())); @@ -273,7 +240,6 @@ public class DownloadController implements DownloadResource { } } - @Override @PreAuthorize("hasAuthority('" + PROCESS_DOWNLOAD + "')") public JSONPrimitive generateOneTimeToken(@RequestBody JSONPrimitive storageIdWrapper) { diff --git a/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/FileAttributesController.java b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/FileAttributesController.java index 1a2255b80..91992117c 100644 --- a/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/FileAttributesController.java +++ b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/FileAttributesController.java @@ -1,49 +1,43 @@ package com.iqser.red.persistence.service.v1.external.api.impl.controller; -import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.READ_FILE_ATTRIBUTES_CONFIG; -import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.WRITE_FILE_ATTRIBUTES; -import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.WRITE_FILE_ATTRIBUTES_CONFIG; - -import java.util.List; -import java.util.Map; - +import com.iqser.red.service.persistence.management.v1.processor.entity.configuration.FileAttributesGeneralConfigurationEntity; +import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.FileAttributeConfigEntity; +import com.iqser.red.service.persistence.management.v1.processor.exception.BadRequestException; +import com.iqser.red.service.persistence.management.v1.processor.exception.NotAllowedException; +import com.iqser.red.service.persistence.management.v1.processor.model.audit.AuditCategory; +import com.iqser.red.service.persistence.management.v1.processor.model.audit.AuditDetail; +import com.iqser.red.service.persistence.management.v1.processor.service.AccessControlService; +import com.iqser.red.service.persistence.management.v1.processor.service.FileAttributesManagementService; +import com.iqser.red.service.persistence.management.v1.processor.service.FileStatusService; +import com.iqser.red.service.persistence.management.v1.processor.service.persistence.FileAttributeConfigPersistenceService; +import com.iqser.red.service.persistence.service.v1.api.external.resource.FileAttributesResource; +import com.iqser.red.service.persistence.service.v1.api.shared.model.FileAttributes; +import com.iqser.red.service.persistence.service.v1.api.shared.model.FileAttributesConfig; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.FileAttributesGeneralConfiguration; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.file.FileAttributeConfig; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.file.WorkflowStatus; +import com.knecon.fforesight.auditor.Auditor; +import com.knecon.fforesight.databasetenantcommons.providers.utils.MagicConverter; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RestController; -import com.knecon.fforesight.keycloakcommons.security.KeycloakSecurity; -import com.iqser.red.service.persistence.management.v1.processor.entity.configuration.FileAttributesGeneralConfigurationEntity; -import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.FileAttributeConfigEntity; -import com.iqser.red.service.persistence.management.v1.processor.exception.BadRequestException; -import com.iqser.red.service.persistence.management.v1.processor.exception.NotAllowedException; -import com.iqser.red.service.persistence.management.v1.processor.service.AccessControlService; -import com.iqser.red.service.persistence.management.v1.processor.service.FileAttributesManagementService; -import com.iqser.red.service.persistence.management.v1.processor.service.FileStatusService; -import com.iqser.red.service.persistence.management.v1.processor.service.persistence.AuditPersistenceService; -import com.iqser.red.service.persistence.management.v1.processor.service.persistence.FileAttributeConfigPersistenceService; -import com.knecon.fforesight.databasetenantcommons.providers.utils.MagicConverter; -import com.iqser.red.service.persistence.service.v1.api.external.resource.FileAttributesResource; -import com.iqser.red.service.persistence.service.v1.api.shared.model.AuditCategory; -import com.iqser.red.service.persistence.service.v1.api.shared.model.FileAttributes; -import com.iqser.red.service.persistence.service.v1.api.shared.model.FileAttributesConfig; -import com.iqser.red.service.persistence.service.v1.api.shared.model.audit.AuditRequest; -import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.FileAttributesGeneralConfiguration; -import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.file.FileAttributeConfig; -import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.file.WorkflowStatus; +import java.util.List; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; +import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.*; @Slf4j @RestController @RequiredArgsConstructor public class FileAttributesController implements FileAttributesResource { + private final Auditor auditor; private final FileAttributesManagementService fileAttributesManagementService; private final FileAttributeConfigPersistenceService fileAttributeConfigPersistenceService; - private final AuditPersistenceService auditPersistenceService; private final FileStatusService fileStatusService; private final AccessControlService accessControlService; @@ -59,12 +53,8 @@ public class FileAttributesController implements FileAttributesResource { MagicConverter.convert(fileAttributesConfig, FileAttributesGeneralConfigurationEntity.class)); var result = fileAttributeConfigPersistenceService.setFileAttributesConfig(dossierTemplateId, MagicConverter.convert(fileAttributesConfig.getFileAttributeConfigs(), FileAttributeConfigEntity.class)); - auditPersistenceService.audit(AuditRequest.builder() - .userId(KeycloakSecurity.getUserId()) - .objectId(dossierTemplateId) - .category(AuditCategory.DOSSIER_TEMPLATE.name()) - .message("Changed file attributes base configuration & attribute configuration ( CSV Import )") - .build()); + auditor.audit(AuditCategory.DOSSIER_TEMPLATE.name(), "Changed file attributes base configuration & attribute configuration ( CSV Import )", + AuditDetail.DOSSIER_TEMPLATE_ID, dossierTemplateId); return FileAttributesConfig.builder() .filenameMappingColumnHeaderName(fileAttributesConfig.getFilenameMappingColumnHeaderName()) .delimiter(fileAttributesConfig.getDelimiter()) @@ -80,13 +70,9 @@ public class FileAttributesController implements FileAttributesResource { public FileAttributeConfig addOrUpdateFileAttribute(@PathVariable(DOSSIER_TEMPLATE_ID) String dossierTemplateId, @RequestBody FileAttributeConfig fileAttribute) { var result = fileAttributeConfigPersistenceService.addOrUpdateFileAttribute(dossierTemplateId, MagicConverter.convert(fileAttribute, FileAttributeConfigEntity.class)); - auditPersistenceService.audit(AuditRequest.builder() - .userId(KeycloakSecurity.getUserId()) - .objectId(dossierTemplateId) - .category(AuditCategory.DOSSIER_TEMPLATE.name()) - .message("File attributes added/updated") - .details(Map.of("FileAttributeName", fileAttribute.getLabel() != null ? fileAttribute.getLabel() : "", "dossierTemplateId", dossierTemplateId)) - .build()); + auditor.audit(AuditCategory.DOSSIER_TEMPLATE.name(), "File attributes added/updated", + AuditDetail.DOSSIER_TEMPLATE_ID, dossierTemplateId, + AuditDetail.FILE_ATTRIBUTE_NAME, fileAttribute.getLabel() != null ? fileAttribute.getLabel() : StringUtils.EMPTY); return MagicConverter.convert(result, FileAttributeConfig.class); } @@ -97,13 +83,8 @@ public class FileAttributesController implements FileAttributesResource { public void deleteFileAttribute(@PathVariable(DOSSIER_TEMPLATE_ID) String dossierTemplateId, @PathVariable(FILE_ATTRIBUTE_ID) String fileAttributeId) { fileAttributeConfigPersistenceService.deleteFileAttribute(fileAttributeId); - auditPersistenceService.audit(AuditRequest.builder() - .userId(KeycloakSecurity.getUserId()) - .objectId(dossierTemplateId) - .category(AuditCategory.DOSSIER_TEMPLATE.name()) - .message("File attributes removed") - .details(Map.of("FileAttributeId", fileAttributeId)) - .build()); + auditor.audit(AuditCategory.DOSSIER_TEMPLATE.name(), "File attributes removed", + AuditDetail.DOSSIER_TEMPLATE_ID,dossierTemplateId, AuditDetail.FILE_ATTRIBUTE_ID, fileAttributeId); } @@ -112,13 +93,8 @@ public class FileAttributesController implements FileAttributesResource { public void deleteFileAttributes(@PathVariable(DOSSIER_TEMPLATE_ID) String dossierTemplateId, @RequestBody List fileAttributeIds) { fileAttributeConfigPersistenceService.deleteFileAttributes(fileAttributeIds); - auditPersistenceService.audit(AuditRequest.builder() - .userId(KeycloakSecurity.getUserId()) - .objectId(dossierTemplateId) - .category(AuditCategory.DOSSIER_TEMPLATE.name()) - .message("File attributes removed") - .details(Map.of("FileAttributeId", fileAttributeIds)) - .build()); + fileAttributeIds.forEach(fileAttributeId -> auditor.audit(AuditCategory.DOSSIER_TEMPLATE.name(), "File attribute removed", + AuditDetail.DOSSIER_TEMPLATE_ID, dossierTemplateId, AuditDetail.FILE_ATTRIBUTE_ID, fileAttributeId)); } @@ -155,12 +131,7 @@ public class FileAttributesController implements FileAttributesResource { } accessControlService.verifyUserIsMemberOrApprover(dossierId); fileAttributesManagementService.setFileAttributes(dossierId, fileId, fileAttributes.getAttributeIdToValue()); - auditPersistenceService.audit(AuditRequest.builder() - .userId(KeycloakSecurity.getUserId()) - .objectId(fileId) - .category(AuditCategory.DOCUMENT.name()) - .message("File attributes has been edited for a document.") - .build()); + auditor.audit(AuditCategory.DOCUMENT.name(), "File attributes have been edited for a document.", AuditDetail.FILE_ID, fileId); } diff --git a/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/FileManagementController.java b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/FileManagementController.java index 6611e1934..572494f65 100644 --- a/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/FileManagementController.java +++ b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/FileManagementController.java @@ -1,17 +1,29 @@ package com.iqser.red.persistence.service.v1.external.api.impl.controller; -import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.DELETE_FILE; -import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.DOWNLOAD_ORIGINAL_FILE; -import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.ROTATE_PAGE; -import static com.iqser.red.service.persistence.management.v1.processor.service.FeignExceptionHandler.processFeignException; -import static com.iqser.red.service.persistence.management.v1.processor.utils.DownloadBufferUtils.fileProxyStreamForDownload; - -import java.io.InputStream; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.Set; - +import com.iqser.red.service.persistence.management.v1.processor.client.pdftronredactionservice.PDFTronClient; +import com.iqser.red.service.persistence.management.v1.processor.exception.BadRequestException; +import com.iqser.red.service.persistence.management.v1.processor.exception.InternalServerErrorException; +import com.iqser.red.service.persistence.management.v1.processor.exception.NotAllowedException; +import com.iqser.red.service.persistence.management.v1.processor.exception.NotFoundException; +import com.iqser.red.service.persistence.management.v1.processor.model.audit.AuditCategory; +import com.iqser.red.service.persistence.management.v1.processor.model.audit.AuditDetail; +import com.iqser.red.service.persistence.management.v1.processor.service.*; +import com.iqser.red.service.persistence.management.v1.processor.utils.StorageIdUtils; +import com.iqser.red.service.persistence.management.v1.processor.utils.StringEncodingUtils; +import com.iqser.red.service.persistence.service.v1.api.external.resource.FileManagementResource; +import com.iqser.red.service.persistence.service.v1.api.shared.model.RotatePagesRequest; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.file.FileModel; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.file.FileType; +import com.iqser.red.storage.commons.exception.StorageException; +import com.iqser.red.storage.commons.exception.StorageObjectDoesNotExist; +import com.iqser.red.storage.commons.service.StorageService; +import com.knecon.fforesight.auditor.Auditor; +import com.knecon.fforesight.tenantcommons.TenantContext; +import feign.FeignException; +import io.micrometer.core.annotation.Timed; +import lombok.RequiredArgsConstructor; +import lombok.SneakyThrows; +import lombok.extern.slf4j.Slf4j; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; @@ -23,37 +35,15 @@ import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; -import com.iqser.red.service.persistence.management.v1.processor.client.pdftronredactionservice.PDFTronClient; -import com.iqser.red.service.persistence.management.v1.processor.exception.BadRequestException; -import com.iqser.red.service.persistence.management.v1.processor.exception.InternalServerErrorException; -import com.iqser.red.service.persistence.management.v1.processor.exception.NotAllowedException; -import com.iqser.red.service.persistence.management.v1.processor.exception.NotFoundException; -import com.iqser.red.service.persistence.management.v1.processor.service.AccessControlService; -import com.iqser.red.service.persistence.management.v1.processor.service.FileManagementStorageService; -import com.iqser.red.service.persistence.management.v1.processor.service.FileService; -import com.iqser.red.service.persistence.management.v1.processor.service.FileStatusManagementService; -import com.iqser.red.service.persistence.management.v1.processor.service.FileStatusService; -import com.iqser.red.service.persistence.management.v1.processor.service.ReanalysisService; -import com.iqser.red.service.persistence.management.v1.processor.service.persistence.AuditPersistenceService; -import com.iqser.red.service.persistence.management.v1.processor.utils.StorageIdUtils; -import com.iqser.red.service.persistence.management.v1.processor.utils.StringEncodingUtils; -import com.iqser.red.service.persistence.service.v1.api.external.resource.FileManagementResource; -import com.iqser.red.service.persistence.service.v1.api.shared.model.AuditCategory; -import com.iqser.red.service.persistence.service.v1.api.shared.model.RotatePagesRequest; -import com.iqser.red.service.persistence.service.v1.api.shared.model.audit.AuditRequest; -import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.file.FileModel; -import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.file.FileType; -import com.iqser.red.storage.commons.exception.StorageException; -import com.iqser.red.storage.commons.exception.StorageObjectDoesNotExist; -import com.iqser.red.storage.commons.service.StorageService; -import com.knecon.fforesight.keycloakcommons.security.KeycloakSecurity; -import com.knecon.fforesight.tenantcommons.TenantContext; +import java.io.InputStream; +import java.util.ArrayList; +import java.util.List; +import java.util.Set; -import feign.FeignException; -import io.micrometer.core.annotation.Timed; -import lombok.RequiredArgsConstructor; -import lombok.SneakyThrows; -import lombok.extern.slf4j.Slf4j; +import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.*; +import static com.iqser.red.service.persistence.management.v1.processor.service.FeignExceptionHandler.processFeignException; +import static com.iqser.red.service.persistence.management.v1.processor.utils.DownloadBufferUtils.fileProxyStreamForDownload; +import static com.knecon.fforesight.auditor.model.Detail.d; @Slf4j @RestController @@ -62,8 +52,8 @@ public class FileManagementController implements FileManagementResource { private static final String DOWNLOAD_HEADER_NAME = "Content-Disposition"; + private final Auditor auditor; private final FileService fileService; - private final AuditPersistenceService auditPersistenceService; private final AccessControlService accessControlService; private final PDFTronClient pdfTronClient; private final ReanalysisService reanalysisService; @@ -79,13 +69,8 @@ public class FileManagementController implements FileManagementResource { public void deleteFile(@PathVariable(DOSSIER_ID) String dossierId, @PathVariable(FILE_ID) String fileId) { fileService.deleteFile(dossierId, fileId); - auditPersistenceService.audit(AuditRequest.builder() - .userId(KeycloakSecurity.getUserId()) - .objectId(dossierId) - .category(AuditCategory.DOSSIER.name()) - .message("File has been deleted.") - .details(Map.of("fileId", fileId)) - .build()); + auditor.audit(AuditCategory.DOSSIER.name(), "File has been deleted.", + AuditDetail.DOSSIER_ID, dossierId, AuditDetail.FILE_ID, fileId); } @@ -98,13 +83,8 @@ public class FileManagementController implements FileManagementResource { for (String fileId : fileIds) { try { fileService.deleteFile(dossierId, fileId); - auditPersistenceService.audit(AuditRequest.builder() - .userId(KeycloakSecurity.getUserId()) - .objectId(dossierId) - .category(AuditCategory.DOSSIER.name()) - .message("Files have been deleted.") - .details(Map.of("Size", fileIds.size())) - .build()); + auditor.audit(AuditCategory.DOSSIER.name(), "Files have been deleted.", + AuditDetail.DOSSIER_ID, dossierId, AuditDetail.SIZE, fileIds.size()); } catch (Exception e) { errorIds.add(fileId); } @@ -183,13 +163,8 @@ public class FileManagementController implements FileManagementResource { } } fileService.hardDeleteFiles(dossierId, fileIds); - auditPersistenceService.audit(AuditRequest.builder() - .userId(KeycloakSecurity.getUserId()) - .objectId(dossierId) - .category(AuditCategory.DOSSIER.name()) - .message("Files has been hard deleted.") - .details(Map.of("FileIds", fileIds)) - .build()); + fileIds.forEach(fileId -> auditor.audit(AuditCategory.DOSSIER.name(), "File has been hard deleted.", + AuditDetail.DOSSIER_ID, dossierId, AuditDetail.FILE_ID, fileId)); } @@ -199,13 +174,8 @@ public class FileManagementController implements FileManagementResource { verifyUserIsDossierOwnerOrApproverOrAssignedReviewer(dossierId, fileIds); fileService.undeleteFiles(dossierId, fileIds); - auditPersistenceService.audit(AuditRequest.builder() - .userId(KeycloakSecurity.getUserId()) - .objectId(dossierId) - .category(AuditCategory.DOSSIER.name()) - .message("Files has been restored.") - .details(Map.of("FileIds", fileIds)) - .build()); + fileIds.forEach(fileId -> auditor.audit(AuditCategory.DOSSIER.name(), "File has been restored.", + AuditDetail.DOSSIER_ID, dossierId, AuditDetail.FILE_ID, fileId)); } @@ -235,13 +205,9 @@ public class FileManagementController implements FileManagementResource { } } - auditPersistenceService.audit(AuditRequest.builder() - .userId(KeycloakSecurity.getUserId()) - .objectId(dossierId) - .category(AuditCategory.DOCUMENT.name()) - .message("Pages have been rotated.") - .details(Map.of("Pages", rotatePagesRequest.getPages().keySet())) - .build()); + + auditor.audit(AuditCategory.DOSSIER.name(), "File page has been rotated.", + d(AuditDetail.DOSSIER_ID, dossierId), d(AuditDetail.FILE_ID, fileId), d(AuditDetail.PAGES, rotatePagesRequest.getPages().size())); } catch (FeignException e) { throw processFeignException(e); diff --git a/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/LegalBasisMappingController.java b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/LegalBasisMappingController.java index 50e89cba3..1ac2832ee 100644 --- a/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/LegalBasisMappingController.java +++ b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/LegalBasisMappingController.java @@ -1,47 +1,38 @@ package com.iqser.red.persistence.service.v1.external.api.impl.controller; -import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.READ_LEGAL_BASIS; -import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.WRITE_LEGAL_BASIS; - -import java.util.List; - +import com.iqser.red.service.persistence.management.v1.processor.model.audit.AuditCategory; +import com.iqser.red.service.persistence.management.v1.processor.model.audit.AuditDetail; +import com.iqser.red.service.persistence.management.v1.processor.service.persistence.LegalBasisMappingPersistenceService; +import com.iqser.red.service.persistence.service.v1.api.external.resource.LegalBasisMappingResource; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.legalbasis.LegalBasis; +import com.knecon.fforesight.auditor.Auditor; +import com.knecon.fforesight.databasetenantcommons.providers.utils.MagicConverter; import jakarta.transaction.Transactional; - +import lombok.RequiredArgsConstructor; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RestController; -import com.knecon.fforesight.keycloakcommons.security.KeycloakSecurity; -import com.iqser.red.service.persistence.management.v1.processor.service.persistence.AuditPersistenceService; -import com.iqser.red.service.persistence.management.v1.processor.service.persistence.LegalBasisMappingPersistenceService; -import com.knecon.fforesight.databasetenantcommons.providers.utils.MagicConverter; -import com.iqser.red.service.persistence.service.v1.api.external.resource.LegalBasisMappingResource; -import com.iqser.red.service.persistence.service.v1.api.shared.model.AuditCategory; -import com.iqser.red.service.persistence.service.v1.api.shared.model.audit.AuditRequest; -import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.legalbasis.LegalBasis; +import java.util.List; -import lombok.RequiredArgsConstructor; +import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.READ_LEGAL_BASIS; +import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.WRITE_LEGAL_BASIS; @RestController @RequiredArgsConstructor public class LegalBasisMappingController implements LegalBasisMappingResource { + private final Auditor auditor; private final LegalBasisMappingPersistenceService legalBasisMappingPersistenceService; - private final AuditPersistenceService auditPersistenceService; - @Override @PreAuthorize("hasAuthority('" + WRITE_LEGAL_BASIS + "')") public void deleteLegalBasis(@PathVariable(DOSSIER_TEMPLATE_PARAMETER_NAME) String dossierTemplateId, @RequestBody List legalBasisNames) { legalBasisMappingPersistenceService.deleteLegalBasis(dossierTemplateId, legalBasisNames); - auditPersistenceService.audit(AuditRequest.builder() - .userId(KeycloakSecurity.getUserId()) - .objectId(dossierTemplateId) - .category(AuditCategory.DOSSIER_TEMPLATE.name()) - .message("Legal basis mapping has been changed.") - .build()); + auditor.audit(AuditCategory.DOSSIER_TEMPLATE.name(), "Legal basis mapping has been changed.", + AuditDetail.DOSSIER_TEMPLATE_ID, dossierTemplateId); } @@ -50,12 +41,8 @@ public class LegalBasisMappingController implements LegalBasisMappingResource { public void addOrUpdateLegalBasis(@PathVariable(DOSSIER_TEMPLATE_PARAMETER_NAME) String dossierTemplateId, @RequestBody LegalBasis legalBasis) { legalBasisMappingPersistenceService.addOrUpdateLegalBasis(dossierTemplateId, legalBasis); - auditPersistenceService.audit(AuditRequest.builder() - .userId(KeycloakSecurity.getUserId()) - .objectId(dossierTemplateId) - .category(AuditCategory.DOSSIER_TEMPLATE.name()) - .message("Legal basis mapping has been changed.") - .build()); + auditor.audit(AuditCategory.DOSSIER_TEMPLATE.name(), "Legal basis mapping has been changed.", + AuditDetail.DOSSIER_TEMPLATE_ID, dossierTemplateId); } @@ -63,12 +50,8 @@ public class LegalBasisMappingController implements LegalBasisMappingResource { public void setLegalBasisMapping(@RequestBody List legalBasisMapping, @PathVariable(DOSSIER_TEMPLATE_PARAMETER_NAME) String dossierTemplateId) { legalBasisMappingPersistenceService.setLegalBasisMapping(dossierTemplateId, legalBasisMapping); - auditPersistenceService.audit(AuditRequest.builder() - .userId(KeycloakSecurity.getUserId()) - .objectId(dossierTemplateId) - .category(AuditCategory.DOSSIER_TEMPLATE.name()) - .message("Legal basis mapping has been changed.") - .build()); + auditor.audit(AuditCategory.DOSSIER_TEMPLATE.name(), "Legal basis mapping has been changed.", + AuditDetail.DOSSIER_TEMPLATE_ID, dossierTemplateId); } @Transactional diff --git a/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/LicenseReportController.java b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/LicenseReportController.java index 12ff2536f..beaba68e1 100644 --- a/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/LicenseReportController.java +++ b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/LicenseReportController.java @@ -1,29 +1,26 @@ package com.iqser.red.persistence.service.v1.external.api.impl.controller; -import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.READ_LICENSE_REPORT; - +import com.iqser.red.service.persistence.management.v1.processor.model.audit.AuditCategory; +import com.iqser.red.service.persistence.management.v1.processor.model.audit.AuditDetail; +import com.iqser.red.service.persistence.management.v1.processor.service.LicenseReportService; +import com.iqser.red.service.persistence.service.v1.api.external.resource.LicenseReportResource; +import com.iqser.red.service.persistence.service.v1.api.shared.model.license.LicenseReport; +import com.iqser.red.service.persistence.service.v1.api.shared.model.license.LicenseReportRequest; +import com.knecon.fforesight.auditor.Auditor; +import lombok.RequiredArgsConstructor; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RestController; -import com.knecon.fforesight.keycloakcommons.security.KeycloakSecurity; -import com.iqser.red.service.persistence.management.v1.processor.service.LicenseReportService; -import com.iqser.red.service.persistence.management.v1.processor.service.persistence.AuditPersistenceService; -import com.iqser.red.service.persistence.service.v1.api.external.resource.LicenseReportResource; -import com.iqser.red.service.persistence.service.v1.api.shared.model.AuditCategory; -import com.iqser.red.service.persistence.service.v1.api.shared.model.audit.AuditRequest; -import com.iqser.red.service.persistence.service.v1.api.shared.model.license.LicenseReport; -import com.iqser.red.service.persistence.service.v1.api.shared.model.license.LicenseReportRequest; - -import lombok.RequiredArgsConstructor; +import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.READ_LICENSE_REPORT; @RestController @RequiredArgsConstructor public class LicenseReportController implements LicenseReportResource { private static final String LICENSE_AUDIT_KEY = "License"; - private final AuditPersistenceService auditPersistenceService; + private final Auditor auditor; private final LicenseReportService licenseReportService; @@ -32,12 +29,7 @@ public class LicenseReportController implements LicenseReportResource { public LicenseReport getReport(@RequestBody LicenseReportRequest reportRequest) { LicenseReport licenseReport = licenseReportService.getLicenseReport(reportRequest); - auditPersistenceService.audit(AuditRequest.builder() - .userId(KeycloakSecurity.getUserId()) - .objectId(LICENSE_AUDIT_KEY) - .category(AuditCategory.LICENSE.name()) - .message("License report has been viewed.") - .build()); + auditor.audit(AuditCategory.LICENSE.name(), "License report has been viewed.", AuditDetail.OBJECT_ID, LICENSE_AUDIT_KEY); return licenseReport; } diff --git a/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/ManualRedactionController.java b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/ManualRedactionController.java index 13f01ba30..37485e0b8 100644 --- a/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/ManualRedactionController.java +++ b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/ManualRedactionController.java @@ -1,21 +1,7 @@ package com.iqser.red.persistence.service.v1.external.api.impl.controller; -import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.ADD_COMMENT; -import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.DELETE_COMMENT; -import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.DELETE_MANUAL_REDACTION; -import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.DO_MANUAL_REDACTION; -import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.READ_MANUAL_REDACTIONS; - -import java.util.List; -import java.util.Map; -import java.util.Set; - -import org.springframework.security.access.prepost.PreAuthorize; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.RestController; - +import com.iqser.red.service.persistence.management.v1.processor.model.audit.AuditCategory; +import com.iqser.red.service.persistence.management.v1.processor.model.audit.AuditDetail; import com.iqser.red.service.persistence.management.v1.processor.service.AccessControlService; import com.iqser.red.service.persistence.management.v1.processor.service.CommentService; import com.iqser.red.service.persistence.management.v1.processor.service.DossierManagementService; @@ -23,35 +9,27 @@ import com.iqser.red.service.persistence.management.v1.processor.service.FileSta import com.iqser.red.service.persistence.management.v1.processor.service.manualredactions.ManualRedactionMapper; import com.iqser.red.service.persistence.management.v1.processor.service.manualredactions.ManualRedactionService; import com.iqser.red.service.persistence.management.v1.processor.service.manualredactions.ManualRedactionUndoService; -import com.iqser.red.service.persistence.management.v1.processor.service.persistence.AuditPersistenceService; import com.iqser.red.service.persistence.service.v1.api.external.resource.ManualRedactionResource; -import com.iqser.red.service.persistence.service.v1.api.shared.model.AuditCategory; import com.iqser.red.service.persistence.service.v1.api.shared.model.CommentResponse; -import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.AddRedactionRequest; -import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.AnnotationComments; -import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.Comment; -import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.CommentRequest; -import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.ForceRedactionRequest; -import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.LegalBasisChangeRequest; -import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.ManualAddResponse; -import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.ManualRedactions; -import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.RecategorizationRequest; -import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.RemoveRedactionRequest; -import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.ResizeRedactionRequest; -import com.iqser.red.service.persistence.service.v1.api.shared.model.audit.AuditRequest; -import com.iqser.red.service.persistence.service.v1.api.shared.model.manual.AddCommentRequestModel; -import com.iqser.red.service.persistence.service.v1.api.shared.model.manual.AddRedactionRequestModel; -import com.iqser.red.service.persistence.service.v1.api.shared.model.manual.ForceRedactionRequestModel; -import com.iqser.red.service.persistence.service.v1.api.shared.model.manual.LegalBasisChangeRequestModel; -import com.iqser.red.service.persistence.service.v1.api.shared.model.manual.RecategorizationRequestModel; -import com.iqser.red.service.persistence.service.v1.api.shared.model.manual.RemoveRedactionRequestModel; -import com.iqser.red.service.persistence.service.v1.api.shared.model.manual.ResizeRedactionRequestModel; +import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.*; +import com.iqser.red.service.persistence.service.v1.api.shared.model.manual.*; +import com.knecon.fforesight.auditor.Auditor; import com.knecon.fforesight.keycloakcommons.security.KeycloakSecurity; - import lombok.AccessLevel; import lombok.RequiredArgsConstructor; import lombok.experimental.FieldDefaults; import lombok.extern.slf4j.Slf4j; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; +import java.util.Set; + +import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.*; +import static com.knecon.fforesight.auditor.model.Detail.d; @Slf4j @RestController @@ -59,13 +37,10 @@ import lombok.extern.slf4j.Slf4j; @FieldDefaults(makeFinal = true, level = AccessLevel.PRIVATE) public class ManualRedactionController implements ManualRedactionResource { - final static String FILE_ID = "fileId"; - final static String DOSSIER_ID = "dossierId"; - final static String ANNOTATION_ID = "annotationId"; + Auditor auditor; ManualRedactionService manualRedactionService; ManualRedactionUndoService manualRedactionUndoService; DossierManagementService dossierManagementService; - AuditPersistenceService auditPersistenceService; AccessControlService accessControlService; ManualRedactionMapper manualRedactionMapper; CommentService commentService; @@ -96,13 +71,8 @@ public class ManualRedactionController implements ManualRedactionResource { accessControlService.verifyFileIsNotApproved(dossierId, fileId); accessControlService.verifyUserIsReviewerOrApprover(dossierId, fileId); - auditPersistenceService.audit(AuditRequest.builder() - .userId(KeycloakSecurity.getUserId()) - .objectId(fileId) - .category(AuditCategory.DOCUMENT.name()) - .message("Comment was removed.") - .details(Map.of(DOSSIER_ID, dossierId, FILE_ID, fileId, ANNOTATION_ID, annotationId)) - .build()); + auditor.audit(AuditCategory.DOCUMENT.name(),"Comment was removed." , + d(AuditDetail.DOSSIER_ID, dossierId), d(AuditDetail.FILE_ID, fileId), d(AuditDetail.ANNOTATION_ID, annotationId)); commentService.deleteComment(fileId, List.of(Long.valueOf(commentId))); } @@ -142,13 +112,8 @@ public class ManualRedactionController implements ManualRedactionResource { var response = commentService.addComment(fileId, annotationId, CommentRequest.builder().user(KeycloakSecurity.getUserId()).text(addCommentRequest.getText()).build()); - auditPersistenceService.audit(AuditRequest.builder() - .userId(KeycloakSecurity.getUserId()) - .objectId(fileId) - .category(AuditCategory.DOCUMENT.name()) - .message("Comment was added.") - .details(Map.of(DOSSIER_ID, dossierId, FILE_ID, fileId, ANNOTATION_ID, annotationId)) - .build()); + auditor.audit(AuditCategory.DOCUMENT.name(),"Comment was added." , + d(AuditDetail.DOSSIER_ID, dossierId), d(AuditDetail.FILE_ID, fileId), d(AuditDetail.ANNOTATION_ID, annotationId)); return new CommentResponse(String.valueOf(response.getId())); } @@ -172,13 +137,8 @@ public class ManualRedactionController implements ManualRedactionResource { List requests = manualRedactionMapper.toAddRedactionRequestList(dossierId, addRedactionRequests, dossier); List responseList = manualRedactionService.addAddRedaction(dossierId, fileId, requests); - responseList.forEach(response -> auditPersistenceService.audit(AuditRequest.builder() - .userId(KeycloakSecurity.getUserId()) - .objectId(fileId) - .category(AuditCategory.DOCUMENT.name()) - .message("Manual redaction was added.") - .details(Map.of(DOSSIER_ID, dossierId, FILE_ID, fileId, ANNOTATION_ID, response.getAnnotationId())) - .build())); + responseList.forEach(response -> auditor.audit(AuditCategory.DOCUMENT.name(),"Manual redaction was added." , + d(AuditDetail.DOSSIER_ID, dossierId), d(AuditDetail.FILE_ID, fileId), d(AuditDetail.ANNOTATION_ID, response.getAnnotationId()))); return responseList; } @@ -201,13 +161,8 @@ public class ManualRedactionController implements ManualRedactionResource { List requests = manualRedactionMapper.toRemoveRedactionRequestList(dossierId, fileId, dossier.getDossierTemplateId(), removeRedactionRequests, includeUnprocessed); List responseList = manualRedactionService.addRemoveRedaction(dossierId, fileId, requests); - responseList.forEach(response -> auditPersistenceService.audit(AuditRequest.builder() - .userId(KeycloakSecurity.getUserId()) - .objectId(fileId) - .category(AuditCategory.DOCUMENT.name()) - .message("Redaction was manually removed") - .details(Map.of(DOSSIER_ID, dossierId, FILE_ID, fileId, ANNOTATION_ID, response.getAnnotationId())) - .build())); + responseList.forEach(response -> auditor.audit(AuditCategory.DOCUMENT.name(),"Redaction was manually removed" , + d(AuditDetail.DOSSIER_ID, dossierId), d(AuditDetail.FILE_ID, fileId), d(AuditDetail.ANNOTATION_ID, response.getAnnotationId()))); return responseList; } @@ -224,13 +179,8 @@ public class ManualRedactionController implements ManualRedactionResource { List requests = manualRedactionMapper.toForceRedactionRequestList(forceRedactionRequests); List responseList = manualRedactionService.addForceRedaction(dossierId, fileId, requests); - responseList.forEach(response -> auditPersistenceService.audit(AuditRequest.builder() - .userId(KeycloakSecurity.getUserId()) - .objectId(fileId) - .category(AuditCategory.DOCUMENT.name()) - .message("Skipped redaction was forced to be redacted") - .details(Map.of(DOSSIER_ID, dossierId, FILE_ID, fileId, ANNOTATION_ID, response.getAnnotationId())) - .build())); + responseList.forEach(response -> auditor.audit(AuditCategory.DOCUMENT.name(),"Skipped redaction was forced to be redacted" , + d(AuditDetail.DOSSIER_ID, dossierId), d(AuditDetail.FILE_ID, fileId), d(AuditDetail.ANNOTATION_ID, response.getAnnotationId()))); return responseList; } @@ -248,13 +198,8 @@ public class ManualRedactionController implements ManualRedactionResource { List responseList = manualRedactionService.addLegalBasisChange(dossierId, fileId, requests); - responseList.forEach(response -> auditPersistenceService.audit(AuditRequest.builder() - .userId(KeycloakSecurity.getUserId()) - .objectId(fileId) - .category(AuditCategory.DOCUMENT.name()) - .message("Legal basis reason was changed") - .details(Map.of(DOSSIER_ID, dossierId, FILE_ID, fileId, ANNOTATION_ID, response.getAnnotationId())) - .build())); + responseList.forEach(response -> auditor.audit(AuditCategory.DOCUMENT.name(),"Legal basis reason was changed" , + d(AuditDetail.DOSSIER_ID, dossierId), d(AuditDetail.FILE_ID, fileId), d(AuditDetail.ANNOTATION_ID, response.getAnnotationId()))); return responseList; } @@ -274,13 +219,8 @@ public class ManualRedactionController implements ManualRedactionResource { List responseList = manualRedactionService.addRecategorization(dossierId, fileId, requests); - responseList.forEach(response -> auditPersistenceService.audit(AuditRequest.builder() - .userId(KeycloakSecurity.getUserId()) - .objectId(fileId) - .category(AuditCategory.DOCUMENT.name()) - .message("Entity was recategorized.") - .details(Map.of(DOSSIER_ID, dossierId, FILE_ID, fileId, ANNOTATION_ID, response.getAnnotationId())) - .build())); + responseList.forEach(response -> auditor.audit(AuditCategory.DOCUMENT.name(),"Entity was recategorized." , + d(AuditDetail.DOSSIER_ID, dossierId), d(AuditDetail.FILE_ID, fileId), d(AuditDetail.ANNOTATION_ID, response.getAnnotationId()))); return responseList; } @@ -298,13 +238,8 @@ public class ManualRedactionController implements ManualRedactionResource { List requests = manualRedactionMapper.toResizeRedactionRequestList(resizeRedactionRequests); List responseList = manualRedactionService.addResizeRedaction(dossierId, fileId, requests, includeUnprocessed); - responseList.forEach(response -> auditPersistenceService.audit(AuditRequest.builder() - .userId(KeycloakSecurity.getUserId()) - .objectId(fileId) - .category(AuditCategory.DOCUMENT.name()) - .message("Skipped redaction was resized to be redacted") - .details(Map.of(DOSSIER_ID, dossierId, FILE_ID, fileId, ANNOTATION_ID, response.getAnnotationId())) - .build())); + responseList.forEach(response -> auditor.audit(AuditCategory.DOCUMENT.name(),"Skipped redaction was resized to be redacted" , + d(AuditDetail.DOSSIER_ID, dossierId), d(AuditDetail.FILE_ID, fileId), d(AuditDetail.ANNOTATION_ID, response.getAnnotationId()))); return responseList; } diff --git a/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/RSSComponentLogController.java b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/RSSComponentLogController.java index 03d9b4915..527ee5e44 100644 --- a/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/RSSComponentLogController.java +++ b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/RSSComponentLogController.java @@ -1,6 +1,7 @@ package com.iqser.red.persistence.service.v1.external.api.impl.controller; import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.GET_RSS; +import static com.knecon.fforesight.auditor.model.Detail.d; import java.util.LinkedHashMap; import java.util.List; @@ -10,6 +11,10 @@ import java.util.Optional; import java.util.Set; import java.util.stream.Collectors; +import com.iqser.red.service.persistence.management.v1.processor.model.audit.AuditCategory; +import com.iqser.red.service.persistence.management.v1.processor.model.audit.AuditDetail; +import com.iqser.red.service.persistence.management.v1.processor.model.audit.AuditDetailAction; +import com.knecon.fforesight.auditor.Auditor; import org.apache.commons.lang3.StringUtils; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.security.access.prepost.PreAuthorize; @@ -20,14 +25,11 @@ import org.springframework.web.bind.annotation.RestController; import com.iqser.red.service.persistence.management.v1.processor.service.ComponentLogService; import com.iqser.red.service.persistence.management.v1.processor.service.ComponentOverrideService; -import com.iqser.red.service.persistence.management.v1.processor.service.persistence.AuditPersistenceService; import com.iqser.red.service.persistence.service.v1.api.external.resource.RSSResource; -import com.iqser.red.service.persistence.service.v1.api.shared.model.AuditCategory; import com.iqser.red.service.persistence.service.v1.api.shared.model.FileStatus; import com.iqser.red.service.persistence.service.v1.api.shared.model.analysislog.componentlog.ComponentLogEntityReference; import com.iqser.red.service.persistence.service.v1.api.shared.model.analysislog.componentlog.ComponentLogEntry; import com.iqser.red.service.persistence.service.v1.api.shared.model.analysislog.componentlog.ComponentLogEntryValue; -import com.iqser.red.service.persistence.service.v1.api.shared.model.audit.AuditRequest; import com.iqser.red.service.persistence.service.v1.api.shared.model.component.ComponentsOverrides; import com.iqser.red.service.persistence.service.v1.api.shared.model.component.RevertOverrideRequest; import com.iqser.red.service.persistence.service.v1.api.shared.model.rss.RSSFileResponse; @@ -36,7 +38,6 @@ import com.iqser.red.service.redaction.report.v1.api.model.rss.DetailedRSSFileRe import com.iqser.red.service.redaction.report.v1.api.model.rss.DetailedRSSResponse; import com.iqser.red.service.redaction.report.v1.api.model.rss.SCMComponent; import com.iqser.red.service.redaction.report.v1.api.model.rss.ScmAnnotation; -import com.knecon.fforesight.keycloakcommons.security.KeycloakSecurity; import lombok.RequiredArgsConstructor; @@ -47,9 +48,9 @@ import lombok.RequiredArgsConstructor; public class RSSComponentLogController implements RSSResource { private final ComponentOverrideService componentOverrideService; - private final AuditPersistenceService auditPersistenceService; private final ComponentLogService componentLogService; private final StatusController statusController; + private final Auditor auditor; @PreAuthorize("hasAuthority('" + GET_RSS + "')") @@ -191,26 +192,11 @@ public class RSSComponentLogController implements RSSResource { Optional component = allComponentLogEntries.stream().filter(c -> c.getName().equals(componentName)).findFirst(); String originalValue = getOriginalValue(component); String value = getValue(component); - auditPersistenceService.audit(AuditRequest.builder() - .userId(KeycloakSecurity.getUserId()) - .objectId(fileId) - .category(AuditCategory.DOCUMENT.name()) - .message("The component is overwritten with value") - .details(Map.of(DOSSIER_ID, - dossierId, - FILE_ID, - fileId, - "ComponentName", - componentName, - "Action", - "MODIFY", - "OriginalValue", - originalValue, - "OldValue", - value, - "NewValue", - overrideValue)) - .build()); + auditor.audit(AuditCategory.DOCUMENT.name(), "The component is overwritten with value", + d(AuditDetail.DOSSIER_ID, dossierId), d(AuditDetail.FILE_ID, fileId), + d(AuditDetail.COMPONENT_NAME, componentName), + d(AuditDetail.ACTION, AuditDetailAction.MODIFY.getID()), + d(AuditDetail.VALUE, value)); } @@ -219,26 +205,11 @@ public class RSSComponentLogController implements RSSResource { Optional component = allComponentLogEntries.stream().filter(c -> c.getName().equals(componentNameToRevert)).findFirst(); String originalValue = getOriginalValue(component); String value = getValue(component); - auditPersistenceService.audit(AuditRequest.builder() - .userId(KeycloakSecurity.getUserId()) - .objectId(fileId) - .category(AuditCategory.DOCUMENT.name()) - .message("The component override for was reverted") - .details(Map.of(DOSSIER_ID, - dossierId, - FILE_ID, - fileId, - "ComponentName", - componentNameToRevert, - "Action", - "REVERT", - "OriginalValue", - originalValue, - "OldValue", - value, - "NewValue", - originalValue)) - .build()); + auditor.audit(AuditCategory.DOCUMENT.name(), "The component is overwritten with value", + d(AuditDetail.DOSSIER_ID, dossierId), d(AuditDetail.FILE_ID, fileId), + d(AuditDetail.COMPONENT_NAME, componentNameToRevert), + d(AuditDetail.ACTION, AuditDetailAction.REVERT.getID()), + d(AuditDetail.VALUE, originalValue)); } diff --git a/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/RSSController.java b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/RSSController.java index 0769dbf3a..665c53fb8 100644 --- a/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/RSSController.java +++ b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/RSSController.java @@ -1,10 +1,18 @@ package com.iqser.red.persistence.service.v1.external.api.impl.controller; -import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.GET_RSS; - -import java.util.Map; -import java.util.stream.Collectors; - +import com.iqser.red.service.persistence.management.v1.processor.client.redactionreportservice.RssReportClient; +import com.iqser.red.service.persistence.management.v1.processor.model.audit.AuditCategory; +import com.iqser.red.service.persistence.management.v1.processor.model.audit.AuditDetail; +import com.iqser.red.service.persistence.management.v1.processor.model.audit.AuditDetailAction; +import com.iqser.red.service.persistence.management.v1.processor.service.ComponentOverrideService; +import com.iqser.red.service.persistence.service.v1.api.external.resource.RSSResource; +import com.iqser.red.service.persistence.service.v1.api.shared.model.component.ComponentsOverrides; +import com.iqser.red.service.persistence.service.v1.api.shared.model.component.RevertOverrideRequest; +import com.iqser.red.service.persistence.service.v1.api.shared.model.rss.RSSFileResponse; +import com.iqser.red.service.persistence.service.v1.api.shared.model.rss.RSSResponse; +import com.iqser.red.service.redaction.report.v1.api.model.rss.DetailedRSSResponse; +import com.knecon.fforesight.auditor.Auditor; +import lombok.RequiredArgsConstructor; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.web.bind.annotation.PathVariable; @@ -12,20 +20,10 @@ import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; -import com.iqser.red.service.persistence.management.v1.processor.client.redactionreportservice.RssReportClient; -import com.iqser.red.service.persistence.management.v1.processor.service.ComponentOverrideService; -import com.iqser.red.service.persistence.management.v1.processor.service.persistence.AuditPersistenceService; -import com.iqser.red.service.persistence.service.v1.api.external.resource.RSSResource; -import com.iqser.red.service.persistence.service.v1.api.shared.model.AuditCategory; -import com.iqser.red.service.persistence.service.v1.api.shared.model.audit.AuditRequest; -import com.iqser.red.service.persistence.service.v1.api.shared.model.component.ComponentsOverrides; -import com.iqser.red.service.persistence.service.v1.api.shared.model.component.RevertOverrideRequest; -import com.iqser.red.service.persistence.service.v1.api.shared.model.rss.RSSFileResponse; -import com.iqser.red.service.persistence.service.v1.api.shared.model.rss.RSSResponse; -import com.iqser.red.service.redaction.report.v1.api.model.rss.DetailedRSSResponse; -import com.knecon.fforesight.keycloakcommons.security.KeycloakSecurity; +import java.util.stream.Collectors; -import lombok.RequiredArgsConstructor; +import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.GET_RSS; +import static com.knecon.fforesight.auditor.model.Detail.d; @Deprecated(forRemoval = true) @RestController @@ -33,10 +31,9 @@ import lombok.RequiredArgsConstructor; @ConditionalOnProperty(name = "application.rss.component-log.enabled", havingValue = "false") public class RSSController implements RSSResource { + private final Auditor auditor; private final RssReportClient rssReportClient; private final ComponentOverrideService componentOverrideService; - private final AuditPersistenceService auditPersistenceService; - @PreAuthorize("hasAuthority('" + GET_RSS + "')") public RSSResponse getRSS(@PathVariable(DOSSIER_ID) String dossierId, @RequestParam(value = "fileId", required = false) String fileId) { @@ -71,32 +68,14 @@ public class RSSController implements RSSResource { @PreAuthorize("hasAuthority('" + GET_RSS + "')") public void addOverrides(@PathVariable(DOSSIER_ID) String dossierId, @PathVariable(FILE_ID) String fileId, @RequestBody ComponentsOverrides componentsOverrides) { - var rssReport = rssReportClient.getDetailedRSS(dossierId, fileId); - var components = rssReport.getFiles().get(0).getResult(); - componentOverrideService.addOverrides(dossierId, fileId, componentsOverrides); componentsOverrides.getComponentOverrides() - .forEach((key, value) -> auditPersistenceService.audit(AuditRequest.builder() - .userId(KeycloakSecurity.getUserId()) - .objectId(fileId) - .category(AuditCategory.DOCUMENT.name()) - .message("The component is overwritten with value") - .details(Map.of(DOSSIER_ID, - dossierId, - FILE_ID, - fileId, - "ComponentName", - key, - "Action", - "MODIFY", - "OriginalValue", - components.get(key).getOriginalValue(), - "OldValue", - components.get(key).getValue() != null ? components.get(key).getValue() : components.get(key).getOriginalValue(), - "NewValue", - value)) - .build())); + .forEach((key, value) -> auditor.audit(AuditCategory.DOCUMENT.name(), "The component is overwritten with value", + d(AuditDetail.DOSSIER_ID, dossierId), d(AuditDetail.FILE_ID, fileId), + d(AuditDetail.COMPONENT_NAME, key), + d(AuditDetail.ACTION, AuditDetailAction.MODIFY.getID()), + d(AuditDetail.VALUE, value))); } @@ -108,7 +87,9 @@ public class RSSController implements RSSResource { @PreAuthorize("hasAuthority('" + GET_RSS + "')") - public void revertOverrides(@PathVariable(DOSSIER_ID) String dossierId, @PathVariable(FILE_ID) String fileId, @RequestBody RevertOverrideRequest revertOverrideRequest) { + public void revertOverrides(@PathVariable(DOSSIER_ID) String dossierId, + @PathVariable(FILE_ID) String fileId, + @RequestBody RevertOverrideRequest revertOverrideRequest) { var rssReport = rssReportClient.getDetailedRSS(dossierId, fileId); var components = rssReport.getFiles().get(0).getResult(); @@ -116,26 +97,11 @@ public class RSSController implements RSSResource { componentOverrideService.revertOverrides(dossierId, fileId, revertOverrideRequest); revertOverrideRequest.getComponents() - .forEach(component -> auditPersistenceService.audit(AuditRequest.builder() - .userId(KeycloakSecurity.getUserId()) - .objectId(fileId) - .category(AuditCategory.DOCUMENT.name()) - .message("The component override for was reverted") - .details(Map.of(DOSSIER_ID, - dossierId, - FILE_ID, - fileId, - "ComponentName", - component, - "Action", - "REVERT", - "OriginalValue", - components.get(component).getOriginalValue(), - "OldValue", - components.get(component).getValue() != null ? components.get(component).getValue() : components.get(component).getOriginalValue(), - "NewValue", - components.get(component).getOriginalValue())) - .build())); + .forEach(component -> auditor.audit(AuditCategory.DOCUMENT.name(), "The component override for was reverted", + d(AuditDetail.DOSSIER_ID, dossierId), d(AuditDetail.FILE_ID, fileId), + d(AuditDetail.COMPONENT_NAME, component), + d(AuditDetail.ACTION, AuditDetailAction.REVERT.getID()), + d(AuditDetail.VALUE, components.get(component).getOriginalValue()))); } } diff --git a/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/ReanalysisController.java b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/ReanalysisController.java index ef8afeb59..b92267848 100644 --- a/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/ReanalysisController.java +++ b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/ReanalysisController.java @@ -1,13 +1,19 @@ package com.iqser.red.persistence.service.v1.external.api.impl.controller; -import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.*; - -import java.util.ArrayList; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; - +import com.google.common.collect.Sets; +import com.iqser.red.service.persistence.management.v1.processor.exception.BadRequestException; +import com.iqser.red.service.persistence.management.v1.processor.exception.NotFoundException; +import com.iqser.red.service.persistence.management.v1.processor.model.audit.AuditCategory; +import com.iqser.red.service.persistence.management.v1.processor.model.audit.AuditDetail; +import com.iqser.red.service.persistence.management.v1.processor.service.AccessControlService; +import com.iqser.red.service.persistence.management.v1.processor.service.FileStatusManagementService; +import com.iqser.red.service.persistence.management.v1.processor.service.ReanalysisService; +import com.iqser.red.service.persistence.service.v1.api.external.resource.ReanalysisResource; +import com.iqser.red.service.persistence.service.v1.api.shared.model.PageExclusionRequest; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.file.WorkflowStatus; +import com.knecon.fforesight.auditor.Auditor; +import feign.FeignException; +import lombok.RequiredArgsConstructor; import org.springframework.security.access.AccessDeniedException; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.web.bind.annotation.PathVariable; @@ -15,31 +21,20 @@ import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; -import com.google.common.collect.Sets; -import com.knecon.fforesight.keycloakcommons.security.KeycloakSecurity; -import com.iqser.red.service.persistence.management.v1.processor.exception.BadRequestException; -import com.iqser.red.service.persistence.management.v1.processor.exception.NotFoundException; -import com.iqser.red.service.persistence.management.v1.processor.service.AccessControlService; -import com.iqser.red.service.persistence.management.v1.processor.service.FileStatusManagementService; -import com.iqser.red.service.persistence.management.v1.processor.service.ReanalysisService; -import com.iqser.red.service.persistence.management.v1.processor.service.persistence.AuditPersistenceService; -import com.iqser.red.service.persistence.service.v1.api.external.resource.ReanalysisResource; -import com.iqser.red.service.persistence.service.v1.api.shared.model.AuditCategory; -import com.iqser.red.service.persistence.service.v1.api.shared.model.PageExclusionRequest; -import com.iqser.red.service.persistence.service.v1.api.shared.model.audit.AuditRequest; -import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.file.WorkflowStatus; +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; -import feign.FeignException; -import lombok.RequiredArgsConstructor; +import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.*; @RestController @RequiredArgsConstructor public class ReanalysisController implements ReanalysisResource { - private static final String DOSSIER_ID = "dossierId"; + private final Auditor auditor; private final ReanalysisService reanalysisService; private final FileStatusManagementService fileStatusManagementService; - private final AuditPersistenceService auditPersistenceService; private final AccessControlService accessControlService; @PreAuthorize("hasAuthority('" + REANALYZE_DOSSIER + "')") @@ -54,12 +49,7 @@ public class ReanalysisController implements ReanalysisResource { accessControlService.verifyUserHasAccessPermissions(dossierId); reanalysisService.reanalyzeDossier(dossierId, force); - auditPersistenceService.audit(AuditRequest.builder() - .userId(KeycloakSecurity.getUserId()) - .objectId(dossierId) - .category(AuditCategory.DOSSIER.name()) - .message("Reanalyse dossier was triggered") - .build()); + auditor.audit(AuditCategory.DOSSIER.name(), "Reanalyse dossier was triggered", AuditDetail.DOSSIER_ID, dossierId); } @@ -69,13 +59,7 @@ public class ReanalysisController implements ReanalysisResource { @RequestParam(value = FORCE_PARAM, required = false, defaultValue = FALSE) boolean force) { reanalysisService.reanalyzeFiles(dossierId, Sets.newHashSet(fileId), force); - auditPersistenceService.audit(AuditRequest.builder() - .userId(KeycloakSecurity.getUserId()) - .objectId(dossierId) - .category(AuditCategory.DOCUMENT.name()) - .message("Reanalyse file was triggered") - .details(Map.of(DOSSIER_ID, dossierId)) - .build()); + auditor.audit(AuditCategory.DOSSIER.name(), "Reanalyse file was triggered", AuditDetail.DOSSIER_ID, dossierId); } @@ -87,13 +71,8 @@ public class ReanalysisController implements ReanalysisResource { reanalysisService.reanalyzeFiles(dossierId, new HashSet<>(fileIds), force); - auditPersistenceService.audit(AuditRequest.builder() - .userId(KeycloakSecurity.getUserId()) - .objectId(dossierId) - .category(AuditCategory.DOCUMENT.name()) - .message("Reanalyse files was triggered") - .details(Map.of(DOSSIER_ID, dossierId, "number", fileIds.size())) - .build()); + auditor.audit(AuditCategory.DOSSIER.name(), "Reanalyse files was triggered", + AuditDetail.DOSSIER_ID, dossierId, AuditDetail.NUMBER, fileIds.size()); } @@ -111,12 +90,7 @@ public class ReanalysisController implements ReanalysisResource { accessControlService.verifyUserHasAccessPermissions(dossierId); reanalysisService.ocrDossier(dossierId); - auditPersistenceService.audit(AuditRequest.builder() - .userId(KeycloakSecurity.getUserId()) - .objectId(dossierId) - .category(AuditCategory.DOSSIER.name()) - .message("OCR and reanalyse dossier was triggered") - .build()); + auditor.audit(AuditCategory.DOSSIER.name(), "OCR and reanalyse dossier was triggered", AuditDetail.NUMBER, dossierId); } @@ -129,13 +103,7 @@ public class ReanalysisController implements ReanalysisResource { validateOCR(dossierId, fileId); reanalysisService.ocrFile(dossierId, fileId, force); - auditPersistenceService.audit(AuditRequest.builder() - .userId(KeycloakSecurity.getUserId()) - .objectId(dossierId) - .category(AuditCategory.DOCUMENT.name()) - .message("OCR and reanalyse file was triggered") - .details(Map.of(DOSSIER_ID, dossierId)) - .build()); + auditor.audit(AuditCategory.DOCUMENT.name(), "OCR and reanalyse file was triggered", AuditDetail.DOSSIER_ID, dossierId); } @@ -146,13 +114,7 @@ public class ReanalysisController implements ReanalysisResource { fileIds.forEach(fileId -> validateOCR(dossierId, fileId)); reanalysisService.ocrFiles(dossierId, fileIds); - auditPersistenceService.audit(AuditRequest.builder() - .userId(KeycloakSecurity.getUserId()) - .objectId(dossierId) - .category(AuditCategory.DOCUMENT.name()) - .message("OCR and reanalyse was triggered") - .details(Map.of(DOSSIER_ID, dossierId, "number", fileIds.size())) - .build()); + auditor.audit(AuditCategory.DOCUMENT.name(), "OCR and reanalyse file was triggered", AuditDetail.DOSSIER_ID, dossierId); } @@ -164,12 +126,9 @@ public class ReanalysisController implements ReanalysisResource { accessControlService.verifyUserIsReviewer(dossierId, fileId); fileStatusManagementService.toggleAutomaticAnalysis(dossierId, fileId, excludedFromAutomaticAnalysis); - auditPersistenceService.audit(AuditRequest.builder() - .userId(KeycloakSecurity.getUserId()) - .objectId(fileId) - .category(AuditCategory.DOCUMENT.name()) - .message("Toggle Exclusion status: File excluded from automatic analysis: " + excludedFromAutomaticAnalysis) - .build()); + auditor.audit(AuditCategory.DOCUMENT.name(), + "Toggle Exclusion status: File excluded from automatic analysis: " + excludedFromAutomaticAnalysis, + AuditDetail.FILE_ID, fileId); } @@ -186,12 +145,8 @@ public class ReanalysisController implements ReanalysisResource { } fileStatusManagementService.toggleExclusion(dossierId, fileId, excluded); - auditPersistenceService.audit(AuditRequest.builder() - .userId(KeycloakSecurity.getUserId()) - .objectId(fileId) - .category(AuditCategory.DOCUMENT.name()) - .message("Toggle Exclusion status: File excluded from analysis: " + excluded) - .build()); + auditor.audit(AuditCategory.DOCUMENT.name(), + "Toggle Exclusion status: File excluded from analysis: " + excluded, AuditDetail.FILE_ID, fileId); } @@ -234,7 +189,9 @@ public class ReanalysisController implements ReanalysisResource { @Override @PreAuthorize("hasAuthority('" + EXCLUDE_INCLUDE_PAGES + "')") - public void excludePages(@PathVariable(DOSSIER_ID) String dossierId, @PathVariable(FILE_ID) String fileId, @RequestBody PageExclusionRequest pageExclusionRequest) { + public void excludePages(@PathVariable(DOSSIER_ID) String dossierId, + @PathVariable(FILE_ID) String fileId, + @RequestBody PageExclusionRequest pageExclusionRequest) { accessControlService.verifyUserIsReviewerOrApprover(dossierId, fileId); @@ -246,12 +203,7 @@ public class ReanalysisController implements ReanalysisResource { } fileStatusManagementService.excludePages(dossierId, fileId, excludedPages); - auditPersistenceService.audit(AuditRequest.builder() - .userId(KeycloakSecurity.getUserId()) - .objectId(fileId) - .category(AuditCategory.DOCUMENT.name()) - .message("Page exclusions added for file") - .build()); + auditor.audit(AuditCategory.DOCUMENT.name(), "Page exclusions added for file", AuditDetail.FILE_ID, fileId); } @@ -270,12 +222,7 @@ public class ReanalysisController implements ReanalysisResource { } fileStatusManagementService.includePages(dossierId, fileId, includePages); - auditPersistenceService.audit(AuditRequest.builder() - .userId(KeycloakSecurity.getUserId()) - .objectId(fileId) - .category(AuditCategory.DOCUMENT.name()) - .message("Page inclusions added for file") - .build()); + auditor.audit(AuditCategory.DOCUMENT.name(), "Page inclusions added for file", AuditDetail.FILE_ID, fileId); } @@ -286,12 +233,7 @@ public class ReanalysisController implements ReanalysisResource { reanalysisService.reindex(dossierId, dropIndex, new HashSet<>(fileIds)); - auditPersistenceService.audit(AuditRequest.builder() - .userId(KeycloakSecurity.getUserId()) - .objectId("redaction") - .category(AuditCategory.INDEX.name()) - .message("Reindexing has been triggered" + (dropIndex ? " (with drop index)." : ".")) - .build()); + auditor.audit(AuditCategory.DOCUMENT.name(), "Reindexing has been triggered" + (dropIndex ? " (with drop index)." : ".")); } diff --git a/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/ReportTemplateController.java b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/ReportTemplateController.java index f99a6f406..934ff0477 100644 --- a/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/ReportTemplateController.java +++ b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/ReportTemplateController.java @@ -1,18 +1,31 @@ package com.iqser.red.persistence.service.v1.external.api.impl.controller; -import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.DELETE_REPORT_TEMPLATE; -import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.DOWNLOAD_REPORT_TEMPLATE; -import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.GET_REPORT_TEMPLATES; -import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.UPLOAD_REPORT_TEMPLATE; -import static com.iqser.red.service.persistence.management.v1.processor.service.FeignExceptionHandler.processFeignException; - -import java.io.ByteArrayInputStream; -import java.io.IOException; -import java.io.InputStream; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - +import com.iqser.red.service.persistence.management.v1.processor.client.redactionreportservice.PlaceholderClient; +import com.iqser.red.service.persistence.management.v1.processor.client.redactionreportservice.ReportTemplatePlaceholderClient; +import com.iqser.red.service.persistence.management.v1.processor.exception.BadRequestException; +import com.iqser.red.service.persistence.management.v1.processor.exception.NotFoundException; +import com.iqser.red.service.persistence.management.v1.processor.model.audit.AuditCategory; +import com.iqser.red.service.persistence.management.v1.processor.model.audit.AuditDetail; +import com.iqser.red.service.persistence.management.v1.processor.service.FileManagementStorageService; +import com.iqser.red.service.persistence.management.v1.processor.service.ReportTemplateService; +import com.iqser.red.service.persistence.management.v1.processor.service.persistence.DossierAttributeConfigPersistenceService; +import com.iqser.red.service.persistence.management.v1.processor.service.persistence.FileAttributeConfigPersistenceService; +import com.iqser.red.service.persistence.management.v1.processor.service.persistence.ReportTemplatePersistenceService; +import com.iqser.red.service.persistence.management.v1.processor.utils.StringEncodingUtils; +import com.iqser.red.service.persistence.service.v1.api.external.resource.ReportTemplateResource; +import com.iqser.red.service.persistence.service.v1.api.shared.model.PlaceholdersResponse; +import com.iqser.red.service.persistence.service.v1.api.shared.model.ReportTemplateUpdateRequest; +import com.iqser.red.service.persistence.service.v1.api.shared.model.common.JSONPrimitive; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.ReportTemplate; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.ReportTemplateUploadRequest; +import com.iqser.red.storage.commons.exception.StorageObjectDoesNotExist; +import com.iqser.red.storage.commons.service.StorageService; +import com.knecon.fforesight.auditor.Auditor; +import com.knecon.fforesight.databasetenantcommons.providers.utils.MagicConverter; +import com.knecon.fforesight.tenantcommons.TenantContext; +import feign.FeignException; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.apache.commons.io.IOUtils; import org.springframework.core.io.InputStreamResource; import org.springframework.http.HttpHeaders; @@ -20,41 +33,17 @@ import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.security.access.prepost.PreAuthorize; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.RequestPart; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; -import com.iqser.red.service.persistence.management.v1.processor.service.FileManagementStorageService; -import com.knecon.fforesight.keycloakcommons.security.KeycloakSecurity; -import com.iqser.red.service.persistence.management.v1.processor.client.redactionreportservice.PlaceholderClient; -import com.iqser.red.service.persistence.management.v1.processor.client.redactionreportservice.ReportTemplatePlaceholderClient; -import com.iqser.red.service.persistence.management.v1.processor.exception.BadRequestException; -import com.iqser.red.service.persistence.management.v1.processor.exception.NotFoundException; -import com.iqser.red.service.persistence.management.v1.processor.service.ReportTemplateService; -import com.iqser.red.service.persistence.management.v1.processor.service.persistence.AuditPersistenceService; -import com.iqser.red.service.persistence.management.v1.processor.service.persistence.DossierAttributeConfigPersistenceService; -import com.iqser.red.service.persistence.management.v1.processor.service.persistence.FileAttributeConfigPersistenceService; -import com.iqser.red.service.persistence.management.v1.processor.service.persistence.ReportTemplatePersistenceService; -import com.knecon.fforesight.databasetenantcommons.providers.utils.MagicConverter; -import com.iqser.red.service.persistence.management.v1.processor.utils.StringEncodingUtils; -import com.iqser.red.service.persistence.service.v1.api.external.resource.ReportTemplateResource; -import com.iqser.red.service.persistence.service.v1.api.shared.model.AuditCategory; -import com.iqser.red.service.persistence.service.v1.api.shared.model.PlaceholdersResponse; -import com.iqser.red.service.persistence.service.v1.api.shared.model.ReportTemplateUpdateRequest; -import com.iqser.red.service.persistence.service.v1.api.shared.model.audit.AuditRequest; -import com.iqser.red.service.persistence.service.v1.api.shared.model.common.JSONPrimitive; -import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.ReportTemplate; -import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.ReportTemplateUploadRequest; -import com.iqser.red.storage.commons.exception.StorageObjectDoesNotExist; -import com.iqser.red.storage.commons.service.StorageService; -import com.knecon.fforesight.tenantcommons.TenantContext; +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.util.ArrayList; +import java.util.List; -import feign.FeignException; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; +import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.*; +import static com.iqser.red.service.persistence.management.v1.processor.service.FeignExceptionHandler.processFeignException; @Slf4j @RestController @@ -62,9 +51,9 @@ import lombok.extern.slf4j.Slf4j; @SuppressWarnings("PMD") public class ReportTemplateController implements ReportTemplateResource { + private final Auditor auditor; private final ReportTemplatePlaceholderClient reportTemplatePlaceholderClient; private final PlaceholderClient placeholderClient; - private final AuditPersistenceService auditPersistenceService; private final DossierAttributeConfigPersistenceService dossierAttributeConfigPersistenceService; private final FileAttributeConfigPersistenceService fileAttributeConfigPersistenceService; private final StorageService storageService; @@ -104,13 +93,8 @@ public class ReportTemplateController implements ReportTemplateResource { .multiFileReport(multiFileReport) .build(); var reportTemplate = reportTemplateService.uploadTemplate(reportTemplateUploadRequest); - auditPersistenceService.audit(AuditRequest.builder() - .userId(KeycloakSecurity.getUserId()) - .objectId(reportTemplate.getTemplateId()) - .category(AuditCategory.DOSSIER_TEMPLATE.name()) - .message("Report template was uploaded.") - .details(Map.of("DossierTemplateId", dossierTemplateId)) - .build()); + auditor.audit(AuditCategory.DOSSIER_TEMPLATE.name(), "Report template was uploaded.", + AuditDetail.TEMPLATE_ID, reportTemplate.getTemplateId(), AuditDetail.DOSSIER_TEMPLATE_ID, dossierTemplateId); return reportTemplate; } else { throw new BadRequestException("Could not upload file, no filename provided."); @@ -168,13 +152,8 @@ public class ReportTemplateController implements ReportTemplateResource { var storageId = reportTemplatePersistenceService.find(templateId).getStorageId(); storageService.deleteObject(TenantContext.getTenantId(), storageId); reportTemplatePersistenceService.delete(templateId); - auditPersistenceService.audit(AuditRequest.builder() - .userId(KeycloakSecurity.getUserId()) - .objectId(templateId) - .category(AuditCategory.DOSSIER_TEMPLATE.name()) - .message("Report template was deleted.") - .details(Map.of("DossierTemplateId", dossierTemplateId)) - .build()); + auditor.audit(AuditCategory.DOSSIER_TEMPLATE.name(), "Report template was deleted.", + AuditDetail.TEMPLATE_ID, templateId, AuditDetail.DOSSIER_TEMPLATE_ID, dossierTemplateId); } diff --git a/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/RulesController.java b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/RulesController.java index 15d585ac0..9d4fdc87a 100644 --- a/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/RulesController.java +++ b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/RulesController.java @@ -1,13 +1,22 @@ package com.iqser.red.persistence.service.v1.external.api.impl.controller; -import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.READ_RULES; -import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.WRITE_RULES; - -import java.io.ByteArrayInputStream; -import java.io.IOException; -import java.io.InputStream; -import java.nio.charset.StandardCharsets; - +import com.iqser.red.service.persistence.management.v1.processor.exception.BadRequestException; +import com.iqser.red.service.persistence.management.v1.processor.exception.FileUploadException; +import com.iqser.red.service.persistence.management.v1.processor.model.audit.AuditCategory; +import com.iqser.red.service.persistence.management.v1.processor.model.audit.AuditDetail; +import com.iqser.red.service.persistence.management.v1.processor.service.RulesValidationService; +import com.iqser.red.service.persistence.management.v1.processor.service.persistence.RulesPersistenceService; +import com.iqser.red.service.persistence.service.v1.api.external.resource.RulesResource; +import com.iqser.red.service.persistence.service.v1.api.shared.model.RuleFileType; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.rules.RuleSyntaxErrorMessage; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.rules.Rules; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.rules.RulesUploadRequest; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.rules.RulesUploadRequestModel; +import com.iqser.red.service.redaction.v1.model.DroolsSyntaxValidation; +import com.knecon.fforesight.auditor.Auditor; +import feign.FeignException; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.springframework.core.io.InputStreamResource; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; @@ -20,25 +29,13 @@ import org.springframework.web.bind.annotation.RequestPart; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartFile; -import com.iqser.red.service.persistence.management.v1.processor.exception.BadRequestException; -import com.iqser.red.service.persistence.management.v1.processor.exception.FileUploadException; -import com.iqser.red.service.persistence.management.v1.processor.service.RulesValidationService; -import com.iqser.red.service.persistence.management.v1.processor.service.persistence.AuditPersistenceService; -import com.iqser.red.service.persistence.management.v1.processor.service.persistence.RulesPersistenceService; -import com.iqser.red.service.persistence.service.v1.api.external.resource.RulesResource; -import com.iqser.red.service.persistence.service.v1.api.shared.model.AuditCategory; -import com.iqser.red.service.persistence.service.v1.api.shared.model.RuleFileType; -import com.iqser.red.service.persistence.service.v1.api.shared.model.audit.AuditRequest; -import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.rules.RuleSyntaxErrorMessage; -import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.rules.Rules; -import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.rules.RulesUploadRequest; -import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.rules.RulesUploadRequestModel; -import com.iqser.red.service.redaction.v1.model.DroolsSyntaxValidation; -import com.knecon.fforesight.keycloakcommons.security.KeycloakSecurity; +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.nio.charset.StandardCharsets; -import feign.FeignException; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; +import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.READ_RULES; +import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.WRITE_RULES; @Slf4j @RestController @@ -47,10 +44,9 @@ public class RulesController implements RulesResource { private static final String DOWNLOAD_FILE_NAME = "rules.drl"; + private final Auditor auditor; private final RulesPersistenceService rulesPersistenceService; private final RulesValidationService rulesValidationService; - private final AuditPersistenceService auditPersistenceService; - @Override @PreAuthorize("hasAuthority('" + WRITE_RULES + "')") @@ -77,12 +73,8 @@ public class RulesController implements RulesResource { } rulesPersistenceService.setRules(rulesUploadRequest.getRules(), rulesUploadRequest.getDossierTemplateId(), rulesUploadRequest.getRuleFileType()); - auditPersistenceService.audit(AuditRequest.builder() - .userId(KeycloakSecurity.getUserId()) - .objectId(rulesUploadRequest.getDossierTemplateId()) - .category(AuditCategory.DOSSIER_TEMPLATE.name()) - .message(String.format("%s Rules have been updated", rulesUploadRequest.getRuleFileType())) - .build()); + auditor.audit(AuditCategory.DOSSIER_TEMPLATE.name(),String.format("%s Rules have been updated", rulesUploadRequest.getRuleFileType()), + AuditDetail.DOSSIER_TEMPLATE_ID, rules.getDossierTemplateId()); return ResponseEntity.ok().build(); } diff --git a/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/StatusController.java b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/StatusController.java index 3e1512e47..9dd5a3978 100644 --- a/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/StatusController.java +++ b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/StatusController.java @@ -4,6 +4,7 @@ import static com.iqser.red.service.persistence.management.v1.processor.roles.Ac import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.SET_REVIEWER; import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.SET_STATUS_APPROVED; import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.SET_STATUS_UNDER_APPROVAL; +import static com.knecon.fforesight.auditor.model.Detail.d; import java.time.OffsetDateTime; import java.util.ArrayList; @@ -14,6 +15,9 @@ import java.util.Map; import java.util.Set; import java.util.stream.Collectors; +import com.iqser.red.service.persistence.management.v1.processor.model.audit.AuditCategory; +import com.iqser.red.service.persistence.management.v1.processor.model.audit.AuditDetail; +import com.iqser.red.service.persistence.service.v1.api.shared.model.AddNotificationRequest; import org.springframework.security.access.AccessDeniedException; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.web.bind.annotation.PathVariable; @@ -29,19 +33,16 @@ import com.iqser.red.service.persistence.management.v1.processor.service.AccessC import com.iqser.red.service.persistence.management.v1.processor.service.DossierManagementService; import com.iqser.red.service.persistence.management.v1.processor.service.FileStatusManagementService; import com.iqser.red.service.persistence.management.v1.processor.service.FileStatusMapper; -import com.iqser.red.service.persistence.management.v1.processor.service.persistence.AuditPersistenceService; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.NotificationPersistenceService; import com.iqser.red.service.persistence.management.v1.processor.service.users.UserService; import com.iqser.red.service.persistence.service.v1.api.external.resource.StatusResource; -import com.iqser.red.service.persistence.service.v1.api.shared.model.AuditCategory; import com.iqser.red.service.persistence.service.v1.api.shared.model.FileStatus; -import com.iqser.red.service.persistence.service.v1.api.shared.model.audit.AddNotificationRequest; -import com.iqser.red.service.persistence.service.v1.api.shared.model.audit.AuditRequest; import com.iqser.red.service.persistence.service.v1.api.shared.model.common.JSONPrimitive; import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.file.FileModel; import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.file.ProcessingStatus; import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.file.WorkflowStatus; import com.iqser.red.service.persistence.service.v1.api.shared.model.notification.NotificationType; +import com.knecon.fforesight.auditor.Auditor; import com.knecon.fforesight.keycloakcommons.security.KeycloakSecurity; import jakarta.transaction.Transactional; @@ -57,10 +58,11 @@ public class StatusController implements StatusResource { private static final String DOSSIER_ID = "dossierId"; private static final String FILE_ID = "fileId"; private static final String FILE_NAME = "fileName"; + + private final Auditor auditor; private final FileStatusManagementService fileStatusManagementService; private final UserService userService; private final DossierManagementService dossierManagementService; - private final AuditPersistenceService auditPersistenceService; private final AccessControlService accessControlService; private final NotificationPersistenceService notificationPersistenceService; private final DossierACLService dossierACLService; @@ -171,21 +173,11 @@ public class StatusController implements StatusResource { fileStatusManagementService.setCurrentFileAssignee(dossierId, fileId, assigneeId); if (assigneeId == null) { - auditPersistenceService.audit(AuditRequest.builder() - .userId(KeycloakSecurity.getUserId()) - .objectId(fileId) - .category(AuditCategory.DOCUMENT.name()) - .message("Reviewer was unassigned from document") - .details(Map.of(DOSSIER_ID, dossierId, FILE_ID, fileId, FILE_NAME, fileStatus.getFilename())) - .build()); + auditor.audit(AuditCategory.DOCUMENT.name(), "Reviewer was unassigned from document", + d(AuditDetail.DOSSIER_ID, dossierId), d(AuditDetail.FILE_ID, fileId), d(AuditDetail.FILE_NAME, fileStatus.getFilename())); } else { - auditPersistenceService.audit(AuditRequest.builder() - .userId(KeycloakSecurity.getUserId()) - .objectId(fileId) - .category(AuditCategory.DOCUMENT.name()) - .message("Reviewer was assigned to document") - .details(Map.of(DOSSIER_ID, dossierId, "reviewer", assigneeId)) - .build()); + auditor.audit(AuditCategory.DOCUMENT.name(), "Reviewer was assigned to document", + d(AuditDetail.DOSSIER_ID, dossierId), d(AuditDetail.FILE_ID, fileId), d(AuditDetail.REVIEWER, assigneeId)); } if (assigneeId != null && !assigneeId.equals(KeycloakSecurity.getUserId())) { @@ -241,13 +233,8 @@ public class StatusController implements StatusResource { var fileStatus = fileStatusManagementService.getFileStatus(fileId); setStatusUnderReviewForFile(dossierId, fileId, assigneeId); - auditPersistenceService.audit(AuditRequest.builder() - .userId(KeycloakSecurity.getUserId()) - .objectId(fileId) - .category(AuditCategory.DOCUMENT.name()) - .message("Document status was changed to Under Review") - .details(Map.of(DOSSIER_ID, dossierId)) - .build()); + auditor.audit(AuditCategory.DOCUMENT.name(), "Document status was changed to Under Review", + AuditDetail.DOSSIER_ID, dossierId, AuditDetail.FILE_ID, fileId); if (assigneeId != null && !assigneeId.equals(KeycloakSecurity.getUserId())) { notificationPersistenceService.insertNotification(AddNotificationRequest.builder() @@ -270,13 +257,8 @@ public class StatusController implements StatusResource { var fileStatus = fileStatusManagementService.getFileStatus(fileId); setStatusUnderApprovalForFile(dossierId, fileId, assigneeId); - auditPersistenceService.audit(AuditRequest.builder() - .userId(KeycloakSecurity.getUserId()) - .objectId(fileId) - .category(AuditCategory.DOCUMENT.name()) - .message("Document status was changed to Under Approval") - .details(Map.of(DOSSIER_ID, dossierId)) - .build()); + auditor.audit(AuditCategory.DOCUMENT.name(), "Document status was changed to Under Approval", + AuditDetail.DOSSIER_ID, dossierId, AuditDetail.FILE_ID, fileId); if (assigneeId != null && !assigneeId.equals(KeycloakSecurity.getUserId())) { @@ -297,13 +279,8 @@ public class StatusController implements StatusResource { accessControlService.verifyUserIsApprover(dossierId); setStatusApprovedForFile(dossierId, fileId); - auditPersistenceService.audit(AuditRequest.builder() - .userId(KeycloakSecurity.getUserId()) - .objectId(fileId) - .category(AuditCategory.DOCUMENT.name()) - .message("Document status was changed to Approved") - .details(Map.of(DOSSIER_ID, dossierId)) - .build()); + + auditor.audit(AuditCategory.DOCUMENT.name(), "Document status was changed to Approved", AuditDetail.DOSSIER_ID, dossierId); var dossier = dossierACLService.enhanceDossierWithACLData(dossierManagementService.getDossierById(dossierId, false, false)); if (!dossier.getOwnerId().equals(KeycloakSecurity.getUserId())) { diff --git a/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/UploadController.java b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/UploadController.java index b0849b3fc..4a2be25a5 100644 --- a/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/UploadController.java +++ b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/UploadController.java @@ -1,18 +1,22 @@ package com.iqser.red.persistence.service.v1.external.api.impl.controller; -import static com.iqser.red.service.persistence.management.v1.processor.service.FeignExceptionHandler.processFeignException; - -import java.io.ByteArrayOutputStream; -import java.io.File; -import java.io.FileInputStream; -import java.io.FileOutputStream; -import java.io.IOException; -import java.util.List; -import java.util.Locale; -import java.util.Map; -import java.util.Set; -import java.util.UUID; - +import com.iqser.red.service.pdftron.redaction.v1.api.model.ByteContentDocument; +import com.iqser.red.service.persistence.management.v1.processor.exception.BadRequestException; +import com.iqser.red.service.persistence.management.v1.processor.model.audit.AuditCategory; +import com.iqser.red.service.persistence.management.v1.processor.model.audit.AuditDetail; +import com.iqser.red.service.persistence.management.v1.processor.service.AccessControlService; +import com.iqser.red.service.persistence.management.v1.processor.service.ReanalysisService; +import com.iqser.red.service.persistence.management.v1.processor.service.UploadService; +import com.iqser.red.service.persistence.management.v1.processor.utils.FileUtils; +import com.iqser.red.service.persistence.service.v1.api.external.resource.UploadResource; +import com.iqser.red.service.persistence.service.v1.api.shared.model.FileUploadResult; +import com.knecon.fforesight.auditor.Auditor; +import feign.FeignException; +import io.micrometer.core.annotation.Timed; +import lombok.AccessLevel; +import lombok.RequiredArgsConstructor; +import lombok.experimental.FieldDefaults; +import lombok.extern.slf4j.Slf4j; import org.apache.commons.compress.archivers.zip.ZipArchiveEntry; import org.apache.commons.compress.archivers.zip.ZipFile; import org.apache.commons.io.IOUtils; @@ -22,25 +26,13 @@ import org.springframework.web.bind.annotation.RequestPart; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartFile; -import com.knecon.fforesight.keycloakcommons.security.KeycloakSecurity; -import com.iqser.red.service.pdftron.redaction.v1.api.model.ByteContentDocument; -import com.iqser.red.service.persistence.management.v1.processor.exception.BadRequestException; -import com.iqser.red.service.persistence.management.v1.processor.service.AccessControlService; -import com.iqser.red.service.persistence.management.v1.processor.service.ReanalysisService; -import com.iqser.red.service.persistence.management.v1.processor.service.UploadService; -import com.iqser.red.service.persistence.management.v1.processor.service.persistence.AuditPersistenceService; -import com.iqser.red.service.persistence.management.v1.processor.utils.FileUtils; -import com.iqser.red.service.persistence.service.v1.api.external.resource.UploadResource; -import com.iqser.red.service.persistence.service.v1.api.shared.model.AuditCategory; -import com.iqser.red.service.persistence.service.v1.api.shared.model.FileUploadResult; -import com.iqser.red.service.persistence.service.v1.api.shared.model.audit.AuditRequest; +import java.io.*; +import java.util.List; +import java.util.Locale; +import java.util.Set; +import java.util.UUID; -import feign.FeignException; -import io.micrometer.core.annotation.Timed; -import lombok.AccessLevel; -import lombok.RequiredArgsConstructor; -import lombok.experimental.FieldDefaults; -import lombok.extern.slf4j.Slf4j; +import static com.iqser.red.service.persistence.management.v1.processor.service.FeignExceptionHandler.processFeignException; @RestController @RequiredArgsConstructor @@ -54,11 +46,10 @@ public class UploadController implements UploadResource { private static final List VALID_FILE_EXTENSIONS = List.of("pdf", "docx", "doc", "xls", "xlsx", "ppt", "pptx"); + private final Auditor auditor; private final UploadService uploadService; private final ReanalysisService reanalysisService; private final AccessControlService accessControlService; - private final AuditPersistenceService auditPersistenceService; - @Timed @Override @@ -104,13 +95,8 @@ public class UploadController implements UploadResource { reanalysisService.importRedactions(ByteContentDocument.builder().dossierId(dossierId).fileId(fileId).document(file.getBytes()).pages(pageInclusionRequest).build()); - auditPersistenceService.audit(AuditRequest.builder() - .userId(KeycloakSecurity.getUserId()) - .objectId(fileId) - .category(AuditCategory.DOCUMENT.name()) - .message("Redactions were imported") - .details(Map.of("dossierId", dossierId)) - .build()); + auditor.audit(AuditCategory.DOCUMENT.name(),"Redactions were imported" , + AuditDetail.DOSSIER_ID, dossierId, AuditDetail.FILE_ID, fileId); } catch (IOException e) { throw new BadRequestException(e.getMessage(), e); } catch (FeignException e) { diff --git a/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/WatermarkController.java b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/WatermarkController.java index 1e5eb88ba..a0b8161dc 100644 --- a/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/WatermarkController.java +++ b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/WatermarkController.java @@ -1,36 +1,32 @@ package com.iqser.red.persistence.service.v1.external.api.impl.controller; -import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.READ_WATERMARK; -import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.WRITE_WATERMARK; - -import java.util.List; - +import com.iqser.red.service.persistence.management.v1.processor.model.audit.AuditCategory; +import com.iqser.red.service.persistence.management.v1.processor.model.audit.AuditDetail; +import com.iqser.red.service.persistence.management.v1.processor.service.WatermarkService; +import com.iqser.red.service.persistence.service.v1.api.external.resource.WatermarkResource; +import com.iqser.red.service.persistence.service.v1.api.shared.model.WatermarkModel; +import com.iqser.red.service.persistence.service.v1.api.shared.model.common.JSONPrimitive; +import com.knecon.fforesight.auditor.Auditor; +import com.knecon.fforesight.databasetenantcommons.providers.utils.MagicConverter; +import com.knecon.fforesight.keycloakcommons.security.KeycloakSecurity; +import lombok.RequiredArgsConstructor; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; -import com.knecon.fforesight.keycloakcommons.security.KeycloakSecurity; -import com.iqser.red.service.persistence.management.v1.processor.service.WatermarkService; -import com.iqser.red.service.persistence.management.v1.processor.service.persistence.AuditPersistenceService; -import com.knecon.fforesight.databasetenantcommons.providers.utils.MagicConverter; -import com.iqser.red.service.persistence.service.v1.api.external.resource.WatermarkResource; -import com.iqser.red.service.persistence.service.v1.api.shared.model.AuditCategory; -import com.iqser.red.service.persistence.service.v1.api.shared.model.WatermarkModel; -import com.iqser.red.service.persistence.service.v1.api.shared.model.audit.AuditRequest; -import com.iqser.red.service.persistence.service.v1.api.shared.model.common.JSONPrimitive; +import java.util.List; -import feign.FeignException; -import lombok.RequiredArgsConstructor; +import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.READ_WATERMARK; +import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.WRITE_WATERMARK; @RestController @RequiredArgsConstructor public class WatermarkController implements WatermarkResource { + private final Auditor auditor; private final WatermarkService watermarkService; - private final AuditPersistenceService auditPersistenceService; - @Override @PreAuthorize("hasAuthority('" + WRITE_WATERMARK + "')") @@ -39,12 +35,7 @@ public class WatermarkController implements WatermarkResource { String userId = KeycloakSecurity.getUserId(); watermark.setCreatedBy(userId); WatermarkModel result = MagicConverter.convert(watermarkService.createOrUpdateWatermark(watermark), WatermarkModel.class); - auditPersistenceService.audit(AuditRequest.builder() - .userId(userId) - .objectId(result.getDossierTemplateId()) - .category(AuditCategory.DOSSIER_TEMPLATE.name()) - .message("Watermark has been changed.") - .build()); + auditor.audit(AuditCategory.DOSSIER_TEMPLATE.name(), "Watermark has been changed.", AuditDetail.DOSSIER_ID, result.getDossierTemplateId()); return result; } @@ -71,12 +62,7 @@ public class WatermarkController implements WatermarkResource { String dossierTemplateId = watermarkService.getWatermark(watermarkId).getDossierTemplateId(); watermarkService.deleteWatermark(watermarkId); - auditPersistenceService.audit(AuditRequest.builder() - .userId(KeycloakSecurity.getUserId()) - .objectId(dossierTemplateId) - .category(AuditCategory.DOSSIER_TEMPLATE.name()) - .message("Watermark has been deleted.") - .build()); + auditor.audit(AuditCategory.DOSSIER_TEMPLATE.name(), "Watermark has been deleted.", AuditDetail.DOSSIER_TEMPLATE_ID, dossierTemplateId); } diff --git a/persistence-service-v1/persistence-service-external-api-impl-v2/src/main/java/com/iqser/red/persistence/service/v2/external/api/impl/controller/DossierTemplateControllerV2.java b/persistence-service-v1/persistence-service-external-api-impl-v2/src/main/java/com/iqser/red/persistence/service/v2/external/api/impl/controller/DossierTemplateControllerV2.java index d666b8909..78fcab8d9 100644 --- a/persistence-service-v1/persistence-service-external-api-impl-v2/src/main/java/com/iqser/red/persistence/service/v2/external/api/impl/controller/DossierTemplateControllerV2.java +++ b/persistence-service-v1/persistence-service-external-api-impl-v2/src/main/java/com/iqser/red/persistence/service/v2/external/api/impl/controller/DossierTemplateControllerV2.java @@ -1,16 +1,29 @@ package com.iqser.red.persistence.service.v2.external.api.impl.controller; -import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.EXPERIMENTAL; -import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.READ_FILE_ATTRIBUTES_CONFIG; -import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.READ_RULES; -import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.WRITE_RULES; - -import java.io.ByteArrayInputStream; -import java.io.InputStream; -import java.nio.charset.StandardCharsets; -import java.util.List; -import java.util.Locale; - +import com.iqser.red.persistence.service.v1.external.api.impl.controller.DossierTemplateController; +import com.iqser.red.persistence.service.v1.external.api.impl.controller.FileAttributesController; +import com.iqser.red.service.persistence.management.v1.processor.exception.BadRequestException; +import com.iqser.red.service.persistence.management.v1.processor.model.audit.AuditCategory; +import com.iqser.red.service.persistence.management.v1.processor.model.audit.AuditDetail; +import com.iqser.red.service.persistence.management.v1.processor.service.RulesValidationService; +import com.iqser.red.service.persistence.management.v1.processor.service.persistence.RulesPersistenceService; +import com.iqser.red.service.persistence.management.v1.processor.utils.StringEncodingUtils; +import com.iqser.red.service.persistence.service.v1.api.shared.model.DossierTemplateModel; +import com.iqser.red.service.persistence.service.v1.api.shared.model.RuleFileType; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.rules.RulesUploadRequest; +import com.iqser.red.service.persistence.service.v2.api.external.model.FileAttributeDefinition; +import com.iqser.red.service.persistence.service.v2.api.external.model.FileAttributeDefinitionList; +import com.iqser.red.service.persistence.service.v2.api.external.model.RulesValidationMessage; +import com.iqser.red.service.persistence.service.v2.api.external.model.RulesValidationResponse; +import com.iqser.red.service.persistence.service.v2.api.external.resource.DossierTemplateResource; +import com.iqser.red.service.redaction.v1.model.DroolsSyntaxValidation; +import com.knecon.fforesight.auditor.Auditor; +import feign.FeignException; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.media.Schema; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.RequiredArgsConstructor; +import lombok.SneakyThrows; import org.springframework.core.io.InputStreamResource; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; @@ -23,32 +36,13 @@ import org.springframework.web.bind.annotation.RequestPart; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartFile; -import com.iqser.red.persistence.service.v1.external.api.impl.controller.DossierTemplateController; -import com.iqser.red.persistence.service.v1.external.api.impl.controller.FileAttributesController; -import com.iqser.red.service.persistence.management.v1.processor.exception.BadRequestException; -import com.iqser.red.service.persistence.management.v1.processor.service.RulesValidationService; -import com.iqser.red.service.persistence.management.v1.processor.service.persistence.AuditPersistenceService; -import com.iqser.red.service.persistence.management.v1.processor.service.persistence.RulesPersistenceService; -import com.iqser.red.service.persistence.management.v1.processor.utils.StringEncodingUtils; -import com.iqser.red.service.persistence.service.v1.api.shared.model.AuditCategory; -import com.iqser.red.service.persistence.service.v1.api.shared.model.DossierTemplateModel; -import com.iqser.red.service.persistence.service.v1.api.shared.model.RuleFileType; -import com.iqser.red.service.persistence.service.v1.api.shared.model.audit.AuditRequest; -import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.rules.RulesUploadRequest; -import com.iqser.red.service.persistence.service.v2.api.external.model.FileAttributeDefinition; -import com.iqser.red.service.persistence.service.v2.api.external.model.FileAttributeDefinitionList; -import com.iqser.red.service.persistence.service.v2.api.external.model.RulesValidationMessage; -import com.iqser.red.service.persistence.service.v2.api.external.model.RulesValidationResponse; -import com.iqser.red.service.persistence.service.v2.api.external.resource.DossierTemplateResource; -import com.iqser.red.service.redaction.v1.model.DroolsSyntaxValidation; -import com.knecon.fforesight.keycloakcommons.security.KeycloakSecurity; +import java.io.ByteArrayInputStream; +import java.io.InputStream; +import java.nio.charset.StandardCharsets; +import java.util.List; +import java.util.Locale; -import feign.FeignException; -import io.swagger.v3.oas.annotations.Parameter; -import io.swagger.v3.oas.annotations.media.Schema; -import io.swagger.v3.oas.annotations.tags.Tag; -import lombok.RequiredArgsConstructor; -import lombok.SneakyThrows; +import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.*; @RestController @RequiredArgsConstructor @@ -60,9 +54,10 @@ public class DossierTemplateControllerV2 implements DossierTemplateResource { private final DossierTemplateController dossierTemplateController; private final RulesPersistenceService rulesPersistenceService; private final RulesValidationService rulesValidationService; - private final AuditPersistenceService auditPersistenceService; private final FileAttributesController fileAttributesController; + private final Auditor auditor; + public List getAllDossierTemplates() { @@ -187,12 +182,9 @@ public class DossierTemplateControllerV2 implements DossierTemplateResource { rulesPersistenceService.setRules(rulesUploadRequest.getRules(), rulesUploadRequest.getDossierTemplateId(), rulesUploadRequest.getRuleFileType()); } - auditPersistenceService.audit(AuditRequest.builder() - .userId(KeycloakSecurity.getUserId()) - .objectId(rulesUploadRequest.getDossierTemplateId()) - .category(AuditCategory.DOSSIER_TEMPLATE.name()) - .message(String.format("%s rules have been %s", rulesUploadRequest.getRuleFileType(), dryRun ? "validated" : "updated")) - .build()); + auditor.audit(AuditCategory.DOSSIER_TEMPLATE.name(), + String.format("%s rules have been %s", rulesUploadRequest.getRuleFileType(), dryRun ? "validated" : "updated"), + AuditDetail.DOSSIER_TEMPLATE_ID, dossierTemplateId); // TODO Add warning and deprecations to response return new ResponseEntity<>(RulesValidationResponse.builder().build(), HttpStatus.OK); diff --git a/persistence-service-v1/persistence-service-external-api-v1/build.gradle.kts b/persistence-service-v1/persistence-service-external-api-v1/build.gradle.kts index 26cf5d88e..e93e63086 100644 --- a/persistence-service-v1/persistence-service-external-api-v1/build.gradle.kts +++ b/persistence-service-v1/persistence-service-external-api-v1/build.gradle.kts @@ -25,6 +25,7 @@ dependencies { api("org.springframework.boot:spring-boot-starter-security:3.1.3") api("org.springframework.boot:spring-boot-starter-validation:3.1.3") api("com.iqser.red.commons:jackson-commons:2.1.0") + api("com.knecon.fforesight:auditor:0.9.0") api(project(":persistence-service-shared-api-v1")) testImplementation("com.iqser.red.commons:test-commons:2.1.0") testImplementation("org.springframework.boot:spring-boot-starter-test:3.0.4") diff --git a/persistence-service-v1/persistence-service-external-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/external/resource/AuditResource.java b/persistence-service-v1/persistence-service-external-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/external/resource/AuditResource.java deleted file mode 100644 index 10c16e426..000000000 --- a/persistence-service-v1/persistence-service-external-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/external/resource/AuditResource.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.iqser.red.service.persistence.service.v1.api.external.resource; - -import java.util.List; - -import org.springframework.http.HttpStatus; -import org.springframework.http.MediaType; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.ResponseBody; -import org.springframework.web.bind.annotation.ResponseStatus; - -import com.iqser.red.service.persistence.service.v1.api.shared.model.AuditResponse; -import com.iqser.red.service.persistence.service.v1.api.shared.model.audit.AuditSearchRequest; -import com.iqser.red.service.persistence.service.v1.api.shared.model.audit.CategoryModel; - -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.responses.ApiResponse; -import io.swagger.v3.oas.annotations.responses.ApiResponses; - -@ResponseStatus(value = HttpStatus.OK) -public interface AuditResource { - - String PATH = ExternalApi.BASE_PATH + "/audit"; - - - @Operation(summary = "Search the audit-log based on some entries the digital signature used to sign PDF's", description = "None") - @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "OK"), @ApiResponse(responseCode = "403", description = "Forbidden.")}) - @ResponseBody - @PostMapping(value = PATH + "/search", produces = MediaType.APPLICATION_JSON_VALUE, consumes = MediaType.APPLICATION_JSON_VALUE) - AuditResponse searchAuditLog(@RequestBody AuditSearchRequest auditSearchRequest); - - - @Operation(summary = "Get a list of available categories for the audit-log", description = "None") - @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "OK"), @ApiResponse(responseCode = "403", description = "Forbidden.")}) - @ResponseBody - @GetMapping(value = PATH + "/categories", produces = MediaType.APPLICATION_JSON_VALUE) - List getAuditCategories(); - -} diff --git a/persistence-service-v1/persistence-service-external-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/external/resource/DownloadResource.java b/persistence-service-v1/persistence-service-external-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/external/resource/DownloadResource.java index 5939dd210..7b2f6c1ef 100644 --- a/persistence-service-v1/persistence-service-external-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/external/resource/DownloadResource.java +++ b/persistence-service-v1/persistence-service-external-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/external/resource/DownloadResource.java @@ -2,7 +2,6 @@ package com.iqser.red.service.persistence.service.v1.api.external.resource; import java.util.concurrent.CompletableFuture; -import org.springframework.core.io.FileSystemResource; import org.springframework.core.io.InputStreamResource; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/audit/AuditEntity.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/audit/AuditEntity.java deleted file mode 100644 index 0b2763e7d..000000000 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/audit/AuditEntity.java +++ /dev/null @@ -1,53 +0,0 @@ -package com.iqser.red.service.persistence.management.v1.processor.entity.audit; - -import java.time.OffsetDateTime; -import java.util.HashMap; -import java.util.Map; - -import jakarta.persistence.Basic; -import jakarta.persistence.Column; -import jakarta.persistence.Convert; -import jakarta.persistence.Entity; -import jakarta.persistence.FetchType; -import jakarta.persistence.GeneratedValue; -import jakarta.persistence.GenerationType; -import jakarta.persistence.Id; -import jakarta.persistence.Table; - -import com.iqser.red.service.persistence.management.v1.processor.utils.JSONMapConverter; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -@Data -@Builder -@NoArgsConstructor -@AllArgsConstructor -@Entity -@Table(name = "audit") -public class AuditEntity { - - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - private long recordId; - - @Column - private OffsetDateTime recordDate; - - @Column - private String objectId; - @Column - private String category; - @Column - private String userId; - @Column(length = 4000) - private String message; - - @Basic(fetch = FetchType.EAGER) - @Column(columnDefinition = "text") - @Convert(converter = JSONMapConverter.class) - private Map details = new HashMap<>(); - -} diff --git a/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/AuditCategory.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/model/audit/AuditCategory.java similarity index 69% rename from persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/AuditCategory.java rename to persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/model/audit/AuditCategory.java index 9e08b3e55..37ce12841 100644 --- a/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/AuditCategory.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/model/audit/AuditCategory.java @@ -1,4 +1,4 @@ -package com.iqser.red.service.persistence.service.v1.api.shared.model; +package com.iqser.red.service.persistence.management.v1.processor.model.audit; public enum AuditCategory { DOSSIER, diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/model/audit/AuditDetail.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/model/audit/AuditDetail.java new file mode 100644 index 000000000..b36ea7b09 --- /dev/null +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/model/audit/AuditDetail.java @@ -0,0 +1,28 @@ +package com.iqser.red.service.persistence.management.v1.processor.model.audit; + +public final class AuditDetail { + + public static final String DOSSIER_TEMPLATE_ID = "dossierTemplateId"; + public static final String DOSSIER_ATTRIBUTE_ID = "dossierAttributeId"; + public static final String DOSSIER_ID = "dossierId"; + public static final String FILE_ATTRIBUTE_NAME = "fileAttributeName"; + public static final String FILE_ATTRIBUTE_ID = "fileAttributeId"; + public static final String FILE_ID = "fileId"; + public static final String FILE_NAME = "fileName"; + public static final String TYPE = "type"; + public static final String SIZE = "size"; + public static final String PAGES = "pages"; + public static final String NUMBER = "number"; + public static final String VALUE = "value"; + public static final String OBJECT_ID = "objectId"; + public static final String USER_ID = "userId"; + public static final String ROLES = "roles"; + public static final String PROFILE = "profile"; + public static final String PROFILE_ACTIVATED = "profileActivated"; + public static final String TEMPLATE_ID = "templateId"; + public static final String ANNOTATION_ID = "annotationId"; + public static final String COMPONENT_NAME = "componentName"; + public static final String ACTION = "action"; + public static final String REVIEWER = "reviewer"; + +} diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/model/audit/AuditDetailAction.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/model/audit/AuditDetailAction.java new file mode 100644 index 000000000..5f25f0b20 --- /dev/null +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/model/audit/AuditDetailAction.java @@ -0,0 +1,17 @@ +package com.iqser.red.service.persistence.management.v1.processor.model.audit; + +public enum AuditDetailAction { + + MODIFY(1), + REVERT(2); + + private int id; + + AuditDetailAction(int id){ + this.id = id; + } + + public int getID(){ + return id; + } +} diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/UploadService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/UploadService.java index a6f83104f..41eb492aa 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/UploadService.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/UploadService.java @@ -1,35 +1,34 @@ package com.iqser.red.service.persistence.management.v1.processor.service; -import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.UPLOAD_FILE; -import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.WRITE_FILE_ATTRIBUTES; - -import java.io.ByteArrayInputStream; -import java.nio.charset.StandardCharsets; -import java.util.Collections; -import java.util.Map; - -import org.springframework.security.access.prepost.PreAuthorize; -import org.springframework.stereotype.Service; - import com.google.common.collect.Lists; import com.google.common.hash.HashFunction; import com.google.common.hash.Hashing; -import com.iqser.red.service.persistence.management.v1.processor.service.persistence.AuditPersistenceService; +import com.iqser.red.service.persistence.management.v1.processor.model.audit.AuditCategory; +import com.iqser.red.service.persistence.management.v1.processor.model.audit.AuditDetail; import com.iqser.red.service.persistence.management.v1.processor.utils.StorageIdUtils; -import com.iqser.red.service.persistence.service.v1.api.shared.model.AuditCategory; import com.iqser.red.service.persistence.service.v1.api.shared.model.FileUploadResult; -import com.iqser.red.service.persistence.service.v1.api.shared.model.audit.AuditRequest; import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.ImportCsvRequest; import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.ImportCsvResponse; import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.file.AddFileRequest; import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.file.FileType; import com.iqser.red.storage.commons.service.StorageService; +import com.knecon.fforesight.auditor.service.AuditingService; import com.knecon.fforesight.keycloakcommons.security.KeycloakSecurity; import com.knecon.fforesight.tenantcommons.TenantContext; import io.micrometer.observation.ObservationRegistry; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.stereotype.Service; + +import java.io.ByteArrayInputStream; +import java.nio.charset.StandardCharsets; +import java.util.Collections; + +import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.UPLOAD_FILE; +import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.WRITE_FILE_ATTRIBUTES; +import static com.knecon.fforesight.auditor.model.Detail.d; @Slf4j @Service @@ -39,22 +38,19 @@ public class UploadService { private final HashFunction hashFunction = Hashing.murmur3_128(); private final FileService fileService; private final DossierManagementService dossierManagementService; - private final AuditPersistenceService auditPersistenceService; private final FileAttributesManagementService fileAttributesManagementService; private final StorageService storageService; private final ObservationRegistry observationRegistry; + private final AuditingService auditingService; + @PreAuthorize("hasAuthority('" + WRITE_FILE_ATTRIBUTES + "')") public FileUploadResult importCsv(String dossierId, byte[] fileContent) { ImportCsvResponse response = fileAttributesManagementService.importCsv(dossierId, new ImportCsvRequest(fileContent)); - auditPersistenceService.audit(AuditRequest.builder() - .userId(KeycloakSecurity.getUserId()) - .objectId(dossierId) - .category(AuditCategory.DOSSIER.name()) - .message("File attributes csv processed.") - .build()); + auditingService.audit(KeycloakSecurity.getUserId(), AuditCategory.DOSSIER.name(), + "File attributes csv processed.", d(AuditDetail.DOSSIER_ID, dossierId)); return FileUploadResult.builder() .processedAttributes(Lists.newArrayList(response.getAffectedFileIds())) @@ -83,13 +79,8 @@ public class UploadService { throw e; } - auditPersistenceService.audit(AuditRequest.builder() - .userId(KeycloakSecurity.getUserId()) - .objectId(dossierId) - .category(AuditCategory.DOSSIER.name()) - .message("File has been uploaded.") - .details(Map.of("fileId", fileId)) - .build()); + auditingService.audit(KeycloakSecurity.getUserId(), AuditCategory.DOSSIER.name(), + "File has been uploaded.", d(AuditDetail.DOSSIER_ID, dossierId), d(AuditDetail.FILE_ID, fileId)); return FileUploadResult.builder().fileIds(Collections.singletonList(fileId)).build(); } diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/download/DownloadPreparationService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/download/DownloadPreparationService.java index 65e583478..ef82b6bb9 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/download/DownloadPreparationService.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/download/DownloadPreparationService.java @@ -22,7 +22,7 @@ import com.iqser.red.service.persistence.management.v1.processor.service.persist import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.DownloadRedactionFileStatusRepository; import com.iqser.red.service.persistence.management.v1.processor.settings.FileManagementServiceSettings; import com.iqser.red.service.persistence.management.v1.processor.utils.FileSystemBackedArchiver; -import com.iqser.red.service.persistence.service.v1.api.shared.model.audit.AddNotificationRequest; +import com.iqser.red.service.persistence.service.v1.api.shared.model.AddNotificationRequest; import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.DownloadFileType; import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.file.FileType; import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.file.WorkflowStatus; diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/manualredactions/ManualRedactionUndoService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/manualredactions/ManualRedactionUndoService.java index d926c4a14..678b76e81 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/manualredactions/ManualRedactionUndoService.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/manualredactions/ManualRedactionUndoService.java @@ -3,6 +3,7 @@ package com.iqser.red.service.persistence.management.v1.processor.service.manual import static com.iqser.red.service.persistence.service.v1.api.external.resource.ManualRedactionResource.ANNOTATION_ID; import static com.iqser.red.service.persistence.service.v1.api.external.resource.ManualRedactionResource.DOSSIER_ID; import static com.iqser.red.service.persistence.service.v1.api.external.resource.ManualRedactionResource.FILE_ID; +import static com.knecon.fforesight.auditor.model.Detail.d; import java.time.OffsetDateTime; import java.util.ArrayList; @@ -14,6 +15,7 @@ import java.util.Map; import java.util.Set; import java.util.stream.Collectors; +import com.iqser.red.service.persistence.management.v1.processor.model.audit.AuditCategory; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -24,7 +26,6 @@ import com.iqser.red.service.persistence.management.v1.processor.exception.NotFo import com.iqser.red.service.persistence.management.v1.processor.service.AnalysisFlagsCalculationService; import com.iqser.red.service.persistence.management.v1.processor.service.EntityLogService; import com.iqser.red.service.persistence.management.v1.processor.service.FileStatusService; -import com.iqser.red.service.persistence.management.v1.processor.service.persistence.AuditPersistenceService; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.DossierPersistenceService; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.annotations.AddRedactionPersistenceService; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.annotations.ForceRedactionPersistenceService; @@ -32,7 +33,6 @@ import com.iqser.red.service.persistence.management.v1.processor.service.persist import com.iqser.red.service.persistence.management.v1.processor.service.persistence.annotations.RecategorizationPersistenceService; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.annotations.RemoveRedactionPersistenceService; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.annotations.ResizeRedactionPersistenceService; -import com.iqser.red.service.persistence.service.v1.api.shared.model.AuditCategory; import com.iqser.red.service.persistence.service.v1.api.shared.model.analysislog.entitylog.EntityLog; import com.iqser.red.service.persistence.service.v1.api.shared.model.analysislog.entitylog.EntityLogEntry; import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.AnnotationStatus; @@ -43,11 +43,10 @@ import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.entitymapped.ManualRecategorization; import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.entitymapped.ManualRedactionEntry; import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.entitymapped.ManualResizeRedaction; -import com.iqser.red.service.persistence.service.v1.api.shared.model.audit.AuditRequest; import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.type.DictionaryEntryType; import com.iqser.red.service.persistence.service.v1.api.shared.model.manual.ManualRedactionWrapperModel; import com.knecon.fforesight.keycloakcommons.security.KeycloakSecurity; - +import com.knecon.fforesight.auditor.service.AuditingService; import lombok.AccessLevel; import lombok.RequiredArgsConstructor; import lombok.experimental.FieldDefaults; @@ -58,7 +57,6 @@ import lombok.experimental.FieldDefaults; public class ManualRedactionUndoService { ManualRedactionProviderService manualRedactionProviderService; - AuditPersistenceService auditPersistenceService; FileStatusService fileStatusService; AnalysisFlagsCalculationService analysisFlagsCalculationService; RecategorizationPersistenceService recategorizationPersistenceService; @@ -71,6 +69,8 @@ public class ManualRedactionUndoService { EntityLogService entityLogService; ManualRedactionDictionaryUpdateHandler manualRedactionDictionaryUpdateHandler; + AuditingService auditingService; + @Transactional public void undo(String dossierId, String fileId, Set annotationIds, boolean includeUnprocessed) { @@ -115,13 +115,8 @@ public class ManualRedactionUndoService { .collect(Collectors.toList()); if (!manualResizeRedactions.isEmpty()) { deleteResizeRedaction(dossierId, fileId, manualResizeRedactions); - manualResizeRedactions.forEach(annotationId -> auditPersistenceService.audit(AuditRequest.builder() - .userId(KeycloakSecurity.getUserId()) - .objectId(fileId) - .category(AuditCategory.DOCUMENT.name()) - .message("Undo of manual resize redaction was done.") - .details(Map.of(DOSSIER_ID, dossierId, FILE_ID, fileId, ANNOTATION_ID, annotationId)) - .build())); + manualResizeRedactions.forEach(annotationId -> auditingService.audit(KeycloakSecurity.getUserId(), AuditCategory.DOCUMENT.name(), + "Undo of manual resize redaction was done.", d(DOSSIER_ID, dossierId), d(FILE_ID, fileId), d(ANNOTATION_ID, annotationId))); } } @@ -146,13 +141,8 @@ public class ManualRedactionUndoService { if (!manualLegalBasisChanges.isEmpty()) { deleteLegalBasisChange(dossierId, fileId, manualLegalBasisChanges); - manualLegalBasisChanges.forEach(annotationId -> auditPersistenceService.audit(AuditRequest.builder() - .userId(KeycloakSecurity.getUserId()) - .objectId(fileId) - .category(AuditCategory.DOCUMENT.name()) - .message("Undo of legal basis change was done.") - .details(Map.of(DOSSIER_ID, dossierId, FILE_ID, fileId, ANNOTATION_ID, annotationId)) - .build())); + manualLegalBasisChanges.forEach(annotationId -> auditingService.audit(KeycloakSecurity.getUserId(), AuditCategory.DOCUMENT.name(), + "Undo of legal basis change was done.", d(DOSSIER_ID, dossierId), d(FILE_ID, fileId), d(ANNOTATION_ID, annotationId))); } } @@ -177,13 +167,9 @@ public class ManualRedactionUndoService { if (!manualImageRecategorizations.isEmpty()) { deleteRecategorization(dossierId, fileId, manualImageRecategorizations, includeUnprocessed); - manualImageRecategorizations.forEach(annotationId -> auditPersistenceService.audit(AuditRequest.builder() - .userId(KeycloakSecurity.getUserId()) - .objectId(fileId) - .category(AuditCategory.DOCUMENT.name()) - .message("Undo of manual image recategorization was done.") - .details(Map.of(DOSSIER_ID, dossierId, FILE_ID, fileId, ANNOTATION_ID, annotationId)) - .build())); + manualImageRecategorizations.forEach(annotationId -> auditingService.audit(KeycloakSecurity.getUserId(), AuditCategory.DOCUMENT.name(), + "Undo of manual image recategorization was done.", d(DOSSIER_ID, dossierId), d(FILE_ID, fileId), d(ANNOTATION_ID, annotationId))); + } } @@ -219,13 +205,8 @@ public class ManualRedactionUndoService { if (!manualForceRedactions.isEmpty()) { deleteForceRedaction(dossierId, fileId, manualForceRedactions); - manualForceRedactions.forEach(annotationId -> auditPersistenceService.audit(AuditRequest.builder() - .userId(KeycloakSecurity.getUserId()) - .objectId(fileId) - .category(AuditCategory.DOCUMENT.name()) - .message("Undo of manual force redaction was done.") - .details(Map.of(DOSSIER_ID, dossierId, FILE_ID, fileId, ANNOTATION_ID, annotationId)) - .build())); + manualForceRedactions.forEach(annotationId -> auditingService.audit(KeycloakSecurity.getUserId(), AuditCategory.DOCUMENT.name(), + "Undo of manual force redaction was done.", d(DOSSIER_ID, dossierId), d(FILE_ID, fileId), d(ANNOTATION_ID, annotationId))); } } @@ -251,13 +232,8 @@ public class ManualRedactionUndoService { .collect(Collectors.toList()); if (!idRemovals.isEmpty()) { deleteRemoveRedaction(dossierId, fileId, idRemovals); - idRemovals.forEach(annotationId -> auditPersistenceService.audit(AuditRequest.builder() - .userId(KeycloakSecurity.getUserId()) - .objectId(fileId) - .category(AuditCategory.DOCUMENT.name()) - .message("Undo of manual remove redaction was done.") - .details(Map.of(DOSSIER_ID, dossierId, FILE_ID, fileId, ANNOTATION_ID, annotationId)) - .build())); + idRemovals.forEach(annotationId -> auditingService.audit(KeycloakSecurity.getUserId(), AuditCategory.DOCUMENT.name(), + "Undo of manual remove redaction was done.", d(DOSSIER_ID, dossierId), d(FILE_ID, fileId), d(ANNOTATION_ID, annotationId))); } } @@ -289,13 +265,8 @@ public class ManualRedactionUndoService { .collect(Collectors.toList()); if (!manualRedactionEntries.isEmpty()) { deleteAddRedaction(dossierId, fileId, manualRedactionEntries); - manualRedactionEntries.forEach(annotationId -> auditPersistenceService.audit(AuditRequest.builder() - .userId(KeycloakSecurity.getUserId()) - .objectId(fileId) - .category(AuditCategory.DOCUMENT.name()) - .message("Undo of manual add redaction was done.") - .details(Map.of(DOSSIER_ID, dossierId, FILE_ID, fileId, ANNOTATION_ID, annotationId)) - .build())); + manualRedactionEntries.forEach(annotationId -> auditingService.audit(KeycloakSecurity.getUserId(), AuditCategory.DOCUMENT.name(), + "Undo of manual add redaction was done.", d(DOSSIER_ID, dossierId), d(FILE_ID, fileId), d(ANNOTATION_ID, annotationId))); } } diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/AuditPersistenceService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/AuditPersistenceService.java deleted file mode 100644 index 574303499..000000000 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/AuditPersistenceService.java +++ /dev/null @@ -1,91 +0,0 @@ -package com.iqser.red.service.persistence.management.v1.processor.service.persistence; - -import static com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.AuditRepository.categoryMatches; -import static com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.AuditRepository.dateBetween; -import static com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.AuditRepository.objectIdMatches; -import static com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.AuditRepository.userMatches; - -import java.time.OffsetDateTime; -import java.time.temporal.ChronoUnit; -import java.util.List; - -import io.micrometer.observation.annotation.Observed; -import jakarta.transaction.Transactional; - -import org.springframework.beans.BeanUtils; -import org.springframework.data.domain.Page; -import org.springframework.data.domain.PageRequest; -import org.springframework.data.domain.Sort; -import org.springframework.data.jpa.domain.Specification; -import org.springframework.stereotype.Service; - -import com.iqser.red.service.persistence.management.v1.processor.entity.audit.AuditEntity; -import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.AuditRepository; -import com.iqser.red.service.persistence.service.v1.api.shared.model.audit.AuditRequest; -import com.iqser.red.service.persistence.service.v1.api.shared.model.audit.AuditSearchRequest; -import com.iqser.red.service.persistence.service.v1.api.shared.model.audit.CategoryModel; - -import lombok.RequiredArgsConstructor; -import lombok.SneakyThrows; - -@Service -@RequiredArgsConstructor -public class AuditPersistenceService { - - private final AuditRepository auditRepository; - - - @Observed(name = "AuditPersistenceService", contextualName = "audit") - public void audit(AuditRequest auditRequest) { - - insertRecord(auditRequest); - } - - - @SneakyThrows - public void insertRecord(AuditRequest auditRequest) { - - var auditModel = new AuditEntity(); - BeanUtils.copyProperties(auditRequest, auditModel); - auditModel.setRecordDate(OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS)); - - auditRepository.save(auditModel); - - } - - - public List getCategories() { - - return auditRepository.findCategories(); - - } - - - public Page search(AuditSearchRequest auditRequest) { - - if (auditRequest.getPageSize() == 0) { - auditRequest.setPageSize(50); - } - - if (auditRequest.getFrom() == null) { - auditRequest.setFrom(OffsetDateTime.now().minusYears(30).truncatedTo(ChronoUnit.MILLIS)); - } - if (auditRequest.getTo() == null) { - auditRequest.setTo(OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS)); - } - - var spec = Specification.where(dateBetween(auditRequest.getFrom(), auditRequest.getTo())); - if (auditRequest.getCategory() != null) { - spec = spec.and(categoryMatches(auditRequest.getCategory())); - } - if (auditRequest.getUserId() != null) { - spec = spec.and(userMatches(auditRequest.getUserId())); - } - if (auditRequest.getObjectId() != null) { - spec = spec.and(objectIdMatches(auditRequest.getObjectId())); - } - - return auditRepository.findAll(spec, PageRequest.of(auditRequest.getPage(), auditRequest.getPageSize(), Sort.Direction.DESC, "recordDate")); - } - -} diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/NotificationEmailService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/NotificationEmailService.java index c6d178f24..503265f9a 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/NotificationEmailService.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/NotificationEmailService.java @@ -13,7 +13,6 @@ import lombok.extern.slf4j.Slf4j; @Slf4j @Service @RequiredArgsConstructor -@SuppressWarnings("PMD") public class NotificationEmailService { public void sendNotificationEmail(String userId, EmailNotificationType emailNotificationType, List notifications) { @@ -32,21 +31,21 @@ public class NotificationEmailService { private void sendDailyEmail(String userId, List notifications) { - log.info("Should send daily notification email for {}", userId); + log.info("Should send daily notification emails {} for {}", notifications, userId); // TODO } private void sendDailySummaryEmail(String userId, List notifications) { - log.info("Should send daily notification summary email for {}", userId); + log.info("Should send daily notification summary email {} for {}", notifications, userId); // TODO } private void sendWeeklySummaryEmail(String userId, List notifications) { - log.info("Should send weekly notification summary email for {}", userId); + log.info("Should send weekly notification summary email {} for {}", notifications, userId); // TODO } diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/NotificationPersistenceService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/NotificationPersistenceService.java index e6a4940d8..2ec22b112 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/NotificationPersistenceService.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/NotificationPersistenceService.java @@ -4,6 +4,7 @@ import java.time.OffsetDateTime; import java.time.temporal.ChronoUnit; import java.util.List; +import com.iqser.red.service.persistence.service.v1.api.shared.model.AddNotificationRequest; import jakarta.transaction.Transactional; import org.springframework.beans.BeanUtils; @@ -12,7 +13,6 @@ import org.springframework.stereotype.Service; import com.iqser.red.service.persistence.management.v1.processor.entity.notification.NotificationEntity; import com.iqser.red.service.persistence.management.v1.processor.exception.NotFoundException; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.NotificationRepository; -import com.iqser.red.service.persistence.service.v1.api.shared.model.audit.AddNotificationRequest; import com.iqser.red.service.persistence.service.v1.api.shared.model.notification.EmailNotificationType; import lombok.RequiredArgsConstructor; diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/AuditRepository.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/AuditRepository.java deleted file mode 100644 index 96bf4e592..000000000 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/AuditRepository.java +++ /dev/null @@ -1,43 +0,0 @@ -package com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository; - -import java.time.OffsetDateTime; -import java.util.List; - -import org.springframework.data.jpa.domain.Specification; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.data.jpa.repository.JpaSpecificationExecutor; -import org.springframework.data.jpa.repository.Query; - -import com.iqser.red.service.persistence.management.v1.processor.entity.audit.AuditEntity; -import com.iqser.red.service.persistence.service.v1.api.shared.model.audit.CategoryModel; - -public interface AuditRepository extends JpaRepository, JpaSpecificationExecutor { - - static Specification categoryMatches(String category) { - - return (audit, cq, cb) -> cb.equal(audit.get("category"), category); - } - - - static Specification userMatches(String user) { - - return (audit, cq, cb) -> cb.equal(audit.get("userId"), user); - } - - - static Specification objectIdMatches(String objectId) { - - return (audit, cq, cb) -> cb.equal(audit.get("objectId"), objectId); - } - - - static Specification dateBetween(OffsetDateTime start, OffsetDateTime end) { - - return (audit, cq, cb) -> cb.between(audit.get("recordDate"), start, end); - } - - - @Query("SELECT new com.iqser.red.service.persistence.service.v1.api.shared.model.audit.CategoryModel(a.category, count(a)) FROM AuditEntity a GROUP BY a.category") - List findCategories(); - -} diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/users/UserService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/users/UserService.java index e69e3d488..b37f49b49 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/users/UserService.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/users/UserService.java @@ -1,50 +1,35 @@ package com.iqser.red.service.persistence.management.v1.processor.service.users; -import static com.iqser.red.service.persistence.management.v1.processor.configuration.UserMessagingConfiguration.PERSISTENCE_SERVICE_USER_CREATED_QUEUE; -import static com.iqser.red.service.persistence.management.v1.processor.configuration.UserMessagingConfiguration.PERSISTENCE_SERVICE_USER_DELETED_QUEUE; -import static com.iqser.red.service.persistence.management.v1.processor.configuration.UserMessagingConfiguration.PERSISTENCE_SERVICE_USER_OWN_PROFILE_UPDATED_QUEUE; -import static com.iqser.red.service.persistence.management.v1.processor.configuration.UserMessagingConfiguration.PERSISTENCE_SERVICE_USER_ROLES_UPDATED_QUEUE; -import static com.iqser.red.service.persistence.management.v1.processor.configuration.UserMessagingConfiguration.PERSISTENCE_SERVICE_USER_STATUS_CHANGED_QUEUE; -import static com.iqser.red.service.persistence.management.v1.processor.configuration.UserMessagingConfiguration.PERSISTENCE_SERVICE_USER_UPDATED_QUEUE; -import static com.iqser.red.service.persistence.management.v1.processor.roles.ApplicationRoles.RED_MANAGER_ROLE; -import static com.iqser.red.service.persistence.management.v1.processor.roles.ApplicationRoles.RED_USER_ROLE; - -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Optional; -import java.util.Set; -import java.util.stream.Collectors; - -import org.springframework.amqp.rabbit.annotation.RabbitListener; -import org.springframework.stereotype.Service; - import com.google.common.collect.Lists; import com.iqser.red.service.persistence.management.v1.processor.acl.custom.dossier.DossierACLService; import com.iqser.red.service.persistence.management.v1.processor.acl.custom.service.CustomPermissionService; import com.iqser.red.service.persistence.management.v1.processor.client.tenantusermanagementservice.UsersClient; +import com.iqser.red.service.persistence.management.v1.processor.model.audit.AuditCategory; +import com.iqser.red.service.persistence.management.v1.processor.model.audit.AuditDetail; import com.iqser.red.service.persistence.management.v1.processor.service.DossierManagementService; import com.iqser.red.service.persistence.management.v1.processor.service.FileStatusManagementService; -import com.iqser.red.service.persistence.management.v1.processor.service.persistence.AuditPersistenceService; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.NotificationPersistenceService; -import com.iqser.red.service.persistence.management.v1.processor.service.users.events.UserCreatedEvent; -import com.iqser.red.service.persistence.management.v1.processor.service.users.events.UserRemovedEvent; -import com.iqser.red.service.persistence.management.v1.processor.service.users.events.UserRolesUpdatedEvent; -import com.iqser.red.service.persistence.management.v1.processor.service.users.events.UserStatusToggleEvent; -import com.iqser.red.service.persistence.management.v1.processor.service.users.events.UserUpdatedEvent; -import com.iqser.red.service.persistence.management.v1.processor.service.users.events.UserUpdatedOwnProfileEvent; +import com.iqser.red.service.persistence.management.v1.processor.service.users.events.*; import com.iqser.red.service.persistence.management.v1.processor.service.users.model.User; -import com.iqser.red.service.persistence.service.v1.api.shared.model.AuditCategory; -import com.iqser.red.service.persistence.service.v1.api.shared.model.audit.AddNotificationRequest; -import com.iqser.red.service.persistence.service.v1.api.shared.model.audit.AuditRequest; +import com.iqser.red.service.persistence.service.v1.api.shared.model.AddNotificationRequest; import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.CreateOrUpdateDossierRequest; import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.Dossier; import com.iqser.red.service.persistence.service.v1.api.shared.model.notification.NotificationType; +import com.knecon.fforesight.auditor.service.AuditingService; import com.knecon.fforesight.keycloakcommons.security.KeycloakSecurity; - import jakarta.validation.constraints.NotNull; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.springframework.amqp.rabbit.annotation.RabbitListener; +import org.springframework.stereotype.Service; + +import java.util.*; +import java.util.stream.Collectors; + +import static com.iqser.red.service.persistence.management.v1.processor.configuration.UserMessagingConfiguration.*; +import static com.iqser.red.service.persistence.management.v1.processor.roles.ApplicationRoles.RED_MANAGER_ROLE; +import static com.iqser.red.service.persistence.management.v1.processor.roles.ApplicationRoles.RED_USER_ROLE; +import static com.knecon.fforesight.auditor.model.Detail.d; @Slf4j @Service @@ -53,23 +38,19 @@ public class UserService { private final DossierManagementService dossierManagementService; private final FileStatusManagementService fileStatusManagementService; - private final AuditPersistenceService auditPersistenceService; private final NotificationPersistenceService notificationPersistenceService; private final DossierACLService dossierACLService; private final CustomPermissionService customPermissionService; private final UsersClient usersClient; + private final AuditingService auditingService; @RabbitListener(queues = PERSISTENCE_SERVICE_USER_CREATED_QUEUE) public void userCreated(UserCreatedEvent user) { - auditPersistenceService.audit(AuditRequest.builder() - .userId(user.getCreatingUserId()) - .objectId(user.getUser().getUserId()) - .category(AuditCategory.USER.name()) - .message("User created") - .build()); + auditingService.audit(user.getCreatingUserId(), AuditCategory.USER.name(), + "User created", d(AuditDetail.USER_ID, user.getUser().getUserId())); customPermissionService.syncAllCustomPermissions(); @@ -91,13 +72,9 @@ public class UserService { removeUserFromDossiers(userRolesUpdatedEvent.getUser().getUserId(), UserRemovalModel.REMOVE_USER); } - auditPersistenceService.audit(AuditRequest.builder() - .userId(userRolesUpdatedEvent.getModifyingUserId()) - .objectId(userRolesUpdatedEvent.getUser().getUserId()) - .category(AuditCategory.USER.name()) - .message("Roles updated for user") - .details(Map.of("CurrentRoles", newRoles)) - .build()); + auditingService.audit(userRolesUpdatedEvent.getModifyingUserId(), AuditCategory.USER.name(), + "Roles updated for user", d(AuditDetail.USER_ID, userRolesUpdatedEvent.getUser().getUserId()), + d(AuditDetail.ROLES, String.join(", ", newRoles))); } @@ -158,13 +135,10 @@ public class UserService { @RabbitListener(queues = PERSISTENCE_SERVICE_USER_OWN_PROFILE_UPDATED_QUEUE) public void myProfileUpdated(UserUpdatedOwnProfileEvent userUpdatedOwnProfileEvent) { - auditPersistenceService.audit(AuditRequest.builder() - .userId(userUpdatedOwnProfileEvent.getUser().getUserId()) - .objectId(userUpdatedOwnProfileEvent.getUser().getUserId()) - .category(AuditCategory.USER.name()) - .message("Profile updated for user") - .details(Map.of("Profile", userUpdatedOwnProfileEvent.getUser())) - .build()); + auditingService.audit(userUpdatedOwnProfileEvent.getUser().getUserId(), AuditCategory.USER.name(), + "Profile updated for user", + d(AuditDetail.USER_ID, userUpdatedOwnProfileEvent.getUser().getUserId()), + d(AuditDetail.PROFILE, userUpdatedOwnProfileEvent.getUser().toString())); } @RabbitListener(queues = PERSISTENCE_SERVICE_USER_DELETED_QUEUE) @@ -174,12 +148,8 @@ public class UserService { customPermissionService.syncAllCustomPermissions(); - auditPersistenceService.audit(AuditRequest.builder() - .userId(userRemovedEvent.getDeletingUserId()) - .objectId(userRemovedEvent.getUser().getUserId()) - .category(AuditCategory.USER.name()) - .message("User removed") - .build()); + auditingService.audit(userRemovedEvent.getDeletingUserId(), AuditCategory.USER.name(), + "User removed", d(AuditDetail.USER_ID, userRemovedEvent.getUser().getUserId())); } @@ -198,7 +168,7 @@ public class UserService { removeUserFromDossiers(userId, UserRemovalModel.PERMANENT); - auditPersistenceService.audit(AuditRequest.builder().objectId(userId).category(AuditCategory.USER.name()).message("User removed automatically").build()); + auditingService.audit(AuditCategory.USER.name(),"User removed automatically", d(AuditDetail.USER_ID, userId)); deletedUsers.add(userId); } } @@ -211,26 +181,20 @@ public class UserService { @RabbitListener(queues = PERSISTENCE_SERVICE_USER_UPDATED_QUEUE) public void userUpdated(UserUpdatedEvent userUpdatedEvent) { - auditPersistenceService.audit(AuditRequest.builder() - .userId(userUpdatedEvent.getModifyingUserId()) - .objectId(userUpdatedEvent.getUser().getUserId()) - .category(AuditCategory.USER.name()) - .message("Profile updated for user") - .details(Map.of("Profile", userUpdatedEvent.getUser())) - .build()); + auditingService.audit(userUpdatedEvent.getModifyingUserId(), AuditCategory.USER.name(), + "Profile updated for user", + d(AuditDetail.USER_ID, userUpdatedEvent.getModifyingUserId()), + d(AuditDetail.PROFILE, userUpdatedEvent.getUser().toString())); } @RabbitListener(queues = PERSISTENCE_SERVICE_USER_STATUS_CHANGED_QUEUE) public void userStatusToggled(UserStatusToggleEvent userStatusToggleEvent) { - auditPersistenceService.audit(AuditRequest.builder() - .userId(userStatusToggleEvent.getModifyingUserId()) - .objectId(userStatusToggleEvent.getUser().getUserId()) - .category(AuditCategory.USER.name()) - .message("Profile activated/deactivated for user") - .details(Map.of("Profile activated", userStatusToggleEvent.getUser().isActive())) - .build()); + auditingService.audit(userStatusToggleEvent.getModifyingUserId(), AuditCategory.USER.name(), + "Profile activated/deactivated for user", + d(AuditDetail.USER_ID, userStatusToggleEvent.getUser().getUserId()), + d(AuditDetail.PROFILE_ACTIVATED, userStatusToggleEvent.getUser().isActive())); } diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/users/model/User.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/users/model/User.java index 40338067e..375aed8fe 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/users/model/User.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/users/model/User.java @@ -4,15 +4,13 @@ import java.io.Serializable; import java.util.Set; import java.util.TreeSet; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; +import lombok.*; @Data @Builder @NoArgsConstructor @AllArgsConstructor +@ToString public class User implements Serializable { private String userId; diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/db.changelog-tenant.yaml b/persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/db.changelog-tenant.yaml index bd46690d2..78390398e 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/db.changelog-tenant.yaml +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/db.changelog-tenant.yaml @@ -173,3 +173,9 @@ databaseChangeLog: file: db/changelog/tenant/115-add-saas-migration-status-table.yaml - include: file: db/changelog/tenant/116-fix-null-fields-in-manual-redaction-table.yaml + - include: + file: db/changelog/tenant/117-rename-audit-table.yaml + - include: + file: db/changelog/tenant/118-rename-audit-pkey-constraint.sql + - include: + file: db/changelog/tenant/119-rename-audit-record-id-sequence.sql diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/tenant/117-rename-audit-table.yaml b/persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/tenant/117-rename-audit-table.yaml new file mode 100644 index 000000000..93e1d4990 --- /dev/null +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/tenant/117-rename-audit-table.yaml @@ -0,0 +1,8 @@ +databaseChangeLog: + - changeSet: + id: rename-audit-table + author: hane + changes: + - renameTable: + newTableName: old_audit + oldTableName: audit diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/tenant/118-rename-audit-pkey-constraint.sql b/persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/tenant/118-rename-audit-pkey-constraint.sql new file mode 100644 index 000000000..0abd00d7f --- /dev/null +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/tenant/118-rename-audit-pkey-constraint.sql @@ -0,0 +1 @@ +ALTER TABLE old_audit RENAME CONSTRAINT audit_pkey TO old_audit_pkey; diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/tenant/119-rename-audit-record-id-sequence.sql b/persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/tenant/119-rename-audit-record-id-sequence.sql new file mode 100644 index 000000000..10caabc42 --- /dev/null +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/tenant/119-rename-audit-record-id-sequence.sql @@ -0,0 +1 @@ +ALTER SEQUENCE audit_record_id_seq RENAME TO old_audit_record_id_seq; diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/tenant/sql/301-migrate-audit-data.sql b/persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/tenant/sql/301-migrate-audit-data.sql new file mode 100644 index 000000000..dbacc5d30 --- /dev/null +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/resources/db/changelog/tenant/sql/301-migrate-audit-data.sql @@ -0,0 +1,127 @@ +INSERT INTO audit (record_date, message, category, user_id) +SELECT record_date, message, category, user_id from old_audit; + +UPDATE audit +SET + string_prop_value1 = object_id, + string_prop_name1 = 'object_id', + string_prop_value2 = ( + SELECT left(value::text, 1024) +FROM json_each(old_audit.details::json) +WHERE json_typeof(value)='string' or json_typeof(value)='array' or json_typeof(value)='object' + LIMIT 1 + ), + string_prop_name2 = ( +SELECT key +FROM json_each(old_audit.details::json) +WHERE json_typeof(value)='string' or json_typeof(value)='array' or json_typeof(value)='object' + LIMIT 1 + ), + string_prop_value3 = ( +SELECT left(value::text, 1024) +FROM json_each(old_audit.details::json) +WHERE json_typeof(value)='string' or json_typeof(value)='array' or json_typeof(value)='object' +OFFSET 1 + LIMIT 1 + ), + string_prop_name3 = ( +SELECT key +FROM json_each(old_audit.details::json) +WHERE json_typeof(value)='string' or json_typeof(value)='array' or json_typeof(value)='object' +OFFSET 1 + LIMIT 1 + ), + string_prop_value4 = ( +SELECT left(value::text, 1024) +FROM json_each(old_audit.details::json) +WHERE json_typeof(value)='string' or json_typeof(value)='array' or json_typeof(value)='object' +OFFSET 2 + LIMIT 1 + ), + string_prop_name4 = ( +SELECT key +FROM json_each(old_audit.details::json) +WHERE json_typeof(value)='string' or json_typeof(value)='array' or json_typeof(value)='object' +OFFSET 2 + LIMIT 1 + ) +FROM old_audit +WHERE old_audit.record_date = audit.record_date and old_audit.message = audit.message; + + +UPDATE audit +SET + numeric_prop_value1 = ( + SELECT value::text::BIGINT + FROM json_each(old_audit.details::json) + WHERE json_typeof(value)='number' + LIMIT 1 + ), + numeric_prop_name1 = ( +SELECT key +FROM json_each(old_audit.details::json) +WHERE json_typeof(value)='number' + LIMIT 1 + ), + numeric_prop_value2 = ( +SELECT value::text::BIGINT +FROM json_each(old_audit.details::json) +WHERE json_typeof(value)='number' +OFFSET 1 + LIMIT 1 + ), + numeric_prop_name2 = ( +SELECT key +FROM json_each(old_audit.details::json) +WHERE json_typeof(value)='number' +OFFSET 1 + LIMIT 1 + ), + numeric_prop_value3 = ( +SELECT value::text::BIGINT +FROM json_each(old_audit.details::json) +WHERE json_typeof(value)='number' +OFFSET 2 + LIMIT 1 + ), + numeric_prop_name3 = ( +SELECT key +FROM json_each(old_audit.details::json) +WHERE json_typeof(value)='number' +OFFSET 2 + LIMIT 1 + ) +FROM old_audit +WHERE old_audit.record_date = audit.record_date and old_audit.message = audit.message; + + +UPDATE audit +SET + boolean_prop_value1 = ( + SELECT value::text::boolean + FROM json_each(old_audit.details::json) + WHERE json_typeof(value)='boolean' + LIMIT 1 + ), + boolean_prop_name1 = ( +SELECT key +FROM json_each(old_audit.details::json) +WHERE json_typeof(value)='boolean' + LIMIT 1 + ), + boolean_prop_value2 = ( +SELECT value::text::boolean +FROM json_each(old_audit.details::json) +WHERE json_typeof(value)='boolean' +OFFSET 1 + LIMIT 1 + ), + boolean_prop_name2 = ( +SELECT key +FROM json_each(old_audit.details::json) +WHERE json_typeof(value)='boolean' +OFFSET 1 + LIMIT 1 + ) +FROM old_audit +WHERE old_audit.record_date = audit.record_date and old_audit.message = audit.message; \ No newline at end of file diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/client/AuditClient.java b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/client/AuditClient.java deleted file mode 100644 index 040693e4a..000000000 --- a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/client/AuditClient.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.iqser.red.service.peristence.v1.server.integration.client; - -import org.springframework.cloud.openfeign.FeignClient; - -import com.iqser.red.service.persistence.service.v1.api.external.resource.AuditResource; - -@FeignClient(name = "AuditClient", url = "http://localhost:${server.port}") -public interface AuditClient extends AuditResource { - -} diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/service/DossierTemplateTesterAndProvider.java b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/service/DossierTemplateTesterAndProvider.java index 91e5e20b4..71838bf16 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/service/DossierTemplateTesterAndProvider.java +++ b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/service/DossierTemplateTesterAndProvider.java @@ -36,6 +36,8 @@ public class DossierTemplateTesterAndProvider { @Autowired private DictionaryClient dictionaryClient; + @Autowired + private TestAuditor auditor; public Colors provideDefaultColors(String dossierTemplateId) { diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/service/DossierTesterAndProvider.java b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/service/DossierTesterAndProvider.java index a0ef0809a..0a60cb8d9 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/service/DossierTesterAndProvider.java +++ b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/service/DossierTesterAndProvider.java @@ -1,14 +1,5 @@ package com.iqser.red.service.peristence.v1.server.integration.service; -import static org.assertj.core.api.Assertions.assertThat; - -import java.time.OffsetDateTime; -import java.time.temporal.ChronoUnit; -import java.util.Set; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; - import com.google.common.collect.Sets; import com.iqser.red.service.peristence.v1.server.integration.client.DossierClient; import com.iqser.red.service.persistence.service.v1.api.shared.model.DossierRequest; @@ -17,8 +8,15 @@ import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemp import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.Dossier; import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.DossierStatusInfo; import com.knecon.fforesight.tenantcommons.TenantContext; - import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.time.OffsetDateTime; +import java.time.temporal.ChronoUnit; +import java.util.Set; + +import static org.assertj.core.api.Assertions.assertThat; @Slf4j @Service @@ -33,7 +31,6 @@ public class DossierTesterAndProvider { @Autowired private UserProvider userProvider; - public Dossier provideTestDossier(DossierTemplateModel testTemplate) { return provideTestDossier(testTemplate, "Dossier1"); diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/service/TestAuditor.java b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/service/TestAuditor.java new file mode 100644 index 000000000..0621b59b9 --- /dev/null +++ b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/service/TestAuditor.java @@ -0,0 +1,33 @@ +package com.iqser.red.service.peristence.v1.server.integration.service; + +import com.knecon.fforesight.auditor.BaseAuditor; +import com.knecon.fforesight.auditor.model.AuditMessage; +import com.knecon.fforesight.auditor.model.Detail; +import lombok.NonNull; +import org.springframework.stereotype.Service; + +import java.util.*; +import java.util.stream.Collectors; + +@Service +public class TestAuditor extends BaseAuditor { + private List audits = new ArrayList<>(); + + @Override + public @NonNull AuditMessage audit(@NonNull String category, @NonNull String message, Detail... details) { + var mappedDetails = Arrays.stream(details) + .collect(Collectors.toMap(Detail::getKey, Detail::getValue)); + var auditMessage = AuditMessage.builder() + .category(category) + .message(message) + .details((Map) mappedDetails) + .build(); + + audits.add(auditMessage); + return auditMessage; + } + + public void deleteAll() { + audits.clear(); + } +} diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/AuditTest.java b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/AuditTest.java deleted file mode 100644 index b24ebdbce..000000000 --- a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/AuditTest.java +++ /dev/null @@ -1,55 +0,0 @@ -package com.iqser.red.service.peristence.v1.server.integration.tests; - -import static org.assertj.core.api.Assertions.assertThat; - -import java.util.Map; - -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; - -import com.iqser.red.service.peristence.v1.server.integration.client.AuditClient; -import com.iqser.red.service.peristence.v1.server.integration.service.UserProvider; -import com.iqser.red.service.peristence.v1.server.integration.utils.AbstractPersistenceServerServiceTest; -import com.iqser.red.service.persistence.management.v1.processor.service.persistence.AuditPersistenceService; -import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.AuditRepository; -import com.iqser.red.service.persistence.service.v1.api.shared.model.audit.AuditRequest; -import com.iqser.red.service.persistence.service.v1.api.shared.model.audit.AuditSearchRequest; -import com.iqser.red.service.persistence.service.v1.api.shared.model.audit.CategoryModel; - -public class AuditTest extends AbstractPersistenceServerServiceTest { - - @Autowired - private AuditClient auditClient; - - @Autowired - private AuditPersistenceService auditPersistenceService; - - @Autowired - private AuditRepository auditRepository; - - @Autowired - private UserProvider userProvider; - - - @Test - public void testAudit() { - - var userId = userProvider.getUserId(); - - auditPersistenceService.audit(AuditRequest.builder().category("c1").message("test").userId(userId).objectId("1").details(Map.of("key", "value")).build()); - auditPersistenceService.audit(AuditRequest.builder().category("c1").message("test").userId(userId).objectId("1").details(Map.of("key", "value")).build()); - auditPersistenceService.audit(AuditRequest.builder().category("c2").message("test").userId(userId).objectId("1").details(Map.of("key", "value")).build()); - - assertThat(auditClient.getAuditCategories().size()).isGreaterThanOrEqualTo(2); - assertThat(auditClient.getAuditCategories().stream().filter(c -> c.getCategory().equals("c1")).findAny().map(CategoryModel::getRecordCount).get()).isEqualTo(2); - assertThat(auditClient.getAuditCategories().stream().filter(c -> c.getCategory().equals("c2")).findAny().map(CategoryModel::getRecordCount).get()).isEqualTo(1); - - var result = auditClient.searchAuditLog(AuditSearchRequest.builder().category("c1").page(0).pageSize(10).build()); - assertThat(result.getTotalHits()).isEqualTo(2); - - result = auditClient.searchAuditLog(AuditSearchRequest.builder().build()); - assertThat(result.getTotalHits()).isGreaterThanOrEqualTo(3); - assertThat(auditClient.getAuditCategories()).isNotEmpty(); - } - -} diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/DictionaryTest.java b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/DictionaryTest.java index 8325fe108..a74cced7e 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/DictionaryTest.java +++ b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/DictionaryTest.java @@ -67,9 +67,12 @@ public class DictionaryTest extends AbstractPersistenceServerServiceTest { var entries = List.of("word1", "word2"); var falsePositives = List.of("false_positive1", "false_positive"); var falseRecommendations = List.of("false_recommendation1", "false_recommendation2"); - Assertions.assertThrows(FeignException.Forbidden.class, () -> dictionaryClient.addEntry(type.getType(), type.getDossierTemplateId(), entries, false, null, DictionaryEntryType.ENTRY)); - Assertions.assertThrows(FeignException.Forbidden.class, () -> dictionaryClient.addEntry(type.getType(), type.getDossierTemplateId(), falsePositives, false, null, DictionaryEntryType.FALSE_POSITIVE)); - Assertions.assertThrows(FeignException.Forbidden.class, () -> dictionaryClient.addEntry(type.getType(), type.getDossierTemplateId(), falseRecommendations, false, null, DictionaryEntryType.FALSE_RECOMMENDATION)); + Assertions.assertThrows(FeignException.Forbidden.class, () -> dictionaryClient.addEntry(type.getType(), + type.getDossierTemplateId(), entries, false, null, DictionaryEntryType.ENTRY)); + Assertions.assertThrows(FeignException.Forbidden.class, () -> dictionaryClient.addEntry(type.getType(), + type.getDossierTemplateId(), falsePositives, false, null, DictionaryEntryType.FALSE_POSITIVE)); + Assertions.assertThrows(FeignException.Forbidden.class, () -> dictionaryClient.addEntry(type.getType(), + type.getDossierTemplateId(), falseRecommendations, false, null, DictionaryEntryType.FALSE_RECOMMENDATION)); var loadedType1 = dictionaryClient.getDictionaryForType(type.getType(), type.getDossierTemplateId(), null); assertThat(loadedType1).isNotNull(); @@ -77,12 +80,18 @@ public class DictionaryTest extends AbstractPersistenceServerServiceTest { assertThat(loadedType1.getFalsePositiveEntries()).isEmpty(); assertThat(loadedType1.getFalseRecommendationEntries()).isEmpty(); - Assertions.assertThrows(FeignException.Forbidden.class, () -> dictionaryClient.deleteEntries(type.getType(), type.getDossierTemplateId(), entries, null, DictionaryEntryType.ENTRY)); - Assertions.assertThrows(FeignException.Forbidden.class, () -> dictionaryClient.deleteEntries(type.getType(), type.getDossierTemplateId(), falsePositives, null, DictionaryEntryType.FALSE_POSITIVE)); - Assertions.assertThrows(FeignException.Forbidden.class, () -> dictionaryClient.deleteEntries(type.getType(), type.getDossierTemplateId(), falseRecommendations, null, DictionaryEntryType.FALSE_RECOMMENDATION)); - Assertions.assertThrows(FeignException.Forbidden.class, () -> dictionaryClient.deleteEntry(type.getType(), type.getDossierTemplateId(), entries.get(0), null, DictionaryEntryType.ENTRY)); - Assertions.assertThrows(FeignException.Forbidden.class, () -> dictionaryClient.deleteEntry(type.getType(), type.getDossierTemplateId(), falsePositives.get(0), null, DictionaryEntryType.FALSE_POSITIVE)); - Assertions.assertThrows(FeignException.Forbidden.class, () -> dictionaryClient.deleteEntry(type.getType(), type.getDossierTemplateId(), falseRecommendations.get(0), null, DictionaryEntryType.FALSE_RECOMMENDATION)); + Assertions.assertThrows(FeignException.Forbidden.class, () -> dictionaryClient.deleteEntries(type.getType(), + type.getDossierTemplateId(), entries, null, DictionaryEntryType.ENTRY)); + Assertions.assertThrows(FeignException.Forbidden.class, () -> dictionaryClient.deleteEntries(type.getType(), + type.getDossierTemplateId(), falsePositives, null, DictionaryEntryType.FALSE_POSITIVE)); + Assertions.assertThrows(FeignException.Forbidden.class, () -> dictionaryClient.deleteEntries(type.getType(), + type.getDossierTemplateId(), falseRecommendations, null, DictionaryEntryType.FALSE_RECOMMENDATION)); + Assertions.assertThrows(FeignException.Forbidden.class, () -> dictionaryClient.deleteEntry(type.getType(), + type.getDossierTemplateId(), entries.get(0), null, DictionaryEntryType.ENTRY)); + Assertions.assertThrows(FeignException.Forbidden.class, () -> dictionaryClient.deleteEntry(type.getType(), + type.getDossierTemplateId(), falsePositives.get(0), null, DictionaryEntryType.FALSE_POSITIVE)); + Assertions.assertThrows(FeignException.Forbidden.class, () -> dictionaryClient.deleteEntry(type.getType(), + type.getDossierTemplateId(), falseRecommendations.get(0), null, DictionaryEntryType.FALSE_RECOMMENDATION)); } @Test @@ -94,8 +103,10 @@ public class DictionaryTest extends AbstractPersistenceServerServiceTest { assertThat(type.getSkippedHexColor()).isEqualTo("#aaaaaa"); assertThat(type.isDossierDictionaryOnly()).isFalse(); - dictionaryClient.addEntry(type.getType(), type.getDossierTemplateId(), List.of("word1", "word2"), false, null, DictionaryEntryType.ENTRY); - dictionaryClient.addEntry(type.getType(), type.getDossierTemplateId(), List.of("false_positive1", "false_positive"), false, null, DictionaryEntryType.FALSE_POSITIVE); + dictionaryClient.addEntry(type.getType(), type.getDossierTemplateId(), List.of("word1", "word2"), false, + null, DictionaryEntryType.ENTRY); + dictionaryClient.addEntry(type.getType(), type.getDossierTemplateId(), List.of("false_positive1", "false_positive"), + false, null, DictionaryEntryType.FALSE_POSITIVE); dictionaryClient.addEntry(type.getType(), type.getDossierTemplateId(), List.of("false_recommendation1", "false_recommendation2"), diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/DigitalSignatureTest.java b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/DigitalSignatureTest.java index a50495569..b076a3a22 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/DigitalSignatureTest.java +++ b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/DigitalSignatureTest.java @@ -2,7 +2,6 @@ package com.iqser.red.service.peristence.v1.server.integration.tests; import static org.assertj.core.api.Assertions.assertThat; -import java.nio.charset.StandardCharsets; import java.nio.file.Files; import org.junit.jupiter.api.Test; diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/NotificationTest.java b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/NotificationTest.java index 69f35d58f..72b2f95cd 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/NotificationTest.java +++ b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/NotificationTest.java @@ -15,7 +15,7 @@ import com.iqser.red.service.peristence.v1.server.integration.service.UserProvid import com.iqser.red.service.peristence.v1.server.integration.utils.AbstractPersistenceServerServiceTest; import com.iqser.red.service.peristence.v1.server.integration.utils.MultithreadedTestRunner; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.NotificationPersistenceService; -import com.iqser.red.service.persistence.service.v1.api.shared.model.audit.AddNotificationRequest; +import com.iqser.red.service.persistence.service.v1.api.shared.model.AddNotificationRequest; import com.iqser.red.service.persistence.service.v1.api.shared.model.common.JSONPrimitive; import com.iqser.red.service.persistence.service.v1.api.shared.model.notification.Notification; import com.iqser.red.service.persistence.service.v1.api.shared.model.notification.NotificationType; diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/ViewedPagesTest.java b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/ViewedPagesTest.java index bacf19943..6abd7dc26 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/ViewedPagesTest.java +++ b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/ViewedPagesTest.java @@ -13,7 +13,6 @@ import com.iqser.red.service.peristence.v1.server.integration.service.UserProvid import com.iqser.red.service.peristence.v1.server.integration.utils.AbstractPersistenceServerServiceTest; import com.iqser.red.service.persistence.service.v1.api.shared.model.ViewedPagesRequest; import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.ViewedPage; -import com.iqser.red.service.persistence.service.v1.api.shared.model.common.JSONPrimitive; public class ViewedPagesTest extends AbstractPersistenceServerServiceTest { diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/utils/AbstractPersistenceServerServiceTest.java b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/utils/AbstractPersistenceServerServiceTest.java index 9a38145a1..974a744b3 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/utils/AbstractPersistenceServerServiceTest.java +++ b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/utils/AbstractPersistenceServerServiceTest.java @@ -34,6 +34,7 @@ import com.knecon.fforesight.tenantcommons.TenantsClient; import com.knecon.fforesight.tenantcommons.model.*; import io.micrometer.prometheus.PrometheusMeterRegistry; import lombok.extern.slf4j.Slf4j; +import com.iqser.red.service.peristence.v1.server.integration.service.TestAuditor; import org.assertj.core.util.Lists; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; @@ -83,8 +84,6 @@ import static org.mockito.Mockito.when; @SpringBootTest(classes = Application.class, webEnvironment = SpringBootTest.WebEnvironment.DEFINED_PORT, properties = "spring-hibernate-query-utils.n-plus-one-queries-detection.error-level=INFO") public abstract class AbstractPersistenceServerServiceTest { - - @MockBean protected Scheduler scheduler; @MockBean @@ -112,7 +111,7 @@ public abstract class AbstractPersistenceServerServiceTest { @Autowired protected NotificationRepository notificationRepository; @Autowired - protected AuditRepository auditRepository; + protected TestAuditor auditor; @Autowired protected TypeRepository typeRepository; @Autowired @@ -353,7 +352,7 @@ public abstract class AbstractPersistenceServerServiceTest { typeRepository.deleteAll(); viewedPagesRepository.deleteAll(); notificationRepository.deleteAll(); - auditRepository.deleteAll(); + auditor.deleteAll(); manualRedactionRepository.deleteAll(); forceRedactionRepository.deleteAll(); removeRedactionRepository.deleteAll(); diff --git a/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/audit/AddNotificationRequest.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/AddNotificationRequest.java similarity index 97% rename from persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/audit/AddNotificationRequest.java rename to persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/AddNotificationRequest.java index 14507246e..13c25f0f4 100644 --- a/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/audit/AddNotificationRequest.java +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/AddNotificationRequest.java @@ -1,4 +1,4 @@ -package com.iqser.red.service.persistence.service.v1.api.shared.model.audit; +package com.iqser.red.service.persistence.service.v1.api.shared.model; import java.util.HashMap; import java.util.Map; @@ -22,3 +22,4 @@ public class AddNotificationRequest { private Map target = new HashMap<>(); } + diff --git a/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/AuditResponse.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/AuditResponse.java deleted file mode 100644 index 3a0020845..000000000 --- a/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/AuditResponse.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.iqser.red.service.persistence.service.v1.api.shared.model; - -import java.util.List; - -import com.iqser.red.service.persistence.service.v1.api.shared.model.audit.AuditModel; -import com.iqser.red.service.persistence.service.v1.api.shared.model.common.Page; - -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.NoArgsConstructor; - -@Data -@NoArgsConstructor -@EqualsAndHashCode(callSuper = true) -public class AuditResponse extends Page { - - public AuditResponse(List elements, long totalHits, int page, int pageSize) { - - super(elements, totalHits, page, pageSize); - } - - - -} diff --git a/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/audit/AuditModel.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/audit/AuditModel.java deleted file mode 100644 index 325558fc2..000000000 --- a/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/audit/AuditModel.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.iqser.red.service.persistence.service.v1.api.shared.model.audit; - -import java.time.OffsetDateTime; -import java.util.HashMap; -import java.util.Map; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -@Data -@Builder -@NoArgsConstructor -@AllArgsConstructor -public class AuditModel { - - private long recordId; - private OffsetDateTime recordDate; - private String objectId; - private String category; - private String userId; - private String message; - private Map details = new HashMap<>(); - -} diff --git a/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/audit/AuditRequest.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/audit/AuditRequest.java deleted file mode 100644 index c17d71ab9..000000000 --- a/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/audit/AuditRequest.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.iqser.red.service.persistence.service.v1.api.shared.model.audit; - -import java.util.HashMap; -import java.util.Map; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -@Data -@NoArgsConstructor -@AllArgsConstructor -@Builder -public class AuditRequest { - - private String objectId; - private String category; - private String userId; - - private String message; - - @Builder.Default - private Map details = new HashMap<>(); - -} diff --git a/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/audit/AuditSearchRequest.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/audit/AuditSearchRequest.java deleted file mode 100644 index 7af518084..000000000 --- a/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/audit/AuditSearchRequest.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.iqser.red.service.persistence.service.v1.api.shared.model.audit; - -import java.time.OffsetDateTime; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -@Data -@Builder -@NoArgsConstructor -@AllArgsConstructor -public class AuditSearchRequest { - - private String category; - private String userId; - private String objectId; - private String requestingUserId; - - private OffsetDateTime from; - private OffsetDateTime to; - - private int page; - private int pageSize; - -} diff --git a/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/audit/CategoryModel.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/audit/CategoryModel.java deleted file mode 100644 index 492ac4030..000000000 --- a/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/audit/CategoryModel.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.iqser.red.service.persistence.service.v1.api.shared.model.audit; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; - -@Data -@Builder -@AllArgsConstructor -public class CategoryModel { - - private final String category; - private final long recordCount; - -} diff --git a/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/common/Page.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/common/Page.java index 65d7325bd..777cdb86b 100644 --- a/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/common/Page.java +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/common/Page.java @@ -3,8 +3,6 @@ package com.iqser.red.service.persistence.service.v1.api.shared.model.common; import java.util.ArrayList; import java.util.List; -import com.iqser.red.service.persistence.service.v1.api.shared.model.audit.AuditModel; - import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data;