From 01a1e38d79f05e4cf3d5a48e6b7624accdfda552 Mon Sep 17 00:00:00 2001 From: Ali Oezyetimoglu Date: Mon, 13 May 2024 22:39:18 +0200 Subject: [PATCH 01/11] RED-8339: Component Overrides in DocuMine --- .../controller/ComponentLogController.java | 145 ++------- .../controller/RSSComponentLogController.java | 287 ------------------ .../api/impl/controller/RSSController.java | 148 --------- .../build.gradle.kts | 2 + .../controller/ComponentControllerV2.java | 117 +++---- .../api/impl/mapper/ComponentMapper.java | 75 +++++ .../resource/ComponentLogResource.java | 13 +- .../v1/api/external/resource/RSSResource.java | 76 ----- .../v2/api/external/model/Component.java | 2 + .../model/ComponentOverrideModelList.java | 22 ++ .../v2/api/external/model/ComponentValue.java | 1 + .../external/resource/ComponentResource.java | 46 +++ .../v1/processor/model/ComponentOverride.java | 21 ++ .../service/ComponentLogService.java | 143 +++++++-- .../service/ComponentOverrideService.java | 68 ----- .../changelog/mongo.changelog-tenant.xml | 1 + .../tenant/3-create-component-entities.xml | 17 ++ .../tests/ComponentLogDocumentMapperTest.java | 62 ++++ .../componentlog/componentLogExample.json | 266 ++++++++++++++++ .../componentOverrideExample.json | 244 +++++++++++++++ .../componentlog/ComponentLogEntry.java | 2 +- .../model/component/ComponentsOverrides.java | 19 -- .../mongo/document/ComponentDocument.java | 39 +++ .../mongo/document/ComponentLogDocument.java | 38 +++ ...ComponentLogDocumentNotFoundException.java | 10 + .../mapper/ComponentLogDocumentMapper.java | 56 ++++ .../ComponentDocumentRepository.java | 22 ++ .../ComponentLogDocumentRepository.java | 22 ++ .../repository/CustomComponentRepository.java | 14 + .../CustomComponentRepositoryImpl.java | 49 +++ .../service/ComponentLogMongoService.java | 229 ++++++++++++++ 31 files changed, 1439 insertions(+), 817 deletions(-) delete mode 100644 persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/RSSComponentLogController.java delete mode 100644 persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/RSSController.java create mode 100644 persistence-service-v1/persistence-service-external-api-impl-v2/src/main/java/com/iqser/red/persistence/service/v2/external/api/impl/mapper/ComponentMapper.java delete mode 100644 persistence-service-v1/persistence-service-external-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/external/resource/RSSResource.java create mode 100644 persistence-service-v1/persistence-service-external-api-v2/src/main/java/com/iqser/red/service/persistence/service/v2/api/external/model/ComponentOverrideModelList.java create mode 100644 persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/model/ComponentOverride.java delete mode 100644 persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/ComponentOverrideService.java create mode 100644 persistence-service-v1/persistence-service-processor-v1/src/main/resources/mongo/changelog/tenant/3-create-component-entities.xml create mode 100644 persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/ComponentLogDocumentMapperTest.java create mode 100644 persistence-service-v1/persistence-service-server-v1/src/test/resources/files/componentlog/componentLogExample.json create mode 100644 persistence-service-v1/persistence-service-server-v1/src/test/resources/files/componentlog/componentOverrideExample.json delete mode 100644 persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/component/ComponentsOverrides.java create mode 100644 persistence-service-v1/persistence-service-shared-mongo-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/mongo/document/ComponentDocument.java create mode 100644 persistence-service-v1/persistence-service-shared-mongo-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/mongo/document/ComponentLogDocument.java create mode 100644 persistence-service-v1/persistence-service-shared-mongo-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/mongo/exception/ComponentLogDocumentNotFoundException.java create mode 100644 persistence-service-v1/persistence-service-shared-mongo-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/mongo/mapper/ComponentLogDocumentMapper.java create mode 100644 persistence-service-v1/persistence-service-shared-mongo-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/mongo/repository/ComponentDocumentRepository.java create mode 100644 persistence-service-v1/persistence-service-shared-mongo-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/mongo/repository/ComponentLogDocumentRepository.java create mode 100644 persistence-service-v1/persistence-service-shared-mongo-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/mongo/repository/CustomComponentRepository.java create mode 100644 persistence-service-v1/persistence-service-shared-mongo-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/mongo/repository/CustomComponentRepositoryImpl.java create mode 100644 persistence-service-v1/persistence-service-shared-mongo-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/mongo/service/ComponentLogMongoService.java 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 56e093a9b..94f69420b 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 @@ -3,30 +3,21 @@ 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.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.READ_REDACTION_LOG; -import java.util.List; -import java.util.Map; -import java.util.Optional; -import java.util.stream.Collectors; - +import org.springframework.http.MediaType; import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.servlet.view.RedirectView; -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.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 lombok.AccessLevel; import lombok.RequiredArgsConstructor; @@ -35,15 +26,15 @@ import lombok.experimental.FieldDefaults; @RestController @RequiredArgsConstructor @FieldDefaults(makeFinal = true, level = AccessLevel.PRIVATE) +@Deprecated(forRemoval = true) public class ComponentLogController implements ComponentLogResource { ComponentLogService componentLogService; - ComponentOverrideService componentOverrideService; - AuditPersistenceService auditPersistenceService; AccessControlService accessControlService; @Override + @Deprecated(forRemoval = true) @PreAuthorize("hasAuthority('" + READ_REDACTION_LOG + "')") public ComponentLog getComponentLog(String dossierId, String fileId, boolean includeOverrides) { @@ -54,134 +45,42 @@ public class ComponentLogController implements ComponentLogResource { } + @PostMapping(value = COMPONENT_LOG_PATH + OVERRIDE_PATH + DOSSIER_ID_PATH_VARIABLE + FILE_ID_PATH_VARIABLE, consumes = MediaType.APPLICATION_JSON_VALUE) @PreAuthorize("hasAuthority('" + GET_RSS + "')") - public void addOverrides(@PathVariable(DOSSIER_ID) String dossierId, @PathVariable(FILE_ID) String fileId, @RequestBody ComponentsOverrides componentsOverrides) { + public RedirectView addOverride(String dossierTemplateId, + @PathVariable(DOSSIER_ID) String dossierId, + @PathVariable(FILE_ID) String fileId, + @RequestBody ComponentLogEntry override) { accessControlService.checkDossierExistenceAndAccessPermissionsToDossier(dossierId); accessControlService.validateFileResourceExistence(fileId); - if (componentsOverrides.getComponentOverrides() == null || componentsOverrides.getComponentOverrides().isEmpty()) { - throw new BadRequestException("Request body cannot be empty!"); - } - var componentLog = componentLogService.getComponentLog(dossierId, fileId); - var allComponents = componentLog.getComponentLogEntries(); - - componentOverrideService.addOverrides(dossierId, fileId, componentsOverrides); - - componentsOverrides.getComponentOverrides() - .forEach((componentName, overrideValue) -> auditOverride(dossierId, fileId, componentName, overrideValue, allComponents)); + return new RedirectView(String.format("/api/dossier-templates/{%s}/dossiers/{%s}/files/{%s}/overrides", dossierTemplateId, dossierId, fileId), true); } + @GetMapping(value = COMPONENT_LOG_PATH + OVERRIDE_PATH + DOSSIER_ID_PATH_VARIABLE + FILE_ID_PATH_VARIABLE, produces = MediaType.APPLICATION_JSON_VALUE) @PreAuthorize("hasAuthority('" + GET_RSS + "')") - public ComponentsOverrides getOverrides(@PathVariable(DOSSIER_ID) String dossierId, @PathVariable(FILE_ID) String fileId) { + public RedirectView getOverrides(String dossierTemplateId, @PathVariable(DOSSIER_ID) String dossierId, @PathVariable(FILE_ID) String fileId) { accessControlService.checkDossierExistenceAndViewPermissionsToDossier(dossierId); accessControlService.validateFileResourceExistence(fileId); - return componentOverrideService.getOverrides(dossierId, fileId); + + return new RedirectView(String.format("/api/dossier-templates/{%s}/dossiers/{%s}/files/{%s}/overrides", dossierTemplateId, dossierId, fileId), true); } + @PostMapping(value = COMPONENT_LOG_PATH + OVERRIDE_PATH + "/revert" + DOSSIER_ID_PATH_VARIABLE + FILE_ID_PATH_VARIABLE, consumes = MediaType.APPLICATION_JSON_VALUE) @PreAuthorize("hasAuthority('" + GET_RSS + "')") - public void revertOverrides(@PathVariable(DOSSIER_ID) String dossierId, @PathVariable(FILE_ID) String fileId, @RequestBody RevertOverrideRequest revertOverrideRequest) { + public RedirectView revertOverrides(String dossierTemplateId, + @PathVariable(DOSSIER_ID) String dossierId, + @PathVariable(FILE_ID) String fileId, + @RequestBody RevertOverrideRequest revertOverrideRequest) { accessControlService.checkDossierExistenceAndAccessPermissionsToDossier(dossierId); accessControlService.validateFileResourceExistence(fileId); - if (revertOverrideRequest.getComponents() == null || revertOverrideRequest.getComponents().isEmpty()) { - throw new BadRequestException("Request body cannot be empty!"); - } - var componentLog = componentLogService.getComponentLog(dossierId, fileId); - var allComponents = componentLog.getComponentLogEntries(); - - componentOverrideService.revertOverrides(dossierId, fileId, revertOverrideRequest); - - revertOverrideRequest.getComponents() - .forEach(componentNameToRevert -> auditOverrideRevert(dossierId, fileId, componentNameToRevert, allComponents)); - } - - - 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()); - } - - - private void auditOverrideRevert(String dossierId, String fileId, String componentNameToRevert, List allComponentLogEntries) { - - 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()); - } - - - private String getValue(Optional component) { - - return component.map(ComponentLogEntry::getComponentValues) - .stream() - .map(a -> a.stream() - .map(ComponentLogEntryValue::getValue) - .collect(Collectors.joining(", "))) - .findFirst() - .orElse(""); - } - - - private static String getOriginalValue(Optional component) { - - return component.map(ComponentLogEntry::getComponentValues) - .stream() - .map(a -> a.stream() - .map(ComponentLogEntryValue::getOriginalValue) - .collect(Collectors.joining(", "))) - .findFirst() - .orElse(""); + return new RedirectView(String.format("/api/dossier-templates/{%s}/dossiers/{%s}/files/{%s}/overrides/revert", dossierTemplateId, dossierId, fileId), true); } } 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 deleted file mode 100644 index 7a75cb402..000000000 --- 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 +++ /dev/null @@ -1,287 +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.GET_RSS; - -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Locale; -import java.util.Map; -import java.util.Optional; -import java.util.Set; -import java.util.stream.Collectors; - -import org.apache.commons.lang3.StringUtils; -import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; -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.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; -import com.iqser.red.service.persistence.service.v1.api.shared.model.rss.RSSResponse; -import com.iqser.red.service.redaction.report.v1.api.model.rss.DetailedRSSFileResponse; -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; - -@Deprecated(forRemoval = true) -@RestController -@RequiredArgsConstructor -@ConditionalOnProperty(name = "application.rss.component-log.enabled", havingValue = "true") -public class RSSComponentLogController implements RSSResource { - - private final ComponentOverrideService componentOverrideService; - private final AuditPersistenceService auditPersistenceService; - private final ComponentLogService componentLogService; - private final StatusController statusController; - - - @PreAuthorize("hasAuthority('" + GET_RSS + "')") - public RSSResponse getRSS(@PathVariable(DOSSIER_ID) String dossierId, @RequestParam(value = "fileId", required = false) String fileId) { - - List dossierFiles; - if (StringUtils.isBlank(fileId)) { - dossierFiles = statusController.getDossierStatus(dossierId); - } else { - dossierFiles = List.of(statusController.getFileStatus(dossierId, fileId)); - } - - List fileResponses = dossierFiles.stream() - .map(this::getRssResponse) - .toList(); - - return new RSSResponse(fileResponses); - - } - - - private RSSFileResponse getRssResponse(FileStatus file) { - - var componentLog = componentLogService.getComponentLog(file.getDossierId(), file.getId(), true); - - Map results = new LinkedHashMap<>(); - - componentLog.getComponentLogEntries() - .forEach(entry -> { - if (entry.getComponentValues().size() <= 1) { - results.put(entry.getName(), - entry.getComponentValues() - .get(0).getValue()); - return; - } - - List componentValues = entry.getComponentValues(); - for (int i = 0, componentValuesSize = componentValues.size(); i < componentValuesSize; i++) { - ComponentLogEntryValue v = componentValues.get(i); - results.put(entry.getName() + "_" + (i + 1), v.getValue()); - } - }); - - return RSSFileResponse.builder().filename(file.getFilename()).result(results).build(); - - } - - - @PreAuthorize("hasAuthority('" + GET_RSS + "')") - public DetailedRSSResponse getDetailedRSS(@PathVariable(DOSSIER_ID) String dossierId, @RequestParam(value = "fileId", required = false) String fileId) { - - List dossierFiles; - if (StringUtils.isBlank(fileId)) { - dossierFiles = statusController.getDossierStatus(dossierId); - } else { - dossierFiles = List.of(statusController.getFileStatus(dossierId, fileId)); - } - - List fileResponses = dossierFiles.stream() - .map(this::getDetailedRssResponse) - .toList(); - - return new DetailedRSSResponse(fileResponses); - } - - - private DetailedRSSFileResponse getDetailedRssResponse(FileStatus file) { - - var componentLog = componentLogService.getComponentLog(file.getDossierId(), file.getId(), true); - - Map results = new LinkedHashMap<>(); - - componentLog.getComponentLogEntries() - .forEach(entry -> { - if (entry.getComponentValues().size() <= 1) { - results.put(entry.getName(), - toSCMComponent(entry.getComponentValues() - .get(0))); - return; - } - - List componentValues = entry.getComponentValues(); - for (int i = 0, componentValuesSize = componentValues.size(); i < componentValuesSize; i++) { - ComponentLogEntryValue v = componentValues.get(i); - results.put(entry.getName() + "_" + (i + 1), toSCMComponent(v)); - } - }); - - return DetailedRSSFileResponse.builder().filename(file.getFilename()).result(results).build(); - } - - - private SCMComponent toSCMComponent(ComponentLogEntryValue v) { - - return SCMComponent.builder() - .value(v.getValue().equals(v.getOriginalValue()) ? null : v.getValue()) - .originalValue(v.getOriginalValue()) - .transformation(v.getValueDescription()) - .scmAnnotations(v.getComponentLogEntityReferences() - .stream() - .map(this::toScmAnnotation) - .toList()) - .build(); - } - - - private ScmAnnotation toScmAnnotation(ComponentLogEntityReference er) { - - return ScmAnnotation.builder().type(er.getType()).pages(Set.of(er.getPage())).ruleIdentifier(er.getEntityRuleId()).reason(formatType(er.getType())).build(); - } - - - private static String formatType(String type) { - - return type.substring(0, 1).toUpperCase(Locale.ENGLISH) + type.substring(1).toLowerCase(Locale.ENGLISH).replaceAll("_", " "); - } - - - @PreAuthorize("hasAuthority('" + GET_RSS + "')") - public void addOverrides(@PathVariable(DOSSIER_ID) String dossierId, @PathVariable(FILE_ID) String fileId, @RequestBody ComponentsOverrides componentsOverrides) { - - var componentLog = componentLogService.getComponentLog(dossierId, fileId); - var allComponents = componentLog.getComponentLogEntries(); - - componentOverrideService.addOverrides(dossierId, fileId, componentsOverrides); - - componentsOverrides.getComponentOverrides() - .forEach((componentName, overrideValue) -> auditOverride(dossierId, fileId, componentName, overrideValue, allComponents)); - } - - - @PreAuthorize("hasAuthority('" + GET_RSS + "')") - public ComponentsOverrides getOverrides(@PathVariable(DOSSIER_ID) String dossierId, @PathVariable(FILE_ID) String fileId) { - - return componentOverrideService.getOverrides(dossierId, fileId); - } - - - @PreAuthorize("hasAuthority('" + GET_RSS + "')") - public void revertOverrides(@PathVariable(DOSSIER_ID) String dossierId, @PathVariable(FILE_ID) String fileId, @RequestBody RevertOverrideRequest revertOverrideRequest) { - - var componentLog = componentLogService.getComponentLog(dossierId, fileId); - var allComponents = componentLog.getComponentLogEntries(); - - componentOverrideService.revertOverrides(dossierId, fileId, revertOverrideRequest); - - revertOverrideRequest.getComponents() - .forEach(componentNameToRevert -> auditOverrideRevert(dossierId, fileId, componentNameToRevert, allComponents)); - } - - - 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()); - } - - - private void auditOverrideRevert(String dossierId, String fileId, String componentNameToRevert, List allComponentLogEntries) { - - 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()); - } - - - private String getValue(Optional component) { - - return component.map(ComponentLogEntry::getComponentValues) - .stream() - .map(a -> a.stream() - .map(ComponentLogEntryValue::getValue) - .collect(Collectors.joining(", "))) - .findFirst() - .orElse(""); - } - - - private static String getOriginalValue(Optional component) { - - return component.map(ComponentLogEntry::getComponentValues) - .stream() - .map(a -> a.stream() - .map(ComponentLogEntryValue::getOriginalValue) - .collect(Collectors.joining(", "))) - .findFirst() - .orElse(""); - } - -} 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 deleted file mode 100644 index 87a8dc4fd..000000000 --- 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 +++ /dev/null @@ -1,148 +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.GET_RSS; - -import java.util.Map; -import java.util.stream.Collectors; - -import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; -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.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 lombok.RequiredArgsConstructor; - -@Deprecated(forRemoval = true) -@RestController -@RequiredArgsConstructor -@ConditionalOnProperty(name = "application.rss.component-log.enabled", havingValue = "false") -public class RSSController implements RSSResource { - - 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) { - - return convert(rssReportClient.getRSS(dossierId, fileId)); - - } - - - @PreAuthorize("hasAuthority('" + GET_RSS + "')") - private RSSResponse convert(com.iqser.red.service.redaction.report.v1.api.model.rss.RSSResponse rssResponse) { - - return new RSSResponse(rssResponse.getFiles() - .stream() - .map(this::convert) - .collect(Collectors.toList())); - } - - - @PreAuthorize("hasAuthority('" + GET_RSS + "')") - private RSSFileResponse convert(com.iqser.red.service.redaction.report.v1.api.model.rss.RSSFileResponse rssFileResponse) { - - return new RSSFileResponse(rssFileResponse.getFilename(), rssFileResponse.getResult()); - - } - - - @PreAuthorize("hasAuthority('" + GET_RSS + "')") - public DetailedRSSResponse getDetailedRSS(@PathVariable(DOSSIER_ID) String dossierId, @RequestParam(value = "fileId", required = false) String fileId) { - - return rssReportClient.getDetailedRSS(dossierId, fileId); - } - - - @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())); - } - - - @PreAuthorize("hasAuthority('" + GET_RSS + "')") - public ComponentsOverrides getOverrides(@PathVariable(DOSSIER_ID) String dossierId, @PathVariable(FILE_ID) String fileId) { - - return componentOverrideService.getOverrides(dossierId, fileId); - } - - - @PreAuthorize("hasAuthority('" + GET_RSS + "')") - 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(); - - 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())); - } - -} diff --git a/persistence-service-v1/persistence-service-external-api-impl-v2/build.gradle.kts b/persistence-service-v1/persistence-service-external-api-impl-v2/build.gradle.kts index 88086af39..1cc96b271 100644 --- a/persistence-service-v1/persistence-service-external-api-impl-v2/build.gradle.kts +++ b/persistence-service-v1/persistence-service-external-api-impl-v2/build.gradle.kts @@ -7,6 +7,8 @@ dependencies { api(project(":persistence-service-processor-v1")) api(project(":persistence-service-external-api-v2")) api(project(":persistence-service-external-api-impl-v1")) + implementation("org.mapstruct:mapstruct:1.5.5.Final") + annotationProcessor("org.mapstruct:mapstruct-processor:1.5.5.Final") } description = "persistence-service-external-api-impl-v2" 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/ComponentControllerV2.java b/persistence-service-v1/persistence-service-external-api-impl-v2/src/main/java/com/iqser/red/persistence/service/v2/external/api/impl/controller/ComponentControllerV2.java index 097de9abb..4c910f414 100644 --- a/persistence-service-v1/persistence-service-external-api-impl-v2/src/main/java/com/iqser/red/persistence/service/v2/external/api/impl/controller/ComponentControllerV2.java +++ b/persistence-service-v1/persistence-service-external-api-impl-v2/src/main/java/com/iqser/red/persistence/service/v2/external/api/impl/controller/ComponentControllerV2.java @@ -1,27 +1,24 @@ package com.iqser.red.persistence.service.v2.external.api.impl.controller; +import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.GET_RSS; import static com.iqser.red.service.persistence.service.v2.api.external.resource.DossierResource.DOSSIER_ID_PARAM; import static com.iqser.red.service.persistence.service.v2.api.external.resource.DossierTemplateResource.DOSSIER_TEMPLATE_ID_PARAM; import static com.iqser.red.service.persistence.service.v2.api.external.resource.FileResource.FILE_ID_PARAM; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; - +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.persistence.service.v1.external.api.impl.controller.DossierTemplateController; import com.iqser.red.persistence.service.v1.external.api.impl.controller.StatusController; +import com.iqser.red.persistence.service.v2.external.api.impl.mapper.ComponentMapper; import com.iqser.red.service.persistence.management.v1.processor.service.ComponentLogService; import com.iqser.red.service.persistence.management.v1.processor.service.FileStatusService; -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.component.RevertOverrideRequest; import com.iqser.red.service.persistence.service.v2.api.external.model.Component; -import com.iqser.red.service.persistence.service.v2.api.external.model.ComponentValue; -import com.iqser.red.service.persistence.service.v2.api.external.model.EntityReference; +import com.iqser.red.service.persistence.service.v2.api.external.model.ComponentOverrideModelList; import com.iqser.red.service.persistence.service.v2.api.external.model.FileComponents; import com.iqser.red.service.persistence.service.v2.api.external.model.FileComponentsList; import com.iqser.red.service.persistence.service.v2.api.external.resource.ComponentResource; @@ -41,6 +38,7 @@ public class ComponentControllerV2 implements ComponentResource { ComponentLogService componentLogService; StatusController statusController; FileStatusService fileStatusService; + ComponentMapper componentMapper = ComponentMapper.INSTANCE; @Override @@ -52,65 +50,7 @@ public class ComponentControllerV2 implements ComponentResource { dossierTemplateController.getDossierTemplate(dossierTemplateId); var componentLog = componentLogService.getComponentLog(dossierId, fileId, true); - Map> basicComponent = new LinkedHashMap<>(); - for (ComponentLogEntry componentLogEntry : componentLog.getComponentLogEntries()) { - basicComponent.put(componentLogEntry.getName(), - componentLogEntry.getComponentValues() - .stream() - .map(ComponentLogEntryValue::getValue) - .toList()); - } - - Map componentsDetails = new LinkedHashMap<>(); - if (includeDetails) { - for (ComponentLogEntry entry : componentLog.getComponentLogEntries()) { - componentsDetails.put(entry.getName(), Component.builder().name(entry.getName()).componentValues(toComponentList(entry)).build()); - } - } - - return FileComponents.builder() - .dossierTemplateId(dossierTemplateId) - .dossierId(dossierId) - .filename(fileStatusService.getFileName(fileId)) - .fileId(fileId) - .components(basicComponent) - .componentDetails(componentsDetails) - .build(); - } - - - private List toComponentList(ComponentLogEntry componentLogEntry) { - - return componentLogEntry.getComponentValues() - .stream() - .map(this::convert) - .toList(); - } - - - private ComponentValue convert(ComponentLogEntryValue componentValue) { - - return ComponentValue.builder() - .valueDescription(componentValue.getValueDescription()) - .componentRuleId(componentValue.getComponentRuleId()) - .entityReferences(componentValue.getComponentLogEntityReferences() - .stream() - .map(this::convertComponentEntityReference) - .toList()) - .originalValue(componentValue.getOriginalValue()) - .value(componentValue.getValue()) - .build(); - } - - - private EntityReference convertComponentEntityReference(ComponentLogEntityReference componentLogEntityReference) { - - return EntityReference.builder() - .id(componentLogEntityReference.getId()) - .entityRuleId(componentLogEntityReference.getEntityRuleId()) - .type(componentLogEntityReference.getType()) - .page(componentLogEntityReference.getPage()) - .build(); + return componentMapper.toFileComponents(componentLog, dossierTemplateId, dossierId, fileId, fileStatusService.getFileName(fileId), includeDetails); } @@ -126,4 +66,45 @@ public class ComponentControllerV2 implements ComponentResource { .toList()); } + + @Override + @PreAuthorize("hasAuthority('" + GET_RSS + "')") + public void addOverride(@PathVariable(DOSSIER_TEMPLATE_ID_PARAM) String dossierTemplateId, + @PathVariable(DOSSIER_ID_PARAM) String dossierId, + @PathVariable(FILE_ID_PARAM) String fileId, + @RequestBody Component override) { + + dossierTemplateController.getDossierTemplate(dossierTemplateId); + + componentLogService.addOverride(dossierId, fileId, componentMapper.toComponentLogEntry(override)); + } + + + @Override + @PreAuthorize("hasAuthority('" + GET_RSS + "')") + public ComponentOverrideModelList getOverrides(@PathVariable(DOSSIER_TEMPLATE_ID_PARAM) String dossierTemplateId, + @PathVariable(DOSSIER_ID_PARAM) String dossierId, + @PathVariable(FILE_ID_PARAM) String fileId) { + + dossierTemplateController.getDossierTemplate(dossierTemplateId); + + var overrides = componentLogService.getOverrides(dossierId, fileId); + var componentOverrides = componentMapper.toComponents(overrides); + + return ComponentOverrideModelList.builder().dossierTemplateId(dossierTemplateId).dossierId(dossierId).fileId(fileId).componentOverrideModels(componentOverrides).build(); + } + + + @Override + @PreAuthorize("hasAuthority('" + GET_RSS + "')") + public void revertOverrides(@PathVariable(DOSSIER_TEMPLATE_ID_PARAM) String dossierTemplateId, + @PathVariable(DOSSIER_ID_PARAM) String dossierId, + @PathVariable(FILE_ID_PARAM) String fileId, + @RequestBody RevertOverrideRequest revertOverrideRequest) { + + dossierTemplateController.getDossierTemplate(dossierTemplateId); + + componentLogService.revertOverrides(dossierId, fileId, revertOverrideRequest); + } + } diff --git a/persistence-service-v1/persistence-service-external-api-impl-v2/src/main/java/com/iqser/red/persistence/service/v2/external/api/impl/mapper/ComponentMapper.java b/persistence-service-v1/persistence-service-external-api-impl-v2/src/main/java/com/iqser/red/persistence/service/v2/external/api/impl/mapper/ComponentMapper.java new file mode 100644 index 000000000..da9eabe0f --- /dev/null +++ b/persistence-service-v1/persistence-service-external-api-impl-v2/src/main/java/com/iqser/red/persistence/service/v2/external/api/impl/mapper/ComponentMapper.java @@ -0,0 +1,75 @@ +package com.iqser.red.persistence.service.v2.external.api.impl.mapper; + +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; + +import org.mapstruct.Mapper; +import org.mapstruct.Mapping; +import org.mapstruct.factory.Mappers; + +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.v2.api.external.model.Component; +import com.iqser.red.service.persistence.service.v2.api.external.model.ComponentValue; +import com.iqser.red.service.persistence.service.v2.api.external.model.FileComponents; + +@Mapper +public interface ComponentMapper { + + ComponentMapper INSTANCE = Mappers.getMapper(ComponentMapper.class); + + + @Mapping(source = "componentLogEntityReferences", target = "entityReferences") + ComponentValue toComponentValue(ComponentLogEntryValue entry); + + + @Mapping(source = "entityReferences", target = "componentLogEntityReferences") + ComponentLogEntryValue toComponentLogEntry(ComponentValue value); + + + List toComponentValues(List entries); + + + List toComponentLogEntries(List values); + + @Mapping(source = "componentValues", target = "componentValues") + Component toComponent(ComponentLogEntry entry); + + + List toComponents(List entries); + + @Mapping(source = "componentValues", target = "componentValues") + ComponentLogEntry toComponentLogEntry(Component component); + + + default FileComponents toFileComponents(ComponentLog componentLog, String dossierTemplateId, String dossierId, String fileId, String fileName, boolean includeDetails) { + + Map> basicComponent = new LinkedHashMap<>(); + for (ComponentLogEntry componentLogEntry : componentLog.getComponentLogEntries()) { + basicComponent.put(componentLogEntry.getName(), + componentLogEntry.getComponentValues() + .stream() + .map(ComponentLogEntryValue::getValue) + .toList()); + } + + Map componentsDetails = new LinkedHashMap<>(); + if (includeDetails) { + for (ComponentLogEntry entry : componentLog.getComponentLogEntries()) { + componentsDetails.put(entry.getName(), toComponent(entry)); + } + } + + return FileComponents.builder() + .dossierTemplateId(dossierTemplateId) + .dossierId(dossierId) + .filename(fileName) + .fileId(fileId) + .components(basicComponent) + .componentDetails(componentsDetails) + .build(); + } + +} diff --git a/persistence-service-v1/persistence-service-external-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/external/resource/ComponentLogResource.java b/persistence-service-v1/persistence-service-external-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/external/resource/ComponentLogResource.java index d51f9853d..ea2bcc1f6 100644 --- a/persistence-service-v1/persistence-service-external-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/external/resource/ComponentLogResource.java +++ b/persistence-service-v1/persistence-service-external-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/external/resource/ComponentLogResource.java @@ -9,9 +9,10 @@ import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.bind.annotation.ResponseStatus; +import org.springframework.web.servlet.view.RedirectView; 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.component.ComponentsOverrides; +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.component.RevertOverrideRequest; import io.swagger.v3.oas.annotations.Operation; @@ -25,11 +26,13 @@ public interface ComponentLogResource { String OVERRIDE_PATH = "/override"; + String DOSSIER_TEMPLATE_ID = "dossierTemplateId"; + String DOSSIER_TEMPLATE_ID_PATH_VARIABLE = "/{" + DOSSIER_TEMPLATE_ID + "}"; + String DOSSIER_ID = "dossierId"; String DOSSIER_ID_PATH_VARIABLE = "/{" + DOSSIER_ID + "}"; String FILE_ID = "fileId"; - String FILE_ID_PATH_VARIABLE = "/{" + FILE_ID + "}"; @@ -46,7 +49,7 @@ public interface ComponentLogResource { @PostMapping(value = COMPONENT_LOG_PATH + OVERRIDE_PATH + DOSSIER_ID_PATH_VARIABLE + FILE_ID_PATH_VARIABLE, consumes = MediaType.APPLICATION_JSON_VALUE) @Operation(summary = "Adds overrides for components", description = "None") @ApiResponses(value = {@ApiResponse(responseCode = "204", description = "OK"), @ApiResponse(responseCode = "404", description = "Not found"), @ApiResponse(responseCode = "403", description = "Forbidden")}) - void addOverrides(@PathVariable(DOSSIER_ID) String dossierId, @PathVariable(FILE_ID) String fileId, @RequestBody ComponentsOverrides componentsOverrides); + RedirectView addOverride(String dossierTemplateId, @PathVariable(DOSSIER_ID) String dossierId, @PathVariable(FILE_ID) String fileId, @RequestBody ComponentLogEntry override); @ResponseBody @@ -54,7 +57,7 @@ public interface ComponentLogResource { @GetMapping(value = COMPONENT_LOG_PATH + OVERRIDE_PATH + DOSSIER_ID_PATH_VARIABLE + FILE_ID_PATH_VARIABLE, produces = MediaType.APPLICATION_JSON_VALUE) @Operation(summary = "Gets overrides for components", description = "None") @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "OK"), @ApiResponse(responseCode = "404", description = "Not found")}) - ComponentsOverrides getOverrides(@PathVariable(DOSSIER_ID) String dossierId, @PathVariable(FILE_ID) String fileId); + RedirectView getOverrides(String dossierTemplateId, @PathVariable(DOSSIER_ID) String dossierId, @PathVariable(FILE_ID) String fileId); @ResponseBody @@ -62,6 +65,6 @@ public interface ComponentLogResource { @PostMapping(value = COMPONENT_LOG_PATH + OVERRIDE_PATH + "/revert" + DOSSIER_ID_PATH_VARIABLE + FILE_ID_PATH_VARIABLE, consumes = MediaType.APPLICATION_JSON_VALUE) @Operation(summary = "Reverts overrides for components", description = "None") @ApiResponses(value = {@ApiResponse(responseCode = "204", description = "OK"), @ApiResponse(responseCode = "404", description = "Not found"), @ApiResponse(responseCode = "403", description = "Forbidden")}) - void revertOverrides(@PathVariable(DOSSIER_ID) String dossierId, @PathVariable(FILE_ID) String fileId, @RequestBody RevertOverrideRequest revertOverrideRequest); + RedirectView revertOverrides(String dossierTemplateId, @PathVariable(DOSSIER_ID) String dossierId, @PathVariable(FILE_ID) String fileId, @RequestBody RevertOverrideRequest revertOverrideRequest); } diff --git a/persistence-service-v1/persistence-service-external-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/external/resource/RSSResource.java b/persistence-service-v1/persistence-service-external-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/external/resource/RSSResource.java deleted file mode 100644 index 74d941076..000000000 --- a/persistence-service-v1/persistence-service-external-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/external/resource/RSSResource.java +++ /dev/null @@ -1,76 +0,0 @@ -package com.iqser.red.service.persistence.service.v1.api.external.resource; - -import org.springframework.http.HttpStatus; -import org.springframework.http.MediaType; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestParam; -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.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.RSSResponse; -import com.iqser.red.service.redaction.report.v1.api.model.rss.DetailedRSSResponse; - -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.responses.ApiResponse; -import io.swagger.v3.oas.annotations.responses.ApiResponses; - -@Deprecated(forRemoval = true) -@ResponseStatus(value = HttpStatus.OK) -public interface RSSResource { - - String RSS_PATH = ExternalApi.BASE_PATH + "/rss"; - String OVERRIDE_PATH = "/override"; - - String DOSSIER_ID = "dossierId"; - String DOSSIER_ID_PATH_VARIABLE = "/{" + DOSSIER_ID + "}"; - - String FILE_ID = "fileId"; - String FILE_ID_PATH_VARIABLE = "/{" + FILE_ID + "}"; - - - @Deprecated(forRemoval = true) - @GetMapping(value = RSS_PATH + DOSSIER_ID_PATH_VARIABLE, produces = {MediaType.APPLICATION_JSON_VALUE, MediaType.APPLICATION_XML_VALUE}) - @Operation(summary = "Returns the RSS response for a dossier", description = "None") - @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "OK")}) - RSSResponse getRSS(@PathVariable(DOSSIER_ID) String dossierId, @RequestParam(value = "fileId", required = false) String fileId); - - - @Deprecated(forRemoval = true) - @GetMapping(value = RSS_PATH + "/detailed" + DOSSIER_ID_PATH_VARIABLE, produces = {MediaType.APPLICATION_JSON_VALUE, MediaType.APPLICATION_XML_VALUE}) - @Operation(summary = "Returns the RSS response with more details for a dossier", description = "None") - @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "OK")}) - DetailedRSSResponse getDetailedRSS(@PathVariable(DOSSIER_ID) String dossierId, @RequestParam(value = "fileId", required = false) String fileId); - - - @Deprecated(forRemoval = true) - @ResponseBody - @ResponseStatus(value = HttpStatus.OK) - @PostMapping(value = RSS_PATH + OVERRIDE_PATH + DOSSIER_ID_PATH_VARIABLE + FILE_ID_PATH_VARIABLE, consumes = MediaType.APPLICATION_JSON_VALUE) - @Operation(summary = "Adds overrides for RSS components", description = "None") - @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "OK")}) - void addOverrides(@PathVariable(DOSSIER_ID) String dossierId, @PathVariable(FILE_ID) String fileId, @RequestBody ComponentsOverrides componentsOverrides); - - - @Deprecated(forRemoval = true) - @ResponseBody - @ResponseStatus(value = HttpStatus.OK) - @GetMapping(value = RSS_PATH + OVERRIDE_PATH + DOSSIER_ID_PATH_VARIABLE + FILE_ID_PATH_VARIABLE, produces = MediaType.APPLICATION_JSON_VALUE) - @Operation(summary = "Gets overrides for RSS components", description = "None") - @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "OK")}) - ComponentsOverrides getOverrides(@PathVariable(DOSSIER_ID) String dossierId, @PathVariable(FILE_ID) String fileId); - - - @Deprecated(forRemoval = true) - @ResponseBody - @ResponseStatus(value = HttpStatus.OK) - @PostMapping(value = RSS_PATH + OVERRIDE_PATH + "/revert" + DOSSIER_ID_PATH_VARIABLE + FILE_ID_PATH_VARIABLE, consumes = MediaType.APPLICATION_JSON_VALUE) - @Operation(summary = "Reverts overrides for RSS components", description = "None") - @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "OK")}) - void revertOverrides(@PathVariable(DOSSIER_ID) String dossierId, @PathVariable(FILE_ID) String fileId, @RequestBody RevertOverrideRequest revertOverrideRequest); - -} diff --git a/persistence-service-v1/persistence-service-external-api-v2/src/main/java/com/iqser/red/service/persistence/service/v2/api/external/model/Component.java b/persistence-service-v1/persistence-service-external-api-v2/src/main/java/com/iqser/red/service/persistence/service/v2/api/external/model/Component.java index d1646ac02..5d8bca92d 100644 --- a/persistence-service-v1/persistence-service-external-api-v2/src/main/java/com/iqser/red/service/persistence/service/v2/api/external/model/Component.java +++ b/persistence-service-v1/persistence-service-external-api-v2/src/main/java/com/iqser/red/service/persistence/service/v2/api/external/model/Component.java @@ -19,5 +19,7 @@ public class Component { private String name; @JacksonXmlCData private List componentValues; + @JacksonXmlCData + private boolean overridden; } diff --git a/persistence-service-v1/persistence-service-external-api-v2/src/main/java/com/iqser/red/service/persistence/service/v2/api/external/model/ComponentOverrideModelList.java b/persistence-service-v1/persistence-service-external-api-v2/src/main/java/com/iqser/red/service/persistence/service/v2/api/external/model/ComponentOverrideModelList.java new file mode 100644 index 000000000..d16b4fd72 --- /dev/null +++ b/persistence-service-v1/persistence-service-external-api-v2/src/main/java/com/iqser/red/service/persistence/service/v2/api/external/model/ComponentOverrideModelList.java @@ -0,0 +1,22 @@ +package com.iqser.red.service.persistence.service.v2.api.external.model; + +import java.util.ArrayList; +import java.util.List; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class ComponentOverrideModelList { + + String dossierTemplateId; + String dossierId; + String fileId; + + List componentOverrideModels = new ArrayList<>(); +} diff --git a/persistence-service-v1/persistence-service-external-api-v2/src/main/java/com/iqser/red/service/persistence/service/v2/api/external/model/ComponentValue.java b/persistence-service-v1/persistence-service-external-api-v2/src/main/java/com/iqser/red/service/persistence/service/v2/api/external/model/ComponentValue.java index 7293b04a0..be343606b 100644 --- a/persistence-service-v1/persistence-service-external-api-v2/src/main/java/com/iqser/red/service/persistence/service/v2/api/external/model/ComponentValue.java +++ b/persistence-service-v1/persistence-service-external-api-v2/src/main/java/com/iqser/red/service/persistence/service/v2/api/external/model/ComponentValue.java @@ -18,6 +18,7 @@ public class ComponentValue { @JacksonXmlCData String value; @JacksonXmlCData + @Deprecated String originalValue; @JacksonXmlCData String valueDescription; diff --git a/persistence-service-v1/persistence-service-external-api-v2/src/main/java/com/iqser/red/service/persistence/service/v2/api/external/resource/ComponentResource.java b/persistence-service-v1/persistence-service-external-api-v2/src/main/java/com/iqser/red/service/persistence/service/v2/api/external/resource/ComponentResource.java index ca0cdbec1..d17622d7a 100644 --- a/persistence-service-v1/persistence-service-external-api-v2/src/main/java/com/iqser/red/service/persistence/service/v2/api/external/resource/ComponentResource.java +++ b/persistence-service-v1/persistence-service-external-api-v2/src/main/java/com/iqser/red/service/persistence/service/v2/api/external/resource/ComponentResource.java @@ -14,9 +14,15 @@ import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestParam; +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.component.RevertOverrideRequest; +import com.iqser.red.service.persistence.service.v2.api.external.model.Component; +import com.iqser.red.service.persistence.service.v2.api.external.model.ComponentOverrideModelList; import com.iqser.red.service.persistence.service.v2.api.external.model.FileComponents; import com.iqser.red.service.persistence.service.v2.api.external.model.FileComponentsList; @@ -44,6 +50,13 @@ public interface ComponentResource { - false (default): The component object does not contain a field componentDetails. """; + String OVERRIDES_PATH = "/overrides"; + String REVERT_PATH = "/revert"; + + String COMPONENT_OVERRIDE_PARAM = "componentOverride"; + + + @GetMapping(value = PATH + FILE_ID_PATH_VARIABLE + COMPONENTS_PATH, produces = {MediaType.APPLICATION_JSON_VALUE, MediaType.APPLICATION_XML_VALUE}) @Operation(summary = "Returns the components for a file", description = "None") @@ -61,4 +74,37 @@ public interface ComponentResource { @Parameter(name = DOSSIER_ID_PARAM, description = "The identifier of the dossier that contains the file.", required = true) @PathVariable(DOSSIER_ID_PARAM) String dossierId, @Parameter(name = INCLUDE_DETAILS_PARAM, description = INCLUDE_DETAILS_DESCRIPTION) @RequestParam(name = INCLUDE_DETAILS_PARAM, defaultValue = "false", required = false) boolean includeDetails); + + + @ResponseBody + @ResponseStatus(value = HttpStatus.NO_CONTENT) + @PostMapping(value = PATH + FILE_ID_PATH_VARIABLE + OVERRIDES_PATH, consumes = MediaType.APPLICATION_JSON_VALUE) + @Operation(summary = "Adds overrides for components", description = "None") + @ApiResponses(value = {@ApiResponse(responseCode = "204", description = "OK"), @ApiResponse(responseCode = "404", description = "Not found"), @ApiResponse(responseCode = "403", description = "Forbidden")}) + void addOverride(@Parameter(name = DOSSIER_TEMPLATE_ID_PARAM, description = "The identifier of the dossier template that is used for the dossier.", required = true) @PathVariable(DOSSIER_TEMPLATE_ID_PARAM) String dossierTemplateId, + @Parameter(name = DOSSIER_ID_PARAM, description = "The identifier of the dossier that contains the file.", required = true) @PathVariable(DOSSIER_ID_PARAM) String dossierId, + @Parameter(name = FILE_ID_PARAM, description = "The identifier of the file that the components are requested for.", required = true) @PathVariable(FILE_ID_PARAM) String fileId, + @Parameter(name = COMPONENT_OVERRIDE_PARAM, description = "The object to override the component.", required = true) @RequestBody Component componentOverrideModel); + + + @ResponseBody + @ResponseStatus(value = HttpStatus.OK) + @GetMapping(value = PATH + FILE_ID_PATH_VARIABLE + OVERRIDES_PATH, produces = {MediaType.APPLICATION_JSON_VALUE, MediaType.APPLICATION_XML_VALUE}) + @Operation(summary = "Gets overrides for components", description = "None") + @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "OK"), @ApiResponse(responseCode = "404", description = "Not found")}) + ComponentOverrideModelList getOverrides(@Parameter(name = DOSSIER_TEMPLATE_ID_PARAM, description = "The identifier of the dossier template that is used for the dossier.", required = true) @PathVariable(DOSSIER_TEMPLATE_ID_PARAM) String dossierTemplateId, + @Parameter(name = DOSSIER_ID_PARAM, description = "The identifier of the dossier that contains the file.", required = true) @PathVariable(DOSSIER_ID_PARAM) String dossierId, + @Parameter(name = FILE_ID_PARAM, description = "The identifier of the file that the components are requested for.", required = true) @PathVariable(FILE_ID_PARAM) String fileId); + + + @ResponseBody + @ResponseStatus(value = HttpStatus.NO_CONTENT) + @PostMapping(value = PATH + FILE_ID_PATH_VARIABLE + OVERRIDES_PATH + REVERT_PATH, consumes = MediaType.APPLICATION_JSON_VALUE) + @Operation(summary = "Reverts overrides for components", description = "None") + @ApiResponses(value = {@ApiResponse(responseCode = "204", description = "OK"), @ApiResponse(responseCode = "404", description = "Not found"), @ApiResponse(responseCode = "403", description = "Forbidden")}) + void revertOverrides(@Parameter(name = DOSSIER_TEMPLATE_ID_PARAM, description = "The identifier of the dossier template that is used for the dossier.", required = true) @PathVariable(DOSSIER_TEMPLATE_ID_PARAM) String dossierTemplateId, + @Parameter(name = DOSSIER_ID_PARAM, description = "The identifier of the dossier that contains the file.", required = true) @PathVariable(DOSSIER_ID_PARAM) String dossierId, + @Parameter(name = FILE_ID_PARAM, description = "The identifier of the file that the components are requested for.", required = true) @PathVariable(FILE_ID_PARAM) String fileId, + @RequestBody RevertOverrideRequest revertOverrideRequest); + } diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/model/ComponentOverride.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/model/ComponentOverride.java new file mode 100644 index 000000000..5a06c3994 --- /dev/null +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/model/ComponentOverride.java @@ -0,0 +1,21 @@ +package com.iqser.red.service.persistence.management.v1.processor.model; + +import java.util.ArrayList; +import java.util.List; + +import com.iqser.red.service.persistence.service.v1.api.shared.model.analysislog.componentlog.ComponentLogEntryValue; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class ComponentOverride { + + String name; + List componentOverrideValues = new ArrayList<>(); +} diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/ComponentLogService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/ComponentLogService.java index 54d907efa..b2e2ab860 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/ComponentLogService.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/ComponentLogService.java @@ -2,13 +2,19 @@ package com.iqser.red.service.persistence.management.v1.processor.service; import java.util.Comparator; import java.util.List; -import java.util.Objects; +import java.util.Map; import org.springframework.stereotype.Service; +import com.iqser.red.service.persistence.management.v1.processor.exception.NotFoundException; +import com.iqser.red.service.persistence.management.v1.processor.service.persistence.AuditPersistenceService; +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.component.ComponentsOverrides; +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.RevertOverrideRequest; +import com.iqser.red.service.persistence.service.v1.api.shared.mongo.service.ComponentLogMongoService; +import com.knecon.fforesight.keycloakcommons.security.KeycloakSecurity; import lombok.AccessLevel; import lombok.RequiredArgsConstructor; @@ -19,7 +25,8 @@ import lombok.experimental.FieldDefaults; public class ComponentLogService { private final FileManagementStorageService fileManagementStorageService; - private final ComponentOverrideService componentOverrideService; + private final ComponentLogMongoService componentLogMongoService; + private final AuditPersistenceService auditPersistenceService; // TODO: make this DB changeable! private static final List ORDER = List.of("Study_Title", @@ -65,30 +72,43 @@ public class ComponentLogService { public ComponentLog getComponentLog(String dossierId, String fileId, boolean includeOverrides) { - ComponentLog componentLog = sortComponentLogEntriesByOrderList(fileManagementStorageService.getComponentLog(dossierId, fileId), ORDER); + ComponentLog componentLog; + try { + componentLog = fileManagementStorageService.getComponentLog(dossierId, fileId); + } catch (NotFoundException e) { + var componentLogOptional = componentLogMongoService.findComponentLogByDossierIdAndFileId(dossierId, fileId); + if (componentLogOptional.isEmpty()) { + throw new NotFoundException(e.getMessage()); + } + componentLog = componentLogOptional.get(); + } if (!includeOverrides) { + componentLog = sortComponentLogEntriesByOrderList(componentLog, ORDER); return componentLog; } - ComponentsOverrides componentsOverrides = componentOverrideService.getOverrides(dossierId, fileId); - if (Objects.isNull(componentsOverrides.getComponentOverrides()) || componentsOverrides.getComponentOverrides().isEmpty()) { - return componentLog; - } + List componentOverrides = getOverrides(dossierId, fileId); - List overriddenComponentLogEntries = componentLog.getComponentLogEntries() - .stream() - .map(componentLogEntry -> applyOverride(componentLogEntry, - componentsOverrides.getComponentOverrides() - .get(componentLogEntry.getName()))) - .toList(); + replaceOverriddenComponentLogEntries(componentLog, componentOverrides); - componentLog.setComponentLogEntries(overriddenComponentLogEntries); + componentLog = sortComponentLogEntriesByOrderList(componentLog, ORDER); return componentLog; } + private void replaceOverriddenComponentLogEntries(ComponentLog componentLog, List componentOverrides) { + // remove override entries from componentLog + componentLog.getComponentLogEntries() + .removeIf(entry -> componentOverrides.stream() + .anyMatch(override -> entry.getName().equals(override.getName()))); + + // insert overrides to Component log + componentLog.getComponentLogEntries().addAll(componentOverrides); + } + + private ComponentLog sortComponentLogEntriesByOrderList(ComponentLog componentLog, List order) { return new ComponentLog(componentLog.getAnalysisNumber(), @@ -107,14 +127,93 @@ public class ComponentLogService { } - private ComponentLogEntry applyOverride(ComponentLogEntry componentLogEntry, String override) { + public void addOverride(String dossierId, String fileId, ComponentLogEntry componentOverride) { - if (Objects.isNull(override)) { - return componentLogEntry; + var optionalComponentLogEntry = componentLogMongoService.findComponentLogEntryById(dossierId, fileId, componentOverride.getName()); + + if (optionalComponentLogEntry.isPresent()) { + ComponentLogEntry componentToUpdate = optionalComponentLogEntry.get(); + componentToUpdate.setComponentValues(componentOverride.getComponentValues()); + saveOverride(dossierId, fileId, componentToUpdate); + auditOverride(dossierId, fileId, componentToUpdate); + } else { + insertOverride(dossierId, fileId, componentOverride); + auditOverride(dossierId, fileId, componentOverride); } - componentLogEntry.getComponentValues() - .forEach(componentValue -> componentValue.setValue(override)); - return componentLogEntry; + + } + + + private void saveOverride(String dossierId, String fileId, ComponentLogEntry componentToUpdate) { + + componentLogMongoService.saveComponentLogEntries(dossierId, fileId, List.of(componentToUpdate)); + + } + + + private void insertOverride(String dossierId, String fileId, ComponentLogEntry componentToAdd) { + + componentLogMongoService.insertComponentLogEntries(dossierId, fileId, List.of(componentToAdd)); + } + + + public List getOverrides(String dossierId, String fileId) { + + return componentLogMongoService.findOverrides(dossierId, fileId); + } + + + public void revertOverrides(String dossierId, String fileId, RevertOverrideRequest revertOverrideRequest) { + + revertOverrideRequest.getComponents() + .forEach(componentName -> { + var componentLogEntry = componentLogMongoService.findComponentLogEntryById(dossierId, fileId, componentName) + .orElseThrow(() -> new NotFoundException(String.format("Component %s was not found.", componentName))); + + auditOverrideRevert(dossierId, fileId, componentLogEntry); + }); + } + + + private void auditOverride(String dossierId, String fileId, ComponentLogEntry entry) { + + auditPersistenceService.audit(AuditRequest.builder() + .userId(KeycloakSecurity.getUserId()) + .objectId(fileId) + .category(AuditCategory.DOCUMENT.name()) + .message("The component is overwritten with value") + .details(Map.of("dossierId", + dossierId, + "fileId", + fileId, + "ComponentName", + entry.getName(), + "Action", + "MODIFY", + "Values", + entry.getComponentValues())) + .build()); + } + + + private void auditOverrideRevert(String dossierId, String fileId, ComponentLogEntry entry) { + + auditPersistenceService.audit(AuditRequest.builder() + .userId(KeycloakSecurity.getUserId()) + .objectId(fileId) + .category(AuditCategory.DOCUMENT.name()) + .message("The component override for was reverted") + .details(Map.of("dossierId", + dossierId, + "fileId", + fileId, + "ComponentName", + entry.getName(), + "Action", + "REVERT", + "Values", + entry.getComponentValues())) + .build()); } @@ -148,4 +247,4 @@ public class ComponentLogService { } -} +} \ No newline at end of file diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/ComponentOverrideService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/ComponentOverrideService.java deleted file mode 100644 index b61aea6df..000000000 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/ComponentOverrideService.java +++ /dev/null @@ -1,68 +0,0 @@ -package com.iqser.red.service.persistence.management.v1.processor.service; - -import java.io.ByteArrayInputStream; -import java.util.Collections; - -import org.springframework.stereotype.Service; - -import com.fasterxml.jackson.databind.ObjectMapper; -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.dossiertemplate.dossier.file.FileType; - -import lombok.RequiredArgsConstructor; -import lombok.SneakyThrows; - -@Service -@RequiredArgsConstructor -public class ComponentOverrideService { - - private final FileManagementStorageService fileManagementStorageService; - private final ObjectMapper objectMapper; - - - @SneakyThrows - public void addOverrides(String dossierId, String fileId, ComponentsOverrides componentsOverrides) { - - if (!fileManagementStorageService.objectExists(dossierId, fileId, FileType.COMPONENTS)) { - fileManagementStorageService.storeObject(dossierId, fileId, FileType.COMPONENTS, new ByteArrayInputStream(objectMapper.writeValueAsBytes(componentsOverrides))); - return; - } - - var existingComponentsBytes = fileManagementStorageService.getStoredObjectBytes(dossierId, fileId, FileType.COMPONENTS); - var existingComponents = objectMapper.readValue(existingComponentsBytes, ComponentsOverrides.class); - existingComponents.getComponentOverrides().putAll(componentsOverrides.getComponentOverrides()); - - fileManagementStorageService.storeObject(dossierId, fileId, FileType.COMPONENTS, new ByteArrayInputStream(objectMapper.writeValueAsBytes(existingComponents))); - } - - - @SneakyThrows - public ComponentsOverrides getOverrides(String dossierId, String fileId) { - - var exists = fileManagementStorageService.objectExists(dossierId, fileId, FileType.COMPONENTS); - if (!exists) { - return ComponentsOverrides.builder().componentOverrides(Collections.emptyMap()).build(); - } - var existingComponentsBytes = fileManagementStorageService.getStoredObjectBytes(dossierId, fileId, FileType.COMPONENTS); - return objectMapper.readValue(existingComponentsBytes, ComponentsOverrides.class); - } - - - @SneakyThrows - public void revertOverrides(String dossierId, String fileId, RevertOverrideRequest revertOverrideRequest) { - - if (!fileManagementStorageService.objectExists(dossierId, fileId, FileType.COMPONENTS)) { - return; - } - - var existingComponentsBytes = fileManagementStorageService.getStoredObjectBytes(dossierId, fileId, FileType.COMPONENTS); - var existingComponents = objectMapper.readValue(existingComponentsBytes, ComponentsOverrides.class); - - revertOverrideRequest.getComponents() - .forEach(c -> existingComponents.getComponentOverrides().remove(c)); - - fileManagementStorageService.storeObject(dossierId, fileId, FileType.COMPONENTS, new ByteArrayInputStream(objectMapper.writeValueAsBytes(existingComponents))); - } - -} diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/resources/mongo/changelog/mongo.changelog-tenant.xml b/persistence-service-v1/persistence-service-processor-v1/src/main/resources/mongo/changelog/mongo.changelog-tenant.xml index a7f704703..e3cb9067d 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/resources/mongo/changelog/mongo.changelog-tenant.xml +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/resources/mongo/changelog/mongo.changelog-tenant.xml @@ -5,4 +5,5 @@ + diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/resources/mongo/changelog/tenant/3-create-component-entities.xml b/persistence-service-v1/persistence-service-processor-v1/src/main/resources/mongo/changelog/tenant/3-create-component-entities.xml new file mode 100644 index 000000000..eca068400 --- /dev/null +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/resources/mongo/changelog/tenant/3-create-component-entities.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + \ 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/tests/ComponentLogDocumentMapperTest.java b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/ComponentLogDocumentMapperTest.java new file mode 100644 index 000000000..d1b3b1471 --- /dev/null +++ b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/ComponentLogDocumentMapperTest.java @@ -0,0 +1,62 @@ +//package com.iqser.red.service.peristence.v1.server.integration.tests; +// +//import static com.mongodb.assertions.Assertions.assertNotNull; +//import static com.mongodb.assertions.Assertions.assertTrue; +//import static org.junit.jupiter.api.Assertions.assertEquals; +// +//import java.util.List; +//import java.util.Optional; +// +//import org.junit.jupiter.api.Test; +//import org.springframework.core.io.ClassPathResource; +// +//import com.fasterxml.jackson.databind.ObjectMapper; +//import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; +//import com.iqser.red.service.persistence.service.v1.api.shared.mongo.document.ComponentDocument; +//import com.iqser.red.service.persistence.service.v1.api.shared.mongo.mapper.ComponentLogDocumentMapper; +// +//import lombok.SneakyThrows; +// +//public class ComponentLogDocumentMapperTest { +// +// private final ComponentLogDocumentMapper mapper = ComponentLogDocumentMapper.INSTANCE; +// +// private final String COMPONENT_LOG = "files/componentlog/componentLogExample.json"; +// private final String COMPONENT_OVERRIDE = "files/componentlog/componentOverrideExample.json"; +// private static final String TEST_DOSSIER_ID = "91ce8e90-9aec-473c-b8c3-cbe16443ad34"; +// private static final String TEST_FILE_ID = "b2cbdd4dca0aa1aa0ebbfc5cc1462df0"; +// +// +// @Test +// @SneakyThrows +// public void ComponentOverrideMapper() { +// +// var overrideFile = new ClassPathResource(String.format(COMPONENT_OVERRIDE)); +// ObjectMapper objectMapper = new ObjectMapper(); +// objectMapper.registerModule(new JavaTimeModule()); +// +// ComponentsOverrides componentsOverridesBefore = objectMapper.readValue(overrideFile.getInputStream(), ComponentsOverrides.class); +// +// List componentDocument = mapper.toComponentOverrideDocuments(componentsOverridesBefore, TEST_DOSSIER_ID, TEST_FILE_ID); +// +// assertEquals(componentDocument.get(0).getDossierId(), TEST_DOSSIER_ID); +// assertEquals(componentDocument.get(0).getFileId(), TEST_FILE_ID); +// assertEquals(componentDocument.get(0).getId(), mapper.getComponentId(TEST_DOSSIER_ID, TEST_FILE_ID, componentDocument.get(0).getName())); +// +// Optional optionalComponentValueDocument = componentDocument.get(0).getOverrideValues() +// .stream() +// .findFirst(); +// +// assertTrue(optionalComponentValueDocument.isPresent()); +// assertNotNull(optionalComponentValueDocument.get().getValueId()); +// assertNotNull(optionalComponentValueDocument.get().getComponentOverrideId()); +// +// ComponentsOverrides componentsOverridesAfter = mapper.fromComponentOverrideDocument(componentDocument.get(0)); +// +// assertEquals(mapper.buildComponentOverrideMap(componentDocument.get(0).getName(), +// componentsOverridesBefore.getComponentOverrides() +// .get(componentDocument.get(0).getName())), componentsOverridesAfter); +// +// } +// +//} diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/resources/files/componentlog/componentLogExample.json b/persistence-service-v1/persistence-service-server-v1/src/test/resources/files/componentlog/componentLogExample.json new file mode 100644 index 000000000..9c51139c2 --- /dev/null +++ b/persistence-service-v1/persistence-service-server-v1/src/test/resources/files/componentlog/componentLogExample.json @@ -0,0 +1,266 @@ +{ + "analysisNumber": 3, + "componentRulesVersion": 1, + "componentLogEntries": [ + { + "name": "Study_Title", + "componentValues": [ + { + "valueId": null, + "value": "", + "originalValue": "", + "valueDescription": "First found value of type or else ''", + "componentRuleId": "StudyTitle.0.0", + "componentLogEntityReferences": [] + } + ] + }, + { + "name": "Performing_Laboratory", + "componentValues": [ + { + "valueId": null, + "value": "", + "originalValue": "", + "valueDescription": "fallback", + "componentRuleId": "PerformingLaboratory.0.2", + "componentLogEntityReferences": [] + } + ] + }, + { + "name": "Report_Number", + "componentValues": [ + { + "valueId": null, + "value": "", + "originalValue": "", + "valueDescription": "First found value of type or else ''", + "componentRuleId": "ReportNumber.0.0", + "componentLogEntityReferences": [] + } + ] + }, + { + "name": "GLP_Study", + "componentValues": [ + { + "valueId": null, + "value": "No", + "originalValue": "No", + "valueDescription": "Yes if present, No if not", + "componentRuleId": "GLPStudy.1.0", + "componentLogEntityReferences": [] + } + ] + }, + { + "name": "Test_Guidelines_2", + "componentValues": [ + { + "valueId": null, + "value": "", + "originalValue": "", + "valueDescription": "Joining all values of type with ', '", + "componentRuleId": "TestGuideline.2.0", + "componentLogEntityReferences": [] + } + ] + }, + { + "name": "Experimental_Starting_Date", + "componentValues": [ + { + "valueId": null, + "value": "", + "originalValue": "", + "valueDescription": "Convert values of type '' to dd/MM/yyyy joined with ', '", + "componentRuleId": "StartDate.0.0", + "componentLogEntityReferences": [] + } + ] + }, + { + "name": "Experimental_Completion_Date", + "componentValues": [ + { + "valueId": null, + "value": "", + "originalValue": "", + "valueDescription": "Convert values of type '' to dd/MM/yyyy joined with ', '", + "componentRuleId": "CompletionDate.0.0", + "componentLogEntityReferences": [] + } + ] + }, + { + "name": "Certificate_of_Analysis_Batch_Identification", + "componentValues": [ + { + "valueId": null, + "value": "", + "originalValue": "", + "valueDescription": "Joining all unique values of type with ', '", + "componentRuleId": "AnalysisCertificate.0.0", + "componentLogEntityReferences": [] + } + ] + }, + { + "name": "Species", + "componentValues": [ + { + "valueId": null, + "value": "", + "originalValue": "", + "valueDescription": "First found value of type or else ''", + "componentRuleId": "Species.0.0", + "componentLogEntityReferences": [] + } + ] + }, + { + "name": "Strain", + "componentValues": [ + { + "valueId": null, + "value": "", + "originalValue": "", + "valueDescription": "First found value of type or else ''", + "componentRuleId": "Strain.0.0", + "componentLogEntityReferences": [] + } + ] + }, + { + "name": "Doses_mg_per_kg_bw", + "componentValues": [ + { + "valueId": null, + "value": "", + "originalValue": "", + "valueDescription": "Joining all values of type with ' '", + "componentRuleId": "Necropsy.1.0", + "componentLogEntityReferences": [] + } + ] + }, + { + "name": "Mortality_Statement", + "componentValues": [ + { + "valueId": null, + "value": "", + "originalValue": "", + "valueDescription": "Joining all values of type with ' '", + "componentRuleId": "MortalityStatement.0.0", + "componentLogEntityReferences": [] + } + ] + }, + { + "name": "Weight_Behavior_Changes", + "componentValues": [ + { + "valueId": null, + "value": "", + "originalValue": "", + "valueDescription": "Joining all values of type with '\n'", + "componentRuleId": "WeightBehavior.0.0", + "componentLogEntityReferences": [] + } + ] + }, + { + "name": "Necropsy_Findings", + "componentValues": [ + { + "valueId": null, + "value": "", + "originalValue": "", + "valueDescription": "Joining all values of type with ' '", + "componentRuleId": "Necropsy.0.0", + "componentLogEntityReferences": [] + } + ] + }, + { + "name": "Deviation_from_the_Guideline", + "componentValues": [ + { + "valueId": null, + "value": "", + "originalValue": "", + "valueDescription": "Joining all values of type with '\n'", + "componentRuleId": "GuidelineDeviation.0.0", + "componentLogEntityReferences": [] + } + ] + }, + { + "name": "Conclusion_LD50_Greater_than", + "componentValues": [ + { + "valueId": null, + "value": "", + "originalValue": "", + "valueDescription": "No entity of type 'ld50_greater' found", + "componentRuleId": "Conclusion.1.1", + "componentLogEntityReferences": [] + } + ] + }, + { + "name": "Conclusion_LD50_mg_per_kg", + "componentValues": [ + { + "valueId": null, + "value": "", + "originalValue": "", + "valueDescription": "Joining all unique values of type with ', '", + "componentRuleId": "Conclusion.0.0", + "componentLogEntityReferences": [] + } + ] + }, + { + "name": "Conclusion_Minimum_Confidence", + "componentValues": [ + { + "valueId": null, + "value": "", + "originalValue": "", + "valueDescription": "Joining all unique values of type with ', '", + "componentRuleId": "Conclusion.2.0", + "componentLogEntityReferences": [] + } + ] + }, + { + "name": "Conclusion_Maximum_Confidence", + "componentValues": [ + { + "valueId": null, + "value": "", + "originalValue": "", + "valueDescription": "Joining all unique values of type with ', '", + "componentRuleId": "Conclusion.3.0", + "componentLogEntityReferences": [] + } + ] + }, + { + "name": "Study_Conclusion", + "componentValues": [ + { + "valueId": null, + "value": "", + "originalValue": "", + "valueDescription": "Joining all values of type with ' '", + "componentRuleId": "StudyConclusion.0.0", + "componentLogEntityReferences": [] + } + ] + } + ] +} \ No newline at end of file diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/resources/files/componentlog/componentOverrideExample.json b/persistence-service-v1/persistence-service-server-v1/src/test/resources/files/componentlog/componentOverrideExample.json new file mode 100644 index 000000000..e78ce1ef0 --- /dev/null +++ b/persistence-service-v1/persistence-service-server-v1/src/test/resources/files/componentlog/componentOverrideExample.json @@ -0,0 +1,244 @@ +{ + "componentOverrides": [ + { + "name": "Study_Title", + "componentValues": [ + { + "valueId": "1", + "value": "", + "valueDescription": "First found value of type or else ''", + "componentRuleId": "StudyTitle.0.0", + "componentLogEntityReferences": [] + } + ] + }, + { + "name": "Performing_Laboratory", + "componentValues": [ + { + "valueId": "2", + "value": "", + "valueDescription": "fallback", + "componentRuleId": "PerformingLaboratory.0.2", + "componentLogEntityReferences": [] + } + ] + }, + { + "name": "Report_Number", + "componentValues": [ + { + "valueId": "3", + "value": "", + "valueDescription": "First found value of type or else ''", + "componentRuleId": "ReportNumber.0.0", + "componentLogEntityReferences": [] + } + ] + }, + { + "name": "GLP_Study", + "componentValues": [ + { + "valueId": "4", + "value": "No", + "valueDescription": "Yes if present, No if not", + "componentRuleId": "GLPStudy.1.0", + "componentLogEntityReferences": [] + } + ] + }, + { + "name": "Test_Guidelines_2", + "componentValues": [ + { + "valueId": "5", + "value": "", + "valueDescription": "Joining all values of type with ', '", + "componentRuleId": "TestGuideline.2.0", + "componentLogEntityReferences": [] + } + ] + }, + { + "name": "Experimental_Starting_Date", + "componentValues": [ + { + "valueId": "6", + "value": "", + "valueDescription": "Convert values of type '' to dd/MM/yyyy joined with ', '", + "componentRuleId": "StartDate.0.0", + "componentLogEntityReferences": [] + } + ] + }, + { + "name": "Experimental_Completion_Date", + "componentValues": [ + { + "valueId": "7", + "value": "", + "valueDescription": "Convert values of type '' to dd/MM/yyyy joined with ', '", + "componentRuleId": "CompletionDate.0.0", + "componentLogEntityReferences": [] + } + ] + }, + { + "name": "Certificate_of_Analysis_Batch_Identification", + "componentValues": [ + { + "valueId": "8", + "value": "", + "valueDescription": "Joining all unique values of type with ', '", + "componentRuleId": "AnalysisCertificate.0.0", + "componentLogEntityReferences": [] + } + ] + }, + { + "name": "Species", + "componentValues": [ + { + "valueId": "9", + "value": "", + "valueDescription": "First found value of type or else ''", + "componentRuleId": "Species.0.0", + "componentLogEntityReferences": [] + } + ] + }, + { + "name": "Strain", + "componentValues": [ + { + "valueId": "10", + "value": "", + "valueDescription": "First found value of type or else ''", + "componentRuleId": "Strain.0.0", + "componentLogEntityReferences": [] + } + ] + }, + { + "name": "Doses_mg_per_kg_bw", + "componentValues": [ + { + "valueId": "11", + "value": "", + "valueDescription": "Joining all values of type with ' '", + "componentRuleId": "Necropsy.1.0", + "componentLogEntityReferences": [] + } + ] + }, + { + "name": "Mortality_Statement", + "componentValues": [ + { + "valueId": "12", + "value": "", + "valueDescription": "Joining all values of type with ' '", + "componentRuleId": "MortalityStatement.0.0", + "componentLogEntityReferences": [] + } + ] + }, + { + "name": "Weight_Behavior_Changes", + "componentValues": [ + { + "valueId": "13", + "value": "", + "valueDescription": "Joining all values of type with '\n'", + "componentRuleId": "WeightBehavior.0.0", + "componentLogEntityReferences": [] + } + ] + }, + { + "name": "Necropsy_Findings", + "componentValues": [ + { + "valueId": "14", + "value": "", + "valueDescription": "Joining all values of type with ' '", + "componentRuleId": "Necropsy.0.0", + "componentLogEntityReferences": [] + } + ] + }, + { + "name": "Deviation_from_the_Guideline", + "componentValues": [ + { + "valueId": "15", + "value": "", + "valueDescription": "Joining all values of type with '\n'", + "componentRuleId": "GuidelineDeviation.0.0", + "componentLogEntityReferences": [] + } + ] + }, + { + "name": "Conclusion_LD50_Greater_than", + "componentValues": [ + { + "valueId": "16", + "value": "", + "valueDescription": "No entity of type 'ld50_greater' found", + "componentRuleId": "Conclusion.1.1", + "componentLogEntityReferences": [] + } + ] + }, + { + "name": "Conclusion_LD50_mg_per_kg", + "componentValues": [ + { + "valueId": "17", + "value": "", + "valueDescription": "Joining all unique values of type with ', '", + "componentRuleId": "Conclusion.0.0", + "componentLogEntityReferences": [] + } + ] + }, + { + "name": "Conclusion_Minimum_Confidence", + "componentValues": [ + { + "valueId": "18", + "value": "", + "valueDescription": "Joining all unique values of type with ', '", + "componentRuleId": "Conclusion.2.0", + "componentLogEntityReferences": [] + } + ] + }, + { + "name": "Conclusion_Maximum_Confidence", + "componentValues": [ + { + "valueId": "19", + "value": "", + "valueDescription": "Joining all unique values of type with ', '", + "componentRuleId": "Conclusion.3.0", + "componentLogEntityReferences": [] + } + ] + }, + { + "name": "Study_Conclusion", + "componentValues": [ + { + "valueId": "20", + "value": "", + "valueDescription": "Joining all values of type with ' '", + "componentRuleId": "StudyConclusion.0.0", + "componentLogEntityReferences": [] + } + ] + } + ] +} \ No newline at end of file diff --git a/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/analysislog/componentlog/ComponentLogEntry.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/analysislog/componentlog/ComponentLogEntry.java index 143bc55b1..1ab54b8c6 100644 --- a/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/analysislog/componentlog/ComponentLogEntry.java +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/analysislog/componentlog/ComponentLogEntry.java @@ -16,5 +16,5 @@ public class ComponentLogEntry { String name; List componentValues; - + boolean overridden; } diff --git a/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/component/ComponentsOverrides.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/component/ComponentsOverrides.java deleted file mode 100644 index ead7333cb..000000000 --- a/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/component/ComponentsOverrides.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.iqser.red.service.persistence.service.v1.api.shared.model.component; - -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 ComponentsOverrides { - - private Map componentOverrides = new HashMap<>(); - -} diff --git a/persistence-service-v1/persistence-service-shared-mongo-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/mongo/document/ComponentDocument.java b/persistence-service-v1/persistence-service-shared-mongo-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/mongo/document/ComponentDocument.java new file mode 100644 index 000000000..e2ef280f3 --- /dev/null +++ b/persistence-service-v1/persistence-service-shared-mongo-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/mongo/document/ComponentDocument.java @@ -0,0 +1,39 @@ +package com.iqser.red.service.persistence.service.v1.api.shared.mongo.document; + +import java.util.ArrayList; +import java.util.List; + +import org.springframework.data.annotation.Id; +import org.springframework.data.mongodb.core.mapping.Document; + +import com.iqser.red.service.persistence.service.v1.api.shared.model.analysislog.componentlog.ComponentLogEntryValue; + +import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; +import lombok.experimental.FieldDefaults; + +@Data +@NoArgsConstructor +@AllArgsConstructor +@EqualsAndHashCode(onlyExplicitlyIncluded = true) +@FieldDefaults(level = AccessLevel.PRIVATE) +@Document(collection = "components") +public class ComponentDocument { + + @Id + @EqualsAndHashCode.Include + String id; // componentLogId/name = componentOverrideId + + String componentLogId; + + String name; + + List overrideValues = new ArrayList<>(); + + // these parameters will be needed later + // List values = new ArrayList<>(); + // boolean overridden; +} diff --git a/persistence-service-v1/persistence-service-shared-mongo-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/mongo/document/ComponentLogDocument.java b/persistence-service-v1/persistence-service-shared-mongo-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/mongo/document/ComponentLogDocument.java new file mode 100644 index 000000000..e230689f2 --- /dev/null +++ b/persistence-service-v1/persistence-service-shared-mongo-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/mongo/document/ComponentLogDocument.java @@ -0,0 +1,38 @@ +package com.iqser.red.service.persistence.service.v1.api.shared.mongo.document; + +import java.util.ArrayList; +import java.util.List; + +import org.springframework.data.annotation.Id; +import org.springframework.data.mongodb.core.mapping.DBRef; +import org.springframework.data.mongodb.core.mapping.Document; + +import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; +import lombok.experimental.FieldDefaults; + +@Data +@NoArgsConstructor +@AllArgsConstructor +@EqualsAndHashCode(onlyExplicitlyIncluded = true) +@FieldDefaults(level = AccessLevel.PRIVATE) +@Document(collection = "component-logs") +public class ComponentLogDocument { + + @Id + @EqualsAndHashCode.Include + String id; // dossierId/fileId = componentLogId + + String dossierId; + String fileId; + + int analysisNumber; + long componentRulesVersion = -1; + + @DBRef + List components = new ArrayList<>(); + +} diff --git a/persistence-service-v1/persistence-service-shared-mongo-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/mongo/exception/ComponentLogDocumentNotFoundException.java b/persistence-service-v1/persistence-service-shared-mongo-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/mongo/exception/ComponentLogDocumentNotFoundException.java new file mode 100644 index 000000000..05e56d25e --- /dev/null +++ b/persistence-service-v1/persistence-service-shared-mongo-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/mongo/exception/ComponentLogDocumentNotFoundException.java @@ -0,0 +1,10 @@ +package com.iqser.red.service.persistence.service.v1.api.shared.mongo.exception; + +public class ComponentLogDocumentNotFoundException extends RuntimeException { + + public ComponentLogDocumentNotFoundException(String errorMessage) { + + super(errorMessage); + } + +} diff --git a/persistence-service-v1/persistence-service-shared-mongo-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/mongo/mapper/ComponentLogDocumentMapper.java b/persistence-service-v1/persistence-service-shared-mongo-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/mongo/mapper/ComponentLogDocumentMapper.java new file mode 100644 index 000000000..67dafef80 --- /dev/null +++ b/persistence-service-v1/persistence-service-shared-mongo-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/mongo/mapper/ComponentLogDocumentMapper.java @@ -0,0 +1,56 @@ +package com.iqser.red.service.persistence.service.v1.api.shared.mongo.mapper; + +import java.util.List; + +import org.mapstruct.Mapper; +import org.mapstruct.Mapping; +import org.mapstruct.factory.Mappers; + +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.mongo.document.ComponentDocument; +import com.iqser.red.service.persistence.service.v1.api.shared.mongo.document.ComponentLogDocument; + +@Mapper +public interface ComponentLogDocumentMapper { + + ComponentLogDocumentMapper INSTANCE = Mappers.getMapper(ComponentLogDocumentMapper.class); + + + @Mapping(source = "components", target = "componentLogEntries") + ComponentLog fromComponentLogDocument(ComponentLogDocument componentLogDocument); + + + List toComponentDocuments(List componentLogEntries); + + + @Mapping(source = "overrideValues", target = "componentValues") + ComponentLogEntry fromComponentDocument(ComponentDocument componentDocument); + + + @Mapping(expression = "java(getComponentLogId(dossierId, fileId))", target = "id") + ComponentLogDocument toComponentLogDocument(String dossierId, String fileId, ComponentLog componentLog); + + + @Mapping(expression = "java(getComponentId(componentLogId, componentLogEntry.getName()))", target = "id") + ComponentDocument toComponentDocument(String componentLogId, ComponentLogEntry componentLogEntry); + + + default String getComponentLogId(String dossierId, String fileId) { + + return dossierId + "/" + fileId; + } + + + default String getComponentId(String componentLogId, String componentName) { + + return componentLogId + "/" + componentName; + } + + + default String getComponentId(String dossierId, String fileId, String componentName) { + + return getComponentLogId(dossierId, fileId) + "/" + componentName; + } + +} diff --git a/persistence-service-v1/persistence-service-shared-mongo-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/mongo/repository/ComponentDocumentRepository.java b/persistence-service-v1/persistence-service-shared-mongo-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/mongo/repository/ComponentDocumentRepository.java new file mode 100644 index 000000000..1e48abcaf --- /dev/null +++ b/persistence-service-v1/persistence-service-shared-mongo-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/mongo/repository/ComponentDocumentRepository.java @@ -0,0 +1,22 @@ +package com.iqser.red.service.persistence.service.v1.api.shared.mongo.repository; + +import java.util.List; +import java.util.Optional; + +import org.springframework.data.mongodb.repository.MongoRepository; +import org.springframework.data.mongodb.repository.Query; +import org.springframework.stereotype.Repository; + +import com.iqser.red.service.persistence.service.v1.api.shared.mongo.document.ComponentDocument; + +@Repository +public interface ComponentDocumentRepository extends MongoRepository { + + @Query(value = "{ 'componentLogId' : ?0}", delete = true) + void deleteByComponentLogId(String componentLogId); + + + @Query(value = "{ 'componentLogId': ?0, 'componentName': ?1 }") + Optional findComponentDocumentByName(String componentLogId, String componentName); + +} diff --git a/persistence-service-v1/persistence-service-shared-mongo-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/mongo/repository/ComponentLogDocumentRepository.java b/persistence-service-v1/persistence-service-shared-mongo-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/mongo/repository/ComponentLogDocumentRepository.java new file mode 100644 index 000000000..262e23842 --- /dev/null +++ b/persistence-service-v1/persistence-service-shared-mongo-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/mongo/repository/ComponentLogDocumentRepository.java @@ -0,0 +1,22 @@ +package com.iqser.red.service.persistence.service.v1.api.shared.mongo.repository; + +import java.util.Optional; + +import org.springframework.core.convert.TypeDescriptor; +import org.springframework.data.mongodb.repository.MongoRepository; +import org.springframework.data.mongodb.repository.Query; +import org.springframework.stereotype.Repository; + +import com.iqser.red.service.persistence.service.v1.api.shared.mongo.document.ComponentLogDocument; + +@Repository +public interface ComponentLogDocumentRepository extends MongoRepository, CustomComponentRepository { + + @Query(value = "{ 'id' : ?0 }", fields = "{ 'analysisNumber' : 1 }") + Optional findAnalysisNumberById(String id); + + + @Query(value = "{ 'id': ?0 }", fields = "{ 'components': 0 }") + Optional findComponentLogDocumentWithoutEntriesById(String id); + +} diff --git a/persistence-service-v1/persistence-service-shared-mongo-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/mongo/repository/CustomComponentRepository.java b/persistence-service-v1/persistence-service-shared-mongo-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/mongo/repository/CustomComponentRepository.java new file mode 100644 index 000000000..32199d5f8 --- /dev/null +++ b/persistence-service-v1/persistence-service-shared-mongo-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/mongo/repository/CustomComponentRepository.java @@ -0,0 +1,14 @@ +package com.iqser.red.service.persistence.service.v1.api.shared.mongo.repository; + +import java.util.List; + +import org.springframework.stereotype.Repository; + +import com.iqser.red.service.persistence.service.v1.api.shared.mongo.document.ComponentDocument; + +@Repository +public interface CustomComponentRepository { + + List findOverrides(String fileId, String dossierId); + +} diff --git a/persistence-service-v1/persistence-service-shared-mongo-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/mongo/repository/CustomComponentRepositoryImpl.java b/persistence-service-v1/persistence-service-shared-mongo-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/mongo/repository/CustomComponentRepositoryImpl.java new file mode 100644 index 000000000..344e0f8ca --- /dev/null +++ b/persistence-service-v1/persistence-service-shared-mongo-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/mongo/repository/CustomComponentRepositoryImpl.java @@ -0,0 +1,49 @@ +package com.iqser.red.service.persistence.service.v1.api.shared.mongo.repository; + +import static org.springframework.data.mongodb.core.aggregation.Aggregation.match; +import static org.springframework.data.mongodb.core.aggregation.Aggregation.newAggregation; +import static org.springframework.data.mongodb.core.aggregation.Aggregation.replaceRoot; +import static org.springframework.data.mongodb.core.aggregation.Aggregation.unwind; + +import java.util.List; + +import org.springframework.data.mongodb.core.MongoTemplate; +import org.springframework.data.mongodb.core.aggregation.Aggregation; +import org.springframework.data.mongodb.core.aggregation.AggregationOperation; +import org.springframework.data.mongodb.core.aggregation.AggregationResults; +import org.springframework.data.mongodb.core.aggregation.LookupOperation; +import org.springframework.data.mongodb.core.query.Criteria; +import org.springframework.stereotype.Repository; + +import com.iqser.red.service.persistence.service.v1.api.shared.mongo.document.ComponentDocument; + +import lombok.RequiredArgsConstructor; + +@Repository +@RequiredArgsConstructor +public class CustomComponentRepositoryImpl implements CustomComponentRepository { + + private final MongoTemplate mongoTemplate; + + + @Override + public List findOverrides(String fileId, String dossierId) { + + LookupOperation lookupOperation = LookupOperation.newLookup().from("componentDocument").localField("components").foreignField("_id").as("componentDocs"); + + AggregationOperation matchOperation = match(Criteria.where("fileId").is(fileId).and("dossierId").is(dossierId)); + + AggregationOperation unwindOperation = unwind("componentDocs"); + + AggregationOperation matchNonEmptyOverrides = match(Criteria.where("componentDocs.overrideValues").ne(null)); + + AggregationOperation replaceRootOperation = replaceRoot("componentDocs"); + + Aggregation aggregation = newAggregation(matchOperation, lookupOperation, unwindOperation, matchNonEmptyOverrides, replaceRootOperation); + + AggregationResults results = mongoTemplate.aggregate(aggregation, "componentLogDocument", ComponentDocument.class); + + return results.getMappedResults(); + } + +} diff --git a/persistence-service-v1/persistence-service-shared-mongo-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/mongo/service/ComponentLogMongoService.java b/persistence-service-v1/persistence-service-shared-mongo-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/mongo/service/ComponentLogMongoService.java new file mode 100644 index 000000000..a4d728e11 --- /dev/null +++ b/persistence-service-v1/persistence-service-shared-mongo-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/mongo/service/ComponentLogMongoService.java @@ -0,0 +1,229 @@ +package com.iqser.red.service.persistence.service.v1.api.shared.mongo.service; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import java.util.Optional; + +import org.springframework.stereotype.Service; + +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.mongo.document.ComponentDocument; +import com.iqser.red.service.persistence.service.v1.api.shared.mongo.document.ComponentLogDocument; +import com.iqser.red.service.persistence.service.v1.api.shared.mongo.exception.ComponentLogDocumentNotFoundException; +import com.iqser.red.service.persistence.service.v1.api.shared.mongo.mapper.ComponentLogDocumentMapper; +import com.iqser.red.service.persistence.service.v1.api.shared.mongo.repository.ComponentDocumentRepository; +import com.iqser.red.service.persistence.service.v1.api.shared.mongo.repository.ComponentLogDocumentRepository; + +import lombok.AccessLevel; +import lombok.experimental.FieldDefaults; + +@Service +@FieldDefaults(level = AccessLevel.PRIVATE, makeFinal = true) +public class ComponentLogMongoService { + + ComponentLogDocumentRepository componentLogDocumentRepository; + ComponentDocumentRepository componentDocumentRepository; + ComponentLogDocumentMapper mapper = ComponentLogDocumentMapper.INSTANCE; + + + public ComponentLogMongoService(ComponentLogDocumentRepository componentLogDocumentRepository, ComponentDocumentRepository componentDocumentRepository) { + + this.componentLogDocumentRepository = componentLogDocumentRepository; + this.componentDocumentRepository = componentDocumentRepository; + } + + + public void insertComponentLog(String dossierId, String fileId, ComponentLog componentLog) { + + ComponentLogDocument componentLogDocument = componentLogDocumentRepository.insert(mapper.toComponentLogDocument(dossierId, fileId, componentLog)); + componentDocumentRepository.insert(componentLog.getComponentLogEntries() + .stream() + .map(componentLogEntry -> mapper.toComponentDocument(componentLogDocument.getId(), componentLogEntry)) + .toList()); + } + + + public void saveComponentLog(String dossierId, String fileId, ComponentLog componentLog) { + + ComponentLogDocument componentLogDocument = componentLogDocumentRepository.save(mapper.toComponentLogDocument(dossierId, fileId, componentLog)); + componentDocumentRepository.saveAll(componentLog.getComponentLogEntries() + .stream() + .map(componentLogEntry -> mapper.toComponentDocument(componentLogDocument.getId(), componentLogEntry)) + .toList()); + } + + + public void upsertComponentLog(String dossierId, String fileId, ComponentLog componentLog) { + + Optional optionalComponentLogDocument = componentLogDocumentRepository.findById(mapper.getComponentLogId(dossierId, fileId)); + if (optionalComponentLogDocument.isEmpty()) { + insertComponentLog(dossierId, fileId, componentLog); + return; + } + + ComponentLogDocument oldComponentLogDocument = optionalComponentLogDocument.get(); + List oldComponentDocuments = oldComponentLogDocument.getComponents(); + + ComponentLogDocument newComponentLogDocument = mapper.toComponentLogDocument(dossierId, fileId, componentLog); + List newComponentDocuments = newComponentLogDocument.getComponents(); + + List toUpdate = new ArrayList<>(newComponentDocuments); + toUpdate.retainAll(oldComponentDocuments); + + List toRemove = new ArrayList<>(oldComponentDocuments); + toRemove.removeAll(toUpdate); + + List toInsert = new ArrayList<>(newComponentDocuments); + toInsert.removeAll(toUpdate); + + componentDocumentRepository.saveAll(toUpdate); + componentDocumentRepository.deleteAll(toRemove); + componentDocumentRepository.insert(toInsert); + + componentLogDocumentRepository.save(newComponentLogDocument); + + } + + + public void deleteComponentLog(String dossierId, String fileId) { + + String componentLogId = mapper.getComponentLogId(dossierId, fileId); + + componentLogDocumentRepository.deleteById(componentLogId); + + componentDocumentRepository.deleteByComponentLogId(componentLogId); + } + + + public void insertComponentLogEntries(String dossierId, String fileId, List componentLogEntries) { + + String componentLogId = mapper.getComponentLogId(dossierId, fileId); + + ComponentLogDocument componentLogDocument = getComponentLogDocument(componentLogId); + + List componentDocuments = componentLogEntries.stream() + .map(componentLogEntry -> mapper.toComponentDocument(componentLogId, componentLogEntry)) + .toList(); + + componentLogDocument.getComponents().addAll(componentDocuments); + + componentDocumentRepository.insert(componentDocuments); + componentLogDocumentRepository.save(componentLogDocument); + } + + + private ComponentLogDocument getComponentLogDocument(String componentLogId) { + + Optional optionalComponentLogDocument = componentLogDocumentRepository.findById(componentLogId); + + if (optionalComponentLogDocument.isEmpty()) { + throw new ComponentLogDocumentNotFoundException(String.format("Component log not found for %s", componentLogId)); + } + + return optionalComponentLogDocument.get(); + } + + + public void saveComponentLogEntries(String dossierId, String fileId, List componentLogEntries) { + + String componentLogId = mapper.getComponentLogId(dossierId, fileId); + + ComponentLogDocument componentLogDocument = getComponentLogDocument(componentLogId); + + List componentDocuments = componentLogEntries.stream() + .map(componentLogEntry -> mapper.toComponentDocument(componentLogId, componentLogEntry)) + .toList(); + + componentLogDocument.getComponents().addAll(componentDocuments); + + componentDocumentRepository.saveAll(componentDocuments); + componentLogDocumentRepository.save(componentLogDocument); + } + + + public void updateComponentLogEntries(String dossierId, String fileId, List componentLogEntries) { + + String componentLogId = mapper.getComponentLogId(dossierId, fileId); + + componentDocumentRepository.saveAll(componentLogEntries.stream() + .map(componentLogEntry -> mapper.toComponentDocument(componentLogId, componentLogEntry)) + .toList()); + } + + + public void deleteComponentLogEntries(String dossierId, String fileId, List componentLogEntries) { + + String componentLogId = mapper.getComponentLogId(dossierId, fileId); + + ComponentLogDocument componentLogDocument = getComponentLogDocument(componentLogId); + + List componentDocuments = componentLogEntries.stream() + .map(componentLogEntry -> mapper.toComponentDocument(componentLogId, componentLogEntry)) + .toList(); + + componentLogDocument.getComponents().removeAll(componentDocuments); + + componentDocumentRepository.deleteAll(componentDocuments); + componentLogDocumentRepository.save(componentLogDocument); + } + + + public Optional findComponentLogByDossierIdAndFileId(String dossierId, String fileId) { + + return componentLogDocumentRepository.findById(mapper.getComponentLogId(dossierId, fileId)) + .map(mapper::fromComponentLogDocument); + } + + + public Optional findComponentLogEntryById(String dossierId, String fileId, String componentName) { + + return componentDocumentRepository.findComponentDocumentByName(mapper.getComponentLogId(dossierId, fileId), componentName) + .map(mapper::fromComponentDocument); + } + + + public List findOverrides(String dossierId, String fileId) { + + return componentLogDocumentRepository.findOverrides(dossierId, fileId) + .stream() + .map(mapper::fromComponentDocument) + .toList(); + } + + + public boolean componentLogDocumentExists(String dossierId, String fileId) { + + return componentLogDocumentRepository.existsById(mapper.getComponentLogId(dossierId, fileId)); + } + + + public Optional findLatestAnalysisNumber(String dossierId, String fileId) { + + return componentLogDocumentRepository.findAnalysisNumberById(mapper.getComponentLogId(dossierId, fileId)) + .map(ComponentLogDocument::getAnalysisNumber); + } + + + public List findComponentLogEntriesWithComponentNameIn(String dossierId, String fileId, Collection componentNames) { + + String componentLogId = mapper.getComponentLogId(dossierId, fileId); + List names = componentNames.stream() + .map(name -> mapper.getComponentId(componentLogId, name)) + .toList(); + + return componentDocumentRepository.findAllById(names) + .stream() + .map(mapper::fromComponentDocument) + .toList(); + } + + + public Optional findComponentLogWithoutEntries(String dossierId, String fileId) { + + return componentLogDocumentRepository.findComponentLogDocumentWithoutEntriesById(mapper.getComponentLogId(dossierId, fileId)) + .map(mapper::fromComponentLogDocument); + } + +} -- 2.47.2 From 9192b55b8cfbae0160186e22fa165b5fb3cc35f7 Mon Sep 17 00:00:00 2001 From: Ali Oezyetimoglu Date: Wed, 22 May 2024 19:28:19 +0200 Subject: [PATCH 02/11] RED-8339: Updated OpenApi Specs --- .../external/resource/ComponentResource.java | 4 +- .../src/main/resources/api/openapi.yaml | 179 ++++++++++++++++++ 2 files changed, 181 insertions(+), 2 deletions(-) diff --git a/persistence-service-v1/persistence-service-external-api-v2/src/main/java/com/iqser/red/service/persistence/service/v2/api/external/resource/ComponentResource.java b/persistence-service-v1/persistence-service-external-api-v2/src/main/java/com/iqser/red/service/persistence/service/v2/api/external/resource/ComponentResource.java index d17622d7a..e8eee558c 100644 --- a/persistence-service-v1/persistence-service-external-api-v2/src/main/java/com/iqser/red/service/persistence/service/v2/api/external/resource/ComponentResource.java +++ b/persistence-service-v1/persistence-service-external-api-v2/src/main/java/com/iqser/red/service/persistence/service/v2/api/external/resource/ComponentResource.java @@ -80,7 +80,7 @@ public interface ComponentResource { @ResponseStatus(value = HttpStatus.NO_CONTENT) @PostMapping(value = PATH + FILE_ID_PATH_VARIABLE + OVERRIDES_PATH, consumes = MediaType.APPLICATION_JSON_VALUE) @Operation(summary = "Adds overrides for components", description = "None") - @ApiResponses(value = {@ApiResponse(responseCode = "204", description = "OK"), @ApiResponse(responseCode = "404", description = "Not found"), @ApiResponse(responseCode = "403", description = "Forbidden")}) + @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "OK"), @ApiResponse(responseCode = "404", description = "Not found"), @ApiResponse(responseCode = "403", description = "Forbidden")}) void addOverride(@Parameter(name = DOSSIER_TEMPLATE_ID_PARAM, description = "The identifier of the dossier template that is used for the dossier.", required = true) @PathVariable(DOSSIER_TEMPLATE_ID_PARAM) String dossierTemplateId, @Parameter(name = DOSSIER_ID_PARAM, description = "The identifier of the dossier that contains the file.", required = true) @PathVariable(DOSSIER_ID_PARAM) String dossierId, @Parameter(name = FILE_ID_PARAM, description = "The identifier of the file that the components are requested for.", required = true) @PathVariable(FILE_ID_PARAM) String fileId, @@ -101,7 +101,7 @@ public interface ComponentResource { @ResponseStatus(value = HttpStatus.NO_CONTENT) @PostMapping(value = PATH + FILE_ID_PATH_VARIABLE + OVERRIDES_PATH + REVERT_PATH, consumes = MediaType.APPLICATION_JSON_VALUE) @Operation(summary = "Reverts overrides for components", description = "None") - @ApiResponses(value = {@ApiResponse(responseCode = "204", description = "OK"), @ApiResponse(responseCode = "404", description = "Not found"), @ApiResponse(responseCode = "403", description = "Forbidden")}) + @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "OK"), @ApiResponse(responseCode = "404", description = "Not found"), @ApiResponse(responseCode = "403", description = "Forbidden")}) void revertOverrides(@Parameter(name = DOSSIER_TEMPLATE_ID_PARAM, description = "The identifier of the dossier template that is used for the dossier.", required = true) @PathVariable(DOSSIER_TEMPLATE_ID_PARAM) String dossierTemplateId, @Parameter(name = DOSSIER_ID_PARAM, description = "The identifier of the dossier that contains the file.", required = true) @PathVariable(DOSSIER_ID_PARAM) String dossierId, @Parameter(name = FILE_ID_PARAM, description = "The identifier of the file that the components are requested for.", required = true) @PathVariable(FILE_ID_PARAM) String fileId, diff --git a/persistence-service-v1/persistence-service-external-api-v2/src/main/resources/api/openapi.yaml b/persistence-service-v1/persistence-service-external-api-v2/src/main/resources/api/openapi.yaml index 4ccd4fb90..2df045e3c 100644 --- a/persistence-service-v1/persistence-service-external-api-v2/src/main/resources/api/openapi.yaml +++ b/persistence-service-v1/persistence-service-external-api-v2/src/main/resources/api/openapi.yaml @@ -745,6 +745,97 @@ paths: $ref: '#/components/responses/403' "500": $ref: '#/components/responses/500' + /api/dossier-templates/{dossierTemplateId}/dossiers/{dossierId}/files/{fileId}/overrides: + post: + operationId: addOverride + tags: + - 4. Components + summary: Adds the component override associated with a specific file. + description: | + This endpoint allows the user to add an override for a specific component of a dossier file. The component override data is provided in the request body. + parameters: + - $ref: '#/components/parameters/dossierTemplateId' + - $ref: '#/components/parameters/dossierId' + - $ref: '#/components/parameters/fileId' + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/Component' + required: true + responses: + "200": + description: | + Component was successfully overridden. + "400": + $ref: '#/components/responses/400' + "403": + $ref: '#/components/responses/403' + "404": + $ref: '#/components/responses/404-file' + "500": + $ref: '#/components/responses/500' + get: + operationId: getOverrides + tags: + - 4. Components + summary: Returns the component overrides associated with a specific file. + description: | + This endpoint retrieves all the overrides for a specific component within a dossier file. + The response includes a list of all component overrides associated with the specified file. + parameters: + - $ref: '#/components/parameters/dossierTemplateId' + - $ref: '#/components/parameters/dossierId' + - $ref: '#/components/parameters/fileId' + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/ComponentOverrideModelList' + application/xml: + schema: + $ref: '#/components/schemas/ComponentOverrideModelList' + description: | + Successfully fetched component overrides for the file in the dossier. + "404": + $ref: '#/components/responses/404-dossier' + "400": + $ref: '#/components/responses/400' + "403": + $ref: '#/components/responses/403' + "500": + $ref: '#/components/responses/500' + /api/dossier-templates/{dossierTemplateId}/dossiers/{dossierId}/files/{fileId}/overrides/revert: + post: + operationId: revertOverrides + tags: + - 4. Components + summary: Reverts the component overrides associated with a specific file. + description: | + Reverts the component overrides associated with a specific file. + parameters: + - $ref: '#/components/parameters/dossierTemplateId' + - $ref: '#/components/parameters/dossierId' + - $ref: '#/components/parameters/fileId' + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/RevertOverrideRequest' + required: true + responses: + "200": + description: | + Component overrides were successfully reverted. + "400": + $ref: '#/components/responses/400' + "403": + $ref: '#/components/responses/403' + "404": + $ref: '#/components/responses/404-file' + "500": + $ref: '#/components/responses/500' /api/license/active/usage: post: operationId: getReport @@ -1203,6 +1294,94 @@ components: entityRuleId: DEF.13.37 type: another_entity_type page: 456 + ComponentOverrideModelList: + type: object + description: A list of component overrides and their associated components. + properties: + dossierTemplateId: + format: uuid + type: string + description: Identifier for the template associated with the dossier. + dossierId: + format: uuid + type: string + description: Identifier for the dossier. + fileId: + type: string + description: Identifier for the file. + componentOverrideModels: + type: array + description: List of files with their component details. + items: + $ref: '#/components/schemas/Component' + example: + dossierTemplateId: 046b6c7f-0b8a-43b9-b35d-6489e6daee91 + dossierId: 046b6c7f-0b8a-43b9-b35d-6489e6daee91 + fileId: 1fdbd888b39059c8cf171df26f62f8a5 + componentOverrideModels: + - name: the component name + componentValues: + - value: my overwritten component value + originalValue: the original value + componentRuleId: COM.0.0 + valueDescription: My value description + entityReferences: + - id: bcd22239-cedf-442f-a5a1-1664cba94dc6 + entityRuleId: ABC.0.0 + type: entity_type + page: 123 + - id: bcd22239-c3df-442f-a5a1-1664cba94dc6_2 + entityRuleId: ABC.0.0 + type: entity_type + page: 124 + - id: b748b89a-5679-4254-9286-1dd652d9970b + entityRuleId: DEF.13.37 + type: another_entity_type + page: 456 + - value: yet another component value + originalValue: yet another component value + componentRuleId: COM.0.1 + valueDescription: Another value description + entityReferences: + - id: 70496456-a016-4679-81b1-6c8856dded6e + entityRuleId: XYZ.0.0 + type: yet_another_entity_type + page: 123 + overridden: true + - name: other component name + componentValues: + - value: my overwritten component value + originalValue: the original value + componentRuleId: COM.0.0 + valueDescription: My value description + entityReferences: + - id: bcd22239-cedf-442f-a5a1-1664cba94dc6 + entityRuleId: ABC.0.0 + type: entity_type + page: 123 + - id: bcd22239-c3df-442f-a5a1-1664cba94dc6_2 + entityRuleId: ABC.0.0 + type: entity_type + page: 124 + - id: b748b89a-5679-4254-9286-1dd652d9970b + entityRuleId: DEF.13.37 + type: another_entity_type + page: 456 + overridden: true + RevertOverrideRequest: + type: object + description: Set of component names to revert. + properties: + components: + type: array + items: + type: string + uniqueItems: true + example: + components: + - component1 + - component2 + - component3 FileComponents: type: object description: Represents file details along with its associated components and values. -- 2.47.2 From 9660ac765bff24662fb055d82b341b40b6ea1122 Mon Sep 17 00:00:00 2001 From: Ali Oezyetimoglu Date: Wed, 22 May 2024 19:58:57 +0200 Subject: [PATCH 03/11] RED-8339: Updated OpenApi Specs --- ...ate-component-entities.xml => 4-create-component-entities.xml} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename persistence-service-v1/persistence-service-processor-v1/src/main/resources/mongo/changelog/tenant/{3-create-component-entities.xml => 4-create-component-entities.xml} (100%) diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/resources/mongo/changelog/tenant/3-create-component-entities.xml b/persistence-service-v1/persistence-service-processor-v1/src/main/resources/mongo/changelog/tenant/4-create-component-entities.xml similarity index 100% rename from persistence-service-v1/persistence-service-processor-v1/src/main/resources/mongo/changelog/tenant/3-create-component-entities.xml rename to persistence-service-v1/persistence-service-processor-v1/src/main/resources/mongo/changelog/tenant/4-create-component-entities.xml -- 2.47.2 From f3a7d40ff920280fa5695fc578e63eb302ea46d7 Mon Sep 17 00:00:00 2001 From: Ali Oezyetimoglu Date: Wed, 22 May 2024 20:03:00 +0200 Subject: [PATCH 04/11] RED-8339: Updated OpenApi Specs --- .../tests/ComponentLogDocumentMapperTest.java | 62 ---- .../componentlog/componentLogExample.json | 266 ------------------ .../componentOverrideExample.json | 244 ---------------- 3 files changed, 572 deletions(-) delete mode 100644 persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/ComponentLogDocumentMapperTest.java delete mode 100644 persistence-service-v1/persistence-service-server-v1/src/test/resources/files/componentlog/componentLogExample.json delete mode 100644 persistence-service-v1/persistence-service-server-v1/src/test/resources/files/componentlog/componentOverrideExample.json diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/ComponentLogDocumentMapperTest.java b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/ComponentLogDocumentMapperTest.java deleted file mode 100644 index d1b3b1471..000000000 --- a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/ComponentLogDocumentMapperTest.java +++ /dev/null @@ -1,62 +0,0 @@ -//package com.iqser.red.service.peristence.v1.server.integration.tests; -// -//import static com.mongodb.assertions.Assertions.assertNotNull; -//import static com.mongodb.assertions.Assertions.assertTrue; -//import static org.junit.jupiter.api.Assertions.assertEquals; -// -//import java.util.List; -//import java.util.Optional; -// -//import org.junit.jupiter.api.Test; -//import org.springframework.core.io.ClassPathResource; -// -//import com.fasterxml.jackson.databind.ObjectMapper; -//import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; -//import com.iqser.red.service.persistence.service.v1.api.shared.mongo.document.ComponentDocument; -//import com.iqser.red.service.persistence.service.v1.api.shared.mongo.mapper.ComponentLogDocumentMapper; -// -//import lombok.SneakyThrows; -// -//public class ComponentLogDocumentMapperTest { -// -// private final ComponentLogDocumentMapper mapper = ComponentLogDocumentMapper.INSTANCE; -// -// private final String COMPONENT_LOG = "files/componentlog/componentLogExample.json"; -// private final String COMPONENT_OVERRIDE = "files/componentlog/componentOverrideExample.json"; -// private static final String TEST_DOSSIER_ID = "91ce8e90-9aec-473c-b8c3-cbe16443ad34"; -// private static final String TEST_FILE_ID = "b2cbdd4dca0aa1aa0ebbfc5cc1462df0"; -// -// -// @Test -// @SneakyThrows -// public void ComponentOverrideMapper() { -// -// var overrideFile = new ClassPathResource(String.format(COMPONENT_OVERRIDE)); -// ObjectMapper objectMapper = new ObjectMapper(); -// objectMapper.registerModule(new JavaTimeModule()); -// -// ComponentsOverrides componentsOverridesBefore = objectMapper.readValue(overrideFile.getInputStream(), ComponentsOverrides.class); -// -// List componentDocument = mapper.toComponentOverrideDocuments(componentsOverridesBefore, TEST_DOSSIER_ID, TEST_FILE_ID); -// -// assertEquals(componentDocument.get(0).getDossierId(), TEST_DOSSIER_ID); -// assertEquals(componentDocument.get(0).getFileId(), TEST_FILE_ID); -// assertEquals(componentDocument.get(0).getId(), mapper.getComponentId(TEST_DOSSIER_ID, TEST_FILE_ID, componentDocument.get(0).getName())); -// -// Optional optionalComponentValueDocument = componentDocument.get(0).getOverrideValues() -// .stream() -// .findFirst(); -// -// assertTrue(optionalComponentValueDocument.isPresent()); -// assertNotNull(optionalComponentValueDocument.get().getValueId()); -// assertNotNull(optionalComponentValueDocument.get().getComponentOverrideId()); -// -// ComponentsOverrides componentsOverridesAfter = mapper.fromComponentOverrideDocument(componentDocument.get(0)); -// -// assertEquals(mapper.buildComponentOverrideMap(componentDocument.get(0).getName(), -// componentsOverridesBefore.getComponentOverrides() -// .get(componentDocument.get(0).getName())), componentsOverridesAfter); -// -// } -// -//} diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/resources/files/componentlog/componentLogExample.json b/persistence-service-v1/persistence-service-server-v1/src/test/resources/files/componentlog/componentLogExample.json deleted file mode 100644 index 9c51139c2..000000000 --- a/persistence-service-v1/persistence-service-server-v1/src/test/resources/files/componentlog/componentLogExample.json +++ /dev/null @@ -1,266 +0,0 @@ -{ - "analysisNumber": 3, - "componentRulesVersion": 1, - "componentLogEntries": [ - { - "name": "Study_Title", - "componentValues": [ - { - "valueId": null, - "value": "", - "originalValue": "", - "valueDescription": "First found value of type or else ''", - "componentRuleId": "StudyTitle.0.0", - "componentLogEntityReferences": [] - } - ] - }, - { - "name": "Performing_Laboratory", - "componentValues": [ - { - "valueId": null, - "value": "", - "originalValue": "", - "valueDescription": "fallback", - "componentRuleId": "PerformingLaboratory.0.2", - "componentLogEntityReferences": [] - } - ] - }, - { - "name": "Report_Number", - "componentValues": [ - { - "valueId": null, - "value": "", - "originalValue": "", - "valueDescription": "First found value of type or else ''", - "componentRuleId": "ReportNumber.0.0", - "componentLogEntityReferences": [] - } - ] - }, - { - "name": "GLP_Study", - "componentValues": [ - { - "valueId": null, - "value": "No", - "originalValue": "No", - "valueDescription": "Yes if present, No if not", - "componentRuleId": "GLPStudy.1.0", - "componentLogEntityReferences": [] - } - ] - }, - { - "name": "Test_Guidelines_2", - "componentValues": [ - { - "valueId": null, - "value": "", - "originalValue": "", - "valueDescription": "Joining all values of type with ', '", - "componentRuleId": "TestGuideline.2.0", - "componentLogEntityReferences": [] - } - ] - }, - { - "name": "Experimental_Starting_Date", - "componentValues": [ - { - "valueId": null, - "value": "", - "originalValue": "", - "valueDescription": "Convert values of type '' to dd/MM/yyyy joined with ', '", - "componentRuleId": "StartDate.0.0", - "componentLogEntityReferences": [] - } - ] - }, - { - "name": "Experimental_Completion_Date", - "componentValues": [ - { - "valueId": null, - "value": "", - "originalValue": "", - "valueDescription": "Convert values of type '' to dd/MM/yyyy joined with ', '", - "componentRuleId": "CompletionDate.0.0", - "componentLogEntityReferences": [] - } - ] - }, - { - "name": "Certificate_of_Analysis_Batch_Identification", - "componentValues": [ - { - "valueId": null, - "value": "", - "originalValue": "", - "valueDescription": "Joining all unique values of type with ', '", - "componentRuleId": "AnalysisCertificate.0.0", - "componentLogEntityReferences": [] - } - ] - }, - { - "name": "Species", - "componentValues": [ - { - "valueId": null, - "value": "", - "originalValue": "", - "valueDescription": "First found value of type or else ''", - "componentRuleId": "Species.0.0", - "componentLogEntityReferences": [] - } - ] - }, - { - "name": "Strain", - "componentValues": [ - { - "valueId": null, - "value": "", - "originalValue": "", - "valueDescription": "First found value of type or else ''", - "componentRuleId": "Strain.0.0", - "componentLogEntityReferences": [] - } - ] - }, - { - "name": "Doses_mg_per_kg_bw", - "componentValues": [ - { - "valueId": null, - "value": "", - "originalValue": "", - "valueDescription": "Joining all values of type with ' '", - "componentRuleId": "Necropsy.1.0", - "componentLogEntityReferences": [] - } - ] - }, - { - "name": "Mortality_Statement", - "componentValues": [ - { - "valueId": null, - "value": "", - "originalValue": "", - "valueDescription": "Joining all values of type with ' '", - "componentRuleId": "MortalityStatement.0.0", - "componentLogEntityReferences": [] - } - ] - }, - { - "name": "Weight_Behavior_Changes", - "componentValues": [ - { - "valueId": null, - "value": "", - "originalValue": "", - "valueDescription": "Joining all values of type with '\n'", - "componentRuleId": "WeightBehavior.0.0", - "componentLogEntityReferences": [] - } - ] - }, - { - "name": "Necropsy_Findings", - "componentValues": [ - { - "valueId": null, - "value": "", - "originalValue": "", - "valueDescription": "Joining all values of type with ' '", - "componentRuleId": "Necropsy.0.0", - "componentLogEntityReferences": [] - } - ] - }, - { - "name": "Deviation_from_the_Guideline", - "componentValues": [ - { - "valueId": null, - "value": "", - "originalValue": "", - "valueDescription": "Joining all values of type with '\n'", - "componentRuleId": "GuidelineDeviation.0.0", - "componentLogEntityReferences": [] - } - ] - }, - { - "name": "Conclusion_LD50_Greater_than", - "componentValues": [ - { - "valueId": null, - "value": "", - "originalValue": "", - "valueDescription": "No entity of type 'ld50_greater' found", - "componentRuleId": "Conclusion.1.1", - "componentLogEntityReferences": [] - } - ] - }, - { - "name": "Conclusion_LD50_mg_per_kg", - "componentValues": [ - { - "valueId": null, - "value": "", - "originalValue": "", - "valueDescription": "Joining all unique values of type with ', '", - "componentRuleId": "Conclusion.0.0", - "componentLogEntityReferences": [] - } - ] - }, - { - "name": "Conclusion_Minimum_Confidence", - "componentValues": [ - { - "valueId": null, - "value": "", - "originalValue": "", - "valueDescription": "Joining all unique values of type with ', '", - "componentRuleId": "Conclusion.2.0", - "componentLogEntityReferences": [] - } - ] - }, - { - "name": "Conclusion_Maximum_Confidence", - "componentValues": [ - { - "valueId": null, - "value": "", - "originalValue": "", - "valueDescription": "Joining all unique values of type with ', '", - "componentRuleId": "Conclusion.3.0", - "componentLogEntityReferences": [] - } - ] - }, - { - "name": "Study_Conclusion", - "componentValues": [ - { - "valueId": null, - "value": "", - "originalValue": "", - "valueDescription": "Joining all values of type with ' '", - "componentRuleId": "StudyConclusion.0.0", - "componentLogEntityReferences": [] - } - ] - } - ] -} \ No newline at end of file diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/resources/files/componentlog/componentOverrideExample.json b/persistence-service-v1/persistence-service-server-v1/src/test/resources/files/componentlog/componentOverrideExample.json deleted file mode 100644 index e78ce1ef0..000000000 --- a/persistence-service-v1/persistence-service-server-v1/src/test/resources/files/componentlog/componentOverrideExample.json +++ /dev/null @@ -1,244 +0,0 @@ -{ - "componentOverrides": [ - { - "name": "Study_Title", - "componentValues": [ - { - "valueId": "1", - "value": "", - "valueDescription": "First found value of type or else ''", - "componentRuleId": "StudyTitle.0.0", - "componentLogEntityReferences": [] - } - ] - }, - { - "name": "Performing_Laboratory", - "componentValues": [ - { - "valueId": "2", - "value": "", - "valueDescription": "fallback", - "componentRuleId": "PerformingLaboratory.0.2", - "componentLogEntityReferences": [] - } - ] - }, - { - "name": "Report_Number", - "componentValues": [ - { - "valueId": "3", - "value": "", - "valueDescription": "First found value of type or else ''", - "componentRuleId": "ReportNumber.0.0", - "componentLogEntityReferences": [] - } - ] - }, - { - "name": "GLP_Study", - "componentValues": [ - { - "valueId": "4", - "value": "No", - "valueDescription": "Yes if present, No if not", - "componentRuleId": "GLPStudy.1.0", - "componentLogEntityReferences": [] - } - ] - }, - { - "name": "Test_Guidelines_2", - "componentValues": [ - { - "valueId": "5", - "value": "", - "valueDescription": "Joining all values of type with ', '", - "componentRuleId": "TestGuideline.2.0", - "componentLogEntityReferences": [] - } - ] - }, - { - "name": "Experimental_Starting_Date", - "componentValues": [ - { - "valueId": "6", - "value": "", - "valueDescription": "Convert values of type '' to dd/MM/yyyy joined with ', '", - "componentRuleId": "StartDate.0.0", - "componentLogEntityReferences": [] - } - ] - }, - { - "name": "Experimental_Completion_Date", - "componentValues": [ - { - "valueId": "7", - "value": "", - "valueDescription": "Convert values of type '' to dd/MM/yyyy joined with ', '", - "componentRuleId": "CompletionDate.0.0", - "componentLogEntityReferences": [] - } - ] - }, - { - "name": "Certificate_of_Analysis_Batch_Identification", - "componentValues": [ - { - "valueId": "8", - "value": "", - "valueDescription": "Joining all unique values of type with ', '", - "componentRuleId": "AnalysisCertificate.0.0", - "componentLogEntityReferences": [] - } - ] - }, - { - "name": "Species", - "componentValues": [ - { - "valueId": "9", - "value": "", - "valueDescription": "First found value of type or else ''", - "componentRuleId": "Species.0.0", - "componentLogEntityReferences": [] - } - ] - }, - { - "name": "Strain", - "componentValues": [ - { - "valueId": "10", - "value": "", - "valueDescription": "First found value of type or else ''", - "componentRuleId": "Strain.0.0", - "componentLogEntityReferences": [] - } - ] - }, - { - "name": "Doses_mg_per_kg_bw", - "componentValues": [ - { - "valueId": "11", - "value": "", - "valueDescription": "Joining all values of type with ' '", - "componentRuleId": "Necropsy.1.0", - "componentLogEntityReferences": [] - } - ] - }, - { - "name": "Mortality_Statement", - "componentValues": [ - { - "valueId": "12", - "value": "", - "valueDescription": "Joining all values of type with ' '", - "componentRuleId": "MortalityStatement.0.0", - "componentLogEntityReferences": [] - } - ] - }, - { - "name": "Weight_Behavior_Changes", - "componentValues": [ - { - "valueId": "13", - "value": "", - "valueDescription": "Joining all values of type with '\n'", - "componentRuleId": "WeightBehavior.0.0", - "componentLogEntityReferences": [] - } - ] - }, - { - "name": "Necropsy_Findings", - "componentValues": [ - { - "valueId": "14", - "value": "", - "valueDescription": "Joining all values of type with ' '", - "componentRuleId": "Necropsy.0.0", - "componentLogEntityReferences": [] - } - ] - }, - { - "name": "Deviation_from_the_Guideline", - "componentValues": [ - { - "valueId": "15", - "value": "", - "valueDescription": "Joining all values of type with '\n'", - "componentRuleId": "GuidelineDeviation.0.0", - "componentLogEntityReferences": [] - } - ] - }, - { - "name": "Conclusion_LD50_Greater_than", - "componentValues": [ - { - "valueId": "16", - "value": "", - "valueDescription": "No entity of type 'ld50_greater' found", - "componentRuleId": "Conclusion.1.1", - "componentLogEntityReferences": [] - } - ] - }, - { - "name": "Conclusion_LD50_mg_per_kg", - "componentValues": [ - { - "valueId": "17", - "value": "", - "valueDescription": "Joining all unique values of type with ', '", - "componentRuleId": "Conclusion.0.0", - "componentLogEntityReferences": [] - } - ] - }, - { - "name": "Conclusion_Minimum_Confidence", - "componentValues": [ - { - "valueId": "18", - "value": "", - "valueDescription": "Joining all unique values of type with ', '", - "componentRuleId": "Conclusion.2.0", - "componentLogEntityReferences": [] - } - ] - }, - { - "name": "Conclusion_Maximum_Confidence", - "componentValues": [ - { - "valueId": "19", - "value": "", - "valueDescription": "Joining all unique values of type with ', '", - "componentRuleId": "Conclusion.3.0", - "componentLogEntityReferences": [] - } - ] - }, - { - "name": "Study_Conclusion", - "componentValues": [ - { - "valueId": "20", - "value": "", - "valueDescription": "Joining all values of type with ' '", - "componentRuleId": "StudyConclusion.0.0", - "componentLogEntityReferences": [] - } - ] - } - ] -} \ No newline at end of file -- 2.47.2 From 1fda16b6caa7452031e52a3a52df5b578f7419e3 Mon Sep 17 00:00:00 2001 From: Ali Oezyetimoglu Date: Thu, 23 May 2024 09:24:59 +0200 Subject: [PATCH 05/11] RED-8339: Fixes --- .../controller/InternalControllerAdvice.java | 32 ++++++++++++++----- .../service/ComponentLogService.java | 15 +++------ .../service/ComponentLogMongoService.java | 4 +-- 3 files changed, 30 insertions(+), 21 deletions(-) diff --git a/persistence-service-v1/persistence-service-internal-api-impl-v1/src/main/java/com/iqser/red/service/persistence/v1/internal/api/controller/InternalControllerAdvice.java b/persistence-service-v1/persistence-service-internal-api-impl-v1/src/main/java/com/iqser/red/service/persistence/v1/internal/api/controller/InternalControllerAdvice.java index 893c9823b..00232e844 100644 --- a/persistence-service-v1/persistence-service-internal-api-impl-v1/src/main/java/com/iqser/red/service/persistence/v1/internal/api/controller/InternalControllerAdvice.java +++ b/persistence-service-v1/persistence-service-internal-api-impl-v1/src/main/java/com/iqser/red/service/persistence/v1/internal/api/controller/InternalControllerAdvice.java @@ -1,10 +1,8 @@ package com.iqser.red.service.persistence.v1.internal.api.controller; -import com.iqser.red.commons.spring.ErrorMessage; -import com.iqser.red.service.persistence.management.v1.processor.exception.*; - -import io.swagger.v3.oas.annotations.Hidden; -import lombok.extern.slf4j.Slf4j; +import java.sql.SQLException; +import java.time.OffsetDateTime; +import java.util.stream.Collectors; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; @@ -14,9 +12,17 @@ import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.bind.annotation.ResponseStatus; import org.springframework.web.bind.annotation.RestControllerAdvice; -import java.sql.SQLException; -import java.time.OffsetDateTime; -import java.util.stream.Collectors; +import com.iqser.red.commons.spring.ErrorMessage; +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.exception.DossierNotFoundException; +import com.iqser.red.service.persistence.management.v1.processor.exception.InvalidRulesException; +import com.iqser.red.service.persistence.management.v1.processor.exception.NotFoundException; +import com.iqser.red.service.persistence.management.v1.processor.exception.RulesTimeoutDetectedException; +import com.iqser.red.service.persistence.service.v1.api.shared.mongo.exception.ComponentLogDocumentNotFoundException; + +import io.swagger.v3.oas.annotations.Hidden; +import lombok.extern.slf4j.Slf4j; @Slf4j @RestControllerAdvice @@ -129,4 +135,14 @@ public class InternalControllerAdvice { return new ErrorMessage(OffsetDateTime.now(), e.getMessage()); } + + @Hidden + @ResponseBody + @ResponseStatus(value = HttpStatus.BAD_REQUEST) + @ExceptionHandler(ComponentLogDocumentNotFoundException.class) + public ErrorMessage handleCustomException(ComponentLogDocumentNotFoundException e) { + + return new ErrorMessage(OffsetDateTime.now(), e.getMessage()); + } + } diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/ComponentLogService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/ComponentLogService.java index b2e2ab860..ada3a840a 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/ComponentLogService.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/ComponentLogService.java @@ -72,16 +72,7 @@ public class ComponentLogService { public ComponentLog getComponentLog(String dossierId, String fileId, boolean includeOverrides) { - ComponentLog componentLog; - try { - componentLog = fileManagementStorageService.getComponentLog(dossierId, fileId); - } catch (NotFoundException e) { - var componentLogOptional = componentLogMongoService.findComponentLogByDossierIdAndFileId(dossierId, fileId); - if (componentLogOptional.isEmpty()) { - throw new NotFoundException(e.getMessage()); - } - componentLog = componentLogOptional.get(); - } + ComponentLog componentLog = fileManagementStorageService.getComponentLog(dossierId, fileId); if (!includeOverrides) { componentLog = sortComponentLogEntriesByOrderList(componentLog, ORDER); @@ -153,7 +144,9 @@ public class ComponentLogService { private void insertOverride(String dossierId, String fileId, ComponentLogEntry componentToAdd) { - componentLogMongoService.insertComponentLogEntries(dossierId, fileId, List.of(componentToAdd)); + ComponentLog componentLog = fileManagementStorageService.getComponentLog(dossierId, fileId); + + componentLogMongoService.insertComponentLogEntries(dossierId, fileId, componentLog, List.of(componentToAdd)); } diff --git a/persistence-service-v1/persistence-service-shared-mongo-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/mongo/service/ComponentLogMongoService.java b/persistence-service-v1/persistence-service-shared-mongo-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/mongo/service/ComponentLogMongoService.java index a4d728e11..ee954e8da 100644 --- a/persistence-service-v1/persistence-service-shared-mongo-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/mongo/service/ComponentLogMongoService.java +++ b/persistence-service-v1/persistence-service-shared-mongo-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/mongo/service/ComponentLogMongoService.java @@ -97,11 +97,11 @@ public class ComponentLogMongoService { } - public void insertComponentLogEntries(String dossierId, String fileId, List componentLogEntries) { + public void insertComponentLogEntries(String dossierId, String fileId, ComponentLog componentLog, List componentLogEntries) { String componentLogId = mapper.getComponentLogId(dossierId, fileId); - ComponentLogDocument componentLogDocument = getComponentLogDocument(componentLogId); + ComponentLogDocument componentLogDocument = mapper.toComponentLogDocument(dossierId, fileId, componentLog); List componentDocuments = componentLogEntries.stream() .map(componentLogEntry -> mapper.toComponentDocument(componentLogId, componentLogEntry)) -- 2.47.2 From ac6b11089bae584808dfd3b2e1154ed283376534 Mon Sep 17 00:00:00 2001 From: Ali Oezyetimoglu Date: Mon, 27 May 2024 12:43:25 +0200 Subject: [PATCH 06/11] RED-8339: Fixes --- .../service/ComponentLogService.java | 6 +- .../integration/client/ComponentClient.java | 10 + .../tests/ComponentOverrideTest.java | 91 +++ .../componentlog/exampleComponentLog.json | 655 ++++++++++++++++++ .../mapper/ComponentLogDocumentMapper.java | 17 +- .../CustomComponentRepositoryImpl.java | 7 +- .../service/ComponentLogMongoService.java | 7 +- 7 files changed, 780 insertions(+), 13 deletions(-) create mode 100644 persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/client/ComponentClient.java create mode 100644 persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/ComponentOverrideTest.java create mode 100644 persistence-service-v1/persistence-service-server-v1/src/test/resources/files/componentlog/exampleComponentLog.json diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/ComponentLogService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/ComponentLogService.java index ada3a840a..da069b0a8 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/ComponentLogService.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/ComponentLogService.java @@ -124,10 +124,12 @@ public class ComponentLogService { if (optionalComponentLogEntry.isPresent()) { ComponentLogEntry componentToUpdate = optionalComponentLogEntry.get(); + componentToUpdate.setOverridden(true); componentToUpdate.setComponentValues(componentOverride.getComponentValues()); saveOverride(dossierId, fileId, componentToUpdate); auditOverride(dossierId, fileId, componentToUpdate); } else { + componentOverride.setOverridden(true); insertOverride(dossierId, fileId, componentOverride); auditOverride(dossierId, fileId, componentOverride); } @@ -144,9 +146,7 @@ public class ComponentLogService { private void insertOverride(String dossierId, String fileId, ComponentLogEntry componentToAdd) { - ComponentLog componentLog = fileManagementStorageService.getComponentLog(dossierId, fileId); - - componentLogMongoService.insertComponentLogEntries(dossierId, fileId, componentLog, List.of(componentToAdd)); + componentLogMongoService.insertComponentLogEntries(dossierId, fileId, List.of(componentToAdd)); } diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/client/ComponentClient.java b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/client/ComponentClient.java new file mode 100644 index 000000000..5a957df73 --- /dev/null +++ b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/client/ComponentClient.java @@ -0,0 +1,10 @@ +package com.iqser.red.service.peristence.v1.server.integration.client; + +import org.springframework.cloud.openfeign.FeignClient; + +import com.iqser.red.service.persistence.service.v2.api.external.resource.ComponentResource; + +@FeignClient(name = "ComponentResource", url = "http://localhost:28080") +public interface ComponentClient extends ComponentResource { + +} diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/ComponentOverrideTest.java b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/ComponentOverrideTest.java new file mode 100644 index 000000000..c660f1202 --- /dev/null +++ b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/ComponentOverrideTest.java @@ -0,0 +1,91 @@ +package com.iqser.red.service.peristence.v1.server.integration.tests; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; + +import java.io.IOException; +import java.util.List; + +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.core.io.ClassPathResource; + +import com.fasterxml.jackson.databind.ObjectMapper; +import com.iqser.red.service.peristence.v1.server.integration.client.ComponentClient; +import com.iqser.red.service.peristence.v1.server.integration.client.DossierTemplateClient; +import com.iqser.red.service.peristence.v1.server.integration.service.DossierTesterAndProvider; +import com.iqser.red.service.peristence.v1.server.integration.service.FileTesterAndProvider; +import com.iqser.red.service.peristence.v1.server.integration.utils.AbstractPersistenceServerServiceTest; +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.dossiertemplate.dossier.file.FileType; +import com.iqser.red.service.persistence.service.v2.api.external.model.Component; +import com.iqser.red.service.persistence.service.v2.api.external.model.ComponentValue; +import com.iqser.red.service.persistence.service.v2.api.external.model.EntityReference; + +public class ComponentOverrideTest extends AbstractPersistenceServerServiceTest { + + @Autowired + private ObjectMapper objectMapper; + + @Autowired + private DossierTesterAndProvider dossierTesterAndProvider; + + @Autowired + private FileTesterAndProvider fileTesterAndProvider; + + @Autowired + private ComponentClient componentClient; + + @Autowired + private DossierTemplateClient dossierTemplateClient; + + + @Test + public void testAddAndGetOverrides() throws IOException { + + var dossier = dossierTesterAndProvider.provideTestDossier(); + + var dossierTemplate = dossierTemplateClient.getDossierTemplate(dossier.getDossierTemplateId()); + + var file = fileTesterAndProvider.testAndProvideFile(dossier, "filename"); + + Component componentOverrideModel = Component.builder() + .name("Study_Title") + .componentValues(List.of(ComponentValue.builder() + .value("AAAA Strange Chemical Name And the rest of a title – With a dash and some more text") + .valueDescription("First found value of type title or else ''") + .componentRuleId("StudyTitle.0.0") + .entityReferences(List.of(EntityReference.builder() + .id("cf7f0d0c4c07918ce7d67b204f5fdb7d") + .type("title") + .entityRuleId("DOC.6.1") + .page(1) + .build())) + .build())) + .overridden(true) + .build(); + + var componentLogJson = new ClassPathResource("files/componentlog/exampleComponentLog.json"); + +// ComponentLog componentLog = objectMapper.readValue(componentLogJson.getInputStream(), ComponentLog.class); + + fileManagementStorageService.storeObject(dossier.getId(), file.getId(), FileType.COMPONENT_LOG, componentLogJson.getInputStream()); + ComponentLog componentLog = fileManagementStorageService.getComponentLog(dossier.getId(), file.getId()); + + componentClient.addOverride(dossierTemplate.getId(), dossier.getId(), file.getId(), componentOverrideModel); + + var overrides = componentClient.getOverrides(dossierTemplate.getId(), dossier.getId(), file.getId()); + + assertEquals(dossierTemplate.getId(), overrides.getDossierTemplateId()); + assertEquals(dossier.getId(), overrides.getDossierId()); + assertEquals(file.getId(), overrides.getFileId()); + + assertFalse(overrides.getComponentOverrideModels().isEmpty()); + + var sth = componentClient.getComponents(dossierTemplate.getId(), dossier.getId(), file.getId(), true); + + System.out.println(sth); + System.out.println("See ya"); + } + +} diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/resources/files/componentlog/exampleComponentLog.json b/persistence-service-v1/persistence-service-server-v1/src/test/resources/files/componentlog/exampleComponentLog.json new file mode 100644 index 000000000..5858a620e --- /dev/null +++ b/persistence-service-v1/persistence-service-server-v1/src/test/resources/files/componentlog/exampleComponentLog.json @@ -0,0 +1,655 @@ +{ + "analysisNumber": 1, + "componentRulesVersion": 1, + "componentLogEntries": [ + { + "name": "Study_Title", + "componentValues": [ + { + "value": "Strange Chemical Name And the rest of a title – With a dash and some more text", + "originalValue": "Strange Chemical Name And the rest of a title – With a dash and some more text", + "valueDescription": "First found value of type title or else ''", + "componentRuleId": "StudyTitle.0.0", + "componentLogEntityReferences": [ + { + "id": "cf7f0d0c4c07918ce7d67b204f5fdb7d", + "type": "title", + "entityRuleId": "DOC.6.1", + "page": 1 + }, + { + "id": "cf7f0d0c4c07918ce7d67b204f5fdb7d", + "type": "title", + "entityRuleId": "DOC.6.1", + "page": 1 + } + ] + } + ], + "overridden": false + }, + { + "name": "Performing_Laboratory", + "componentValues": [ + { + "value": "Test Labor Deutschland AG, Switzerland", + "originalValue": "Test Labor Deutschland AG, Switzerland", + "valueDescription": "Laboratory name and country found!", + "componentRuleId": "PerformingLaboratory.1.0", + "componentLogEntityReferences": [ + { + "id": "cdfa1386cc0b1c665c7dfb1b8bd2a134", + "type": "laboratory_name", + "entityRuleId": "DOC.7.0", + "page": 1 + }, + { + "id": "281e6f46a8b400cfb66e02ed51cd6a7a", + "type": "laboratory_country", + "entityRuleId": "DOC.7.2", + "page": 1 + } + ] + }, + { + "value": "Test Labor Deutschland AG, Switzerland", + "originalValue": "Test Labor Deutschland AG, Switzerland", + "valueDescription": "Laboratory name and country found!", + "componentRuleId": "PerformingLaboratory.1.0", + "componentLogEntityReferences": [ + { + "id": "cdfa1386cc0b1c665c7dfb1b8bd2a134", + "type": "laboratory_name", + "entityRuleId": "DOC.7.0", + "page": 1 + }, + { + "id": "281e6f46a8b400cfb66e02ed51cd6a7a", + "type": "laboratory_country", + "entityRuleId": "DOC.7.2", + "page": 1 + } + ] + }, + { + "value": "Test Labor Deutschland AG, Switzerland", + "originalValue": "Test Labor Deutschland AG, Switzerland", + "valueDescription": "Laboratory name and country found!", + "componentRuleId": "PerformingLaboratory.1.0", + "componentLogEntityReferences": [ + { + "id": "cdfa1386cc0b1c665c7dfb1b8bd2a134", + "type": "laboratory_name", + "entityRuleId": "DOC.7.0", + "page": 1 + }, + { + "id": "281e6f46a8b400cfb66e02ed51cd6a7a", + "type": "laboratory_country", + "entityRuleId": "DOC.7.2", + "page": 1 + } + ] + }, + { + "value": "Test Labor Deutschland AG, Switzerland", + "originalValue": "Test Labor Deutschland AG, Switzerland", + "valueDescription": "Laboratory name and country found!", + "componentRuleId": "PerformingLaboratory.1.0", + "componentLogEntityReferences": [ + { + "id": "cdfa1386cc0b1c665c7dfb1b8bd2a134", + "type": "laboratory_name", + "entityRuleId": "DOC.7.0", + "page": 1 + }, + { + "id": "281e6f46a8b400cfb66e02ed51cd6a7a", + "type": "laboratory_country", + "entityRuleId": "DOC.7.2", + "page": 1 + } + ] + } + ], + "overridden": false + }, + { + "name": "Report_Number", + "componentValues": [ + { + "value": "11/111-111A", + "originalValue": "11/111-111A", + "valueDescription": "First found value of type report_number or else ''", + "componentRuleId": "ReportNumber.0.0", + "componentLogEntityReferences": [ + { + "id": "e2a93bcc72e9740bbfc19bd9cd982e01", + "type": "report_number", + "entityRuleId": "DOC.2.0", + "page": 1 + }, + { + "id": "e2a93bcc72e9740bbfc19bd9cd982e01", + "type": "report_number", + "entityRuleId": "DOC.2.0", + "page": 1 + } + ] + } + ], + "overridden": false + }, + { + "name": "GLP_Study", + "componentValues": [ + { + "value": "Yes", + "originalValue": "Yes", + "valueDescription": "Yes if present, No if not", + "componentRuleId": "GLPStudy.0.0", + "componentLogEntityReferences": [ + { + "id": "f898e5d91723480a4595d70371066a7f", + "type": "glp_study", + "entityRuleId": "DOC.8.0", + "page": 2 + }, + { + "id": "f898e5d91723480a4595d70371066a7f", + "type": "glp_study", + "entityRuleId": "DOC.8.0", + "page": 2 + }, + { + "id": "bb6817a9356ce9569d314a321aa44ad1", + "type": "glp_study", + "entityRuleId": "DOC.8.0", + "page": 11 + }, + { + "id": "bb6817a9356ce9569d314a321aa44ad1", + "type": "glp_study", + "entityRuleId": "DOC.8.0", + "page": 11 + } + ] + } + ], + "overridden": false + }, + { + "name": "Test_Guidelines_1", + "componentValues": [ + { + "value": "Nº 402: Acute Dermal Toxicity (09/10/2017)", + "originalValue": "Nº 402: Acute Dermal Toxicity (09/10/2017)", + "valueDescription": "OECD Number and guideline year mapped!", + "componentRuleId": "TestGuideline.0.0", + "componentLogEntityReferences": [ + { + "id": "fa103d7d55a67aff195a42d46cf5b1b1", + "type": "oecd_guideline_number", + "entityRuleId": "DOC.1.0", + "page": 1 + }, + { + "id": "a6a07692a60d3b8ef8d1261f23ab20c7", + "type": "oecd_guideline_year", + "entityRuleId": "DOC.1.0", + "page": 1 + } + ] + } + ], + "overridden": false + }, + { + "name": "Test_Guidelines_2", + "componentValues": [ + { + "value": "EPA 870.1200 (1998), EPA 870.1200 (1998), EC 440/2008, B.3 (2008), EC 440/2008, B.3 (2008)", + "originalValue": "EPA 870.1200 (1998), EPA 870.1200 (1998), EC 440/2008, B.3 (2008), EC 440/2008, B.3 (2008)", + "valueDescription": "Joining all values of type epa_guideline, ec_guideline with ', '", + "componentRuleId": "TestGuideline.2.0", + "componentLogEntityReferences": [ + { + "id": "80890bae7f2ea65c43f2e82ab847c424", + "type": "epa_guideline", + "entityRuleId": "DOC.1.0", + "page": 1 + }, + { + "id": "80890bae7f2ea65c43f2e82ab847c424", + "type": "epa_guideline", + "entityRuleId": "DOC.1.0", + "page": 1 + }, + { + "id": "7a23ea595ed928d777d00f1afa61f552", + "type": "ec_guideline", + "entityRuleId": "DOC.1.0", + "page": 1 + }, + { + "id": "7a23ea595ed928d777d00f1afa61f552", + "type": "ec_guideline", + "entityRuleId": "DOC.1.0", + "page": 1 + } + ] + } + ], + "overridden": false + }, + { + "name": "Experimental_Starting_Date", + "componentValues": [ + { + "value": "14/05/2010, 14/05/2010", + "originalValue": "14/05/2010, 14/05/2010", + "valueDescription": "Convert values of type 'experimental_start_date' to dd/MM/yyyy joined with ', '", + "componentRuleId": "StartDate.0.0", + "componentLogEntityReferences": [ + { + "id": "9819e3a491c9841ba76a526b215c2adf", + "type": "experimental_start_date", + "entityRuleId": "DOC.3.0", + "page": 3 + }, + { + "id": "9819e3a491c9841ba76a526b215c2adf", + "type": "experimental_start_date", + "entityRuleId": "DOC.3.0", + "page": 3 + } + ] + } + ], + "overridden": false + }, + { + "name": "Experimental_Completion_Date", + "componentValues": [ + { + "value": "21/05/2010, 21/05/2010", + "originalValue": "21/05/2010, 21/05/2010", + "valueDescription": "Convert values of type 'experimental_end_date' to dd/MM/yyyy joined with ', '", + "componentRuleId": "CompletionDate.0.0", + "componentLogEntityReferences": [ + { + "id": "9a2a7922adf21476bd8718f154fc1fb0", + "type": "experimental_end_date", + "entityRuleId": "DOC.4.0", + "page": 3 + }, + { + "id": "9a2a7922adf21476bd8718f154fc1fb0", + "type": "experimental_end_date", + "entityRuleId": "DOC.4.0", + "page": 3 + } + ] + } + ], + "overridden": false + }, + { + "name": "Certificate_of_Analysis_Batch_Identification", + "componentValues": [ + { + "value": "AAA111-111-111", + "originalValue": "AAA111-111-111", + "valueDescription": "Joining all unique values of type batch_number with ', '", + "componentRuleId": "AnalysisCertificate.0.0", + "componentLogEntityReferences": [ + { + "id": "2910c0d523ad15f9619e3c6b46200533", + "type": "batch_number", + "entityRuleId": "DOC.9.1", + "page": 6 + }, + { + "id": "2910c0d523ad15f9619e3c6b46200533", + "type": "batch_number", + "entityRuleId": "DOC.9.1", + "page": 6 + }, + { + "id": "b028246b799b7e32c0aef31e413c187f", + "type": "batch_number", + "entityRuleId": "DOC.9.1", + "page": 10 + }, + { + "id": "b028246b799b7e32c0aef31e413c187f", + "type": "batch_number", + "entityRuleId": "DOC.9.1", + "page": 10 + } + ] + } + ], + "overridden": false + }, + { + "name": "Species", + "componentValues": [ + { + "value": "rats", + "originalValue": "rats", + "valueDescription": "First found value of type species or else ''", + "componentRuleId": "Species.0.0", + "componentLogEntityReferences": [ + { + "id": "5f0b08c0e3d98545cd7647aac82b6bf2", + "type": "species", + "entityRuleId": "DOC.5.2", + "page": 7 + }, + { + "id": "5f0b08c0e3d98545cd7647aac82b6bf2", + "type": "species", + "entityRuleId": "DOC.5.2", + "page": 7 + }, + { + "id": "18ab2f51b57c2f91cea9350621e7152f", + "type": "species", + "entityRuleId": "DOC.5.2", + "page": 7 + }, + { + "id": "18ab2f51b57c2f91cea9350621e7152f", + "type": "species", + "entityRuleId": "DOC.5.2", + "page": 7 + }, + { + "id": "5557fd15f4c4e3e519cce0f47f64d3e1", + "type": "species", + "entityRuleId": "DOC.5.2", + "page": 7 + }, + { + "id": "5557fd15f4c4e3e519cce0f47f64d3e1", + "type": "species", + "entityRuleId": "DOC.5.2", + "page": 7 + }, + { + "id": "665743f4475ff7c82e642b2901376b28", + "type": "species", + "entityRuleId": "DOC.5.2", + "page": 7 + }, + { + "id": "665743f4475ff7c82e642b2901376b28", + "type": "species", + "entityRuleId": "DOC.5.2", + "page": 7 + } + ] + } + ], + "overridden": false + }, + { + "name": "Strain", + "componentValues": [ + { + "value": "Crl:WI Wistar", + "originalValue": "Crl:WI Wistar", + "valueDescription": "First found value of type strain or else ''", + "componentRuleId": "Strain.0.0", + "componentLogEntityReferences": [ + { + "id": "a77b13568f8d6885faabf90119dd9b40", + "type": "strain", + "entityRuleId": "DOC.5.3", + "page": 7 + }, + { + "id": "a77b13568f8d6885faabf90119dd9b40", + "type": "strain", + "entityRuleId": "DOC.5.3", + "page": 7 + }, + { + "id": "818d354d9dc4158e4c05e96de099f39c", + "type": "strain", + "entityRuleId": "DOC.5.3", + "page": 7 + }, + { + "id": "818d354d9dc4158e4c05e96de099f39c", + "type": "strain", + "entityRuleId": "DOC.5.3", + "page": 7 + } + ] + } + ], + "overridden": false + }, + { + "name": "Doses_mg_per_kg_bw", + "componentValues": [ + { + "value": "Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.", + "originalValue": "Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.", + "valueDescription": "Joining all values of type doses_(mg_kg_bw) with ' '", + "componentRuleId": "Necropsy.1.0", + "componentLogEntityReferences": [ + { + "id": "92b67bcf7b5f7f7bdfcb6d0991e6b4c2", + "type": "doses_(mg_kg_bw)", + "entityRuleId": "DOC.35.0", + "page": 4 + }, + { + "id": "92b67bcf7b5f7f7bdfcb6d0991e6b4c2", + "type": "doses_(mg_kg_bw)", + "entityRuleId": "DOC.35.0", + "page": 4 + }, + { + "id": "67e8421d095ed4c003ca2c21a120c00b", + "type": "doses_(mg_kg_bw)", + "entityRuleId": "DOC.35.0", + "page": 4 + }, + { + "id": "67e8421d095ed4c003ca2c21a120c00b", + "type": "doses_(mg_kg_bw)", + "entityRuleId": "DOC.35.0", + "page": 4 + } + ] + } + ], + "overridden": false + }, + { + "name": "Mortality_Statement", + "componentValues": [ + { + "value": "Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.", + "originalValue": "Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.", + "valueDescription": "Joining all values of type mortality_statement with ' '", + "componentRuleId": "MortalityStatement.0.0", + "componentLogEntityReferences": [ + { + "id": "08b4d86a822d87d6f4e7b1efdd364181", + "type": "mortality_statement", + "entityRuleId": "DOC.32.0", + "page": 8 + }, + { + "id": "08b4d86a822d87d6f4e7b1efdd364181", + "type": "mortality_statement", + "entityRuleId": "DOC.32.0", + "page": 8 + }, + { + "id": "cc1c76d7e9bd09483b1ffa91a0749c2c", + "type": "mortality_statement", + "entityRuleId": "DOC.32.0", + "page": 8 + }, + { + "id": "cc1c76d7e9bd09483b1ffa91a0749c2c", + "type": "mortality_statement", + "entityRuleId": "DOC.32.0", + "page": 8 + } + ] + } + ], + "overridden": false + }, + { + "name": "Weight_Behavior_Changes", + "componentValues": [ + { + "value": "", + "originalValue": "", + "valueDescription": "Joining all values of type with '\n'", + "componentRuleId": "WeightBehavior.0.0", + "componentLogEntityReferences": [] + } + ], + "overridden": false + }, + { + "name": "Necropsy_Findings", + "componentValues": [ + { + "value": "Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.", + "originalValue": "Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.", + "valueDescription": "Joining all values of type necropsy_findings with ' '", + "componentRuleId": "Necropsy.0.0", + "componentLogEntityReferences": [ + { + "id": "069397e80191213e72c792f177a22185", + "type": "necropsy_findings", + "entityRuleId": "DOC.17.0", + "page": 9 + }, + { + "id": "069397e80191213e72c792f177a22185", + "type": "necropsy_findings", + "entityRuleId": "DOC.17.0", + "page": 9 + } + ] + } + ], + "overridden": false + }, + { + "name": "Deviation_from_the_Guideline", + "componentValues": [ + { + "value": "There was no deviation from the guidelines and from the Study Plan.\nThere was no deviation from the guidelines and from the Study Plan.", + "originalValue": "There was no deviation from the guidelines and from the Study Plan.\nThere was no deviation from the guidelines and from the Study Plan.", + "valueDescription": "Joining all values of type guideline_deviation with '\n'", + "componentRuleId": "GuidelineDeviation.0.0", + "componentLogEntityReferences": [ + { + "id": "4553fb6da48b0c6d6d5d45860c7e473d", + "type": "guideline_deviation", + "entityRuleId": "DOC.11.0", + "page": 3 + }, + { + "id": "4553fb6da48b0c6d6d5d45860c7e473d", + "type": "guideline_deviation", + "entityRuleId": "DOC.11.0", + "page": 3 + } + ] + } + ], + "overridden": false + }, + { + "name": "Conclusion_LD50_Greater_than", + "componentValues": [ + { + "value": "", + "originalValue": "", + "valueDescription": "No entity of type 'ld50_greater' found", + "componentRuleId": "Conclusion.1.1", + "componentLogEntityReferences": [] + } + ], + "overridden": false + }, + { + "name": "Conclusion_LD50_mg_per_kg", + "componentValues": [ + { + "value": "", + "originalValue": "", + "valueDescription": "Joining all unique values of type with ', '", + "componentRuleId": "Conclusion.0.0", + "componentLogEntityReferences": [] + } + ], + "overridden": false + }, + { + "name": "Conclusion_Minimum_Confidence", + "componentValues": [ + { + "value": "", + "originalValue": "", + "valueDescription": "Joining all unique values of type with ', '", + "componentRuleId": "Conclusion.2.0", + "componentLogEntityReferences": [] + } + ], + "overridden": false + }, + { + "name": "Conclusion_Maximum_Confidence", + "componentValues": [ + { + "value": "", + "originalValue": "", + "valueDescription": "Joining all unique values of type with ', '", + "componentRuleId": "Conclusion.3.0", + "componentLogEntityReferences": [] + } + ], + "overridden": false + }, + { + "name": "Study_Conclusion", + "componentValues": [ + { + "value": "Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.", + "originalValue": "Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.", + "valueDescription": "Joining all values of type study_conclusion with ' '", + "componentRuleId": "StudyConclusion.0.0", + "componentLogEntityReferences": [ + { + "id": "d9c491f44d607083e9e6609b19498d21", + "type": "study_conclusion", + "entityRuleId": "DOC.15.0", + "page": 4 + }, + { + "id": "d9c491f44d607083e9e6609b19498d21", + "type": "study_conclusion", + "entityRuleId": "DOC.15.0", + "page": 4 + } + ] + } + ], + "overridden": false + } + ] +} \ No newline at end of file diff --git a/persistence-service-v1/persistence-service-shared-mongo-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/mongo/mapper/ComponentLogDocumentMapper.java b/persistence-service-v1/persistence-service-shared-mongo-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/mongo/mapper/ComponentLogDocumentMapper.java index 67dafef80..5d251f240 100644 --- a/persistence-service-v1/persistence-service-shared-mongo-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/mongo/mapper/ComponentLogDocumentMapper.java +++ b/persistence-service-v1/persistence-service-shared-mongo-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/mongo/mapper/ComponentLogDocumentMapper.java @@ -1,5 +1,6 @@ package com.iqser.red.service.persistence.service.v1.api.shared.mongo.mapper; +import java.util.ArrayList; import java.util.List; import org.mapstruct.Mapper; @@ -20,8 +21,20 @@ public interface ComponentLogDocumentMapper { @Mapping(source = "components", target = "componentLogEntries") ComponentLog fromComponentLogDocument(ComponentLogDocument componentLogDocument); + default List toComponentDocuments(String dossierId, String fileId, List componentLogEntries) { + List componentDocuments = new ArrayList<>(); - List toComponentDocuments(List componentLogEntries); + String componentLogId = getComponentLogId(dossierId, fileId); + for (ComponentLogEntry componentLogEntry : componentLogEntries) { + ComponentDocument componentDocument = new ComponentDocument(); + componentDocument.setId(getComponentId(componentLogId, componentLogEntry.getName())); + componentDocument.setComponentLogId(componentLogId); + componentDocument.setName(componentLogEntry.getName()); + componentDocument.setOverrideValues(componentLogEntry.getComponentValues()); + componentDocuments.add(componentDocument); + } + return componentDocuments; + } @Mapping(source = "overrideValues", target = "componentValues") @@ -29,10 +42,12 @@ public interface ComponentLogDocumentMapper { @Mapping(expression = "java(getComponentLogId(dossierId, fileId))", target = "id") + @Mapping(expression = "java(toComponentDocuments(dossierId, fileId, componentLog.getComponentLogEntries()))", target = "components") ComponentLogDocument toComponentLogDocument(String dossierId, String fileId, ComponentLog componentLog); @Mapping(expression = "java(getComponentId(componentLogId, componentLogEntry.getName()))", target = "id") + @Mapping(source = "componentLogEntry.componentValues", target = "overrideValues") ComponentDocument toComponentDocument(String componentLogId, ComponentLogEntry componentLogEntry); diff --git a/persistence-service-v1/persistence-service-shared-mongo-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/mongo/repository/CustomComponentRepositoryImpl.java b/persistence-service-v1/persistence-service-shared-mongo-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/mongo/repository/CustomComponentRepositoryImpl.java index 344e0f8ca..72a23adef 100644 --- a/persistence-service-v1/persistence-service-shared-mongo-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/mongo/repository/CustomComponentRepositoryImpl.java +++ b/persistence-service-v1/persistence-service-shared-mongo-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/mongo/repository/CustomComponentRepositoryImpl.java @@ -29,9 +29,10 @@ public class CustomComponentRepositoryImpl implements CustomComponentRepository @Override public List findOverrides(String fileId, String dossierId) { - LookupOperation lookupOperation = LookupOperation.newLookup().from("componentDocument").localField("components").foreignField("_id").as("componentDocs"); + LookupOperation lookupOperation = LookupOperation.newLookup().from("components").localField("overrideValues").foreignField("_id").as("componentDocs"); - AggregationOperation matchOperation = match(Criteria.where("fileId").is(fileId).and("dossierId").is(dossierId)); + AggregationOperation matchOperation = match(Criteria.where("componentLogId").is(dossierId + "/" + fileId)); +// AggregationOperation matchOperation = match(Criteria.where("fileId").is(fileId).and("dossierId").is(dossierId)); AggregationOperation unwindOperation = unwind("componentDocs"); @@ -41,7 +42,7 @@ public class CustomComponentRepositoryImpl implements CustomComponentRepository Aggregation aggregation = newAggregation(matchOperation, lookupOperation, unwindOperation, matchNonEmptyOverrides, replaceRootOperation); - AggregationResults results = mongoTemplate.aggregate(aggregation, "componentLogDocument", ComponentDocument.class); + AggregationResults results = mongoTemplate.aggregate(aggregation, "component-logs", ComponentDocument.class); return results.getMappedResults(); } diff --git a/persistence-service-v1/persistence-service-shared-mongo-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/mongo/service/ComponentLogMongoService.java b/persistence-service-v1/persistence-service-shared-mongo-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/mongo/service/ComponentLogMongoService.java index ee954e8da..ff6acde63 100644 --- a/persistence-service-v1/persistence-service-shared-mongo-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/mongo/service/ComponentLogMongoService.java +++ b/persistence-service-v1/persistence-service-shared-mongo-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/mongo/service/ComponentLogMongoService.java @@ -97,20 +97,15 @@ public class ComponentLogMongoService { } - public void insertComponentLogEntries(String dossierId, String fileId, ComponentLog componentLog, List componentLogEntries) { + public void insertComponentLogEntries(String dossierId, String fileId, List componentLogEntries) { String componentLogId = mapper.getComponentLogId(dossierId, fileId); - ComponentLogDocument componentLogDocument = mapper.toComponentLogDocument(dossierId, fileId, componentLog); - List componentDocuments = componentLogEntries.stream() .map(componentLogEntry -> mapper.toComponentDocument(componentLogId, componentLogEntry)) .toList(); - componentLogDocument.getComponents().addAll(componentDocuments); - componentDocumentRepository.insert(componentDocuments); - componentLogDocumentRepository.save(componentLogDocument); } -- 2.47.2 From be4769497d3337dc8a1bba636bc4bd0c12030c2b Mon Sep 17 00:00:00 2001 From: Ali Oezyetimoglu Date: Mon, 27 May 2024 17:25:39 +0200 Subject: [PATCH 07/11] RED-8339: Fixes --- .../tests/ComponentOverrideTest.java | 1 + .../ComponentDocumentRepository.java | 6 +++ .../ComponentLogDocumentRepository.java | 4 +- .../repository/CustomComponentRepository.java | 14 ------ .../CustomComponentRepositoryImpl.java | 50 ------------------- .../service/ComponentLogMongoService.java | 18 ++++++- 6 files changed, 27 insertions(+), 66 deletions(-) delete mode 100644 persistence-service-v1/persistence-service-shared-mongo-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/mongo/repository/CustomComponentRepository.java delete mode 100644 persistence-service-v1/persistence-service-shared-mongo-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/mongo/repository/CustomComponentRepositoryImpl.java diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/ComponentOverrideTest.java b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/ComponentOverrideTest.java index c660f1202..f5fa090cf 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/ComponentOverrideTest.java +++ b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/ComponentOverrideTest.java @@ -53,6 +53,7 @@ public class ComponentOverrideTest extends AbstractPersistenceServerServiceTest .name("Study_Title") .componentValues(List.of(ComponentValue.builder() .value("AAAA Strange Chemical Name And the rest of a title – With a dash and some more text") + .originalValue("Strange Chemical Name And the rest of a title – With a dash and some more text") .valueDescription("First found value of type title or else ''") .componentRuleId("StudyTitle.0.0") .entityReferences(List.of(EntityReference.builder() diff --git a/persistence-service-v1/persistence-service-shared-mongo-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/mongo/repository/ComponentDocumentRepository.java b/persistence-service-v1/persistence-service-shared-mongo-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/mongo/repository/ComponentDocumentRepository.java index 1e48abcaf..7b6b3324f 100644 --- a/persistence-service-v1/persistence-service-shared-mongo-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/mongo/repository/ComponentDocumentRepository.java +++ b/persistence-service-v1/persistence-service-shared-mongo-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/mongo/repository/ComponentDocumentRepository.java @@ -19,4 +19,10 @@ public interface ComponentDocumentRepository extends MongoRepository findComponentDocumentByName(String componentLogId, String componentName); + @Query(value = "{ 'componentLogId': ?0 }") + List findByDossierIdAndFileId(String componentLogId); + + @Query(value = "{ 'componentLogId': ?0 }", fields = "{ 'overrideValues': 0 }") + List findWithoutEntriesByDossierIdAndFileId(String componentLogId); + } diff --git a/persistence-service-v1/persistence-service-shared-mongo-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/mongo/repository/ComponentLogDocumentRepository.java b/persistence-service-v1/persistence-service-shared-mongo-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/mongo/repository/ComponentLogDocumentRepository.java index 262e23842..e18006a0d 100644 --- a/persistence-service-v1/persistence-service-shared-mongo-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/mongo/repository/ComponentLogDocumentRepository.java +++ b/persistence-service-v1/persistence-service-shared-mongo-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/mongo/repository/ComponentLogDocumentRepository.java @@ -1,5 +1,6 @@ package com.iqser.red.service.persistence.service.v1.api.shared.mongo.repository; +import java.util.List; import java.util.Optional; import org.springframework.core.convert.TypeDescriptor; @@ -7,10 +8,11 @@ import org.springframework.data.mongodb.repository.MongoRepository; import org.springframework.data.mongodb.repository.Query; import org.springframework.stereotype.Repository; +import com.iqser.red.service.persistence.service.v1.api.shared.mongo.document.ComponentDocument; import com.iqser.red.service.persistence.service.v1.api.shared.mongo.document.ComponentLogDocument; @Repository -public interface ComponentLogDocumentRepository extends MongoRepository, CustomComponentRepository { +public interface ComponentLogDocumentRepository extends MongoRepository { @Query(value = "{ 'id' : ?0 }", fields = "{ 'analysisNumber' : 1 }") Optional findAnalysisNumberById(String id); diff --git a/persistence-service-v1/persistence-service-shared-mongo-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/mongo/repository/CustomComponentRepository.java b/persistence-service-v1/persistence-service-shared-mongo-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/mongo/repository/CustomComponentRepository.java deleted file mode 100644 index 32199d5f8..000000000 --- a/persistence-service-v1/persistence-service-shared-mongo-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/mongo/repository/CustomComponentRepository.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.iqser.red.service.persistence.service.v1.api.shared.mongo.repository; - -import java.util.List; - -import org.springframework.stereotype.Repository; - -import com.iqser.red.service.persistence.service.v1.api.shared.mongo.document.ComponentDocument; - -@Repository -public interface CustomComponentRepository { - - List findOverrides(String fileId, String dossierId); - -} diff --git a/persistence-service-v1/persistence-service-shared-mongo-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/mongo/repository/CustomComponentRepositoryImpl.java b/persistence-service-v1/persistence-service-shared-mongo-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/mongo/repository/CustomComponentRepositoryImpl.java deleted file mode 100644 index 72a23adef..000000000 --- a/persistence-service-v1/persistence-service-shared-mongo-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/mongo/repository/CustomComponentRepositoryImpl.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.iqser.red.service.persistence.service.v1.api.shared.mongo.repository; - -import static org.springframework.data.mongodb.core.aggregation.Aggregation.match; -import static org.springframework.data.mongodb.core.aggregation.Aggregation.newAggregation; -import static org.springframework.data.mongodb.core.aggregation.Aggregation.replaceRoot; -import static org.springframework.data.mongodb.core.aggregation.Aggregation.unwind; - -import java.util.List; - -import org.springframework.data.mongodb.core.MongoTemplate; -import org.springframework.data.mongodb.core.aggregation.Aggregation; -import org.springframework.data.mongodb.core.aggregation.AggregationOperation; -import org.springframework.data.mongodb.core.aggregation.AggregationResults; -import org.springframework.data.mongodb.core.aggregation.LookupOperation; -import org.springframework.data.mongodb.core.query.Criteria; -import org.springframework.stereotype.Repository; - -import com.iqser.red.service.persistence.service.v1.api.shared.mongo.document.ComponentDocument; - -import lombok.RequiredArgsConstructor; - -@Repository -@RequiredArgsConstructor -public class CustomComponentRepositoryImpl implements CustomComponentRepository { - - private final MongoTemplate mongoTemplate; - - - @Override - public List findOverrides(String fileId, String dossierId) { - - LookupOperation lookupOperation = LookupOperation.newLookup().from("components").localField("overrideValues").foreignField("_id").as("componentDocs"); - - AggregationOperation matchOperation = match(Criteria.where("componentLogId").is(dossierId + "/" + fileId)); -// AggregationOperation matchOperation = match(Criteria.where("fileId").is(fileId).and("dossierId").is(dossierId)); - - AggregationOperation unwindOperation = unwind("componentDocs"); - - AggregationOperation matchNonEmptyOverrides = match(Criteria.where("componentDocs.overrideValues").ne(null)); - - AggregationOperation replaceRootOperation = replaceRoot("componentDocs"); - - Aggregation aggregation = newAggregation(matchOperation, lookupOperation, unwindOperation, matchNonEmptyOverrides, replaceRootOperation); - - AggregationResults results = mongoTemplate.aggregate(aggregation, "component-logs", ComponentDocument.class); - - return results.getMappedResults(); - } - -} diff --git a/persistence-service-v1/persistence-service-shared-mongo-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/mongo/service/ComponentLogMongoService.java b/persistence-service-v1/persistence-service-shared-mongo-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/mongo/service/ComponentLogMongoService.java index ff6acde63..5dbbae463 100644 --- a/persistence-service-v1/persistence-service-shared-mongo-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/mongo/service/ComponentLogMongoService.java +++ b/persistence-service-v1/persistence-service-shared-mongo-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/mongo/service/ComponentLogMongoService.java @@ -181,10 +181,26 @@ public class ComponentLogMongoService { public List findOverrides(String dossierId, String fileId) { - return componentLogDocumentRepository.findOverrides(dossierId, fileId) + String componentLogId = mapper.getComponentLogId(dossierId, fileId); + + List overrides = componentDocumentRepository.findByDossierIdAndFileId(componentLogId) .stream() .map(mapper::fromComponentDocument) .toList(); + overrides.forEach(componentLogEntry -> { + var componentValues = componentLogEntry.getComponentValues() + .stream() + .filter(componentLogEntryValue -> !componentLogEntryValue.getValue().equals(componentLogEntryValue.getOriginalValue())) + .toList(); + componentLogEntry.setComponentValues(componentValues); + }); + + return overrides; + +// return componentLogDocumentRepository.findOverrides(dossierId, fileId) +// .stream() +// .map(mapper::fromComponentDocument) +// .toList(); } -- 2.47.2 From 9c93cd32c12c143a659618668f0bd1ea1424bbe5 Mon Sep 17 00:00:00 2001 From: Ali Oezyetimoglu Date: Mon, 27 May 2024 18:39:22 +0200 Subject: [PATCH 08/11] RED-8339: Fixes --- .../v1/processor/service/ComponentLogService.java | 4 +++- .../server/integration/tests/ComponentOverrideTest.java | 8 -------- .../shared/mongo/service/ComponentLogMongoService.java | 1 + 3 files changed, 4 insertions(+), 9 deletions(-) diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/ComponentLogService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/ComponentLogService.java index da069b0a8..7a4a69efa 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/ComponentLogService.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/ComponentLogService.java @@ -125,11 +125,13 @@ public class ComponentLogService { if (optionalComponentLogEntry.isPresent()) { ComponentLogEntry componentToUpdate = optionalComponentLogEntry.get(); componentToUpdate.setOverridden(true); - componentToUpdate.setComponentValues(componentOverride.getComponentValues()); + System.out.println("AAAA1: " + componentToUpdate); + componentToUpdate.getComponentValues().addAll(componentOverride.getComponentValues()); saveOverride(dossierId, fileId, componentToUpdate); auditOverride(dossierId, fileId, componentToUpdate); } else { componentOverride.setOverridden(true); + System.out.println("AAAA2: " + componentOverride); insertOverride(dossierId, fileId, componentOverride); auditOverride(dossierId, fileId, componentOverride); } diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/ComponentOverrideTest.java b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/ComponentOverrideTest.java index f5fa090cf..f71352a18 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/ComponentOverrideTest.java +++ b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/ComponentOverrideTest.java @@ -16,7 +16,6 @@ import com.iqser.red.service.peristence.v1.server.integration.client.DossierTemp import com.iqser.red.service.peristence.v1.server.integration.service.DossierTesterAndProvider; import com.iqser.red.service.peristence.v1.server.integration.service.FileTesterAndProvider; import com.iqser.red.service.peristence.v1.server.integration.utils.AbstractPersistenceServerServiceTest; -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.dossiertemplate.dossier.file.FileType; import com.iqser.red.service.persistence.service.v2.api.external.model.Component; import com.iqser.red.service.persistence.service.v2.api.external.model.ComponentValue; @@ -68,10 +67,7 @@ public class ComponentOverrideTest extends AbstractPersistenceServerServiceTest var componentLogJson = new ClassPathResource("files/componentlog/exampleComponentLog.json"); -// ComponentLog componentLog = objectMapper.readValue(componentLogJson.getInputStream(), ComponentLog.class); - fileManagementStorageService.storeObject(dossier.getId(), file.getId(), FileType.COMPONENT_LOG, componentLogJson.getInputStream()); - ComponentLog componentLog = fileManagementStorageService.getComponentLog(dossier.getId(), file.getId()); componentClient.addOverride(dossierTemplate.getId(), dossier.getId(), file.getId(), componentOverrideModel); @@ -83,10 +79,6 @@ public class ComponentOverrideTest extends AbstractPersistenceServerServiceTest assertFalse(overrides.getComponentOverrideModels().isEmpty()); - var sth = componentClient.getComponents(dossierTemplate.getId(), dossier.getId(), file.getId(), true); - - System.out.println(sth); - System.out.println("See ya"); } } diff --git a/persistence-service-v1/persistence-service-shared-mongo-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/mongo/service/ComponentLogMongoService.java b/persistence-service-v1/persistence-service-shared-mongo-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/mongo/service/ComponentLogMongoService.java index 5dbbae463..a3448e151 100644 --- a/persistence-service-v1/persistence-service-shared-mongo-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/mongo/service/ComponentLogMongoService.java +++ b/persistence-service-v1/persistence-service-shared-mongo-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/mongo/service/ComponentLogMongoService.java @@ -105,6 +105,7 @@ public class ComponentLogMongoService { .map(componentLogEntry -> mapper.toComponentDocument(componentLogId, componentLogEntry)) .toList(); + System.out.println("BBBB: " + componentDocuments); componentDocumentRepository.insert(componentDocuments); } -- 2.47.2 From fcc87a078bfaa13fa7ff7d67f64c547c789db402 Mon Sep 17 00:00:00 2001 From: Ali Oezyetimoglu Date: Wed, 29 May 2024 12:29:05 +0200 Subject: [PATCH 09/11] RED-8339: Fixes --- .../service/ComponentLogService.java | 38 ++++++++++++++----- .../tests/ComponentOverrideTest.java | 30 ++++++++++++++- .../mongo/document/ComponentDocument.java | 9 +++-- .../ComponentDocumentRepository.java | 1 - .../service/ComponentLogMongoService.java | 15 +------- 5 files changed, 64 insertions(+), 29 deletions(-) diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/ComponentLogService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/ComponentLogService.java index 7a4a69efa..813b2633a 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/ComponentLogService.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/ComponentLogService.java @@ -5,6 +5,7 @@ import java.util.List; import java.util.Map; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import com.iqser.red.service.persistence.management.v1.processor.exception.NotFoundException; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.AuditPersistenceService; @@ -118,27 +119,44 @@ public class ComponentLogService { } + @Transactional public void addOverride(String dossierId, String fileId, ComponentLogEntry componentOverride) { var optionalComponentLogEntry = componentLogMongoService.findComponentLogEntryById(dossierId, fileId, componentOverride.getName()); + ComponentLogEntry componentToUpdate; if (optionalComponentLogEntry.isPresent()) { - ComponentLogEntry componentToUpdate = optionalComponentLogEntry.get(); - componentToUpdate.setOverridden(true); - System.out.println("AAAA1: " + componentToUpdate); - componentToUpdate.getComponentValues().addAll(componentOverride.getComponentValues()); - saveOverride(dossierId, fileId, componentToUpdate); - auditOverride(dossierId, fileId, componentToUpdate); + componentToUpdate = optionalComponentLogEntry.get(); + updateComponentLogEntry(dossierId, fileId, componentOverride, componentToUpdate); } else { - componentOverride.setOverridden(true); - System.out.println("AAAA2: " + componentOverride); - insertOverride(dossierId, fileId, componentOverride); - auditOverride(dossierId, fileId, componentOverride); + optionalComponentLogEntry = fileManagementStorageService.getComponentLog(dossierId, fileId).getComponentLogEntries() + .stream() + .filter(componentLogEntry -> componentOverride.getName().equals(componentLogEntry.getName())) + .findFirst(); + if (optionalComponentLogEntry.isPresent()) { + componentToUpdate = optionalComponentLogEntry.get(); + updateComponentLogEntry(dossierId, fileId, componentOverride, componentToUpdate); + } else { + componentOverride.setOverridden(true); + System.out.println("AAAA2: " + componentOverride); + insertOverride(dossierId, fileId, componentOverride); + auditOverride(dossierId, fileId, componentOverride); + } } } + private void updateComponentLogEntry(String dossierId, String fileId, ComponentLogEntry componentOverride, ComponentLogEntry componentToUpdate) { + + componentToUpdate.setOverridden(true); + System.out.println("AAAA: " + componentToUpdate); + componentToUpdate.setComponentValues(componentOverride.getComponentValues()); + saveOverride(dossierId, fileId, componentToUpdate); + auditOverride(dossierId, fileId, componentToUpdate); + } + + private void saveOverride(String dossierId, String fileId, ComponentLogEntry componentToUpdate) { componentLogMongoService.saveComponentLogEntries(dossierId, fileId, List.of(componentToUpdate)); diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/ComponentOverrideTest.java b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/ComponentOverrideTest.java index f71352a18..4319e8287 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/ComponentOverrideTest.java +++ b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/ComponentOverrideTest.java @@ -2,6 +2,7 @@ package com.iqser.red.service.peristence.v1.server.integration.tests; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; import java.io.IOException; import java.util.List; @@ -62,7 +63,6 @@ public class ComponentOverrideTest extends AbstractPersistenceServerServiceTest .page(1) .build())) .build())) - .overridden(true) .build(); var componentLogJson = new ClassPathResource("files/componentlog/exampleComponentLog.json"); @@ -78,7 +78,35 @@ public class ComponentOverrideTest extends AbstractPersistenceServerServiceTest assertEquals(file.getId(), overrides.getFileId()); assertFalse(overrides.getComponentOverrideModels().isEmpty()); + assertTrue(overrides.getComponentOverrideModels().get(0).isOverridden()); + // override same entry a second time + Component componentOverrideModel2 = Component.builder() + .name("Study_Title") + .componentValues(List.of(ComponentValue.builder() + .value("BBBB Strange Chemical Name And the rest of a title – With a dash and some more text") + .originalValue("Strange Chemical Name And the rest of a title – With a dash and some more text") + .valueDescription("First found value of type title or else ''") + .componentRuleId("StudyTitle.0.0") + .entityReferences(List.of(EntityReference.builder() + .id("cf7f0d0c4c07918ce7d67b204f5fdb7d") + .type("title") + .entityRuleId("DOC.6.1") + .page(1) + .build())) + .build())) + .build(); + componentClient.addOverride(dossierTemplate.getId(), dossier.getId(), file.getId(), componentOverrideModel2); + +// when(fileManagementStorageService.getComponentLog(any(), any())).thenReturn(); + overrides = componentClient.getOverrides(dossierTemplate.getId(), dossier.getId(), file.getId()); + + assertEquals(dossierTemplate.getId(), overrides.getDossierTemplateId()); + assertEquals(dossier.getId(), overrides.getDossierId()); + assertEquals(file.getId(), overrides.getFileId()); + + assertFalse(overrides.getComponentOverrideModels().isEmpty()); + assertTrue(overrides.getComponentOverrideModels().get(0).isOverridden()); } } diff --git a/persistence-service-v1/persistence-service-shared-mongo-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/mongo/document/ComponentDocument.java b/persistence-service-v1/persistence-service-shared-mongo-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/mongo/document/ComponentDocument.java index e2ef280f3..f4b0b80de 100644 --- a/persistence-service-v1/persistence-service-shared-mongo-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/mongo/document/ComponentDocument.java +++ b/persistence-service-v1/persistence-service-shared-mongo-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/mongo/document/ComponentDocument.java @@ -20,7 +20,7 @@ import lombok.experimental.FieldDefaults; @AllArgsConstructor @EqualsAndHashCode(onlyExplicitlyIncluded = true) @FieldDefaults(level = AccessLevel.PRIVATE) -@Document(collection = "components") +@Document(collection = "component-log-entries") public class ComponentDocument { @Id @@ -33,7 +33,8 @@ public class ComponentDocument { List overrideValues = new ArrayList<>(); - // these parameters will be needed later - // List values = new ArrayList<>(); - // boolean overridden; + List values = new ArrayList<>(); + + boolean overridden; + } diff --git a/persistence-service-v1/persistence-service-shared-mongo-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/mongo/repository/ComponentDocumentRepository.java b/persistence-service-v1/persistence-service-shared-mongo-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/mongo/repository/ComponentDocumentRepository.java index 7b6b3324f..22635ea78 100644 --- a/persistence-service-v1/persistence-service-shared-mongo-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/mongo/repository/ComponentDocumentRepository.java +++ b/persistence-service-v1/persistence-service-shared-mongo-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/mongo/repository/ComponentDocumentRepository.java @@ -15,7 +15,6 @@ public interface ComponentDocumentRepository extends MongoRepository findComponentDocumentByName(String componentLogId, String componentName); diff --git a/persistence-service-v1/persistence-service-shared-mongo-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/mongo/service/ComponentLogMongoService.java b/persistence-service-v1/persistence-service-shared-mongo-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/mongo/service/ComponentLogMongoService.java index a3448e151..5084049a3 100644 --- a/persistence-service-v1/persistence-service-shared-mongo-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/mongo/service/ComponentLogMongoService.java +++ b/persistence-service-v1/persistence-service-shared-mongo-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/mongo/service/ComponentLogMongoService.java @@ -105,7 +105,6 @@ public class ComponentLogMongoService { .map(componentLogEntry -> mapper.toComponentDocument(componentLogId, componentLogEntry)) .toList(); - System.out.println("BBBB: " + componentDocuments); componentDocumentRepository.insert(componentDocuments); } @@ -126,16 +125,11 @@ public class ComponentLogMongoService { String componentLogId = mapper.getComponentLogId(dossierId, fileId); - ComponentLogDocument componentLogDocument = getComponentLogDocument(componentLogId); - List componentDocuments = componentLogEntries.stream() .map(componentLogEntry -> mapper.toComponentDocument(componentLogId, componentLogEntry)) .toList(); - componentLogDocument.getComponents().addAll(componentDocuments); - componentDocumentRepository.saveAll(componentDocuments); - componentLogDocumentRepository.save(componentLogDocument); } @@ -149,7 +143,7 @@ public class ComponentLogMongoService { } - public void deleteComponentLogEntries(String dossierId, String fileId, List componentLogEntries) { + public void deleteComponentLogEntriesFromComponentLog(String dossierId, String fileId, List componentLogEntries) { String componentLogId = mapper.getComponentLogId(dossierId, fileId); @@ -175,7 +169,7 @@ public class ComponentLogMongoService { public Optional findComponentLogEntryById(String dossierId, String fileId, String componentName) { - return componentDocumentRepository.findComponentDocumentByName(mapper.getComponentLogId(dossierId, fileId), componentName) + return componentDocumentRepository.findById(mapper.getComponentId(mapper.getComponentLogId(dossierId, fileId), componentName)) .map(mapper::fromComponentDocument); } @@ -197,11 +191,6 @@ public class ComponentLogMongoService { }); return overrides; - -// return componentLogDocumentRepository.findOverrides(dossierId, fileId) -// .stream() -// .map(mapper::fromComponentDocument) -// .toList(); } -- 2.47.2 From 34237ca813a821d26cffa39e00d467556f335bcc Mon Sep 17 00:00:00 2001 From: Ali Oezyetimoglu Date: Wed, 29 May 2024 12:49:25 +0200 Subject: [PATCH 10/11] RED-8339: Fixes --- .../api/controller/InternalControllerAdvice.java | 11 ----------- .../ComponentLogDocumentNotFoundException.java | 10 ---------- .../mongo/exception/DocumentNotFoundException.java | 10 ++++++++++ .../exception/EntityLogDocumentNotFoundException.java | 10 ---------- .../mongo/repository/ComponentDocumentRepository.java | 2 +- .../mongo/service/ComponentLogMongoService.java | 10 +++------- .../shared/mongo/service/EntityLogMongoService.java | 4 ++-- 7 files changed, 16 insertions(+), 41 deletions(-) delete mode 100644 persistence-service-v1/persistence-service-shared-mongo-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/mongo/exception/ComponentLogDocumentNotFoundException.java create mode 100644 persistence-service-v1/persistence-service-shared-mongo-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/mongo/exception/DocumentNotFoundException.java delete mode 100644 persistence-service-v1/persistence-service-shared-mongo-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/mongo/exception/EntityLogDocumentNotFoundException.java diff --git a/persistence-service-v1/persistence-service-internal-api-impl-v1/src/main/java/com/iqser/red/service/persistence/v1/internal/api/controller/InternalControllerAdvice.java b/persistence-service-v1/persistence-service-internal-api-impl-v1/src/main/java/com/iqser/red/service/persistence/v1/internal/api/controller/InternalControllerAdvice.java index 00232e844..87baa639a 100644 --- a/persistence-service-v1/persistence-service-internal-api-impl-v1/src/main/java/com/iqser/red/service/persistence/v1/internal/api/controller/InternalControllerAdvice.java +++ b/persistence-service-v1/persistence-service-internal-api-impl-v1/src/main/java/com/iqser/red/service/persistence/v1/internal/api/controller/InternalControllerAdvice.java @@ -19,7 +19,6 @@ import com.iqser.red.service.persistence.management.v1.processor.exception.Dossi import com.iqser.red.service.persistence.management.v1.processor.exception.InvalidRulesException; import com.iqser.red.service.persistence.management.v1.processor.exception.NotFoundException; import com.iqser.red.service.persistence.management.v1.processor.exception.RulesTimeoutDetectedException; -import com.iqser.red.service.persistence.service.v1.api.shared.mongo.exception.ComponentLogDocumentNotFoundException; import io.swagger.v3.oas.annotations.Hidden; import lombok.extern.slf4j.Slf4j; @@ -135,14 +134,4 @@ public class InternalControllerAdvice { return new ErrorMessage(OffsetDateTime.now(), e.getMessage()); } - - @Hidden - @ResponseBody - @ResponseStatus(value = HttpStatus.BAD_REQUEST) - @ExceptionHandler(ComponentLogDocumentNotFoundException.class) - public ErrorMessage handleCustomException(ComponentLogDocumentNotFoundException e) { - - return new ErrorMessage(OffsetDateTime.now(), e.getMessage()); - } - } diff --git a/persistence-service-v1/persistence-service-shared-mongo-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/mongo/exception/ComponentLogDocumentNotFoundException.java b/persistence-service-v1/persistence-service-shared-mongo-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/mongo/exception/ComponentLogDocumentNotFoundException.java deleted file mode 100644 index 05e56d25e..000000000 --- a/persistence-service-v1/persistence-service-shared-mongo-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/mongo/exception/ComponentLogDocumentNotFoundException.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.iqser.red.service.persistence.service.v1.api.shared.mongo.exception; - -public class ComponentLogDocumentNotFoundException extends RuntimeException { - - public ComponentLogDocumentNotFoundException(String errorMessage) { - - super(errorMessage); - } - -} diff --git a/persistence-service-v1/persistence-service-shared-mongo-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/mongo/exception/DocumentNotFoundException.java b/persistence-service-v1/persistence-service-shared-mongo-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/mongo/exception/DocumentNotFoundException.java new file mode 100644 index 000000000..2e285239d --- /dev/null +++ b/persistence-service-v1/persistence-service-shared-mongo-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/mongo/exception/DocumentNotFoundException.java @@ -0,0 +1,10 @@ +package com.iqser.red.service.persistence.service.v1.api.shared.mongo.exception; + +public class DocumentNotFoundException extends RuntimeException { + + public DocumentNotFoundException(String errorMessage) { + + super(errorMessage); + } + +} diff --git a/persistence-service-v1/persistence-service-shared-mongo-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/mongo/exception/EntityLogDocumentNotFoundException.java b/persistence-service-v1/persistence-service-shared-mongo-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/mongo/exception/EntityLogDocumentNotFoundException.java deleted file mode 100644 index c83162c0f..000000000 --- a/persistence-service-v1/persistence-service-shared-mongo-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/mongo/exception/EntityLogDocumentNotFoundException.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.iqser.red.service.persistence.service.v1.api.shared.mongo.exception; - -public class EntityLogDocumentNotFoundException extends RuntimeException { - - public EntityLogDocumentNotFoundException(String errorMessage) { - - super(errorMessage); - } - -} diff --git a/persistence-service-v1/persistence-service-shared-mongo-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/mongo/repository/ComponentDocumentRepository.java b/persistence-service-v1/persistence-service-shared-mongo-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/mongo/repository/ComponentDocumentRepository.java index 22635ea78..c36db5f82 100644 --- a/persistence-service-v1/persistence-service-shared-mongo-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/mongo/repository/ComponentDocumentRepository.java +++ b/persistence-service-v1/persistence-service-shared-mongo-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/mongo/repository/ComponentDocumentRepository.java @@ -22,6 +22,6 @@ public interface ComponentDocumentRepository extends MongoRepository findByDossierIdAndFileId(String componentLogId); @Query(value = "{ 'componentLogId': ?0 }", fields = "{ 'overrideValues': 0 }") - List findWithoutEntriesByDossierIdAndFileId(String componentLogId); + List findWithoutOverrideValuesByDossierIdAndFileId(String componentLogId); } diff --git a/persistence-service-v1/persistence-service-shared-mongo-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/mongo/service/ComponentLogMongoService.java b/persistence-service-v1/persistence-service-shared-mongo-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/mongo/service/ComponentLogMongoService.java index 5084049a3..1c2d1134f 100644 --- a/persistence-service-v1/persistence-service-shared-mongo-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/mongo/service/ComponentLogMongoService.java +++ b/persistence-service-v1/persistence-service-shared-mongo-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/mongo/service/ComponentLogMongoService.java @@ -11,7 +11,7 @@ import com.iqser.red.service.persistence.service.v1.api.shared.model.analysislog import com.iqser.red.service.persistence.service.v1.api.shared.model.analysislog.componentlog.ComponentLogEntry; import com.iqser.red.service.persistence.service.v1.api.shared.mongo.document.ComponentDocument; import com.iqser.red.service.persistence.service.v1.api.shared.mongo.document.ComponentLogDocument; -import com.iqser.red.service.persistence.service.v1.api.shared.mongo.exception.ComponentLogDocumentNotFoundException; +import com.iqser.red.service.persistence.service.v1.api.shared.mongo.exception.DocumentNotFoundException; import com.iqser.red.service.persistence.service.v1.api.shared.mongo.mapper.ComponentLogDocumentMapper; import com.iqser.red.service.persistence.service.v1.api.shared.mongo.repository.ComponentDocumentRepository; import com.iqser.red.service.persistence.service.v1.api.shared.mongo.repository.ComponentLogDocumentRepository; @@ -111,13 +111,9 @@ public class ComponentLogMongoService { private ComponentLogDocument getComponentLogDocument(String componentLogId) { - Optional optionalComponentLogDocument = componentLogDocumentRepository.findById(componentLogId); + return componentLogDocumentRepository.findById(componentLogId) + .orElseThrow(() -> new DocumentNotFoundException(String.format("Component log not found for %s", componentLogId))); - if (optionalComponentLogDocument.isEmpty()) { - throw new ComponentLogDocumentNotFoundException(String.format("Component log not found for %s", componentLogId)); - } - - return optionalComponentLogDocument.get(); } diff --git a/persistence-service-v1/persistence-service-shared-mongo-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/mongo/service/EntityLogMongoService.java b/persistence-service-v1/persistence-service-shared-mongo-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/mongo/service/EntityLogMongoService.java index 9439fbd9e..8acbcaa72 100644 --- a/persistence-service-v1/persistence-service-shared-mongo-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/mongo/service/EntityLogMongoService.java +++ b/persistence-service-v1/persistence-service-shared-mongo-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/mongo/service/EntityLogMongoService.java @@ -13,7 +13,7 @@ import com.iqser.red.service.persistence.service.v1.api.shared.model.analysislog import com.iqser.red.service.persistence.service.v1.api.shared.model.analysislog.entitylog.EntityLogEntry; import com.iqser.red.service.persistence.service.v1.api.shared.mongo.document.EntityLogDocument; import com.iqser.red.service.persistence.service.v1.api.shared.mongo.document.EntityLogEntryDocument; -import com.iqser.red.service.persistence.service.v1.api.shared.mongo.exception.EntityLogDocumentNotFoundException; +import com.iqser.red.service.persistence.service.v1.api.shared.mongo.exception.DocumentNotFoundException; import com.iqser.red.service.persistence.service.v1.api.shared.mongo.mapper.EntityLogDocumentMapper; import com.iqser.red.service.persistence.service.v1.api.shared.mongo.repository.EntityLogDocumentRepository; import com.iqser.red.service.persistence.service.v1.api.shared.mongo.repository.EntityLogEntryDocumentRepository; @@ -167,7 +167,7 @@ public class EntityLogMongoService { Optional optionalEntityLogDocument = entityLogDocumentRepository.findById(entityLogId); if (optionalEntityLogDocument.isEmpty()) { - throw new EntityLogDocumentNotFoundException(String.format("Entity log not found for %s", entityLogId)); + throw new DocumentNotFoundException(String.format("Entity log not found for %s", entityLogId)); } return optionalEntityLogDocument.get(); -- 2.47.2 From 4487d8f5866d5a53ab7cb9c9cf7f6b99f5bc4937 Mon Sep 17 00:00:00 2001 From: Ali Oezyetimoglu Date: Wed, 29 May 2024 17:40:06 +0200 Subject: [PATCH 11/11] RED-8339: Fixes --- .../service/ComponentLogService.java | 40 ++------ .../tenant/4-create-component-entities.xml | 95 ++++++++++++++++++- .../componentlog/ComponentLogEntryValue.java | 1 - .../ComponentDocumentRepository.java | 2 +- .../service/ComponentLogMongoService.java | 19 ++-- 5 files changed, 110 insertions(+), 47 deletions(-) diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/ComponentLogService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/ComponentLogService.java index 813b2633a..c4e01f056 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/ComponentLogService.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/ComponentLogService.java @@ -7,7 +7,6 @@ import java.util.Map; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import com.iqser.red.service.persistence.management.v1.processor.exception.NotFoundException; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.AuditPersistenceService; 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; @@ -91,12 +90,11 @@ public class ComponentLogService { private void replaceOverriddenComponentLogEntries(ComponentLog componentLog, List componentOverrides) { - // remove override entries from componentLog + componentLog.getComponentLogEntries() .removeIf(entry -> componentOverrides.stream() .anyMatch(override -> entry.getName().equals(override.getName()))); - // insert overrides to Component log componentLog.getComponentLogEntries().addAll(componentOverrides); } @@ -129,28 +127,14 @@ public class ComponentLogService { componentToUpdate = optionalComponentLogEntry.get(); updateComponentLogEntry(dossierId, fileId, componentOverride, componentToUpdate); } else { - optionalComponentLogEntry = fileManagementStorageService.getComponentLog(dossierId, fileId).getComponentLogEntries() - .stream() - .filter(componentLogEntry -> componentOverride.getName().equals(componentLogEntry.getName())) - .findFirst(); - if (optionalComponentLogEntry.isPresent()) { - componentToUpdate = optionalComponentLogEntry.get(); - updateComponentLogEntry(dossierId, fileId, componentOverride, componentToUpdate); - } else { - componentOverride.setOverridden(true); - System.out.println("AAAA2: " + componentOverride); - insertOverride(dossierId, fileId, componentOverride); - auditOverride(dossierId, fileId, componentOverride); - } + insertOverride(dossierId, fileId, componentOverride); + auditOverride(dossierId, fileId, componentOverride); } - } private void updateComponentLogEntry(String dossierId, String fileId, ComponentLogEntry componentOverride, ComponentLogEntry componentToUpdate) { - componentToUpdate.setOverridden(true); - System.out.println("AAAA: " + componentToUpdate); componentToUpdate.setComponentValues(componentOverride.getComponentValues()); saveOverride(dossierId, fileId, componentToUpdate); auditOverride(dossierId, fileId, componentToUpdate); @@ -180,10 +164,9 @@ public class ComponentLogService { revertOverrideRequest.getComponents() .forEach(componentName -> { - var componentLogEntry = componentLogMongoService.findComponentLogEntryById(dossierId, fileId, componentName) - .orElseThrow(() -> new NotFoundException(String.format("Component %s was not found.", componentName))); + componentLogMongoService.deleteOverrides(dossierId, fileId, componentName); - auditOverrideRevert(dossierId, fileId, componentLogEntry); + auditOverrideRevert(dossierId, fileId, componentName); }); } @@ -209,23 +192,14 @@ public class ComponentLogService { } - private void auditOverrideRevert(String dossierId, String fileId, ComponentLogEntry entry) { + private void auditOverrideRevert(String dossierId, String fileId, String componentName) { auditPersistenceService.audit(AuditRequest.builder() .userId(KeycloakSecurity.getUserId()) .objectId(fileId) .category(AuditCategory.DOCUMENT.name()) .message("The component override for was reverted") - .details(Map.of("dossierId", - dossierId, - "fileId", - fileId, - "ComponentName", - entry.getName(), - "Action", - "REVERT", - "Values", - entry.getComponentValues())) + .details(Map.of("dossierId", dossierId, "fileId", fileId, "ComponentName", componentName, "Action", "REVERT")) .build()); } diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/resources/mongo/changelog/tenant/4-create-component-entities.xml b/persistence-service-v1/persistence-service-processor-v1/src/main/resources/mongo/changelog/tenant/4-create-component-entities.xml index eca068400..fe20dabdc 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/resources/mongo/changelog/tenant/4-create-component-entities.xml +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/resources/mongo/changelog/tenant/4-create-component-entities.xml @@ -7,11 +7,100 @@ - + + + { + "collMod": "component-logs", + "validator": { + "$jsonSchema": { + "bsonType": "object", + "required": ["id", "dossierId", "fileId", "analysisNumber", "componentRulesVersion", "components"], + "properties": { + "id": { + "bsonType": "string", + "description": "must be a string and is required" + }, + "dossierId": { + "bsonType": "string", + "description": "must be a string and is required" + }, + "fileId": { + "bsonType": "string", + "description": "must be a string and is required" + }, + "analysisNumber": { + "bsonType": "int", + "description": "must be an integer and is required" + }, + "componentRulesVersion": { + "bsonType": "long", + "description": "must be a long and is required" + }, + "components": { + "bsonType": "array", + "items": { + "bsonType": "objectId", + "description": "must be an array of objectIds" + }, + "description": "must be an array and is required" + } + } + } + }, + "validationLevel": "strict", + "validationAction": "error" + } + + - + + + { + "collMod": "component-log-entries", + "validator": { + "$jsonSchema": { + "bsonType": "object", + "required": ["id", "componentLogId", "name", "overrideValues", "values", "overridden"], + "properties": { + "id": { + "bsonType": "string", + "description": "must be a string and is required" + }, + "componentLogId": { + "bsonType": "string", + "description": "must be a string and is required" + }, + "name": { + "bsonType": "string", + "description": "must be a string and is required" + }, + "overrideValues": { + "bsonType": "array", + "items": { + "bsonType": "object" + }, + "description": "must be an array of objects and is required" + }, + "values": { + "bsonType": "array", + "items": { + "bsonType": "object" + }, + "description": "must be an array of objects and is required" + }, + "overridden": { + "bsonType": "bool", + "description": "must be a boolean and is required" + } + } + } + }, + "validationLevel": "strict", + "validationAction": "warn" + } + + - \ No newline at end of file diff --git a/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/analysislog/componentlog/ComponentLogEntryValue.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/analysislog/componentlog/ComponentLogEntryValue.java index 04812f9a3..c2280392d 100644 --- a/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/analysislog/componentlog/ComponentLogEntryValue.java +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/analysislog/componentlog/ComponentLogEntryValue.java @@ -17,7 +17,6 @@ import lombok.experimental.FieldDefaults; public class ComponentLogEntryValue { String value; - String originalValue; String valueDescription; String componentRuleId; diff --git a/persistence-service-v1/persistence-service-shared-mongo-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/mongo/repository/ComponentDocumentRepository.java b/persistence-service-v1/persistence-service-shared-mongo-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/mongo/repository/ComponentDocumentRepository.java index c36db5f82..01e6adb43 100644 --- a/persistence-service-v1/persistence-service-shared-mongo-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/mongo/repository/ComponentDocumentRepository.java +++ b/persistence-service-v1/persistence-service-shared-mongo-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/mongo/repository/ComponentDocumentRepository.java @@ -19,7 +19,7 @@ public interface ComponentDocumentRepository extends MongoRepository findComponentDocumentByName(String componentLogId, String componentName); @Query(value = "{ 'componentLogId': ?0 }") - List findByDossierIdAndFileId(String componentLogId); + List findByComponentLogId(String componentLogId); @Query(value = "{ 'componentLogId': ?0 }", fields = "{ 'overrideValues': 0 }") List findWithoutOverrideValuesByDossierIdAndFileId(String componentLogId); diff --git a/persistence-service-v1/persistence-service-shared-mongo-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/mongo/service/ComponentLogMongoService.java b/persistence-service-v1/persistence-service-shared-mongo-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/mongo/service/ComponentLogMongoService.java index 1c2d1134f..1879cf307 100644 --- a/persistence-service-v1/persistence-service-shared-mongo-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/mongo/service/ComponentLogMongoService.java +++ b/persistence-service-v1/persistence-service-shared-mongo-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/mongo/service/ComponentLogMongoService.java @@ -174,19 +174,12 @@ public class ComponentLogMongoService { String componentLogId = mapper.getComponentLogId(dossierId, fileId); - List overrides = componentDocumentRepository.findByDossierIdAndFileId(componentLogId) + return componentDocumentRepository.findByComponentLogId(componentLogId) .stream() .map(mapper::fromComponentDocument) + .peek(componentLogEntry -> componentLogEntry.setOverridden(true)) .toList(); - overrides.forEach(componentLogEntry -> { - var componentValues = componentLogEntry.getComponentValues() - .stream() - .filter(componentLogEntryValue -> !componentLogEntryValue.getValue().equals(componentLogEntryValue.getOriginalValue())) - .toList(); - componentLogEntry.setComponentValues(componentValues); - }); - return overrides; } @@ -223,4 +216,12 @@ public class ComponentLogMongoService { .map(mapper::fromComponentLogDocument); } + + public void deleteOverrides(String dossierId, String fileId, String componentName) { + + String componentId = mapper.getComponentId(dossierId, fileId, componentName); + + componentDocumentRepository.deleteById(componentId); + } + } -- 2.47.2