Pull request #330: RED-3287 ps3

Merge in RED/persistence-service from RED-3287-ps3 to master

* commit 'fabfffcf3da5c8a71d2f27cf9629c83a7e00a781':
  RED-3287: Improve RedactionLog Controller to allow incremental calls
  RED-3287: Improve RedactionLog Controller to allow incremental calls
  RED-3287: Improve RedactionLog Controller to allow incremental calls
This commit is contained in:
Ali Oezyetimoglu 2022-04-04 11:50:00 +02:00
commit 68faea6093
5 changed files with 100 additions and 1 deletions

View File

@ -0,0 +1,21 @@
package com.iqser.red.service.persistence.service.v1.api.model.redactionlog;
import java.time.OffsetDateTime;
import java.util.List;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class FilteredRedactionLogRequest {
private List<String> excludedTypes;
private boolean withManualRedactions;
private boolean includeFalsePositives;
private OffsetDateTime specifiedDate;
}

View File

@ -1,14 +1,18 @@
package com.iqser.red.service.persistence.service.v1.api.resources;
import java.time.OffsetDateTime;
import java.util.List;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.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.ResponseStatus;
import com.iqser.red.service.persistence.service.v1.api.model.redactionlog.FilteredRedactionLogRequest;
import com.iqser.red.service.redaction.v1.model.RedactionLog;
import com.iqser.red.service.redaction.v1.model.SectionGrid;
@ -34,4 +38,8 @@ public interface RedactionLogResource {
@GetMapping(value = SECTION_GRID_PATH + DOSSIER_ID_PATH_PARAM + FILE_ID_PATH_VARIABLE, produces = MediaType.APPLICATION_JSON_VALUE)
SectionGrid getSectionGrid(@PathVariable(DOSSIER_ID_PARAM) String dossierId, @PathVariable(FILE_ID) String fileId);
@PostMapping(value = REDACTION_LOG_PATH + DOSSIER_ID_PATH_PARAM + FILE_ID_PATH_VARIABLE + "/filtered", produces = MediaType.APPLICATION_JSON_VALUE)
RedactionLog getFilteredRedactionLog(@PathVariable(DOSSIER_ID_PARAM) String dossierId, @PathVariable(FILE_ID) String fileId,
@RequestBody FilteredRedactionLogRequest filteredRedactionLogRequest);
}

View File

@ -1,12 +1,15 @@
package com.iqser.red.service.peristence.v1.server.controller;
import java.time.OffsetDateTime;
import java.util.List;
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.peristence.v1.server.service.RedactionLogService;
import com.iqser.red.service.persistence.service.v1.api.model.redactionlog.FilteredRedactionLogRequest;
import com.iqser.red.service.persistence.service.v1.api.resources.RedactionLogResource;
import com.iqser.red.service.redaction.v1.model.RedactionLog;
import com.iqser.red.service.redaction.v1.model.SectionGrid;
@ -35,4 +38,9 @@ public class RedactionLogController implements RedactionLogResource {
return redactionLogService.getSectionGrid(dossierId, fileId);
}
public RedactionLog getFilteredRedactionLog(@PathVariable(DOSSIER_ID_PARAM) String dossierId, @PathVariable(FILE_ID) String fileId,
@RequestBody FilteredRedactionLogRequest filteredRedactionLogRequest) {
return redactionLogService.getFilteredRedactionLog(dossierId, fileId, filteredRedactionLogRequest);
}
}

View File

