RED-3621: Implemented IndexInformation

This commit is contained in:
Philipp Schramm 2022-04-04 11:02:37 +02:00
parent 38cce583aa
commit 1b4e7cc0e0
13 changed files with 333 additions and 35 deletions

View File

@ -0,0 +1,19 @@
package com.iqser.red.service.persistence.service.v1.api.model.index;
import java.time.OffsetDateTime;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class IndexInformation {
private String indexConfigurationHash;
private OffsetDateTime updateDate;
}

View File

@ -0,0 +1,29 @@
package com.iqser.red.service.persistence.service.v1.api.resources;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.ResponseStatus;
import com.iqser.red.service.persistence.service.v1.api.model.index.IndexInformation;
public interface IndexInformationResource {
String PATH = "/index-information";
@ResponseBody
@ResponseStatus(value = HttpStatus.OK)
@GetMapping(value = PATH, produces = MediaType.APPLICATION_JSON_VALUE)
IndexInformation getIndexInformation();
@ResponseBody
@ResponseStatus(value = HttpStatus.OK)
@PostMapping(value = PATH, consumes = MediaType.APPLICATION_JSON_VALUE)
void updateIndexInformation(@RequestBody IndexInformation indexInformation);
}

View File

@ -1,14 +1,5 @@
package com.iqser.red.service.persistence.management.v1.processor;
import com.iqser.red.service.persistence.management.v1.processor.client.PDFTronRedactionClient;
import com.iqser.red.service.persistence.management.v1.processor.entity.annotations.CommentEntity;
import com.iqser.red.service.persistence.management.v1.processor.entity.audit.AuditEntity;
import com.iqser.red.service.persistence.management.v1.processor.entity.configuration.ColorsEntity;
import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.DossierEntity;
import com.iqser.red.service.persistence.management.v1.processor.entity.download.DownloadStatusEntity;
import com.iqser.red.service.persistence.management.v1.processor.entity.migration.MigrationEntity;
import com.iqser.red.service.persistence.management.v1.processor.entity.notification.NotificationEntity;
import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.ColorsRepository;
import org.springframework.boot.autoconfigure.domain.EntityScan;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.cloud.openfeign.support.PageJacksonModule;
@ -18,9 +9,20 @@ import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
import com.iqser.red.service.persistence.management.v1.processor.client.PDFTronRedactionClient;
import com.iqser.red.service.persistence.management.v1.processor.entity.annotations.CommentEntity;
import com.iqser.red.service.persistence.management.v1.processor.entity.audit.AuditEntity;
import com.iqser.red.service.persistence.management.v1.processor.entity.configuration.ColorsEntity;
import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.DossierEntity;
import com.iqser.red.service.persistence.management.v1.processor.entity.download.DownloadStatusEntity;
import com.iqser.red.service.persistence.management.v1.processor.entity.index.IndexInformationEntity;
import com.iqser.red.service.persistence.management.v1.processor.entity.migration.MigrationEntity;
import com.iqser.red.service.persistence.management.v1.processor.entity.notification.NotificationEntity;
import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.ColorsRepository;
@Configuration
@ComponentScan
@EntityScan(basePackageClasses = {CommentEntity.class, AuditEntity.class, NotificationEntity.class, ColorsEntity.class, DossierEntity.class, DownloadStatusEntity.class, MigrationEntity.class})
@EntityScan(basePackageClasses = {CommentEntity.class, AuditEntity.class, NotificationEntity.class, ColorsEntity.class, DossierEntity.class, DownloadStatusEntity.class, MigrationEntity.class, IndexInformationEntity.class})
@EnableJpaRepositories(basePackageClasses = ColorsRepository.class)
@EnableFeignClients(basePackageClasses = {PDFTronRedactionClient.class})
public class PersistenceServiceProcessorConfiguration {

View File

@ -0,0 +1,37 @@
package com.iqser.red.service.persistence.management.v1.processor.entity.index;
import java.time.OffsetDateTime;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
import com.iqser.red.service.persistence.service.v1.api.utils.SuppressFBWarnings;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@Entity
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Table(name = "index_information")
@SuppressFBWarnings("RCN_REDUNDANT_NULLCHECK_OF_NONNULL_VALUE")
public class IndexInformationEntity {
public final static String ID = "CONFIG_ID";
@Id
private final String id = IndexInformationEntity.ID;
@Column
private String indexConfigurationHash;
@Column
private OffsetDateTime updateDate;
}

View File

@ -0,0 +1,32 @@
package com.iqser.red.service.persistence.management.v1.processor.service.persistence;
import java.util.Optional;
import org.springframework.stereotype.Service;
import com.iqser.red.service.persistence.management.v1.processor.entity.index.IndexInformationEntity;
import com.iqser.red.service.persistence.management.v1.processor.exception.NotFoundException;
import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.IndexInformationRepository;
import lombok.RequiredArgsConstructor;
@Service
@RequiredArgsConstructor
public class IndexInformationPersistenceService {
private final IndexInformationRepository indexInformationRepository;
public IndexInformationEntity getIndexInformation() {
Optional<IndexInformationEntity> indexInformation = indexInformationRepository.findById(IndexInformationEntity.ID);
return indexInformation.orElseThrow(() -> new NotFoundException("Index information does not exist"));
}
public void updateIndexInformation(IndexInformationEntity indexInformation) {
indexInformationRepository.save(indexInformation);
}
}

View File

@ -0,0 +1,9 @@
package com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository;
import org.springframework.data.jpa.repository.JpaRepository;
import com.iqser.red.service.persistence.management.v1.processor.entity.index.IndexInformationEntity;
public interface IndexInformationRepository extends JpaRepository<IndexInformationEntity, String> {
}

View File

@ -27,6 +27,10 @@
<groupId>com.iqser.red.service</groupId>
<artifactId>pdftron-redaction-service-api-v1</artifactId>
</exclusion>
<exclusion>
<groupId>com.iqser.red.service</groupId>
<artifactId>persistence-service-api-v1</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>

View File

@ -0,0 +1,35 @@
package com.iqser.red.service.peristence.v1.server.controller;
import static com.iqser.red.service.persistence.management.v1.processor.utils.MagicConverter.convert;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
import com.iqser.red.service.persistence.management.v1.processor.entity.index.IndexInformationEntity;
import com.iqser.red.service.persistence.management.v1.processor.service.persistence.IndexInformationPersistenceService;
import com.iqser.red.service.persistence.service.v1.api.model.index.IndexInformation;
import com.iqser.red.service.persistence.service.v1.api.resources.IndexInformationResource;
import lombok.RequiredArgsConstructor;
@RestController
@RequiredArgsConstructor
public class IndexInformationController implements IndexInformationResource {
private final IndexInformationPersistenceService indexInformationPersistenceService;
@Override
public IndexInformation getIndexInformation() {
return convert(indexInformationPersistenceService.getIndexInformation(), IndexInformation.class);
}
@Override
public void updateIndexInformation(@RequestBody IndexInformation indexInformation) {
indexInformationPersistenceService.updateIndexInformation(convert(indexInformation, IndexInformationEntity.class));
}
}

View File

@ -0,0 +1,21 @@
databaseChangeLog:
- changeSet:
id: add-index-information
author: philipp
changes:
- createTable:
columns:
- column:
constraints:
nullable: false
primaryKey: true
primaryKeyName: index_information_pkey
name: id
type: VARCHAR(255)
- column:
name: index_configuration_hash
type: VARCHAR(255)
- column:
name: update_date
type: TIMESTAMP WITHOUT TIME ZONE
tableName: index_information

View File

@ -42,4 +42,6 @@ databaseChangeLog:
- include:
file: db/changelog/17-digital-signature-kms.changelog.yaml
- include:
file: db/changelog/18-add-migration-table.yaml
file: db/changelog/18-add-migration-table.yaml
- include:
file: db/changelog/19-add-index-information-table.yaml

View File

@ -0,0 +1,10 @@
package com.iqser.red.service.peristence.v1.server.integration.client;
import org.springframework.cloud.openfeign.FeignClient;
import com.iqser.red.service.persistence.service.v1.api.resources.IndexInformationResource;
@FeignClient(name = "IndexInformationClient", url = "http://localhost:${server.port}")
public interface IndexInformationClient extends IndexInformationResource {
}

View File

@ -0,0 +1,62 @@
package com.iqser.red.service.peristence.v1.server.integration.tests;
import static org.assertj.core.api.Assertions.assertThat;
import java.time.OffsetDateTime;
import java.time.temporal.ChronoUnit;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
import com.iqser.red.service.peristence.v1.server.integration.client.IndexInformationClient;
import com.iqser.red.service.peristence.v1.server.integration.utils.AbstractPersistenceServerServiceTest;
import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.IndexInformationRepository;
import com.iqser.red.service.persistence.service.v1.api.model.index.IndexInformation;
import feign.FeignException;
public class IndexInformationTest extends AbstractPersistenceServerServiceTest {
@Autowired
private IndexInformationClient indexInformationClient;
@Autowired
private IndexInformationRepository indexInformationRepository;
@Test
public void test() {
// No indexInformation exist
try {
IndexInformation indexInformation = indexInformationClient.getIndexInformation();
} catch (FeignException e) {
assertThat(e.status()).isEqualTo(404);
}
// Save indexInformation the first time
String hash = "This is the hash from the search-service";
OffsetDateTime timeStamp = OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS);
IndexInformation indexInformation = IndexInformation.builder().indexConfigurationHash(hash).updateDate(timeStamp).build();
indexInformationClient.updateIndexInformation(indexInformation);
IndexInformation indexInformationFromDb = indexInformationClient.getIndexInformation();
assertThat(indexInformationFromDb).isNotNull();
assertThat(indexInformationFromDb.getIndexConfigurationHash()).isEqualTo(hash);
assertThat(indexInformationFromDb.getUpdateDate()).isEqualTo(timeStamp);
// Update indexInformation
String newHash = "This is 2. the hash from the search-service";
OffsetDateTime newTimeStamp = OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS);
IndexInformation newIndexInformation = IndexInformation.builder().indexConfigurationHash(newHash).updateDate(newTimeStamp).build();
indexInformationClient.updateIndexInformation(newIndexInformation);
indexInformationFromDb = indexInformationClient.getIndexInformation();
assertThat(indexInformationFromDb).isNotNull();
assertThat(indexInformationFromDb.getIndexConfigurationHash()).isEqualTo(newHash);
assertThat(indexInformationFromDb.getUpdateDate()).isEqualTo(newTimeStamp);
}
}

