Pull request #178: changes to dossier changes endpoint
Merge in RED/persistence-service from dossier-changes-updates to master * commit 'f27b1ab679c1cb07b4efa1b8f9a0b918dd5ec2ef': changes to dossier changes endpoint
This commit is contained in:
commit
f1dafe1549
@ -0,0 +1,15 @@
|
|||||||
|
package com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier;
|
||||||
|
|
||||||
|
import lombok.*;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
@Builder
|
||||||
|
@EqualsAndHashCode(of="dossierId")
|
||||||
|
@NoArgsConstructor
|
||||||
|
@AllArgsConstructor
|
||||||
|
public class DossierChange {
|
||||||
|
|
||||||
|
private String dossierId;
|
||||||
|
private boolean dossierChanges;
|
||||||
|
private boolean fileChanges;
|
||||||
|
}
|
||||||
@ -3,6 +3,7 @@ package com.iqser.red.service.persistence.service.v1.api.resources;
|
|||||||
import com.iqser.red.service.persistence.service.v1.api.model.common.JSONPrimitive;
|
import com.iqser.red.service.persistence.service.v1.api.model.common.JSONPrimitive;
|
||||||
import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.CreateOrUpdateDossierRequest;
|
import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.CreateOrUpdateDossierRequest;
|
||||||
import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.Dossier;
|
import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.Dossier;
|
||||||
|
import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.DossierChange;
|
||||||
import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.DossierInformation;
|
import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.DossierInformation;
|
||||||
import org.springframework.http.HttpStatus;
|
import org.springframework.http.HttpStatus;
|
||||||
import org.springframework.http.MediaType;
|
import org.springframework.http.MediaType;
|
||||||
@ -26,12 +27,12 @@ public interface DossierResource {
|
|||||||
|
|
||||||
String INCLUDE_DELETED_PARAM = "includeDeleted";
|
String INCLUDE_DELETED_PARAM = "includeDeleted";
|
||||||
|
|
||||||
String CHANGES_PATH = "/has-changes";
|
String CHANGES_PATH = "/changes";
|
||||||
|
|
||||||
@ResponseBody
|
@ResponseBody
|
||||||
@ResponseStatus(value = HttpStatus.OK)
|
@ResponseStatus(value = HttpStatus.OK)
|
||||||
@PostMapping(value = REST_PATH + CHANGES_PATH, produces = MediaType.APPLICATION_JSON_VALUE)
|
@PostMapping(value = REST_PATH + CHANGES_PATH, produces = MediaType.APPLICATION_JSON_VALUE)
|
||||||
JSONPrimitive<Boolean> hasChangesSince(@RequestBody JSONPrimitive<OffsetDateTime> since);
|
Set<DossierChange> changesSince(@RequestBody JSONPrimitive<OffsetDateTime> since);
|
||||||
|
|
||||||
@PostMapping(value = REST_PATH, consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
|
@PostMapping(value = REST_PATH, consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
|
||||||
Dossier addDossier(@RequestBody CreateOrUpdateDossierRequest dossierRequest);
|
Dossier addDossier(@RequestBody CreateOrUpdateDossierRequest dossierRequest);
|
||||||
|
|||||||
@ -8,6 +8,7 @@ import com.iqser.red.service.persistence.management.v1.processor.service.persist
|
|||||||
import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.FileRepository;
|
import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.FileRepository;
|
||||||
import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.ReportTemplateRepository;
|
import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.ReportTemplateRepository;
|
||||||
import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.CreateOrUpdateDossierRequest;
|
import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.CreateOrUpdateDossierRequest;
|
||||||
|
import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.DossierChange;
|
||||||
import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.DossierStatus;
|
import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.DossierStatus;
|
||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
import org.springframework.beans.BeanUtils;
|
import org.springframework.beans.BeanUtils;
|
||||||
@ -16,7 +17,9 @@ import org.springframework.stereotype.Service;
|
|||||||
import javax.transaction.Transactional;
|
import javax.transaction.Transactional;
|
||||||
import java.time.OffsetDateTime;
|
import java.time.OffsetDateTime;
|
||||||
import java.time.temporal.ChronoUnit;
|
import java.time.temporal.ChronoUnit;
|
||||||
|
import java.util.HashSet;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Set;
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
@ -62,7 +65,11 @@ public class DossierPersistenceService {
|
|||||||
|
|
||||||
dossier.getReportTemplates().forEach(t -> t.getDossiers().removeIf(d -> d.getId().equals(dossierId) && !createOrUpdateDossierRequest.getReportTemplateIds().contains(t.getTemplateId())));
|
dossier.getReportTemplates().forEach(t -> t.getDossiers().removeIf(d -> d.getId().equals(dossierId) && !createOrUpdateDossierRequest.getReportTemplateIds().contains(t.getTemplateId())));
|
||||||
var reportTemplates = reportTemplateRepository.findAllById(createOrUpdateDossierRequest.getReportTemplateIds());
|
var reportTemplates = reportTemplateRepository.findAllById(createOrUpdateDossierRequest.getReportTemplateIds());
|
||||||
reportTemplates.forEach(r -> {if (!r.getDossiers().stream().map(DossierEntity::getId).collect(Collectors.toSet()).contains(dossierId)) {r.getDossiers().add(dossier);}});
|
reportTemplates.forEach(r -> {
|
||||||
|
if (!r.getDossiers().stream().map(DossierEntity::getId).collect(Collectors.toSet()).contains(dossierId)) {
|
||||||
|
r.getDossiers().add(dossier);
|
||||||
|
}
|
||||||
|
});
|
||||||
dossier.setReportTemplates(reportTemplates);
|
dossier.setReportTemplates(reportTemplates);
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -110,7 +117,23 @@ public class DossierPersistenceService {
|
|||||||
dossierRepository.markDossierAsDeleted(dossierId, DossierStatus.DELETED, softDeletedTime, OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS));
|
dossierRepository.markDossierAsDeleted(dossierId, DossierStatus.DELETED, softDeletedTime, OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS));
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean hasChangesSince(OffsetDateTime since) {
|
public Set<DossierChange> hasChangesSince(OffsetDateTime since) {
|
||||||
return dossierRepository.existsByLastUpdatedIsAfter(since.truncatedTo(ChronoUnit.MILLIS)) || fileRepository.existsByLastUpdatedIsAfter(since.truncatedTo(ChronoUnit.MILLIS));
|
|
||||||
|
var dossiersWithChanges = dossierRepository.findDossierChangeByLastUpdatedIsAfter(since.truncatedTo(ChronoUnit.MILLIS));
|
||||||
|
var dossiersWithChangedFiles = fileRepository.findDossierChangeByLastUpdatedIsAfter(since.truncatedTo(ChronoUnit.MILLIS));
|
||||||
|
|
||||||
|
Set<DossierChange> dossierChanges = new HashSet<>();
|
||||||
|
|
||||||
|
for (var dossierId : dossiersWithChanges) {
|
||||||
|
var dossierChange = new DossierChange(dossierId, true, dossiersWithChangedFiles.contains(dossierId));
|
||||||
|
dossierChanges.add(dossierChange);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (var dossierId : dossiersWithChangedFiles) {
|
||||||
|
var dossierChange = new DossierChange(dossierId, dossiersWithChanges.contains(dossierId), true);
|
||||||
|
dossierChanges.add(dossierChange);
|
||||||
|
}
|
||||||
|
|
||||||
|
return dossierChanges;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,15 +1,20 @@
|
|||||||
package com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository;
|
package com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository;
|
||||||
|
|
||||||
import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.DossierEntity;
|
import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.DossierEntity;
|
||||||
|
import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.DossierChange;
|
||||||
import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.DossierStatus;
|
import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.DossierStatus;
|
||||||
import org.springframework.data.jpa.repository.JpaRepository;
|
import org.springframework.data.jpa.repository.JpaRepository;
|
||||||
import org.springframework.data.jpa.repository.Modifying;
|
import org.springframework.data.jpa.repository.Modifying;
|
||||||
import org.springframework.data.jpa.repository.Query;
|
import org.springframework.data.jpa.repository.Query;
|
||||||
|
|
||||||
import java.time.OffsetDateTime;
|
import java.time.OffsetDateTime;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
public interface DossierRepository extends JpaRepository<DossierEntity, String> {
|
public interface DossierRepository extends JpaRepository<DossierEntity, String> {
|
||||||
|
|
||||||
|
@Query("select d.id from DossierEntity d where d.lastUpdated > :since")
|
||||||
|
List<String> findDossierChangeByLastUpdatedIsAfter(OffsetDateTime since);
|
||||||
|
|
||||||
@Modifying
|
@Modifying
|
||||||
@Query("update DossierEntity d set d.status = :dossierStatus, d.hardDeletedTime = :hardDeletedTime, d.lastUpdated = :lastUpdated," +
|
@Query("update DossierEntity d set d.status = :dossierStatus, d.hardDeletedTime = :hardDeletedTime, d.lastUpdated = :lastUpdated," +
|
||||||
" d.softDeletedTime = " +
|
" d.softDeletedTime = " +
|
||||||
@ -29,6 +34,5 @@ public interface DossierRepository extends JpaRepository<DossierEntity, String>
|
|||||||
@Query("update DossierEntity d set d.status = :dossierStatus, d.softDeletedTime = :softDeletedTime, d.lastUpdated = :lastUpdated where d.id = :dossierId")
|
@Query("update DossierEntity d set d.status = :dossierStatus, d.softDeletedTime = :softDeletedTime, d.lastUpdated = :lastUpdated where d.id = :dossierId")
|
||||||
void markDossierAsDeleted(String dossierId, DossierStatus dossierStatus, OffsetDateTime softDeletedTime, OffsetDateTime lastUpdated);
|
void markDossierAsDeleted(String dossierId, DossierStatus dossierStatus, OffsetDateTime softDeletedTime, OffsetDateTime lastUpdated);
|
||||||
|
|
||||||
boolean existsByLastUpdatedIsAfter(OffsetDateTime since);
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -2,6 +2,7 @@ package com.iqser.red.service.persistence.management.v1.processor.service.persis
|
|||||||
|
|
||||||
|
|
||||||
import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.FileEntity;
|
import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.FileEntity;
|
||||||
|
import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.DossierChange;
|
||||||
import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file.ProcessingStatus;
|
import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file.ProcessingStatus;
|
||||||
import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file.WorkflowStatus;
|
import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file.WorkflowStatus;
|
||||||
import org.springframework.data.jpa.repository.JpaRepository;
|
import org.springframework.data.jpa.repository.JpaRepository;
|
||||||
@ -16,8 +17,6 @@ public interface FileRepository extends JpaRepository<FileEntity, String> {
|
|||||||
|
|
||||||
boolean existsByDossierIdAndLastUpdatedIsAfter(String dossierId, OffsetDateTime since);
|
boolean existsByDossierIdAndLastUpdatedIsAfter(String dossierId, OffsetDateTime since);
|
||||||
|
|
||||||
boolean existsByLastUpdatedIsAfter(OffsetDateTime since);
|
|
||||||
|
|
||||||
List<FileEntity> findByDossierId(String dossierId);
|
List<FileEntity> findByDossierId(String dossierId);
|
||||||
|
|
||||||
@Modifying
|
@Modifying
|
||||||
@ -121,6 +120,8 @@ public interface FileRepository extends JpaRepository<FileEntity, String> {
|
|||||||
@Query("select count(f) from FileEntity f where f.dossierId = :dossierId and f.deleted is not null and f.hardDeletedTime is null")
|
@Query("select count(f) from FileEntity f where f.dossierId = :dossierId and f.deleted is not null and f.hardDeletedTime is null")
|
||||||
int countSoftDeletedFiles(String dossierId);
|
int countSoftDeletedFiles(String dossierId);
|
||||||
|
|
||||||
|
@Query("select distinct f.dossierId from FileEntity f where f.lastUpdated > :since")
|
||||||
|
List<String> findDossierChangeByLastUpdatedIsAfter(OffsetDateTime since);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -8,10 +8,7 @@ import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.
|
|||||||
import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.FileEntity;
|
import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.FileEntity;
|
||||||
import com.iqser.red.service.persistence.management.v1.processor.exception.DossierNotFoundException;
|
import com.iqser.red.service.persistence.management.v1.processor.exception.DossierNotFoundException;
|
||||||
import com.iqser.red.service.persistence.service.v1.api.model.common.JSONPrimitive;
|
import com.iqser.red.service.persistence.service.v1.api.model.common.JSONPrimitive;
|
||||||
import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.CreateOrUpdateDossierRequest;
|
import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.*;
|
||||||
import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.Dossier;
|
|
||||||
import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.DossierInformation;
|
|
||||||
import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.DossierStatus;
|
|
||||||
import com.iqser.red.service.persistence.service.v1.api.resources.DossierResource;
|
import com.iqser.red.service.persistence.service.v1.api.resources.DossierResource;
|
||||||
import feign.Param;
|
import feign.Param;
|
||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
@ -39,9 +36,9 @@ public class DossierController implements DossierResource {
|
|||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public JSONPrimitive<Boolean> hasChangesSince(@RequestBody JSONPrimitive<OffsetDateTime> since) {
|
public Set<DossierChange> changesSince(@RequestBody JSONPrimitive<OffsetDateTime> since) {
|
||||||
|
|
||||||
return JSONPrimitive.of(dossierService.hasChangesSince(since.getValue()));
|
return dossierService.changesSince(since.getValue());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -8,12 +8,14 @@ import com.iqser.red.service.persistence.management.v1.processor.service.persist
|
|||||||
import com.iqser.red.service.persistence.management.v1.processor.service.persistence.FileStatusPersistenceService;
|
import com.iqser.red.service.persistence.management.v1.processor.service.persistence.FileStatusPersistenceService;
|
||||||
import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.DossierTemplateStatus;
|
import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.DossierTemplateStatus;
|
||||||
import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.CreateOrUpdateDossierRequest;
|
import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.CreateOrUpdateDossierRequest;
|
||||||
|
import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.DossierChange;
|
||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
import java.time.OffsetDateTime;
|
import java.time.OffsetDateTime;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Provides the internal interface between dossier request and the actual persistence.
|
* Provides the internal interface between dossier request and the actual persistence.
|
||||||
@ -108,7 +110,7 @@ public class DossierService {
|
|||||||
return dossierPersistenceService.findAllDossiers();
|
return dossierPersistenceService.findAllDossiers();
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean hasChangesSince(OffsetDateTime since) {
|
public Set<DossierChange> changesSince(OffsetDateTime since) {
|
||||||
return dossierPersistenceService.hasChangesSince(since);
|
return dossierPersistenceService.hasChangesSince(since);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -3,8 +3,10 @@ package com.iqser.red.service.peristence.v1.server.integration.tests;
|
|||||||
import static org.assertj.core.api.Assertions.assertThat;
|
import static org.assertj.core.api.Assertions.assertThat;
|
||||||
import static org.assertj.core.api.Assertions.assertThatThrownBy;
|
import static org.assertj.core.api.Assertions.assertThatThrownBy;
|
||||||
|
|
||||||
|
import java.time.OffsetDateTime;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
|
import com.iqser.red.service.persistence.service.v1.api.model.common.JSONPrimitive;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import org.springframework.beans.BeanUtils;
|
import org.springframework.beans.BeanUtils;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
@ -35,12 +37,17 @@ public class DossierTest extends AbstractPersistenceServerServiceTest {
|
|||||||
@Test
|
@Test
|
||||||
public void testDossier() {
|
public void testDossier() {
|
||||||
|
|
||||||
|
var start = OffsetDateTime.now();
|
||||||
|
|
||||||
var dossier = dossierTesterAndProvider.provideTestDossier();
|
var dossier = dossierTesterAndProvider.provideTestDossier();
|
||||||
|
|
||||||
var allDossiers = dossierClient.getAllDossiers();
|
var allDossiers = dossierClient.getAllDossiers();
|
||||||
assertThat(allDossiers.size()).isEqualTo(1);
|
assertThat(allDossiers.size()).isEqualTo(1);
|
||||||
assertThat(allDossiers.get(0)).isEqualTo(dossier);
|
assertThat(allDossiers.get(0)).isEqualTo(dossier);
|
||||||
|
|
||||||
|
var changes = dossierClient.changesSince(JSONPrimitive.of(start));
|
||||||
|
assertThat(changes).isNotEmpty();
|
||||||
|
|
||||||
// update
|
// update
|
||||||
CreateOrUpdateDossierRequest cru = new CreateOrUpdateDossierRequest();
|
CreateOrUpdateDossierRequest cru = new CreateOrUpdateDossierRequest();
|
||||||
cru.setDossierTemplateId(dossier.getId());
|
cru.setDossierTemplateId(dossier.getId());
|
||||||
|
|||||||
@ -3,6 +3,7 @@ package com.iqser.red.service.peristence.v1.server.integration.tests;
|
|||||||
import static org.assertj.core.api.Assertions.assertThat;
|
import static org.assertj.core.api.Assertions.assertThat;
|
||||||
|
|
||||||
import java.nio.charset.StandardCharsets;
|
import java.nio.charset.StandardCharsets;
|
||||||
|
import java.time.OffsetDateTime;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
|
|
||||||
import com.iqser.red.service.peristence.v1.server.integration.client.DossierClient;
|
import com.iqser.red.service.peristence.v1.server.integration.client.DossierClient;
|
||||||
@ -101,6 +102,7 @@ public class FileTest extends AbstractPersistenceServerServiceTest {
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testFile() {
|
public void testFile() {
|
||||||
|
var start = OffsetDateTime.now();
|
||||||
|
|
||||||
var dossier = dossierTesterAndProvider.provideTestDossier();
|
var dossier = dossierTesterAndProvider.provideTestDossier();
|
||||||
// update
|
// update
|
||||||
@ -111,6 +113,11 @@ public class FileTest extends AbstractPersistenceServerServiceTest {
|
|||||||
|
|
||||||
var file = fileTesterAndProvider.testAndProvideFile(dossier);
|
var file = fileTesterAndProvider.testAndProvideFile(dossier);
|
||||||
|
|
||||||
|
var changes = dossierClient.changesSince(JSONPrimitive.of(start));
|
||||||
|
assertThat(changes).isNotEmpty();
|
||||||
|
assertThat(changes.iterator().next().isFileChanges()).isTrue();
|
||||||
|
assertThat(changes.iterator().next().isDossierChanges()).isTrue();
|
||||||
|
|
||||||
assertThat(fileClient.getAllStatuses().size()).isEqualTo(1);
|
assertThat(fileClient.getAllStatuses().size()).isEqualTo(1);
|
||||||
var loadedFile = fileClient.getFileStatus(dossier.getId(), file.getId());
|
var loadedFile = fileClient.getFileStatus(dossier.getId(), file.getId());
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user