RED-4249-When I edit or create a dossier as an owner I want to select from multiple watermark configurations

- add columns id, name and enabled to watermark entity,
- removed watermarkEnabled and watermarkPreviewEnabled and added new dependencies to watermark_configuration
- updated tests
This commit is contained in:
devplant 2022-06-20 17:13:42 +03:00
parent c149b67990
commit ab5f644d33
25 changed files with 241 additions and 131 deletions

View File

@ -1,5 +1,6 @@
package com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.configuration;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
@ -11,6 +12,9 @@ import lombok.NoArgsConstructor;
@AllArgsConstructor
public class Watermark {
private Long id;
private String name;
private boolean enabled;
private String dossierTemplateId;
private String text;
private String hexColor;
@ -19,5 +23,4 @@ public class Watermark {
private String fontType;
private WatermarkOrientation orientation;
}

View File

@ -33,10 +33,6 @@ public class CreateOrUpdateDossierRequest {
@Builder.Default
private Set<DownloadFileType> downloadFileTypes = new HashSet<>();
private boolean watermarkEnabled;
private boolean watermarkPreviewEnabled;
private OffsetDateTime dueDate;
private String dossierTemplateId;
@ -48,4 +44,7 @@ public class CreateOrUpdateDossierRequest {
private String dossierStatusId;
private Long watermarkId;
private Long previewWatermarkId;
}

View File

@ -27,8 +27,8 @@ public class Dossier {
private Set<String> approverIds = new HashSet<>();
private Set<DownloadFileType> downloadFileTypes = new HashSet<>();
private Set<String> reportTemplateIds = new HashSet<>();
private boolean watermarkEnabled;
private boolean watermarkPreviewEnabled;
private Long watermarkId;
private Long previewWatermarkId;
private OffsetDateTime softDeletedTime;
private OffsetDateTime hardDeletedTime;
private OffsetDateTime startDate;

View File

@ -9,18 +9,18 @@ import org.springframework.web.bind.annotation.*;
public interface WatermarkResource {
String WATERMARK_PATH = "/watermark";
String DOSSIER_TEMPLATE_PARAMETER_NAME = "dossierTemplateId";
String DOSSIER_TEMPLATE_PATH_VARIABLE = "/{" + DOSSIER_TEMPLATE_PARAMETER_NAME + "}";
String WATERMARK_ID_PARAMETER_NAME = "watermarkId";
String WATERMARK_ID_PATH_VARIABLE = "/{" + WATERMARK_ID_PARAMETER_NAME + "}";
@ResponseStatus(HttpStatus.CREATED)
@PostMapping(value = WATERMARK_PATH + DOSSIER_TEMPLATE_PATH_VARIABLE, consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
Watermark saveWatermark(@PathVariable(DOSSIER_TEMPLATE_PARAMETER_NAME) String dossierTemplateId, @RequestBody Watermark watermark);
@PostMapping(value = WATERMARK_PATH, consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
Watermark createOrUpdateWatermark(@RequestBody Watermark watermark);
@GetMapping(value = WATERMARK_PATH + DOSSIER_TEMPLATE_PATH_VARIABLE, produces = MediaType.APPLICATION_JSON_VALUE)
Watermark getWatermark(@PathVariable(DOSSIER_TEMPLATE_PARAMETER_NAME) String dossierTemplateId);
@GetMapping(value = WATERMARK_PATH + WATERMARK_ID_PATH_VARIABLE, produces = MediaType.APPLICATION_JSON_VALUE)
Watermark getWatermark(@PathVariable(WATERMARK_ID_PARAMETER_NAME) Long watermarkId);
@ResponseStatus(HttpStatus.NO_CONTENT)
@DeleteMapping(value = WATERMARK_PATH + DOSSIER_TEMPLATE_PATH_VARIABLE)
void deleteWatermark(@PathVariable(DOSSIER_TEMPLATE_PARAMETER_NAME) String dossierTemplateId);
@DeleteMapping(value = WATERMARK_PATH + WATERMARK_ID_PATH_VARIABLE)
void deleteWatermark(@PathVariable(WATERMARK_ID_PARAMETER_NAME) Long watermarkId);
}

View File

@ -22,7 +22,13 @@ import javax.persistence.*;
public class WatermarkEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;
@Column
private String name;
@Column
private boolean enabled;
@Column(updatable = false, insertable = false, name = "dossier_template_id")
private String dossierTemplateId;
@Column(length = 4000)
private String text;
@ -39,9 +45,8 @@ public class WatermarkEntity {
@Enumerated(EnumType.STRING)
private WatermarkOrientation orientation;
@OneToOne(fetch = FetchType.LAZY)
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "dossier_template_id")
private DossierTemplateEntity dossierTemplate;
}

View File

@ -2,6 +2,7 @@ package com.iqser.red.service.persistence.management.v1.processor.entity.dossier
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.iqser.red.service.persistence.management.v1.processor.entity.configuration.TypeEntity;
import com.iqser.red.service.persistence.management.v1.processor.entity.configuration.WatermarkEntity;
import com.iqser.red.service.persistence.management.v1.processor.utils.JSONDownloadFileTypeConverter;
import com.iqser.red.service.persistence.management.v1.processor.utils.JSONStringSetConverter;
import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.DownloadFileType;
@ -59,12 +60,6 @@ public class DossierEntity {
@Convert(converter = JSONDownloadFileTypeConverter.class)
private Set<DownloadFileType> downloadFileTypes = new HashSet<>();
@Column
private boolean watermarkEnabled;
@Column
private boolean watermarkPreviewEnabled;
@Column
private OffsetDateTime softDeletedTime;
@ -113,6 +108,18 @@ public class DossierEntity {
@Column(updatable = false, insertable = false, name = "dossier_status_id")
private String dossierStatusId;
@Column(updatable = false, insertable = false, name = "watermark_id")
private Long watermarkId;
@ManyToOne(fetch = FetchType.LAZY)
private WatermarkEntity watermark;
@Column(updatable = false, insertable = false, name = "preview_watermark_id")
private Long previewWatermarkId;
@ManyToOne(fetch = FetchType.LAZY)
private WatermarkEntity previewWatermark;
public boolean isDeleted() {
return softDeletedTime != null || hardDeletedTime != null;
}

View File

@ -8,8 +8,8 @@ import java.util.Set;
import javax.persistence.*;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.iqser.red.service.persistence.management.v1.processor.entity.configuration.TypeEntity;
import com.iqser.red.service.persistence.management.v1.processor.entity.configuration.WatermarkEntity;
import com.iqser.red.service.persistence.management.v1.processor.utils.JSONDownloadFileTypeConverter;
import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.DossierTemplateStatus;
import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.DownloadFileType;
@ -89,6 +89,11 @@ public class DossierTemplateEntity {
@OneToMany(mappedBy = "dossierTemplate")
private List<DossierStatusEntity> dossierStatusList = new ArrayList<>();
@Builder.Default
@Fetch(FetchMode.SUBSELECT)
@OneToMany(mappedBy = "dossierTemplate")
private List<WatermarkEntity> watermarkConfigs = new ArrayList<>();
@Transient
private DossierTemplateStatus dossierTemplateStatus;

View File

@ -3,7 +3,6 @@ package com.iqser.red.service.persistence.management.v1.processor.service;
import com.iqser.red.service.persistence.management.v1.processor.entity.configuration.ColorsEntity;
import com.iqser.red.service.persistence.management.v1.processor.entity.configuration.FileAttributesGeneralConfigurationEntity;
import com.iqser.red.service.persistence.management.v1.processor.entity.configuration.TypeEntity;
import com.iqser.red.service.persistence.management.v1.processor.entity.configuration.WatermarkEntity;
import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.DossierAttributeConfigEntity;
import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.DossierTemplateEntity;
import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.FileAttributeConfigEntity;
@ -45,7 +44,6 @@ public class DossierTemplateCloneService {
private final EntryPersistenceService entryPersistenceService;
private final FileAttributeConfigPersistenceService fileAttributeConfigPersistenceService;
private final ReportTemplatePersistenceService reportTemplatePersistenceService;
private final WatermarkService watermarkService;
private final ColorsService colorsService;
private final StorageService storageService;
private final DossierStatusPersistenceService dossierStatusPersistenceService;
@ -93,9 +91,6 @@ public class DossierTemplateCloneService {
//set report templates
cloneReportTemplates(dossierTemplate, clonedDossierTemplate.getId());
//set watermarks
cloneWatermark(dossierTemplate.getId(), clonedDossierTemplate.getId());
//set colors
cloneColors(dossierTemplate.getId(), clonedDossierTemplate.getId());
@ -205,27 +200,6 @@ public class DossierTemplateCloneService {
}
}
private void cloneWatermark(String dossierTemplateId, String clonedDossierTemplateId) {
try {
var watermark = watermarkService.getWatermark(dossierTemplateId);
WatermarkEntity we = WatermarkEntity.builder()
.dossierTemplateId(clonedDossierTemplateId)
.text(watermark.getText())
.hexColor(watermark.getHexColor())
.opacity(watermark.getOpacity())
.fontType(watermark.getFontType())
.fontSize(watermark.getFontSize())
.orientation(watermark.getOrientation())
.build();
watermarkService.saveWatermark(clonedDossierTemplateId, we);
} catch (NotFoundException e) {
log.debug("No watermark config found for cloning {}", dossierTemplateId);
}
}
private void cloneColors(String dossierTemplateId, String clonedDossierTemplateId) {
var colors = colorsService.getColors(dossierTemplateId);

View File

@ -2,9 +2,11 @@ package com.iqser.red.service.persistence.management.v1.processor.service;
import javax.transaction.Transactional;
import com.iqser.red.service.persistence.management.v1.processor.service.persistence.DossierTemplatePersistenceService;
import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.DossierRepository;
import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.configuration.Watermark;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.dao.EmptyResultDataAccessException;
import org.springframework.stereotype.Service;
import com.iqser.red.service.persistence.management.v1.processor.entity.configuration.WatermarkEntity;
@ -15,50 +17,70 @@ import com.iqser.red.service.persistence.management.v1.processor.service.persist
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import java.util.Optional;
@Slf4j
@Service
@RequiredArgsConstructor
public class WatermarkService {
private final WatermarkRepository watermarkRepository;
private final DossierRepository dossierRepository;
private final DossierTemplatePersistenceService dossierTemplatePersistenceService;
public void deleteWatermark(String dossierTemplateId) {
try {
watermarkRepository.deleteById(dossierTemplateId);
} catch (EmptyResultDataAccessException e) {
log.info("Watermark for dossierTemplateId '{}' was already deleted.", dossierTemplateId);
}
@Transactional
public void deleteWatermark(Long watermarkId) {
watermarkRepository.findById(watermarkId).ifPresentOrElse(loadedWatermark -> {
dossierRepository.countDeleteWatermark(watermarkId);
dossierRepository.countDeletePreviewWatermark(watermarkId);
watermarkRepository.deleteById(watermarkId);
}, () -> {
log.debug("Watermark with id '{}' was already deleted.", watermarkId);
});
}
public WatermarkEntity getWatermark(String dossierTemplateId) {
public WatermarkEntity getWatermark(Long watermarkId) {
return watermarkRepository.findById(dossierTemplateId)
return watermarkRepository.findById(watermarkId)
.orElseThrow(() -> new NotFoundException("Watermark Configuration not found"));
}
@Transactional
public WatermarkEntity saveWatermark(String dossierTemplateId, WatermarkEntity watermark) {
public WatermarkEntity createOrUpdateWatermark(Watermark watermark) {
validateWatermark(watermark);
watermarkRepository.findById(dossierTemplateId)
.ifPresentOrElse(loadedWatermark -> BeanUtils.copyProperties(watermark, loadedWatermark, "dossierTemplateId"), () -> {
watermark.setDossierTemplateId(dossierTemplateId);
watermarkRepository.save(watermark);
});
return watermarkRepository.findById(dossierTemplateId)
.orElseThrow(() -> new NotFoundException("Watermark not found"));
if (watermark.getId() != null) { // update
watermarkRepository.findById(watermark.getId())
.ifPresentOrElse(loadedWatermark -> {
BeanUtils.copyProperties(watermark, loadedWatermark, "dossierTemplateId");
var dossierTemplate = dossierTemplatePersistenceService.getDossierTemplate(watermark.getDossierTemplateId());
loadedWatermark.setDossierTemplate(dossierTemplate);
}, () -> {
WatermarkEntity watermarkEntity = new WatermarkEntity();
BeanUtils.copyProperties(watermark, watermarkEntity, "id");
var dossierTemplate = dossierTemplatePersistenceService.getDossierTemplate(watermark.getDossierTemplateId());
watermarkEntity.setDossierTemplate(dossierTemplate);
watermarkRepository.save(watermarkEntity);
});
return watermarkRepository.findById(watermark.getId()).orElseThrow(() -> new NotFoundException("Watermark Configuration not found"));
} else {
WatermarkEntity watermarkEntity = new WatermarkEntity();
BeanUtils.copyProperties(watermark, watermarkEntity, "id");
var dossierTemplate = dossierTemplatePersistenceService.getDossierTemplate(watermark.getDossierTemplateId());
watermarkEntity.setDossierTemplate(dossierTemplate);
return watermarkRepository.save(watermarkEntity);
}
}
private void validateWatermark(WatermarkEntity watermark) {
private void validateWatermark(Watermark watermark) {
if (watermark == null) {
throw new BadRequestException("The watermark may not be null");
}
// if (watermark == null) {
// throw new BadRequestException("The watermark may not be null");
// }
if (StringUtils.isNotBlank(watermark.getText()) && !StringUtils.isAsciiPrintable(StringUtils.normalizeSpace(watermark.getText()))) {
throw new BadRequestException("The watermark may only contain ASCII characters");
}

View File

@ -12,6 +12,8 @@ import java.util.stream.Collectors;
import javax.transaction.Transactional;
import com.iqser.red.service.persistence.management.v1.processor.service.WatermarkService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
@ -29,6 +31,7 @@ import lombok.RequiredArgsConstructor;
@Service
@RequiredArgsConstructor
@Slf4j
public class DossierPersistenceService {
@ -37,6 +40,7 @@ public class DossierPersistenceService {
private final DossierTemplateRepository dossierTemplateRepository;
private final ReportTemplateRepository reportTemplateRepository;
private final DossierStatusPersistenceService dossierStatusPersistenceService;
private final WatermarkService watermarkService;
public DossierEntity insert(CreateOrUpdateDossierRequest createOrUpdateDossierRequest) {
@ -51,7 +55,7 @@ public class DossierPersistenceService {
reportTemplates.forEach(r -> r.getDossiers().add(dossier));
dossier.setReportTemplates(reportTemplates);
this.handleDossierStatus(createOrUpdateDossierRequest, dossier);
this.handleWatermark(createOrUpdateDossierRequest, dossier);
return dossierRepository.save(dossier);
@ -75,6 +79,7 @@ public class DossierPersistenceService {
});
dossier.setReportTemplates(reportTemplates);
this.handleDossierStatus(createOrUpdateDossierRequest, dossier);
this.handleWatermark(createOrUpdateDossierRequest, dossier);
});
}
@ -92,6 +97,29 @@ public class DossierPersistenceService {
}
}
private void handleWatermark(CreateOrUpdateDossierRequest createOrUpdateDossierRequest, DossierEntity dossier) {
if (createOrUpdateDossierRequest.getWatermarkId() != null) {
var watermarkEntity = watermarkService.getWatermark(createOrUpdateDossierRequest.getWatermarkId());
if (watermarkEntity.getDossierTemplateId().equals(createOrUpdateDossierRequest.getDossierTemplateId())) {
dossier.setWatermark(watermarkEntity);
} else {
log.debug("Invalid watermark id");
}
} else {
dossier.setWatermark(null);
}
if (createOrUpdateDossierRequest.getPreviewWatermarkId() != null) {
var previewWatermarkEntity = watermarkService.getWatermark(createOrUpdateDossierRequest.getPreviewWatermarkId());
if (previewWatermarkEntity.getDossierTemplateId().equals(createOrUpdateDossierRequest.getDossierTemplateId())) {
dossier.setPreviewWatermark(previewWatermarkEntity);
} else {
log.debug("Invalid preview watermark id");
}
} else {
dossier.setPreviewWatermark(null);
}
}
public DossierEntity getActiveOrArchivedDossier(String dossierId) {

View File

@ -58,4 +58,12 @@ public interface DossierRepository extends JpaRepository<DossierEntity, String>
@Query("select d from DossierEntity d where d.dossierTemplateId = :dossierTemplateId")
List<DossierEntity> findByDossierTemplateId(String dossierTemplateId);
@Modifying
@Query("update DossierEntity d set d.watermarkId = null where d.watermarkId = :watermarkId")
int countDeleteWatermark(Long watermarkId);
@Modifying
@Query("update DossierEntity d set d.previewWatermarkId = null where d.previewWatermarkId = :previewWatermarkId")
int countDeletePreviewWatermark(Long previewWatermarkId);
}

View File

@ -3,5 +3,5 @@ package com.iqser.red.service.persistence.management.v1.processor.service.persis
import com.iqser.red.service.persistence.management.v1.processor.entity.configuration.WatermarkEntity;
import org.springframework.data.jpa.repository.JpaRepository;
public interface WatermarkRepository extends JpaRepository<WatermarkEntity, String> {
public interface WatermarkRepository extends JpaRepository<WatermarkEntity, Long> {
}

View File

@ -17,16 +17,16 @@ public class WatermarkController implements WatermarkResource {
private final WatermarkService watermarkService;
public Watermark saveWatermark(String dossierTemplateId, @RequestBody Watermark watermark) {
return convert(watermarkService.saveWatermark(dossierTemplateId, convert(watermark, WatermarkEntity.class)), Watermark.class);
public Watermark createOrUpdateWatermark(@RequestBody Watermark watermark) {
return convert(watermarkService.createOrUpdateWatermark(watermark), Watermark.class);
}
public Watermark getWatermark(String dossierTemplateId) {
return convert(watermarkService.getWatermark(dossierTemplateId), Watermark.class);
public Watermark getWatermark(Long watermarkId) {
return convert(watermarkService.getWatermark(watermarkId), Watermark.class);
}
public void deleteWatermark(String dossierTemplateId) {
watermarkService.deleteWatermark(dossierTemplateId);
public void deleteWatermark(Long watermarkId) {
watermarkService.deleteWatermark(watermarkId);
}
}

View File

@ -88,15 +88,15 @@ public class DownloadPreparationService {
}
if (downloadFileType.name().equals(DownloadFileType.PREVIEW.name())) {
fileSystemBackedArchiver.addEntry(new FileSystemBackedArchiver.ArchiveModel("Preview", addSuffix(fileStatus.getFilename(), "highlighted"),
getPreview(dossier.getId(), fileId, redactionLog, dossier.getDossierTemplateId(), dossier.isWatermarkPreviewEnabled())));
getPreview(dossier.getId(), fileId, redactionLog, dossier.getDossierTemplateId(), dossier.getPreviewWatermarkId())));
}
if (downloadFileType.name().equals(DownloadFileType.DELTA_PREVIEW.name())) {
fileSystemBackedArchiver.addEntry(new FileSystemBackedArchiver.ArchiveModel("Delta Preview", addSuffix(fileStatus.getFilename(), "delta_highlighted"),
getDeltaPreview(dossier.getId(), fileId, redactionLog, dossier.getDossierTemplateId(), dossier.isWatermarkPreviewEnabled())));
getDeltaPreview(dossier.getId(), fileId, redactionLog, dossier.getDossierTemplateId(), dossier.getPreviewWatermarkId())));
}
if (downloadFileType.name().equals(DownloadFileType.REDACTED.name())) {
fileSystemBackedArchiver.addEntry(new FileSystemBackedArchiver.ArchiveModel("Redacted", addSuffix(fileStatus.getFilename(), "redacted"),
getRedacted(dossier.getId(), fileId, redactionLog, dossier.getDossierTemplateId(), dossier.isWatermarkEnabled())));
getRedacted(dossier.getId(), fileId, redactionLog, dossier.getDossierTemplateId(), dossier.getWatermarkId())));
}
}
log.info("Successfully added file {}/{} for downloadId {}, took {}", i, fileIds
@ -173,38 +173,38 @@ public class DownloadPreparationService {
}
private byte[] getRedacted(String dossierId, String fileId, RedactionLog redactionLog, String dossierTemplateId,
boolean watermarkEnabled) {
Long watermarkId) {
return pdfTronRedactionClient.redact(RedactionRequest.builder()
.dossierId(dossierId)
.fileId(fileId)
.dossierTemplateId(dossierTemplateId)
.redactionLog(redactionLog)
.applyWatermark(watermarkEnabled)
.watermarkId(watermarkId)
.build()).getDocument();
}
private byte[] getPreview(String dossierId, String fileId, RedactionLog redactionLog, String dossierTemplateId, boolean watermarkEnabled) {
private byte[] getPreview(String dossierId, String fileId, RedactionLog redactionLog, String dossierTemplateId, Long watermarkId) {
return pdfTronRedactionClient.redactionPreview(RedactionRequest.builder()
.dossierId(dossierId)
.fileId(fileId)
.dossierTemplateId(dossierTemplateId)
.redactionLog(redactionLog)
.applyWatermark(watermarkEnabled)
.watermarkId(watermarkId)
.build()).getDocument();
}
private byte[] getDeltaPreview(String dossierId, String fileId, RedactionLog redactionLog, String dossierTemplateId, boolean watermarkEnabled) {
private byte[] getDeltaPreview(String dossierId, String fileId, RedactionLog redactionLog, String dossierTemplateId, Long watermarkId) {
return pdfTronRedactionClient.redactionPreviewDiff(RedactionRequest.builder()
.dossierId(dossierId)
.fileId(fileId)
.dossierTemplateId(dossierTemplateId)
.redactionLog(redactionLog)
.applyWatermark(watermarkEnabled)
.watermarkId(watermarkId)
.build()).getDocument();
}

View File

@ -73,3 +73,5 @@ databaseChangeLog:
file: db/changelog/sql/30-change-bigint-to-serial.sql
- include:
file: db/changelog/31-add-file-size-column.changelog.yaml
- include:
file: db/changelog/sql/31-watermark-configuration.sql

View File

@ -0,0 +1,20 @@
-- add the generated id to watermark_configuration table
alter table watermark_configuration add column id BIGINT GENERATED ALWAYS AS IDENTITY;
alter table watermark_configuration add column name VARCHAR (255), add column enabled BOOLEAN;
-- update the primary key constraint based on the new configuration and add the foreign key contraints to the dossier and dossier_template tables
alter table watermark_configuration drop constraint watermark_configuration_pkey;
alter table watermark_configuration add constraint watermark_configuration_pkey PRIMARY KEY (id);
delete from watermark_configuration where dossier_template_id not in ( select id from dossier_template );
alter table watermark_configuration add constraint watermark_dossier_template_id_fk FOREIGN KEY (dossier_template_id) REFERENCES dossier_template (id);
-- add the link to watermark_configuration to dossier table and the foreign key contraints
alter table dossier add column watermark_id BIGINT;
alter table dossier add column preview_watermark_id BIGINT;
alter table dossier add constraint watermark_id_fk FOREIGN KEY (watermark_id) REFERENCES watermark_configuration (id);
alter table dossier add constraint preview_watermark_id_fk FOREIGN KEY (preview_watermark_id) REFERENCES watermark_configuration (id);
-- update the dossier table with the corresponding watermark based on the dossier template given
update dossier d set watermark_id = (select id from watermark_configuration w where w.dossier_template_id = d.dossier_template_id) where d.watermark_enabled = true;
update dossier d set preview_watermark_id = (select id from watermark_configuration w where w.dossier_template_id = d.dossier_template_id) where d.watermark_preview_enabled = true;
-- remove the previous columns, not needed anymore
alter table dossier drop column watermark_enabled;
alter table dossier drop column watermark_preview_enabled;

View File

@ -54,7 +54,6 @@ public class DossierTesterAndProvider {
if (dossierStatus != null) {
cru.setDossierStatusId(dossierStatus.getId());
}
cru.setWatermarkEnabled(true);
cru.setMemberIds(Sets.newHashSet("1"));
cru.setOwnerId("1");
cru.setApproverIds(Sets.newHashSet("1"));

View File

@ -207,15 +207,6 @@ public class DossierTemplateTest extends AbstractPersistenceServerServiceTest {
.activeByDefault(true)
.multiFileReport(false)
.build());
watermarkClient.saveWatermark(dossierTemplate.getId(), Watermark.builder()
.dossierTemplateId(dossierTemplate.getId())
.fontSize(10)
.fontType("Arial")
.text("watermark")
.hexColor("#123456")
.opacity(1)
.orientation(WatermarkOrientation.HORIZONTAL)
.build());
var col = Colors.builder()
.analysisColor("#111111")
.defaultColor("#222222")
@ -268,7 +259,6 @@ public class DossierTemplateTest extends AbstractPersistenceServerServiceTest {
assertThat(reportTemplateClient.getAvailableReportTemplates(dossierTemplate.getId())
.get(0)
.getFileName()).isEqualTo(reportTemplateClient.getAvailableReportTemplates(clonedDT.getId()).get(0).getFileName());
assertThat(watermarkClient.getWatermark(dossierTemplate.getId()).getText()).isEqualTo(watermarkClient.getWatermark(clonedDT.getId()).getText());
assertThat(dictionaryClient.getColors(dossierTemplate.getId()).getRequestAdd()).isEqualTo(dictionaryClient.getColors(clonedDT.getId()).getRequestAdd());
assertThat(dictionaryClient.getAllTypesForDossierTemplate(dossierTemplate.getId(), false)
.get(0)

View File

@ -7,6 +7,9 @@ import java.time.OffsetDateTime;
import java.util.List;
import java.util.Set;
import com.iqser.red.service.peristence.v1.server.integration.client.WatermarkClient;
import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.configuration.Watermark;
import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.configuration.WatermarkOrientation;
import org.junit.Test;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
@ -44,6 +47,9 @@ public class DossierTest extends AbstractPersistenceServerServiceTest {
@Autowired
private DossierStatusClient dossierStatusClient;
@Autowired
private WatermarkClient watermarkClient;
@Test
public void testDossier() {
@ -51,6 +57,15 @@ public class DossierTest extends AbstractPersistenceServerServiceTest {
var dossier = dossierTesterAndProvider.provideTestDossier();
Watermark watermark = new Watermark();
watermark.setName("watermark name");
watermark.setEnabled(true);
watermark.setText("Minions ipsum chasy para tu la bodaaa bananaaaa hana dul sae. Chasy hana dul sae pepete hana dul sae belloo! Tatata bala tu ti aamoo! Jeje.");
watermark.setOrientation(WatermarkOrientation.DIAGONAL);
watermark.setDossierTemplateId(dossier.getDossierTemplateId());
var watermarkConfig = watermarkClient.createOrUpdateWatermark(watermark);
var allDossiers = dossierClient.getAllDossiers(false, false);
assertThat(allDossiers.size()).isEqualTo(1);
assertThat(allDossiers.get(0)).isEqualTo(dossier);
@ -61,10 +76,10 @@ public class DossierTest extends AbstractPersistenceServerServiceTest {
// update
CreateOrUpdateDossierRequest cru = new CreateOrUpdateDossierRequest();
cru.setDossierTemplateId(dossier.getId());
cru.setWatermarkPreviewEnabled(true);
cru.setWatermarkId(watermarkConfig.getId());
BeanUtils.copyProperties(dossier, cru);
cru.setDossierName("Dossier 1 Update");
cru.setWatermarkPreviewEnabled(true);
cru.setPreviewWatermarkId(watermarkConfig.getId());
// Create dossier status
CreateOrUpdateDossierStatusRequest crudsr = new CreateOrUpdateDossierStatusRequest();
crudsr.setName("name1");
@ -78,7 +93,7 @@ public class DossierTest extends AbstractPersistenceServerServiceTest {
var updated = dossierClient.updateDossier(cru, dossier.getId());
assertThat(updated.getDossierName()).isEqualTo("Dossier 1 Update");
assertThat(updated.isWatermarkPreviewEnabled()).isEqualTo(true);
assertThat(updated.getPreviewWatermarkId()).isEqualTo(watermarkConfig.getId());
assertThat(updated.getDossierStatusId()).isEqualTo(loadedDossierStatus.getId());
// put dossier status to null
@ -232,7 +247,17 @@ public class DossierTest extends AbstractPersistenceServerServiceTest {
@Test
public void testDossierWithReportTemplates() {
var dossier = dossierTesterAndProvider.provideTestDossier();
Watermark watermark = new Watermark();
watermark.setName("watermark name");
watermark.setEnabled(true);
watermark.setText("Minions ipsum chasy para tu la bodaaa bananaaaa hana dul sae. Chasy hana dul sae pepete hana dul sae belloo! Tatata bala tu ti aamoo! Jeje.");
watermark.setOrientation(WatermarkOrientation.DIAGONAL);
watermark.setDossierTemplateId(dossier.getDossierTemplateId());
var watermarkConfig = watermarkClient.createOrUpdateWatermark(watermark);
String dossierName = "Dossier 1 Update";
var allDossiers = dossierClient.getAllDossiers(false, false);
@ -246,12 +271,12 @@ public class DossierTest extends AbstractPersistenceServerServiceTest {
cru.setDossierTemplateId(dossier.getId());
BeanUtils.copyProperties(dossier, cru);
cru.setDossierName(dossierName);
cru.setWatermarkPreviewEnabled(true);
cru.setPreviewWatermarkId(watermarkConfig.getId());
cru.setReportTemplateIds(List.of(availableTemplates.get(0).getTemplateId(), "id-does-not-exist-1", "id-does-not-exist-2"));
var updated = dossierClient.updateDossier(cru, dossier.getId());
assertThat(updated.getDossierName()).isEqualTo(dossierName);
assertThat(updated.isWatermarkPreviewEnabled()).isEqualTo(true);
assertThat(updated.getPreviewWatermarkId()).isEqualTo(watermarkConfig.getId());
assertThat(updated.getReportTemplateIds().size()).isEqualTo(1);
assertThat(updated.getReportTemplateIds()).contains(availableTemplates.get(0).getTemplateId());
@ -270,12 +295,12 @@ public class DossierTest extends AbstractPersistenceServerServiceTest {
cru.setDossierTemplateId(dossier.getId());
BeanUtils.copyProperties(dossier, cru);
cru.setDossierName(dossierName);
cru.setWatermarkPreviewEnabled(true);
cru.setPreviewWatermarkId(watermarkConfig.getId());
cru.setReportTemplateIds(List.of(availableTemplates.get(0).getTemplateId(), availableTemplates.get(1).getTemplateId()));
updated = dossierClient.updateDossier(cru, dossier.getId());
assertThat(updated.getDossierName()).isEqualTo(dossierName);
assertThat(updated.isWatermarkPreviewEnabled()).isEqualTo(true);
assertThat(updated.getPreviewWatermarkId()).isEqualTo(watermarkConfig.getId());
assertThat(updated.getReportTemplateIds().size()).isEqualTo(2);
assertThat(updated.getReportTemplateIds()).contains(availableTemplates.get(0).getTemplateId(), availableTemplates.get(1).getTemplateId());
@ -290,12 +315,12 @@ public class DossierTest extends AbstractPersistenceServerServiceTest {
cru.setDossierTemplateId(dossier.getId());
BeanUtils.copyProperties(dossier, cru);
cru.setDossierName(dossierName);
cru.setWatermarkPreviewEnabled(true);
cru.setPreviewWatermarkId(watermarkConfig.getId());
cru.setReportTemplateIds(List.of(availableTemplates.get(1).getTemplateId(), availableTemplates.get(2).getTemplateId()));
updated = dossierClient.updateDossier(cru, dossier.getId());
assertThat(updated.getDossierName()).isEqualTo(dossierName);
assertThat(updated.isWatermarkPreviewEnabled()).isEqualTo(true);
assertThat(updated.getPreviewWatermarkId()).isEqualTo(watermarkConfig.getId());
assertThat(updated.getReportTemplateIds().size()).isEqualTo(2);
assertThat(updated.getReportTemplateIds()).contains(availableTemplates.get(1).getTemplateId(), availableTemplates.get(2).getTemplateId());
@ -310,12 +335,12 @@ public class DossierTest extends AbstractPersistenceServerServiceTest {
cru.setDossierTemplateId(dossier.getId());
BeanUtils.copyProperties(dossier, cru);
cru.setDossierName(dossierName);
cru.setWatermarkPreviewEnabled(true);
cru.setPreviewWatermarkId(watermarkConfig.getId());
cru.setReportTemplateIds(List.of(availableTemplates.get(0).getTemplateId()));
updated = dossierClient.updateDossier(cru, dossier.getId());
assertThat(updated.getDossierName()).isEqualTo(dossierName);
assertThat(updated.isWatermarkPreviewEnabled()).isEqualTo(true);
assertThat(updated.getPreviewWatermarkId()).isEqualTo(watermarkConfig.getId());
assertThat(updated.getReportTemplateIds().size()).isEqualTo(1);
assertThat(updated.getReportTemplateIds()).contains(availableTemplates.get(0).getTemplateId());

View File

@ -99,7 +99,7 @@ public class DownloadPreparationTest extends AbstractPersistenceServerServiceTes
.memberIds(dossier.getMemberIds())
.approverIds(dossier.getApproverIds())
.downloadFileTypes(dossier.getDownloadFileTypes())
.watermarkEnabled(dossier.isWatermarkEnabled())
.watermarkId(dossier.getWatermarkId())
.dueDate(dossier.getDueDate())
.dossierTemplateId(dossier.getDossierTemplateId())
.reportTemplateIds(availableTemplates.stream().map(a -> a.getTemplateId()).collect(Collectors.toList()))

View File

@ -28,37 +28,40 @@ public class WatermarkTest extends AbstractPersistenceServerServiceTest {
var dossierTemplate = dossierTemplateTesterAndProvider.provideTestTemplate();
try {
watermarkClient.getWatermark(dossierTemplate.getId());
watermarkClient.getWatermark(Long.valueOf(13));
} catch (FeignException.FeignClientException e) {
assertThat(e.status()).isEqualTo(404);
}
Watermark watermark = new Watermark();
watermark.setName("watermark name");
watermark.setEnabled(true);
watermark.setText("Minions ipsum chasy para tu la bodaaa bananaaaa hana dul sae. Chasy hana dul sae pepete hana dul sae belloo! Tatata bala tu ti aamoo! Jeje.");
watermark.setFontSize(12);
watermark.setFontType("font");
watermark.setHexColor("#dddddd");
watermark.setOpacity(20);
watermark.setOrientation(WatermarkOrientation.DIAGONAL);
watermark.setDossierTemplateId(dossierTemplate.getId());
var saved = watermarkClient.saveWatermark(dossierTemplate.getId(), watermark);
assertThat(watermarkClient.getWatermark(dossierTemplate.getId())).isEqualTo(saved);
var saved = watermarkClient.createOrUpdateWatermark(watermark);
var loadedWatermark = watermarkClient.getWatermark(saved.getId());
assertThat(loadedWatermark).isEqualTo(saved);
watermark.setFontSize(14);
saved = watermarkClient.saveWatermark(dossierTemplate.getId(), watermark);
assertThat(watermarkClient.getWatermark(dossierTemplate.getId())).isEqualTo(saved);
saved = watermarkClient.createOrUpdateWatermark(watermark);
loadedWatermark = watermarkClient.getWatermark(saved.getId());
assertThat(loadedWatermark).isEqualTo(saved);
// Delete first time
watermarkClient.deleteWatermark(dossierTemplate.getId());
watermarkClient.deleteWatermark(saved.getId());
try {
watermarkClient.getWatermark(dossierTemplate.getId());
watermarkClient.getWatermark(saved.getId());
} catch (FeignException.FeignClientException e) {
assertThat(e.status()).isEqualTo(404);
}
// Delete second time
watermarkClient.deleteWatermark(dossierTemplate.getId());
}
@ -70,6 +73,9 @@ public class WatermarkTest extends AbstractPersistenceServerServiceTest {
var watermarkText = "This is not an ASCII text äöüÄÖÜéèê... \nand many more...\r May the force with you! ";
Watermark watermark = new Watermark();
watermark.setName("name");
watermark.setEnabled(true);
watermark.setDossierTemplateId(dossierTemplate.getId());
watermark.setFontSize(12);
watermark.setFontType("font");
watermark.setHexColor("#dddddd");
@ -78,7 +84,7 @@ public class WatermarkTest extends AbstractPersistenceServerServiceTest {
watermark.setText(watermarkText);
// Act
FeignException exception = assertThrows(FeignException.class, () -> watermarkClient.saveWatermark(dossierTemplate.getId(), watermark));
FeignException exception = assertThrows(FeignException.class, () -> watermarkClient.createOrUpdateWatermark(watermark));
// Assert
assertThat(exception.status()).isEqualTo(400);
@ -93,6 +99,9 @@ public class WatermarkTest extends AbstractPersistenceServerServiceTest {
var watermarkText = "We love ASCII!\n\nThis text contains only ASCII chars and newlines\r\r\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~";
Watermark watermark = new Watermark();
watermark.setName("name");
watermark.setEnabled(true);
watermark.setDossierTemplateId(dossierTemplate.getId());
watermark.setFontSize(12);
watermark.setFontType("font");
watermark.setHexColor("#dddddd");
@ -101,11 +110,12 @@ public class WatermarkTest extends AbstractPersistenceServerServiceTest {
watermark.setText(watermarkText);
// Act
var saved = watermarkClient.saveWatermark(dossierTemplate.getId(), watermark);
var saved = watermarkClient.createOrUpdateWatermark(watermark);
var loadedWatermarked = watermarkClient.getWatermark(saved.getId());
// Assert
assertThat(watermarkClient.getWatermark(dossierTemplate.getId())).isEqualTo(saved);
assertThat(watermarkClient.getWatermark(dossierTemplate.getId()).getText()).isEqualTo(watermarkText);
assertThat(loadedWatermarked).isEqualTo(saved);
assertThat(loadedWatermarked.getText()).isEqualTo(watermarkText);
}
}

View File

@ -3,11 +3,14 @@ package com.iqser.red.service.peristence.v1.server.integration.tests.performance
import com.iqser.red.service.peristence.v1.server.integration.client.DossierClient;
import com.iqser.red.service.peristence.v1.server.integration.client.DossierStatsClient;
import com.iqser.red.service.peristence.v1.server.integration.client.FileClient;
import com.iqser.red.service.peristence.v1.server.integration.client.WatermarkClient;
import com.iqser.red.service.peristence.v1.server.integration.utils.AbstractPersistenceServerServiceTest;
import com.iqser.red.service.persistence.management.v1.processor.entity.configuration.DictionaryEntryEntity;
import com.iqser.red.service.persistence.management.v1.processor.entity.configuration.TypeEntity;
import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.*;
import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.DownloadFileType;
import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.configuration.Watermark;
import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.configuration.WatermarkOrientation;
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.file.FileAttributeType;
import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file.ProcessingStatus;
@ -17,7 +20,6 @@ import org.assertj.core.util.Sets;
import org.junit.Before;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.DataIntegrityViolationException;
import java.time.OffsetDateTime;
import java.util.*;
@ -45,6 +47,9 @@ public class FilePerformanceTest extends AbstractPersistenceServerServiceTest {
@Autowired
private DossierStatsClient dossierStatsClient;
@Autowired
private WatermarkClient watermarkClient;
@Before
public void setupTest() {
@ -60,6 +65,15 @@ public class FilePerformanceTest extends AbstractPersistenceServerServiceTest {
dte = dossierTemplateRepository.save(dte);
Watermark watermark = new Watermark();
watermark.setName("watermark name");
watermark.setEnabled(true);
watermark.setText("Minions ipsum chasy para tu la bodaaa bananaaaa hana dul sae. Chasy hana dul sae pepete hana dul sae belloo! Tatata bala tu ti aamoo! Jeje.");
watermark.setOrientation(WatermarkOrientation.DIAGONAL);
watermark.setDossierTemplateId(dte.getId());
var watermarkConfig = watermarkClient.createOrUpdateWatermark(watermark);
List<FileAttributeConfigEntity> fces = new ArrayList<>();
for (int i = 0; i < FILE_ATTRIBUTE_COUNT; i++) {
FileAttributeConfigEntity fce = new FileAttributeConfigEntity();
@ -122,7 +136,7 @@ public class FilePerformanceTest extends AbstractPersistenceServerServiceTest {
d.setDossierTemplate(dte);
d.setDueDate(OffsetDateTime.now());
d.setDescription("Lorem Ipsum");
d.setWatermarkEnabled(true);
d.setWatermarkId(watermarkConfig.getId());
d.setStartDate(OffsetDateTime.now());
d.setApproverIds(Sets.newTreeSet("1", "2", "3", "4", "5", "6", "7", "8", "9", "10"));
d.setMemberIds(Sets.newTreeSet("1", "2", "3", "4", "5", "6", "7", "8", "9", "10"));

View File

@ -196,7 +196,6 @@ public abstract class AbstractPersistenceServerServiceTest {
dossierAttributeConfigRepository.deleteAll();
downloadStatusRepository.deleteAll();
fileAttributesRepository.deleteAll();
watermarkRepository.deleteAll();
smtpRepository.deleteAll();
digitalSignatureRepository.deleteAll();
fileAttributesGeneralConfigurationRepository.deleteAll();
@ -212,12 +211,12 @@ public abstract class AbstractPersistenceServerServiceTest {
legalBasisChangeRepository.deleteAll();
imageRecategorizationRepository.deleteAll();
legalBasisMappingRepository.deleteAll();
watermarkRepository.deleteAll();
ruleSetRepository.deleteAll();
smtpRepository.deleteAll();
fileRepository.deleteAll();
dossierRepository.deleteAll();
dossierStatusRepository.deleteAll();
watermarkRepository.deleteAll();
dossierTemplateRepository.deleteAll();
notificationPreferencesRepository.deleteAll();
indexInformationRepository.deleteAll();

View File

@ -1 +1 @@
[{"dossierId":"48c10c3e-9831-4165-a80e-6e96ba2c3e98","dossierTemplateId":"49156a1f-30cc-412f-8778-eb5bd842d709","dossierName":"Dom2","date":"2021-11-15T13:27:48Z","description":"","status":"ACTIVE","ownerId":"f8960240-9973-42e9-9b0f-ed096ff5a018","memberIds":["f8960240-9973-42e9-9b0f-ed096ff5a018"],"approverIds":["f8960240-9973-42e9-9b0f-ed096ff5a018"],"downloadFileTypes":["PREVIEW","REDACTED"],"reportTypes":[],"dueDate":null,"reportTemplateIds":["e37613cb-e093-49af-ae69-5678148c29b8"],"watermarkEnabled":true,"watermarkPreviewEnabled":false,"softDeletedTime":null,"hardDeletedTime":null},{"dossierId":"b2c9c4e5-5382-4862-9402-5b619c41a68c","dossierTemplateId":"49156a1f-30cc-412f-8778-eb5bd842d709","dossierName":"Dom1","date":"2021-11-15T13:27:19Z","description":"","status":"ACTIVE","ownerId":"f8960240-9973-42e9-9b0f-ed096ff5a018","memberIds":["f8960240-9973-42e9-9b0f-ed096ff5a018"],"approverIds":["f8960240-9973-42e9-9b0f-ed096ff5a018"],"downloadFileTypes":["PREVIEW","REDACTED"],"reportTypes":[],"dueDate":null,"reportTemplateIds":["75674b0f-7c70-4903-b30a-2a4aa330b6b1","87553a68-49e7-4bb6-9af7-263dcb81e964","e2eff609-1dbb-4f10-a1a2-de71f03e5875","e37613cb-e093-49af-ae69-5678148c29b8"],"watermarkEnabled":true,"watermarkPreviewEnabled":false,"softDeletedTime":null,"hardDeletedTime":null},{"dossierId":"d46267c1-bb19-44ca-8c0c-60fb5d5309c5","dossierTemplateId":"9b7bd575-4566-4408-984f-b26da1d2616e","dossierName":"Dom3","date":"2021-11-15T13:28:31Z","description":"","status":"ACTIVE","ownerId":"f8960240-9973-42e9-9b0f-ed096ff5a018","memberIds":["f8960240-9973-42e9-9b0f-ed096ff5a018"],"approverIds":["f8960240-9973-42e9-9b0f-ed096ff5a018"],"downloadFileTypes":["PREVIEW","REDACTED"],"reportTypes":[],"dueDate":null,"reportTemplateIds":["bb18db9e-2730-403c-90c0-d306aac06284"],"watermarkEnabled":true,"watermarkPreviewEnabled":false,"softDeletedTime":null,"hardDeletedTime":null}]
[{"dossierId":"48c10c3e-9831-4165-a80e-6e96ba2c3e98","dossierTemplateId":"49156a1f-30cc-412f-8778-eb5bd842d709","dossierName":"Dom2","date":"2021-11-15T13:27:48Z","description":"","status":"ACTIVE","ownerId":"f8960240-9973-42e9-9b0f-ed096ff5a018","memberIds":["f8960240-9973-42e9-9b0f-ed096ff5a018"],"approverIds":["f8960240-9973-42e9-9b0f-ed096ff5a018"],"downloadFileTypes":["PREVIEW","REDACTED"],"reportTypes":[],"dueDate":null,"reportTemplateIds":["e37613cb-e093-49af-ae69-5678148c29b8"],"softDeletedTime":null,"hardDeletedTime":null},{"dossierId":"b2c9c4e5-5382-4862-9402-5b619c41a68c","dossierTemplateId":"49156a1f-30cc-412f-8778-eb5bd842d709","dossierName":"Dom1","date":"2021-11-15T13:27:19Z","description":"","status":"ACTIVE","ownerId":"f8960240-9973-42e9-9b0f-ed096ff5a018","memberIds":["f8960240-9973-42e9-9b0f-ed096ff5a018"],"approverIds":["f8960240-9973-42e9-9b0f-ed096ff5a018"],"downloadFileTypes":["PREVIEW","REDACTED"],"reportTypes":[],"dueDate":null,"reportTemplateIds":["75674b0f-7c70-4903-b30a-2a4aa330b6b1","87553a68-49e7-4bb6-9af7-263dcb81e964","e2eff609-1dbb-4f10-a1a2-de71f03e5875","e37613cb-e093-49af-ae69-5678148c29b8"],"softDeletedTime":null,"hardDeletedTime":null},{"dossierId":"d46267c1-bb19-44ca-8c0c-60fb5d5309c5","dossierTemplateId":"9b7bd575-4566-4408-984f-b26da1d2616e","dossierName":"Dom3","date":"2021-11-15T13:28:31Z","description":"","status":"ACTIVE","ownerId":"f8960240-9973-42e9-9b0f-ed096ff5a018","memberIds":["f8960240-9973-42e9-9b0f-ed096ff5a018"],"approverIds":["f8960240-9973-42e9-9b0f-ed096ff5a018"],"downloadFileTypes":["PREVIEW","REDACTED"],"reportTypes":[],"dueDate":null,"reportTemplateIds":["bb18db9e-2730-403c-90c0-d306aac06284"],"softDeletedTime":null,"hardDeletedTime":null}]

View File

@ -27,7 +27,7 @@
<properties>
<redaction-service.version>3.114.0</redaction-service.version>
<search-service.version>2.36.0</search-service.version>
<pdftron-redaction-service.version>3.96.0</pdftron-redaction-service.version>
<pdftron-redaction-service.version>3.105.0</pdftron-redaction-service.version>
<redaction-report-service.version>3.47.0</redaction-report-service.version>
</properties>