View File

@ -1,24 +1,13 @@
package com.iqser.red.service.peristence.v1.server.integration.utils;
import com.iqser.red.service.pdftron.redaction.v1.api.model.*;
import com.iqser.red.service.peristence.v1.server.Application;
import com.iqser.red.service.peristence.v1.server.client.RedactionClient;
import com.iqser.red.service.peristence.v1.server.client.SearchClient;
import com.iqser.red.service.peristence.v1.server.integration.client.FileClient;
import com.iqser.red.service.peristence.v1.server.utils.MetricsPrinterService;
import com.iqser.red.service.peristence.v1.server.utils.StorageIdUtils;
import com.iqser.red.service.persistence.management.v1.processor.client.PDFTronRedactionClient;
import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.*;
import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file.FileType;
import com.iqser.red.service.redaction.v1.model.AnnotateResponse;
import com.iqser.red.service.redaction.v1.model.RedactionLog;
import com.iqser.red.service.redaction.v1.model.RedactionResult;
import com.iqser.red.storage.commons.StorageAutoConfiguration;
import com.iqser.red.storage.commons.service.StorageService;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.doAnswer;
import static org.mockito.Mockito.doNothing;
import static org.mockito.Mockito.when;
import org.assertj.core.util.Lists;
import org.junit.After;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.runner.RunWith;
import org.mockito.Mockito;
import org.springframework.amqp.core.AmqpAdmin;
@ -32,17 +21,60 @@ import org.springframework.boot.test.util.TestPropertyValues;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.context.ApplicationContextInitializer;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.annotation.*;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
import org.springframework.context.annotation.Primary;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringRunner;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.doAnswer;
import static org.mockito.Mockito.doNothing;
import static org.mockito.Mockito.when;
import java.util.List;
import java.util.TimeZone;
import com.iqser.red.service.pdftron.redaction.v1.api.model.DocumentRequest;
import com.iqser.red.service.pdftron.redaction.v1.api.model.PdfTronFlattenRequest;
import com.iqser.red.service.pdftron.redaction.v1.api.model.PdfTronFlattenResponse;
import com.iqser.red.service.pdftron.redaction.v1.api.model.PdfTronRedactionRequest;
import com.iqser.red.service.pdftron.redaction.v1.api.model.PdfTronRedactionResult;
import com.iqser.red.service.peristence.v1.server.Application;
import com.iqser.red.service.peristence.v1.server.client.RedactionClient;
import com.iqser.red.service.peristence.v1.server.client.SearchClient;
import com.iqser.red.service.peristence.v1.server.integration.client.FileClient;
import com.iqser.red.service.peristence.v1.server.utils.MetricsPrinterService;
import com.iqser.red.service.peristence.v1.server.utils.StorageIdUtils;
import com.iqser.red.service.persistence.management.v1.processor.client.PDFTronRedactionClient;
import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.AuditRepository;
import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.DigitalSignatureRepository;
import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.DossierAttributeConfigRepository;
import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.DossierAttributeRepository;
import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.DossierRepository;
import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.DossierStatusRepository;
import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.DossierTemplateRepository;
import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.DownloadStatusRepository;
import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.EntryRepository;
import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.FileAttributeConfigRepository;
import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.FileAttributesGeneralConfigurationRepository;
import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.FileAttributesRepository;
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.ForceRedactionRepository;
import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.ImageRecategorizationRepository;
import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.IndexInformationRepository;
import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.LegalBasisChangeRepository;
import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.LegalBasisMappingRepository;
import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.ManualRedactionRepository;
import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.NotificationPreferencesRepository;
import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.NotificationRepository;
import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.RemoveRedactionRepository;
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.RuleSetRepository;
import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.SMTPRepository;
import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.TypeRepository;
import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.ViewedPagesRepository;
import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.WatermarkRepository;
import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.file.FileType;
import com.iqser.red.service.redaction.v1.model.AnnotateResponse;
import com.iqser.red.service.redaction.v1.model.RedactionLog;
import com.iqser.red.service.redaction.v1.model.RedactionResult;
import com.iqser.red.storage.commons.StorageAutoConfiguration;
import com.iqser.red.storage.commons.service.StorageService;
@RunWith(SpringRunner.class)
@EnableFeignClients(basePackageClasses = FileClient.class)
@ -120,6 +152,9 @@ public abstract class AbstractPersistenceServerServiceTest {
protected MetricsPrinterService metricsPrinterService;
@Autowired
protected EntryRepository entryRepository;
@Autowired
protected IndexInformationRepository indexInformationRepository;
@Before
public void setupOptimize() {
@ -194,6 +229,7 @@ public abstract class AbstractPersistenceServerServiceTest {
dossierStatusRepository.deleteAll();
dossierTemplateRepository.deleteAll();
notificationPreferencesRepository.deleteAll();
indexInformationRepository.deleteAll();
}
static class Initializer implements ApplicationContextInitializer<ConfigurableApplicationContext> {