From 9079ae18afc21438d345cb0a2e70cbbebc48fbd3 Mon Sep 17 00:00:00 2001 From: Ali Oezyetimoglu Date: Mon, 13 May 2024 22:39:18 +0200 Subject: [PATCH 1/8] RED-8339: Component Overrides in DocuMine --- .../controller/ComponentLogController.java | 145 ++------- .../controller/RSSComponentLogController.java | 287 ------------------ .../api/impl/controller/RSSController.java | 148 --------- .../controller/ComponentControllerV2.java | 118 +++---- .../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 | 47 ++- .../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 ++++++++++++++ 30 files changed, 1431 insertions(+), 825 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/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 943fba2d0..eeb47bc76 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,25 @@ 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.management.v1.processor.service.persistence.DossierTemplatePersistenceService; -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; @@ -37,10 +35,12 @@ import lombok.experimental.FieldDefaults; @FieldDefaults(makeFinal = true, level = AccessLevel.PRIVATE) public class ComponentControllerV2 implements ComponentResource { + DossierTemplateController dossierTemplateController; ComponentLogService componentLogService; StatusController statusController; FileStatusService fileStatusService; DossierTemplatePersistenceService dossierTemplatePersistenceService; + ComponentMapper componentMapper = ComponentMapper.INSTANCE; @Override @@ -52,65 +52,7 @@ public class ComponentControllerV2 implements ComponentResource { dossierTemplatePersistenceService.checkDossierTemplateExistsOrElseThrow404(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); } @@ -127,4 +69,44 @@ public class ComponentControllerV2 implements ComponentResource { } + @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 a67b78e9c..2b63f8148 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 @@ -11,26 +11,22 @@ import static com.iqser.red.service.persistence.service.v2.api.external.resource import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.DeleteMapping; 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.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.RequestPart; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.bind.annotation.ResponseStatus; -import org.springframework.web.multipart.MultipartFile; -import com.iqser.red.service.persistence.service.v2.api.external.model.ComponentMappingMetadataModel; -import com.iqser.red.service.persistence.service.v2.api.external.model.ComponentMappingSummary; +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; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; -import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.responses.ApiResponse; import io.swagger.v3.oas.annotations.responses.ApiResponses; @@ -49,10 +45,15 @@ public interface ComponentResource { String INCLUDE_DETAILS_DESCRIPTION = """ A toggle to decide whether to include detailed component information in the response: + - true: The component object's field componentDetails stores detailed information about the source of its respective value(s). - 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 = FILE_PATH + FILE_ID_PATH_VARIABLE + COMPONENTS_PATH, produces = {MediaType.APPLICATION_JSON_VALUE, MediaType.APPLICATION_XML_VALUE}) @@ -72,5 +73,35 @@ public interface ComponentResource { @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 d921c3f6a0407b4db2df6d0f6657fee84f666939 Mon Sep 17 00:00:00 2001 From: Ali Oezyetimoglu Date: Wed, 22 May 2024 19:28:19 +0200 Subject: [PATCH 2/8] 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 2b63f8148..e16e47626 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 @@ -77,7 +77,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, @@ -98,7 +98,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 9691da1d5..67111c029 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 @@ -953,6 +953,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 @@ -1462,6 +1553,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 1a4d97a14f170cd9180924df00683a755631cebe Mon Sep 17 00:00:00 2001 From: Ali Oezyetimoglu Date: Wed, 22 May 2024 19:58:57 +0200 Subject: [PATCH 3/8] 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 2ae40e640365a63a7bb57753c3c47ff0dc75cfa7 Mon Sep 17 00:00:00 2001 From: Ali Oezyetimoglu Date: Wed, 22 May 2024 20:03:00 +0200 Subject: [PATCH 4/8] 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 23cf4cf5e9962fcc51496bec47d0d58bd0c45fab Mon Sep 17 00:00:00 2001 From: Ali Oezyetimoglu Date: Thu, 23 May 2024 09:24:59 +0200 Subject: [PATCH 5/8] RED-8339: Fixes --- .../controller/ComponentControllerV2.java | 7 +- .../external/resource/ComponentResource.java | 6 +- .../controller/InternalControllerAdvice.java | 21 +- .../service/ComponentLogService.java | 49 +- .../tenant/4-create-component-entities.xml | 95 ++- .../integration/client/ComponentClient.java | 10 + .../tests/ComponentOverrideTest.java | 112 +++ .../componentlog/exampleComponentLog.json | 655 ++++++++++++++++++ .../componentlog/ComponentLogEntryValue.java | 1 - .../mongo/document/ComponentDocument.java | 9 +- ...ComponentLogDocumentNotFoundException.java | 10 - .../exception/DocumentNotFoundException.java | 10 + .../EntityLogDocumentNotFoundException.java | 10 - .../mapper/ComponentLogDocumentMapper.java | 17 +- .../ComponentDocumentRepository.java | 7 +- .../ComponentLogDocumentRepository.java | 4 +- .../repository/CustomComponentRepository.java | 14 - .../CustomComponentRepositoryImpl.java | 49 -- .../service/ComponentLogMongoService.java | 38 +- .../mongo/service/EntityLogMongoService.java | 4 +- 20 files changed, 966 insertions(+), 162 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 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 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-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 eeb47bc76..14fbccd9e 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 @@ -35,7 +35,6 @@ import lombok.experimental.FieldDefaults; @FieldDefaults(makeFinal = true, level = AccessLevel.PRIVATE) public class ComponentControllerV2 implements ComponentResource { - DossierTemplateController dossierTemplateController; ComponentLogService componentLogService; StatusController statusController; FileStatusService fileStatusService; @@ -76,7 +75,7 @@ public class ComponentControllerV2 implements ComponentResource { @PathVariable(FILE_ID_PARAM) String fileId, @RequestBody Component override) { - dossierTemplateController.getDossierTemplate(dossierTemplateId); + dossierTemplatePersistenceService.checkDossierTemplateExistsOrElseThrow404(dossierTemplateId); componentLogService.addOverride(dossierId, fileId, componentMapper.toComponentLogEntry(override)); } @@ -88,7 +87,7 @@ public class ComponentControllerV2 implements ComponentResource { @PathVariable(DOSSIER_ID_PARAM) String dossierId, @PathVariable(FILE_ID_PARAM) String fileId) { - dossierTemplateController.getDossierTemplate(dossierTemplateId); + dossierTemplatePersistenceService.checkDossierTemplateExistsOrElseThrow404(dossierTemplateId); var overrides = componentLogService.getOverrides(dossierId, fileId); var componentOverrides = componentMapper.toComponents(overrides); @@ -104,7 +103,7 @@ public class ComponentControllerV2 implements ComponentResource { @PathVariable(FILE_ID_PARAM) String fileId, @RequestBody RevertOverrideRequest revertOverrideRequest) { - dossierTemplateController.getDossierTemplate(dossierTemplateId); + dossierTemplatePersistenceService.checkDossierTemplateExistsOrElseThrow404(dossierTemplateId); componentLogService.revertOverrides(dossierId, fileId, revertOverrideRequest); } 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 e16e47626..288cec197 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 @@ -75,7 +75,7 @@ public interface ComponentResource { @ResponseBody @ResponseStatus(value = HttpStatus.NO_CONTENT) - @PostMapping(value = PATH + FILE_ID_PATH_VARIABLE + OVERRIDES_PATH, consumes = MediaType.APPLICATION_JSON_VALUE) + @PostMapping(value = FILE_PATH + FILE_ID_PATH_VARIABLE + OVERRIDES_PATH, consumes = MediaType.APPLICATION_JSON_VALUE) @Operation(summary = "Adds overrides for components", description = "None") @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, @@ -86,7 +86,7 @@ public interface ComponentResource { @ResponseBody @ResponseStatus(value = HttpStatus.OK) - @GetMapping(value = PATH + FILE_ID_PATH_VARIABLE + OVERRIDES_PATH, produces = {MediaType.APPLICATION_JSON_VALUE, MediaType.APPLICATION_XML_VALUE}) + @GetMapping(value = FILE_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, @@ -96,7 +96,7 @@ public interface ComponentResource { @ResponseBody @ResponseStatus(value = HttpStatus.NO_CONTENT) - @PostMapping(value = PATH + FILE_ID_PATH_VARIABLE + OVERRIDES_PATH + REVERT_PATH, consumes = MediaType.APPLICATION_JSON_VALUE) + @PostMapping(value = FILE_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 = "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, 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..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 @@ -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,16 @@ 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 io.swagger.v3.oas.annotations.Hidden; +import lombok.extern.slf4j.Slf4j; @Slf4j @RestControllerAdvice 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..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 @@ -5,8 +5,8 @@ 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; 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; @@ -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); @@ -99,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); } @@ -127,20 +117,27 @@ 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.setComponentValues(componentOverride.getComponentValues()); - saveOverride(dossierId, fileId, componentToUpdate); - auditOverride(dossierId, fileId, componentToUpdate); + componentToUpdate = optionalComponentLogEntry.get(); + updateComponentLogEntry(dossierId, fileId, componentOverride, componentToUpdate); } else { insertOverride(dossierId, fileId, componentOverride); auditOverride(dossierId, fileId, componentOverride); } + } + + private void updateComponentLogEntry(String dossierId, String fileId, ComponentLogEntry componentOverride, ComponentLogEntry componentToUpdate) { + + componentToUpdate.setComponentValues(componentOverride.getComponentValues()); + saveOverride(dossierId, fileId, componentToUpdate); + auditOverride(dossierId, fileId, componentToUpdate); } @@ -167,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); }); } @@ -196,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-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..04d87efdd --- /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:28081") +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..4319e8287 --- /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,112 @@ +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; + +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.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") + .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(); + + var componentLogJson = new ClassPathResource("files/componentlog/exampleComponentLog.json"); + + fileManagementStorageService.storeObject(dossier.getId(), file.getId(), FileType.COMPONENT_LOG, componentLogJson.getInputStream()); + + 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()); + 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-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-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/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/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/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/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..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 @@ -15,8 +15,13 @@ public interface ComponentDocumentRepository extends MongoRepository findComponentDocumentByName(String componentLogId, String componentName); + @Query(value = "{ 'componentLogId': ?0 }") + 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/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 344e0f8ca..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,49 +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("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 index a4d728e11..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 @@ -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; @@ -101,28 +101,19 @@ 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.insert(componentDocuments); - componentLogDocumentRepository.save(componentLogDocument); } 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(); } @@ -130,16 +121,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); } @@ -153,7 +139,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); @@ -179,17 +165,21 @@ 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); } public List findOverrides(String dossierId, String fileId) { - return componentLogDocumentRepository.findOverrides(dossierId, fileId) + String componentLogId = mapper.getComponentLogId(dossierId, fileId); + + return componentDocumentRepository.findByComponentLogId(componentLogId) .stream() .map(mapper::fromComponentDocument) + .peek(componentLogEntry -> componentLogEntry.setOverridden(true)) .toList(); + } @@ -226,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); + } + } 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 adb6332bf5cc1676c9649941c176e100f40c6c66 Mon Sep 17 00:00:00 2001 From: Ali Oezyetimoglu Date: Sun, 2 Jun 2024 21:37:55 +0200 Subject: [PATCH 6/8] RED-8339: Fixes --- .../controller/ComponentLogController.java | 32 ++--- .../controller/ComponentControllerV2.java | 1 - .../resource/ComponentLogResource.java | 16 ++- .../external/resource/ComponentResource.java | 3 +- .../client/ComponentLogClient.java | 10 ++ .../tests/ComponentOverrideTest.java | 110 +++++++++++++++++- .../AbstractPersistenceServerServiceTest.java | 18 ++- .../componentlog/ComponentLogEntry.java | 2 + .../component/ComponentOverrideModelList.java | 21 ++++ 9 files changed, 185 insertions(+), 28 deletions(-) create mode 100644 persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/client/ComponentLogClient.java create mode 100644 persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/component/ComponentOverrideModelList.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 94f69420b..5ac4a9d1b 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 @@ -9,14 +9,15 @@ 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.RestController; -import org.springframework.web.servlet.view.RedirectView; 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.service.v1.api.external.resource.ComponentLogResource; import com.iqser.red.service.persistence.service.v1.api.shared.model.analysislog.componentlog.ComponentLog; import com.iqser.red.service.persistence.service.v1.api.shared.model.analysislog.componentlog.ComponentLogEntry; +import com.iqser.red.service.persistence.service.v1.api.shared.model.component.ComponentOverrideModelList; import com.iqser.red.service.persistence.service.v1.api.shared.model.component.RevertOverrideRequest; import lombok.AccessLevel; @@ -47,40 +48,45 @@ 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 RedirectView addOverride(String dossierTemplateId, - @PathVariable(DOSSIER_ID) String dossierId, - @PathVariable(FILE_ID) String fileId, - @RequestBody ComponentLogEntry override) { + public void addOverride(@RequestParam(name = "dossierTemplateId") String dossierTemplateId, + @PathVariable(DOSSIER_ID) String dossierId, + @PathVariable(FILE_ID) String fileId, + @RequestBody ComponentLogEntry override) { accessControlService.checkDossierExistenceAndAccessPermissionsToDossier(dossierId); accessControlService.validateFileResourceExistence(fileId); - return new RedirectView(String.format("/api/dossier-templates/{%s}/dossiers/{%s}/files/{%s}/overrides", dossierTemplateId, dossierId, fileId), true); + componentLogService.addOverride(dossierId, fileId, override); + } @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 RedirectView getOverrides(String dossierTemplateId, @PathVariable(DOSSIER_ID) String dossierId, @PathVariable(FILE_ID) String fileId) { + public ComponentOverrideModelList getOverrides(@RequestParam(name = "dossierTemplateId") String dossierTemplateId, + @PathVariable(DOSSIER_ID) String dossierId, + @PathVariable(FILE_ID) String fileId) { accessControlService.checkDossierExistenceAndViewPermissionsToDossier(dossierId); accessControlService.validateFileResourceExistence(fileId); - return new RedirectView(String.format("/api/dossier-templates/{%s}/dossiers/{%s}/files/{%s}/overrides", dossierTemplateId, dossierId, fileId), true); + var overrides = componentLogService.getOverrides(dossierId, fileId); + + return ComponentOverrideModelList.builder().componentOverrideModels(overrides).build(); } @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 RedirectView revertOverrides(String dossierTemplateId, - @PathVariable(DOSSIER_ID) String dossierId, - @PathVariable(FILE_ID) String fileId, - @RequestBody RevertOverrideRequest revertOverrideRequest) { + public void revertOverrides(@RequestParam(name = "dossierTemplateId") String dossierTemplateId, + @PathVariable(DOSSIER_ID) String dossierId, + @PathVariable(FILE_ID) String fileId, + @RequestBody RevertOverrideRequest revertOverrideRequest) { accessControlService.checkDossierExistenceAndAccessPermissionsToDossier(dossierId); accessControlService.validateFileResourceExistence(fileId); - return new RedirectView(String.format("/api/dossier-templates/{%s}/dossiers/{%s}/files/{%s}/overrides/revert", dossierTemplateId, dossierId, fileId), true); + 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/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 14fbccd9e..bbe0417ce 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 @@ -11,7 +11,6 @@ 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; 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 ea2bcc1f6..6f3e2d260 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,10 +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.analysislog.componentlog.ComponentLogEntry; +import com.iqser.red.service.persistence.service.v1.api.shared.model.component.ComponentOverrideModelList; import com.iqser.red.service.persistence.service.v1.api.shared.model.component.RevertOverrideRequest; import io.swagger.v3.oas.annotations.Operation; @@ -49,7 +49,10 @@ 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")}) - RedirectView addOverride(String dossierTemplateId, @PathVariable(DOSSIER_ID) String dossierId, @PathVariable(FILE_ID) String fileId, @RequestBody ComponentLogEntry override); + void addOverride(@RequestParam(name = "dossierTemplateId") String dossierTemplateId, + @PathVariable(DOSSIER_ID) String dossierId, + @PathVariable(FILE_ID) String fileId, + @RequestBody ComponentLogEntry override); @ResponseBody @@ -57,7 +60,9 @@ 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")}) - RedirectView getOverrides(String dossierTemplateId, @PathVariable(DOSSIER_ID) String dossierId, @PathVariable(FILE_ID) String fileId); + ComponentOverrideModelList getOverrides(@RequestParam(name = "dossierTemplateId") String dossierTemplateId, + @PathVariable(DOSSIER_ID) String dossierId, + @PathVariable(FILE_ID) String fileId); @ResponseBody @@ -65,6 +70,9 @@ 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")}) - RedirectView revertOverrides(String dossierTemplateId, @PathVariable(DOSSIER_ID) String dossierId, @PathVariable(FILE_ID) String fileId, @RequestBody RevertOverrideRequest revertOverrideRequest); + void revertOverrides(@RequestParam(name = "dossierTemplateId") 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-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 288cec197..740c8c19a 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 @@ -54,6 +54,7 @@ public interface ComponentResource { String REVERT_PATH = "/revert"; String COMPONENT_OVERRIDE_PARAM = "componentOverride"; + String REVERT_OVERRIDE_PARAM = "revertOverride"; @GetMapping(value = FILE_PATH + FILE_ID_PATH_VARIABLE + COMPONENTS_PATH, produces = {MediaType.APPLICATION_JSON_VALUE, MediaType.APPLICATION_XML_VALUE}) @@ -102,6 +103,6 @@ public interface ComponentResource { 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); + @Parameter(name = REVERT_OVERRIDE_PARAM) @RequestBody RevertOverrideRequest revertOverrideRequest); } diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/client/ComponentLogClient.java b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/client/ComponentLogClient.java new file mode 100644 index 000000000..c1f35ef71 --- /dev/null +++ b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/client/ComponentLogClient.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.v1.api.external.resource.ComponentLogResource; + +@FeignClient(name = "ComponentLogResource", url = "http://localhost:28081") +public interface ComponentLogClient extends ComponentLogResource { + +} 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 4319e8287..cdad0cd24 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 @@ -6,6 +6,7 @@ import static org.junit.jupiter.api.Assertions.assertTrue; import java.io.IOException; import java.util.List; +import java.util.Set; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; @@ -13,10 +14,15 @@ 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.ComponentLogClient; 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.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.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; @@ -36,12 +42,15 @@ public class ComponentOverrideTest extends AbstractPersistenceServerServiceTest @Autowired private ComponentClient componentClient; + @Autowired + private ComponentLogClient componentLogClient; + @Autowired private DossierTemplateClient dossierTemplateClient; @Test - public void testAddAndGetOverrides() throws IOException { + public void testOverrides() throws IOException { var dossier = dossierTesterAndProvider.provideTestDossier(); @@ -49,6 +58,10 @@ public class ComponentOverrideTest extends AbstractPersistenceServerServiceTest var file = fileTesterAndProvider.testAndProvideFile(dossier, "filename"); + System.out.println("DOSSIER TEMPLATE ID: " + dossierTemplate.getId()); + System.out.println("DOSSIER ID: " + dossier.getId()); + System.out.println("FILE ID: " + file.getId()); + Component componentOverrideModel = Component.builder() .name("Study_Title") .componentValues(List.of(ComponentValue.builder() @@ -78,7 +91,8 @@ public class ComponentOverrideTest extends AbstractPersistenceServerServiceTest assertEquals(file.getId(), overrides.getFileId()); assertFalse(overrides.getComponentOverrideModels().isEmpty()); - assertTrue(overrides.getComponentOverrideModels().get(0).isOverridden()); + assertTrue(overrides.getComponentOverrideModels() + .get(0).isOverridden()); // override same entry a second time Component componentOverrideModel2 = Component.builder() @@ -98,7 +112,6 @@ public class ComponentOverrideTest extends AbstractPersistenceServerServiceTest .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()); @@ -106,7 +119,96 @@ public class ComponentOverrideTest extends AbstractPersistenceServerServiceTest assertEquals(file.getId(), overrides.getFileId()); assertFalse(overrides.getComponentOverrideModels().isEmpty()); - assertTrue(overrides.getComponentOverrideModels().get(0).isOverridden()); + assertTrue(overrides.getComponentOverrideModels() + .get(0).isOverridden()); + + // add and revert override + Component componentOverrideModel3 = Component.builder() + .name("Report_Number") + .componentValues(List.of(ComponentValue.builder() + .value("WOHOO 11/111-111A") + .originalValue("11/111-111A") + .valueDescription("First found value of type report_number or else ''") + .componentRuleId("ReportNumber.0.0") + .entityReferences(List.of(EntityReference.builder() + .id("e2a93bcc72e9740bbfc19bd9cd982e01") + .type("report_number") + .entityRuleId("DOC.2.0") + .page(1) + .build())) + .build())) + .build(); + componentClient.addOverride(dossierTemplate.getId(), dossier.getId(), file.getId(), componentOverrideModel3); + + 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() + .stream() + .filter(component -> component.getName().equals("Report_Number")) + .findAny() + .get().isOverridden()); + + RevertOverrideRequest revertOverrideRequest = RevertOverrideRequest.builder().components(Set.of("Report_Number")).build(); + componentClient.revertOverrides(dossierTemplate.getId(), dossier.getId(), file.getId(), revertOverrideRequest); + + 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()); + assertFalse(overrides.getComponentOverrideModels() + .stream() + .anyMatch(component -> component.getName().equals("Report_Number"))); + + // testing old endpoints + var overridesFromOldEndpoint = componentLogClient.getComponentLog(dossier.getId(), file.getId(), true); + assertTrue(overridesFromOldEndpoint.getComponentLogEntries() + .stream() + .filter(component -> component.getName().equals("Study_Title")) + .findAny() + .get().isOverridden()); + + revertOverrideRequest = RevertOverrideRequest.builder().components(Set.of("Study_Title")).build(); + componentLogClient.revertOverrides(dossierTemplate.getId(), dossier.getId(), file.getId(), revertOverrideRequest); + + overridesFromOldEndpoint = componentLogClient.getComponentLog(dossier.getId(), file.getId(), true); + assertFalse(overridesFromOldEndpoint.getComponentLogEntries() + .stream() + .filter(component -> component.getName().equals("Study_Title")) + .findAny() + .get().isOverridden()); + + ComponentLogEntry componentOverrideModel4 = ComponentLogEntry.builder() + .name("Study_Title") + .componentValues(List.of(ComponentLogEntryValue.builder() + .value("BBBB 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(List.of(ComponentLogEntityReference.builder() + .id("cf7f0d0c4c07918ce7d67b204f5fdb7d") + .type("title") + .entityRuleId("DOC.6.1") + .page(1) + .build())) + .build())) + .build(); + + componentLogClient.addOverride(dossierTemplate.getId(), dossier.getId(), file.getId(), componentOverrideModel4); + + overridesFromOldEndpoint = componentLogClient.getComponentLog(dossier.getId(), file.getId(), true); + assertTrue(overridesFromOldEndpoint.getComponentLogEntries() + .stream() + .filter(component -> component.getName().equals("Study_Title")) + .findAny() + .get().isOverridden()); + } } diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/utils/AbstractPersistenceServerServiceTest.java b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/utils/AbstractPersistenceServerServiceTest.java index ce27b8a53..15d7a4948 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/utils/AbstractPersistenceServerServiceTest.java +++ b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/utils/AbstractPersistenceServerServiceTest.java @@ -12,14 +12,10 @@ import java.util.Set; import java.util.concurrent.atomic.AtomicInteger; import java.util.stream.Collectors; -import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.CommentRepository; -import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.annotationentity.ResizeRedactionRepository; - import org.assertj.core.util.Lists; import org.bson.BsonArray; import org.bson.BsonDocument; import org.bson.BsonString; -import org.checkerframework.checker.units.qual.A; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.extension.ExtendWith; @@ -54,7 +50,6 @@ import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.security.provisioning.InMemoryUserDetailsManager; import org.springframework.security.web.SecurityFilterChain; -import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit.jupiter.SpringExtension; import org.springframework.test.context.support.TestPropertySourceUtils; @@ -76,6 +71,7 @@ import com.iqser.red.service.persistence.management.v1.processor.service.EntityL import com.iqser.red.service.persistence.management.v1.processor.service.FileManagementStorageService; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.ApplicationConfigRepository; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.AuditRepository; +import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.CommentRepository; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.DigitalSignatureRepository; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.DossierAttributeConfigRepository; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.DossierAttributeRepository; @@ -101,14 +97,18 @@ import com.iqser.red.service.persistence.management.v1.processor.service.persist import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.annotationentity.ManualRedactionRepository; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.annotationentity.RecategorizationRepository; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.annotationentity.RemoveRedactionRepository; +import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.annotationentity.ResizeRedactionRepository; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.dictionaryentry.EntryRepository; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.dictionaryentry.FalsePositiveEntryRepository; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.dictionaryentry.FalseRecommendationEntryRepository; import com.iqser.red.service.persistence.management.v1.processor.service.users.UserService; import com.iqser.red.service.persistence.service.v1.api.shared.model.analysislog.entitylog.EntityLog; import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.configuration.ApplicationConfig; +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 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; +import com.iqser.red.service.persistence.service.v1.api.shared.mongo.service.ComponentLogMongoService; import com.iqser.red.service.persistence.service.v1.api.shared.mongo.service.EntityLogMongoService; import com.iqser.red.service.redaction.v1.model.DroolsValidation; import com.iqser.red.storage.commons.service.StorageService; @@ -168,6 +168,12 @@ public abstract class AbstractPersistenceServerServiceTest { @Autowired protected EntityLogEntryDocumentRepository entityLogEntryDocumentRepository; @Autowired + protected ComponentLogMongoService componentLogMongoService; + @Autowired + protected ComponentLogDocumentRepository componentLogDocumentRepository; + @Autowired + protected ComponentDocumentRepository componentDocumentRepository; + @Autowired protected FileManagementStorageService fileManagementStorageService; @Autowired protected DossierTemplateRepository dossierTemplateRepository; @@ -526,6 +532,8 @@ public abstract class AbstractPersistenceServerServiceTest { applicationConfigRepository.deleteAll(); entityLogEntryDocumentRepository.deleteAll(); entityLogDocumentRepository.deleteAll(); + componentLogDocumentRepository.deleteAll(); + componentDocumentRepository.deleteAll(); }); } diff --git a/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/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 1ab54b8c6..40cb541aa 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 @@ -4,11 +4,13 @@ import java.util.List; import lombok.AccessLevel; import lombok.AllArgsConstructor; +import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; import lombok.experimental.FieldDefaults; @Data +@Builder @AllArgsConstructor @NoArgsConstructor @FieldDefaults(level = AccessLevel.PRIVATE) 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/ComponentOverrideModelList.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/component/ComponentOverrideModelList.java new file mode 100644 index 000000000..3ae6116be --- /dev/null +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/component/ComponentOverrideModelList.java @@ -0,0 +1,21 @@ +package com.iqser.red.service.persistence.service.v1.api.shared.model.component; + +import java.util.ArrayList; +import java.util.List; + +import com.iqser.red.service.persistence.service.v1.api.shared.model.analysislog.componentlog.ComponentLogEntry; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class ComponentOverrideModelList { + + List componentOverrideModels = new ArrayList<>(); + +} -- 2.47.2 From efd777acd87b10cd9b355686c87c6c5edf89cdff Mon Sep 17 00:00:00 2001 From: Ali Oezyetimoglu Date: Mon, 3 Jun 2024 13:04:27 +0200 Subject: [PATCH 7/8] RED-8339: some refactoring --- .../controller/ComponentControllerV2.java | 10 ++++----- .../api/impl/mapper/ComponentMapper.java | 2 -- ...elList.java => ComponentOverrideList.java} | 4 ++-- .../external/resource/ComponentResource.java | 8 +++---- .../src/main/resources/api/openapi.yaml | 22 +++++++++++-------- .../tests/ComponentOverrideTest.java | 16 +++++++------- 6 files changed, 32 insertions(+), 30 deletions(-) rename persistence-service-v1/persistence-service-external-api-v2/src/main/java/com/iqser/red/service/persistence/service/v2/api/external/model/{ComponentOverrideModelList.java => ComponentOverrideList.java} (77%) 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 bbe0417ce..3f3e12953 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 @@ -18,7 +18,7 @@ import com.iqser.red.service.persistence.management.v1.processor.service.FileSta import com.iqser.red.service.persistence.management.v1.processor.service.persistence.DossierTemplatePersistenceService; 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.ComponentOverrideList; 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; @@ -82,16 +82,16 @@ public class ComponentControllerV2 implements ComponentResource { @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) { + public ComponentOverrideList getOverrides(@PathVariable(DOSSIER_TEMPLATE_ID_PARAM) String dossierTemplateId, + @PathVariable(DOSSIER_ID_PARAM) String dossierId, + @PathVariable(FILE_ID_PARAM) String fileId) { dossierTemplatePersistenceService.checkDossierTemplateExistsOrElseThrow404(dossierTemplateId); var overrides = componentLogService.getOverrides(dossierId, fileId); var componentOverrides = componentMapper.toComponents(overrides); - return ComponentOverrideModelList.builder().dossierTemplateId(dossierTemplateId).dossierId(dossierId).fileId(fileId).componentOverrideModels(componentOverrides).build(); + return ComponentOverrideList.builder().dossierTemplateId(dossierTemplateId).dossierId(dossierId).fileId(fileId).componentOverrides(componentOverrides).build(); } 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 index da9eabe0f..e3fe4085e 100644 --- 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 @@ -34,13 +34,11 @@ public interface ComponentMapper { 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); 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/ComponentOverrideList.java similarity index 77% rename from persistence-service-v1/persistence-service-external-api-v2/src/main/java/com/iqser/red/service/persistence/service/v2/api/external/model/ComponentOverrideModelList.java rename to persistence-service-v1/persistence-service-external-api-v2/src/main/java/com/iqser/red/service/persistence/service/v2/api/external/model/ComponentOverrideList.java index d16b4fd72..257e870eb 100644 --- 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/ComponentOverrideList.java @@ -12,11 +12,11 @@ import lombok.NoArgsConstructor; @Builder @NoArgsConstructor @AllArgsConstructor -public class ComponentOverrideModelList { +public class ComponentOverrideList { String dossierTemplateId; String dossierId; String fileId; - List componentOverrideModels = new ArrayList<>(); + List componentOverrides = 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/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 740c8c19a..8c2d195c1 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 @@ -21,7 +21,7 @@ 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.ComponentOverrideList; import com.iqser.red.service.persistence.service.v2.api.external.model.FileComponents; import com.iqser.red.service.persistence.service.v2.api.external.model.FileComponentsList; @@ -90,9 +90,9 @@ public interface ComponentResource { @GetMapping(value = FILE_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); + ComponentOverrideList 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 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 67111c029..a5a08424a 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 @@ -958,9 +958,11 @@ paths: operationId: addOverride tags: - 4. Components - summary: Adds the component override associated with a specific file. + summary: Add the component overrides 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. + This endpoint allows the user to add one or more overrides for a specific component of a dossier file. The component override data is provided in the request body. + + Use this route to add overrides to the specified component. parameters: - $ref: '#/components/parameters/dossierTemplateId' - $ref: '#/components/parameters/dossierId' @@ -987,9 +989,9 @@ paths: operationId: getOverrides tags: - 4. Components - summary: Returns the component overrides associated with a specific file. + summary: Returns all overrides from components associated with a specific file. description: | - This endpoint retrieves all the overrides for a specific component within a dossier file. + This endpoint retrieves all the overrides for components within a dossier file. The response includes a list of all component overrides associated with the specified file. parameters: - $ref: '#/components/parameters/dossierTemplateId' @@ -1000,10 +1002,10 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/ComponentOverrideModelList' + $ref: '#/components/schemas/ComponentOverrideList' application/xml: schema: - $ref: '#/components/schemas/ComponentOverrideModelList' + $ref: '#/components/schemas/ComponentOverrideList' description: | Successfully fetched component overrides for the file in the dossier. "404": @@ -1021,7 +1023,9 @@ paths: - 4. Components summary: Reverts the component overrides associated with a specific file. description: | - Reverts the component overrides associated with a specific file. + Reverts all overrides for the specified components associated with a specific file. + + Use this route to revert all overrides specified by the component names. parameters: - $ref: '#/components/parameters/dossierTemplateId' - $ref: '#/components/parameters/dossierId' @@ -1553,7 +1557,7 @@ components: entityRuleId: DEF.13.37 type: another_entity_type page: 456 - ComponentOverrideModelList: + ComponentOverrideList: type: object description: A list of component overrides and their associated components. properties: @@ -1568,7 +1572,7 @@ components: fileId: type: string description: Identifier for the file. - componentOverrideModels: + componentOverrides: type: array description: List of files with their component details. items: 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 cdad0cd24..757a69208 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 @@ -90,8 +90,8 @@ public class ComponentOverrideTest extends AbstractPersistenceServerServiceTest assertEquals(dossier.getId(), overrides.getDossierId()); assertEquals(file.getId(), overrides.getFileId()); - assertFalse(overrides.getComponentOverrideModels().isEmpty()); - assertTrue(overrides.getComponentOverrideModels() + assertFalse(overrides.getComponentOverrides().isEmpty()); + assertTrue(overrides.getComponentOverrides() .get(0).isOverridden()); // override same entry a second time @@ -118,8 +118,8 @@ public class ComponentOverrideTest extends AbstractPersistenceServerServiceTest assertEquals(dossier.getId(), overrides.getDossierId()); assertEquals(file.getId(), overrides.getFileId()); - assertFalse(overrides.getComponentOverrideModels().isEmpty()); - assertTrue(overrides.getComponentOverrideModels() + assertFalse(overrides.getComponentOverrides().isEmpty()); + assertTrue(overrides.getComponentOverrides() .get(0).isOverridden()); // add and revert override @@ -146,8 +146,8 @@ public class ComponentOverrideTest extends AbstractPersistenceServerServiceTest assertEquals(dossier.getId(), overrides.getDossierId()); assertEquals(file.getId(), overrides.getFileId()); - assertFalse(overrides.getComponentOverrideModels().isEmpty()); - assertTrue(overrides.getComponentOverrideModels() + assertFalse(overrides.getComponentOverrides().isEmpty()); + assertTrue(overrides.getComponentOverrides() .stream() .filter(component -> component.getName().equals("Report_Number")) .findAny() @@ -162,8 +162,8 @@ public class ComponentOverrideTest extends AbstractPersistenceServerServiceTest assertEquals(dossier.getId(), overrides.getDossierId()); assertEquals(file.getId(), overrides.getFileId()); - assertFalse(overrides.getComponentOverrideModels().isEmpty()); - assertFalse(overrides.getComponentOverrideModels() + assertFalse(overrides.getComponentOverrides().isEmpty()); + assertFalse(overrides.getComponentOverrides() .stream() .anyMatch(component -> component.getName().equals("Report_Number"))); -- 2.47.2 From a5866b36c8767fab59319e51dd5c9cab4535317d Mon Sep 17 00:00:00 2001 From: Ali Oezyetimoglu Date: Mon, 3 Jun 2024 13:13:25 +0200 Subject: [PATCH 8/8] RED-8339: some refactoring --- .../api/impl/controller/ComponentLogController.java | 10 +++++----- .../v1/api/external/resource/ComponentLogResource.java | 8 ++++---- ...errideModelList.java => ComponentOverrideList.java} | 4 ++-- 3 files changed, 11 insertions(+), 11 deletions(-) rename persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/component/{ComponentOverrideModelList.java => ComponentOverrideList.java} (78%) 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 5ac4a9d1b..d41475261 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 @@ -17,7 +17,7 @@ import com.iqser.red.service.persistence.management.v1.processor.service.Compone import com.iqser.red.service.persistence.service.v1.api.external.resource.ComponentLogResource; import com.iqser.red.service.persistence.service.v1.api.shared.model.analysislog.componentlog.ComponentLog; import com.iqser.red.service.persistence.service.v1.api.shared.model.analysislog.componentlog.ComponentLogEntry; -import com.iqser.red.service.persistence.service.v1.api.shared.model.component.ComponentOverrideModelList; +import com.iqser.red.service.persistence.service.v1.api.shared.model.component.ComponentOverrideList; import com.iqser.red.service.persistence.service.v1.api.shared.model.component.RevertOverrideRequest; import lombok.AccessLevel; @@ -63,16 +63,16 @@ public class ComponentLogController implements ComponentLogResource { @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 ComponentOverrideModelList getOverrides(@RequestParam(name = "dossierTemplateId") String dossierTemplateId, - @PathVariable(DOSSIER_ID) String dossierId, - @PathVariable(FILE_ID) String fileId) { + public ComponentOverrideList getOverrides(@RequestParam(name = "dossierTemplateId") String dossierTemplateId, + @PathVariable(DOSSIER_ID) String dossierId, + @PathVariable(FILE_ID) String fileId) { accessControlService.checkDossierExistenceAndViewPermissionsToDossier(dossierId); accessControlService.validateFileResourceExistence(fileId); var overrides = componentLogService.getOverrides(dossierId, fileId); - return ComponentOverrideModelList.builder().componentOverrideModels(overrides).build(); + return ComponentOverrideList.builder().componentOverrides(overrides).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 6f3e2d260..d7382d956 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 @@ -12,7 +12,7 @@ import org.springframework.web.bind.annotation.ResponseStatus; 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.ComponentOverrideModelList; +import com.iqser.red.service.persistence.service.v1.api.shared.model.component.ComponentOverrideList; import com.iqser.red.service.persistence.service.v1.api.shared.model.component.RevertOverrideRequest; import io.swagger.v3.oas.annotations.Operation; @@ -60,9 +60,9 @@ 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")}) - ComponentOverrideModelList getOverrides(@RequestParam(name = "dossierTemplateId") String dossierTemplateId, - @PathVariable(DOSSIER_ID) String dossierId, - @PathVariable(FILE_ID) String fileId); + ComponentOverrideList getOverrides(@RequestParam(name = "dossierTemplateId") String dossierTemplateId, + @PathVariable(DOSSIER_ID) String dossierId, + @PathVariable(FILE_ID) String fileId); @ResponseBody 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/ComponentOverrideModelList.java b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/component/ComponentOverrideList.java similarity index 78% rename from persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/component/ComponentOverrideModelList.java rename to persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/component/ComponentOverrideList.java index 3ae6116be..dd3486eb2 100644 --- a/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/component/ComponentOverrideModelList.java +++ b/persistence-service-v1/persistence-service-shared-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/shared/model/component/ComponentOverrideList.java @@ -14,8 +14,8 @@ import lombok.NoArgsConstructor; @Builder @NoArgsConstructor @AllArgsConstructor -public class ComponentOverrideModelList { +public class ComponentOverrideList { - List componentOverrideModels = new ArrayList<>(); + List componentOverrides = new ArrayList<>(); } -- 2.47.2