@ -1,6 +1,10 @@
package com.iqser.red.service.peristence.v1.server.service;
import java.time.OffsetDateTime;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.stream.Collectors;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Service;
@ -9,7 +13,12 @@ import com.iqser.red.service.peristence.v1.server.client.RedactionClient;
import com.iqser.red.service.peristence.v1.server.controller.DictionaryController;
import com.iqser.red.service.persistence.management.v1.processor.exception.NotFoundException;
import com.iqser.red.service.persistence.management.v1.processor.service.persistence.DossierPersistenceService;
import com.iqser.red.service.persistence.service.v1.api.model.annotations.Comment;
import com.iqser.red.service.persistence.service.v1.api.model.redactionlog.FilteredRedactionLogRequest;
import com.iqser.red.service.redaction.v1.model.Change;
import com.iqser.red.service.redaction.v1.model.ManualChange;
import com.iqser.red.service.redaction.v1.model.RedactionLog;
import com.iqser.red.service.redaction.v1.model.RedactionLogEntry;
import com.iqser.red.service.redaction.v1.model.RedactionRequest;
import com.iqser.red.service.redaction.v1.model.SectionGrid;
@ -85,4 +94,47 @@ public class RedactionLogService {
return fileManagementStorageService.getSectionGrid(dossierId, fileId);
}
public RedactionLog getFilteredRedactionLog(String dossierId, String fileId, FilteredRedactionLogRequest filteredRedactionLogRequest) {
if (filteredRedactionLogRequest.getSpecifiedDate() == null) {
filteredRedactionLogRequest.setSpecifiedDate(OffsetDateTime.MIN);
}
var redactionLog = getRedactionLog(dossierId, fileId, filteredRedactionLogRequest.getExcludedTypes(), filteredRedactionLogRequest.isWithManualRedactions(), filteredRedactionLogRequest.isIncludeFalsePositives());
var redactionLogEntries = redactionLog.getRedactionLogEntry();
Iterator<RedactionLogEntry> it = redactionLogEntries.iterator();
while (it.hasNext()) {
var redactionLogEntry = it.next();
boolean isAfterSpecifiedDate = false;
for (var change : redactionLogEntry.getChanges()) {
if (change.getDateTime().isAfter(filteredRedactionLogRequest.getSpecifiedDate())) {
isAfterSpecifiedDate = true;
}
}
for (var manualChange : redactionLogEntry.getManualChanges()) {
if (manualChange.getProcessedDate().isAfter(filteredRedactionLogRequest.getSpecifiedDate())) {
isAfterSpecifiedDate = true;
}
}
var comments = redactionLogEntry.getComments();
if (comments != null) {
for (var comment : comments) {
if (comment.getSoftDeletedTime() != null && comment.getSoftDeletedTime().isAfter(filteredRedactionLogRequest.getSpecifiedDate()) || comment.getDate().isAfter(filteredRedactionLogRequest.getSpecifiedDate())) {
isAfterSpecifiedDate = true;
}
}
}
if(!isAfterSpecifiedDate) {
it.remove();
}
}
return redactionLog;
}
}

View File

@ -2,6 +2,8 @@ package com.iqser.red.service.peristence.v1.server.integration.tests;
import static org.assertj.core.api.Assertions.assertThat;
import java.time.OffsetDateTime;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
@ -9,6 +11,7 @@ import com.iqser.red.service.peristence.v1.server.integration.client.RedactionLo
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.model.redactionlog.FilteredRedactionLogRequest;
public class RedactionLogTest extends AbstractPersistenceServerServiceTest {
@ -21,6 +24,7 @@ public class RedactionLogTest extends AbstractPersistenceServerServiceTest {
@Autowired
private RedactionLogClient redactionLogClient;
@Test
public void testRedactionLog() {
@ -30,6 +34,12 @@ public class RedactionLogTest extends AbstractPersistenceServerServiceTest {
assertThat(redactionLogClient.getSectionGrid(dossier.getId(), file.getId())).isNotNull();
assertThat(redactionLogClient.getRedactionLog(dossier.getId(), file.getId(), null, true, false)).isNotNull();
assertThat(redactionLogClient.getRedactionLog(dossier.getId(), file.getId(), null, false, false)).isNotNull();
assertThat(redactionLogClient.getFilteredRedactionLog(dossier.getId(), file.getId(), FilteredRedactionLogRequest.builder()
.excludedTypes(null)
.withManualRedactions(true)
.includeFalsePositives(false)
.specifiedDate(OffsetDateTime.now().minusDays(30))
.build())).isNotNull();
}
}