RED-8339: Fixes

This commit is contained in:
Ali Oezyetimoglu 2024-06-02 21:37:55 +02:00
parent 23cf4cf5e9
commit adb6332bf5
9 changed files with 185 additions and 28 deletions

View File

@ -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);
}
}

View File

@ -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;

View File

@ -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);
}

View File

@ -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);
}

View File

@ -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 {
}

View File

@ -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());
}
}

View File

@ -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();
});
}

View File

@ -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)

View File

@ -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<ComponentLogEntry> componentOverrideModels = new ArrayList<>();
}