status poll and rework of dossier-stats

This commit is contained in:
Timo Bejan 2021-10-25 09:15:24 +03:00
parent 9eb3eedc5c
commit b83e915feb
18 changed files with 154 additions and 31 deletions

View File

@ -1,11 +1,13 @@
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.dossiertemplate.dossier.CreateOrUpdateDossierRequest;
import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.Dossier;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.*;
import java.time.OffsetDateTime;
import java.util.List;
import java.util.Set;
@ -22,6 +24,15 @@ public interface DossierResource {
String INCLUDE_DELETED_PARAM = "includeDeleted";
String SINCE_REQUEST_PARAM="since";
String CHANGES_PATH = "/has-changes";
@ResponseBody
@ResponseStatus(value = HttpStatus.OK)
@GetMapping(value = REST_PATH+CHANGES_PATH, produces = MediaType.APPLICATION_JSON_VALUE)
JSONPrimitive<Boolean> hasChangesSince(@RequestParam(SINCE_REQUEST_PARAM) OffsetDateTime since);
@PostMapping(value = REST_PATH, consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
Dossier addDossier(@RequestBody CreateOrUpdateDossierRequest dossierRequest);

View File

@ -4,8 +4,10 @@ import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.do
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 java.util.List;
import java.util.Map;
import java.util.Set;
@ -19,6 +21,6 @@ public interface DossierStatsResource {
@GetMapping(value = REST_PATH + DOSSIER_ID_PATH_PARAM, produces = MediaType.APPLICATION_JSON_VALUE)
DossierStats getDossierStats(@PathVariable(DOSSIER_ID_PARAM) String dossierId);
@GetMapping(value = REST_PATH, produces = MediaType.APPLICATION_JSON_VALUE)
Map<String, DossierStats> getDossierStats(@RequestBody Set<String> dossierIds);
@PostMapping(value = REST_PATH, produces = MediaType.APPLICATION_JSON_VALUE)
List<DossierStats> getDossierStats(@RequestBody Set<String> dossierIds);
}

View File

@ -1,11 +1,13 @@
package com.iqser.red.service.persistence.service.v1.api.resources;
import com.iqser.red.service.persistence.service.v1.api.model.audit.AddNotificationRequest;
import com.iqser.red.service.persistence.service.v1.api.model.common.JSONPrimitive;
import com.iqser.red.service.persistence.service.v1.api.model.notification.Notification;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.*;
import java.time.OffsetDateTime;
import java.util.List;
@ResponseStatus(value = HttpStatus.OK)
@ -14,6 +16,7 @@ public interface NotificationResource {
String NOTIFICATION_PATH = "/notification";
String TOGGLE_SEEN_PATH = "/toggle-seen";
String TOGGLE_READ_PATH = "/toggle-read";
String CHANGES_PATH = "/has-changes";
String USER_ID_PARAM = "userId";
String USER_ID_PATH_PARAM = "/{" + USER_ID_PARAM + "}";
@ -21,7 +24,13 @@ public interface NotificationResource {
String INCLUDE_SEEN_PARAM = "includeSeen";
String SET_SEEN_PARAM = "setSeen";
String SET_READ_PARAM = "setRead";
String SINCE_REQUEST_PARAM = "since";
@ResponseBody
@ResponseStatus(value = HttpStatus.OK)
@GetMapping(value = NOTIFICATION_PATH + CHANGES_PATH + USER_ID_PATH_PARAM, produces = MediaType.APPLICATION_JSON_VALUE)
JSONPrimitive<Boolean> hasNewNotificationsSince(@PathVariable(USER_ID_PARAM) String userId,
@RequestParam(SINCE_REQUEST_PARAM) OffsetDateTime since);
@PostMapping(value = NOTIFICATION_PATH, consumes = MediaType.APPLICATION_JSON_VALUE)
void addNotification(@RequestBody AddNotificationRequest addNotificationRequest);

View File

@ -6,6 +6,7 @@ import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.*;
import java.time.OffsetDateTime;
import java.util.List;
import java.util.Set;
@ -19,16 +20,26 @@ public interface StatusResource {
String FILE_ID = "fileId";
String FILE_ID_PATH_VARIABLE = "/{" + FILE_ID + "}";
String CHANGES_PATH = "/has-changes";
String EXCLUDED_STATUS_PARAM = "excluded";
String APPROVER_ID_REQUEST_PARAM = "approverId";
String REVIEWER_ID_REQUEST_PARAM = "reviewerId";
String SINCE_REQUEST_PARAM="since";
@ResponseBody
@ResponseStatus(value = HttpStatus.OK)
@GetMapping(value = STATUS_PATH, produces = MediaType.APPLICATION_JSON_VALUE)
List<FileModel> getAllStatuses();
@ResponseBody
@ResponseStatus(value = HttpStatus.OK)
@GetMapping(value = STATUS_PATH+DOSSIER_ID_PATH_PARAM+CHANGES_PATH, produces = MediaType.APPLICATION_JSON_VALUE)
JSONPrimitive<Boolean> hasChangesSince(@PathVariable(DOSSIER_ID_PARAM) String dossierId, @RequestParam(SINCE_REQUEST_PARAM) OffsetDateTime since);
@ResponseBody
@ResponseStatus(value = HttpStatus.OK)
@GetMapping(value = STATUS_PATH + DOSSIER_ID_PATH_PARAM, produces = MediaType.APPLICATION_JSON_VALUE)

View File

@ -33,6 +33,9 @@ public class DossierEntity {
@Column
private OffsetDateTime date;
@Column
private OffsetDateTime lastUpdated;
@Column(length = 4000)
private String description;

View File

@ -31,6 +31,7 @@ public class DossierPersistenceService {
private final DossierTemplateRepository dossierTemplateRepository;
private final ReportTemplateRepository reportTemplateRepository;
public DossierEntity insert(CreateOrUpdateDossierRequest createOrUpdateDossierRequest) {
DossierEntity dossier = new DossierEntity();
@ -38,7 +39,7 @@ public class DossierPersistenceService {
dossier.setId(UUID.randomUUID().toString());
dossier.setStatus(DossierStatus.ACTIVE);
dossier.setDate(OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS));
dossier.setLastUpdated(OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS));
dossier.setDossierTemplate(dossierTemplateRepository.getOne(createOrUpdateDossierRequest.getDossierTemplateId()));
var reportTemplates = reportTemplateRepository.findAllById(createOrUpdateDossierRequest.getReportTemplateIds());
reportTemplates.forEach(r -> r.getDossiers().add(dossier));
@ -56,6 +57,7 @@ public class DossierPersistenceService {
dossierRepository.findById(dossierId).ifPresent(dossier -> {
BeanUtils.copyProperties(createOrUpdateDossierRequest, dossier);
dossier.setDossierTemplate(dossierTemplateRepository.getOne(createOrUpdateDossierRequest.getDossierTemplateId()));
dossier.setLastUpdated(OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS));
var reportTemplates = reportTemplateRepository.findAllById(createOrUpdateDossierRequest.getReportTemplateIds());
reportTemplates.forEach(r -> r.getDossiers().add(dossier));
dossier.setReportTemplates(reportTemplates);
@ -104,6 +106,7 @@ public class DossierPersistenceService {
public void hardDelete(String dossierId) {
dossierRepository.findById(dossierId).ifPresent(dossier -> {
dossier.setHardDeletedTime(OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS));
dossier.setLastUpdated(OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS));
dossier.setStatus(DossierStatus.DELETED);
dossier.setSoftDeletedTime(dossier.getSoftDeletedTime() == null ? OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS) : dossier.getSoftDeletedTime());
});
@ -117,6 +120,7 @@ public class DossierPersistenceService {
throw new BadRequestException("Cannot undelete a hard-deleted dossier!");
}
dossier.setStatus(DossierStatus.ACTIVE);
dossier.setLastUpdated(OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS));
dossier.setSoftDeletedTime(null);
});
}
@ -125,9 +129,13 @@ public class DossierPersistenceService {
@Transactional
public void markDossierAsDeleted(String dossierId, OffsetDateTime softDeletedTime) {
dossierRepository.findById(dossierId).ifPresent(dossier -> {
dossier.setLastUpdated(OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS));
dossier.setStatus(DossierStatus.DELETED);
dossier.setSoftDeletedTime(softDeletedTime);
});
}
public boolean hasChangesSince(OffsetDateTime since) {
return dossierRepository.existsByLastUpdatedIsAfter(since.truncatedTo(ChronoUnit.MILLIS));
}
}

View File

@ -47,7 +47,7 @@ public class FileStatusPersistenceService {
file.setAdded(OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS));
file.setUploader(uploader);
file.setLastUploaded(OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS));
file.setLastUpdated(OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS));
fileRepository.save(file);
}
@ -78,7 +78,7 @@ public class FileStatusPersistenceService {
@Transactional
public void updateFlags(String fileId, boolean hasRedactions, boolean hasHints, boolean hasImages, boolean hasSuggestions, boolean hasComments, boolean hasUpdates) {
fileRepository.updateFlags(fileId, hasRedactions, hasHints, hasImages, hasSuggestions, hasComments, hasUpdates);
fileRepository.updateFlags(fileId, OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS), hasRedactions, hasHints, hasImages, hasSuggestions, hasComments, hasUpdates);
}
@ -112,6 +112,7 @@ public class FileStatusPersistenceService {
fileRepository.findById(fileId).ifPresentOrElse((file) -> {
file.setProcessingStatus(ProcessingStatus.PROCESSED);
file.setLastUpdated(OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS));
file.setLastIndexed(OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS));
}, () -> {
throw new NotFoundException("Unknown file=" + fileId);
@ -123,6 +124,7 @@ public class FileStatusPersistenceService {
public void updateLastOCRTime(String fileId, OffsetDateTime time) {
fileRepository.findById(fileId).ifPresentOrElse((file) -> {
file.setLastUpdated(OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS));
file.setLastOCRTime(time);
}, () -> {
throw new NotFoundException("Unknown file=" + fileId);
@ -134,6 +136,7 @@ public class FileStatusPersistenceService {
public void updateHasComments(String fileId, boolean hasComments) {
fileRepository.findById(fileId).ifPresentOrElse((file) -> {
file.setLastUpdated(OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS));
file.setHasAnnotationComments(hasComments);
}, () -> {
throw new NotFoundException("Unknown file=" + fileId);
@ -144,6 +147,7 @@ public class FileStatusPersistenceService {
public void updateLastManualRedaction(String fileId, OffsetDateTime date) {
fileRepository.findById(fileId).ifPresentOrElse((file) -> {
file.setLastUpdated(OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS));
file.setLastManualRedaction(date);
}, () -> {
throw new NotFoundException("Unknown file=" + fileId);
@ -155,6 +159,7 @@ public class FileStatusPersistenceService {
public void setUpdateLastManualRedactionAndHasSuggestions(String fileId, OffsetDateTime date, boolean hasSuggestions) {
fileRepository.findById(fileId).ifPresentOrElse((file) -> {
file.setLastUpdated(OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS));
file.setLastManualRedaction(date);
file.setHasSuggestions(hasSuggestions);
}, () -> {
@ -171,6 +176,7 @@ public class FileStatusPersistenceService {
fileRepository.findById(fileId).ifPresentOrElse((file) -> {
var fileAttributeEntities = convertFileAttributes(dossierId, file, fileAttributes);
file.setLastFileAttributeChange(OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS));
file.setLastUpdated(OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS));
file.setFileAttributes(fileAttributeEntities);
}, () -> {
throw new NotFoundException("Unknown file=" + fileId);
@ -183,6 +189,7 @@ public class FileStatusPersistenceService {
fileRepository.findById(fileId).ifPresentOrElse((file) -> {
file.setLastManualRedaction(OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS));
file.setLastUpdated(OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS));
file.setExcludedPages(excludedPages);
}, () -> {
throw new NotFoundException("Unknown file=" + fileId);
@ -212,6 +219,7 @@ public class FileStatusPersistenceService {
fileRepository.findById(fileId).ifPresentOrElse((file) -> {
file.setProcessingStatus(ProcessingStatus.DELETED);
file.setLastUpdated(OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS));
file.setDeleted(softDeletedTime);
}, () -> {
throw new NotFoundException("Unknown file=" + fileId);
@ -225,6 +233,7 @@ public class FileStatusPersistenceService {
fileRepository.findById(fileId).ifPresentOrElse((file) -> {
file.setProcessingStatus(ProcessingStatus.DELETED);
file.setLastUpdated(OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS));
file.setDeleted(file.getDeleted() == null ? OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS) : file.getDeleted());
file.setHardDeletedTime(OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS));
@ -242,6 +251,7 @@ public class FileStatusPersistenceService {
if (file.getHardDeletedTime() != null) {
throw new BadRequestException("Cannot undelete a hard-deleted dossier file!");
}
file.setLastUpdated(OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS));
file.setProcessingStatus(ProcessingStatus.PROCESSED);
file.setDeleted(null);
}, () -> {
@ -255,6 +265,7 @@ public class FileStatusPersistenceService {
fileRepository.findById(fileId).ifPresentOrElse((file) -> {
file.setCurrentReviewer(currentReviewer);
file.setLastReviewer(lastReviewer);
file.setLastUpdated(OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS));
file.setWorkflowStatus(currentReviewer == null ? WorkflowStatus.UNASSIGNED :WorkflowStatus.UNDER_REVIEW);
}, () -> {
throw new NotFoundException("Unknown file=" + fileId);
@ -267,6 +278,7 @@ public class FileStatusPersistenceService {
fileRepository.findById(fileId).ifPresentOrElse((file) -> {
file.setExcluded(excluded);
file.setLastUpdated(OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS));
file.setLastProcessed(null);
file.setLastReviewer(null);
file.setCurrentReviewer(null);
@ -334,4 +346,7 @@ public class FileStatusPersistenceService {
}
public boolean hasChangesSince(String dossierId, OffsetDateTime since) {
return fileRepository.existsByDossierIdAndLastUpdatedIsAfter(dossierId,since);
}
}

View File

@ -11,6 +11,7 @@ import org.springframework.stereotype.Service;
import javax.transaction.Transactional;
import java.time.OffsetDateTime;
import java.time.temporal.ChronoUnit;
import java.util.List;
@Service
@ -20,6 +21,9 @@ public class NotificationPersistenceService {
private final NotificationRepository notificationRepository;
public boolean hasNewNotificationsSince(String userId, OffsetDateTime since) {
return notificationRepository.existsByUserIdAndCreationDateIsAfter(userId, since.truncatedTo(ChronoUnit.MILLIS));
}
@SneakyThrows
public void insertNotification(AddNotificationRequest addNotificationRequest) {

View File

@ -3,5 +3,10 @@ package com.iqser.red.service.persistence.management.v1.processor.service.persis
import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.DossierEntity;
import org.springframework.data.jpa.repository.JpaRepository;
import java.time.OffsetDateTime;
public interface DossierRepository extends JpaRepository<DossierEntity, String> {
boolean existsByLastUpdatedIsAfter(OffsetDateTime since);
}

View File

@ -12,11 +12,25 @@ import java.util.List;
import javax.persistence.Column;
public interface FileRepository extends JpaRepository<FileEntity, String> {
boolean existsByDossierIdAndLastUpdatedIsAfter(String dossierId, OffsetDateTime since);
List<FileEntity> findByDossierId(String dossierId);
@Modifying
@Query("update FileEntity e set e.hasRedactions = :hasRedactions , e.hasHints = :hasHints, e.hasSuggestions = :hasSuggestions, e.hasImages = :hasImages, e.hasUpdates = :hasUpdates, e.hasAnnotationComments = :hasComments where e.id =:fileId")
void updateFlags(String fileId, boolean hasRedactions, boolean hasHints, boolean hasImages, boolean hasSuggestions, boolean hasComments, boolean hasUpdates);
@Query("update FileEntity e set e.hasRedactions = :hasRedactions ," +
" e.hasHints = :hasHints, e.hasSuggestions = :hasSuggestions," +
" e.hasImages = :hasImages, e.hasUpdates = :hasUpdates, e.hasAnnotationComments = :hasComments, " +
" e.lastUpdated = :lastUpdated " +
" where e.id =:fileId")
void updateFlags(String fileId,
OffsetDateTime lastUpdated,
boolean hasRedactions,
boolean hasHints,
boolean hasImages,
boolean hasSuggestions,
boolean hasComments,
boolean hasUpdates);
}

View File

@ -4,11 +4,14 @@ import com.iqser.red.service.persistence.management.v1.processor.entity.notifica
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import java.time.OffsetDateTime;
import java.util.List;
import java.util.Optional;
public interface NotificationRepository extends JpaRepository<NotificationEntity, Long> {
boolean existsByUserIdAndCreationDateIsAfter(String userId, OffsetDateTime since);
List<NotificationEntity> findByUserIdOrderByCreationDateDesc(String userId);
@Query("Select n from NotificationEntity n where n.softDeleted is null and n.userId = :userId order by n.creationDate desc")

View File

@ -7,6 +7,7 @@ import com.iqser.red.service.peristence.v1.server.utils.DossierMapper;
import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.DossierEntity;
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.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.Dossier;
import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.DossierStatus;
@ -35,6 +36,12 @@ public class DossierController implements DossierResource {
private final FileStatusService fileStatusService;
private final FileService fileService;
@Override
public JSONPrimitive<Boolean> hasChangesSince(@RequestParam(SINCE_REQUEST_PARAM) OffsetDateTime since) {
return JSONPrimitive.of(dossierService.hasChangesSince(since));
}
@Override
@Transactional

View File

@ -6,6 +6,7 @@ import com.iqser.red.service.persistence.service.v1.api.resources.DossierStatsRe
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.function.Function;
@ -23,7 +24,7 @@ public class DossierStatsController implements DossierStatsResource {
}
@Override
public Map<String, DossierStats> getDossierStats(Set<String> dossierIds) {
return dossierIds.stream().collect(Collectors.toMap(Function.identity(), dossierStatsService::getDossierStats));
public List<DossierStats> getDossierStats(Set<String> dossierIds) {
return dossierIds.stream().map(dossierStatsService::getDossierStats).collect(Collectors.toList());
}
}

View File

@ -3,6 +3,7 @@ package com.iqser.red.service.peristence.v1.server.controller;
import com.iqser.red.service.peristence.v1.server.service.*;
import com.iqser.red.service.peristence.v1.server.utils.FileModelMapper;
import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.FileEntity;
import com.iqser.red.service.persistence.service.v1.api.model.common.JSONPrimitive;
import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file.FileModel;
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;
@ -13,6 +14,7 @@ import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import java.time.OffsetDateTime;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;
@ -38,6 +40,14 @@ public class FileStatusController implements StatusResource {
}
@Override
public JSONPrimitive<Boolean> hasChangesSince(@PathVariable(DOSSIER_ID_PARAM) String dossierId,
@RequestParam(SINCE_REQUEST_PARAM) OffsetDateTime since) {
return JSONPrimitive.of(fileStatusService.hasChangesSince(dossierId,since));
}
@Override
public List<FileModel> getDossierStatus(@PathVariable(DOSSIER_ID_PARAM) String dossierId) {

View File

@ -1,7 +1,10 @@
package com.iqser.red.service.peristence.v1.server.controller;
import com.iqser.red.service.persistence.management.v1.processor.exception.NotFoundException;
import com.iqser.red.service.persistence.management.v1.processor.service.persistence.NotificationPersistenceService;
import com.iqser.red.service.persistence.management.v1.processor.service.persistence.NotificationPreferencesPersistenceService;
import com.iqser.red.service.persistence.service.v1.api.model.audit.AddNotificationRequest;
import com.iqser.red.service.persistence.service.v1.api.model.common.JSONPrimitive;
import com.iqser.red.service.persistence.service.v1.api.model.notification.Notification;
import com.iqser.red.service.persistence.service.v1.api.resources.NotificationResource;
import lombok.RequiredArgsConstructor;
@ -21,12 +24,25 @@ public class NotificationController implements NotificationResource {
private final NotificationPersistenceService notificationPersistenceService;
private final NotificationPreferencesPersistenceService notificationPreferencesPersistenceService;
public void addNotification(@RequestBody AddNotificationRequest addNotificationRequest) {
notificationPersistenceService.insertNotification(addNotificationRequest);
@Override
public JSONPrimitive<Boolean> hasNewNotificationsSince(String userId, OffsetDateTime since) {
return JSONPrimitive.of(notificationPersistenceService.hasNewNotificationsSince(userId, since));
}
public void addNotification(@RequestBody AddNotificationRequest addNotificationRequest) {
try {
var userPreferences = notificationPreferencesPersistenceService.getNotificationPreferences(addNotificationRequest.getUserId());
if (userPreferences.getInAppNotifications().contains(addNotificationRequest.getNotificationType())
|| userPreferences.getEmailNotifications().contains(addNotificationRequest.getNotificationType())) {
notificationPersistenceService.insertNotification(addNotificationRequest);
}
} catch (NotFoundException e) {
notificationPersistenceService.insertNotification(addNotificationRequest);
}
}
public void toggleSeen(@PathVariable(USER_ID_PARAM) String userId, @RequestBody List<Long> notificationIds,
@RequestParam(SET_SEEN_PARAM) boolean setSeen) {

View File

@ -94,4 +94,7 @@ public class DossierService {
return dossierPersistenceService.findAllDossiers();
}
public boolean hasChangesSince(OffsetDateTime since) {
return dossierPersistenceService.hasChangesSince(since);
}
}

View File

@ -10,6 +10,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.exception.UserNotFoundException;
import com.iqser.red.service.persistence.management.v1.processor.service.persistence.*;
import com.iqser.red.service.persistence.service.v1.api.model.common.JSONPrimitive;
import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file.FileType;
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;
@ -344,4 +345,7 @@ public class FileStatusService {
return fileAttributeList;
}
public boolean hasChangesSince(String dossierId, OffsetDateTime since) {
return fileStatusPersistenceService.hasChangesSince(dossierId,since);
}
}

View File

@ -10,15 +10,12 @@ import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.do
import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.DossierStats;
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 org.hibernate.jdbc.Work;
import org.junit.Before;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
import java.util.HashSet;
import java.util.Map;
import java.util.List;
import java.util.Set;
import static org.assertj.core.api.Assertions.assertThat;
@ -57,7 +54,7 @@ public class DossierStatsTest extends AbstractPersistenceServerServiceTest {
// alter file 1
var loadedFile1 = fileClient.getFileStatus(dossier1.getId(), file1.getId());
assertThat(loadedFile1.isHasRedactions()).isFalse();
fileRepository.findById(file1.getId()).ifPresent((file)->{
fileRepository.findById(file1.getId()).ifPresent((file) -> {
file.setNumberOfAnalyses(NUMBER_PAGES_ANALYZED);
file.setHasRedactions(true);
file.setHasHints(true);
@ -68,18 +65,18 @@ public class DossierStatsTest extends AbstractPersistenceServerServiceTest {
assertThat(loadedFile1.isHasRedactions()).isTrue();
// alter file 2
fileRepository.findById(file2.getId()).ifPresent((file)->{
fileRepository.findById(file2.getId()).ifPresent((file) -> {
file.setHasSuggestions(true);
fileRepository.save(file);
});
// second dossier
dossier2 = dossierTesterAndProvider.provideTestDossier(dossierTemplate,"Dossier2");
dossier2 = dossierTesterAndProvider.provideTestDossier(dossierTemplate, "Dossier2");
var file3 = fileTesterAndProvider.testAndProvideFile(dossier2, "file3");
var file4 = fileTesterAndProvider.testAndProvideFile(dossier2, "file4");
//alter file 4
fileRepository.findById(file4.getId()).ifPresent((file)->{
fileRepository.findById(file4.getId()).ifPresent((file) -> {
file.setHasHints(true);
file.setWorkflowStatus(WorkflowStatus.APPROVED);
fileRepository.save(file);
@ -106,18 +103,18 @@ public class DossierStatsTest extends AbstractPersistenceServerServiceTest {
dossierIds.add(dossier1.getId());
dossierIds.add(dossier2.getId());
Map<String, DossierStats> dossierStatsMap = dossierStatsClient.getDossierStats(dossierIds);
List<DossierStats> dossierStatsList = dossierStatsClient.getDossierStats(dossierIds);
// get the result for dossier2
DossierStats dossierStats2 = dossierStatsMap.get(dossier2.getId());
assertThat(dossierStats2.getNumberOfFiles()).isEqualTo(2);
assertThat(dossierStats2.getNumberOfAnalysedPages()).isEqualTo(0);
assertThat(dossierStats2.isHasRedactionsFilePresent()).isFalse();
assertThat(dossierStats2.isHasHintsNoRedactionsFilePresent()).isTrue();
assertThat(dossierStats2.isHasSuggestionsFilePresent()).isFalse();
assertThat(dossierStats2.isHasUpdatesFilePresent()).isFalse();
assertThat(dossierStats2.isHasNoFlagsFilePresent()).isTrue();
assertThat(dossierStats2.getFileCountPerWorkflowStatus().get(WorkflowStatus.UNASSIGNED)).isEqualTo(1);
assertThat(dossierStats2.getFileCountPerWorkflowStatus().get(WorkflowStatus.APPROVED)).isEqualTo(1);
DossierStats dossierStats = dossierStatsList.stream().filter(d -> d.getDossierId().equals(dossier2.getId())).findAny().get();
assertThat(dossierStats.getNumberOfFiles()).isEqualTo(2);
assertThat(dossierStats.getNumberOfAnalysedPages()).isEqualTo(0);
assertThat(dossierStats.isHasRedactionsFilePresent()).isFalse();
assertThat(dossierStats.isHasHintsNoRedactionsFilePresent()).isTrue();
assertThat(dossierStats.isHasSuggestionsFilePresent()).isFalse();
assertThat(dossierStats.isHasUpdatesFilePresent()).isFalse();
assertThat(dossierStats.isHasNoFlagsFilePresent()).isTrue();
assertThat(dossierStats.getFileCountPerWorkflowStatus().get(WorkflowStatus.UNASSIGNED)).isEqualTo(1);
assertThat(dossierStats.getFileCountPerWorkflowStatus().get(WorkflowStatus.APPROVED)).isEqualTo(1);
}
}