RED-3240 - Dossier Status

- add new entity DossierStatusEntity, add crud operations
- update DossierEntity to add dossierStatus
This commit is contained in:
devplant 2022-01-27 09:55:06 +02:00
parent 713d1fc5bc
commit 2a4ac35d78
16 changed files with 393 additions and 0 deletions

View File

@ -46,5 +46,6 @@ public class CreateOrUpdateDossierRequest {
private String requestingUser;
private String dossierStatusId;
}

View File

@ -0,0 +1,21 @@
package com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class CreateOrUpdateDossierStatusRequest {
private String dossierStatusId;
private String name;
private String description;
private String dossierTemplateId;
}

View File

@ -36,5 +36,6 @@ public class Dossier {
private OffsetDateTime dueDate;
private OffsetDateTime archivedTime;
private String dossierTemplateId;
private String dossierStatusId;
}

View File

@ -0,0 +1,26 @@
package com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.DossierTemplate;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.ArrayList;
import java.util.List;
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class DossierStatusInfo {
@JsonProperty("dossierStatusId")
private String id;
private String name;
private String description;
private String dossierTemplateId;
// private DossierTemplate dossierTemplate;
// private List<Dossier> dossierList = new ArrayList<>();
}

View File

@ -0,0 +1,46 @@
package com.iqser.red.service.persistence.service.v1.api.resources;
import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.CreateOrUpdateDossierStatusRequest;
import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.DossierStatusInfo;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.*;
import java.util.List;
public interface DossierStatusResource {
String DOSSIER_STATUS_PATH = "/dossier-status";
String DOSSIER_TEMPLATE_ID = "dossierTemplateId";
String DOSSIER_TEMPLATE_ID_PATH_VARIABLE = "/{" + DOSSIER_TEMPLATE_ID + "}";
String DOSSIER_STATUS_ID = "dossierStatusId";
String DOSSIER_STATUS_ID_PATH_VARIABLE = "/{" + DOSSIER_STATUS_ID + "}";
@ResponseBody
@ResponseStatus(HttpStatus.ACCEPTED)
@PostMapping(value = DOSSIER_STATUS_PATH, consumes = MediaType.APPLICATION_JSON_VALUE)
DossierStatusInfo createOrUpdateDossierStatus(@RequestBody CreateOrUpdateDossierStatusRequest dossierStatusRequest);
@ResponseBody
@ResponseStatus(value = HttpStatus.OK)
@GetMapping(value = DOSSIER_STATUS_PATH, produces = MediaType.APPLICATION_JSON_VALUE)
List<DossierStatusInfo> getAllDossierStatus();
@ResponseBody
@ResponseStatus(value = HttpStatus.OK)
@GetMapping(value = DOSSIER_STATUS_PATH + DOSSIER_TEMPLATE_ID_PATH_VARIABLE, produces = MediaType.APPLICATION_JSON_VALUE)
List<DossierStatusInfo> getAllDossierStatusForTemplate(@PathVariable(DOSSIER_TEMPLATE_ID) String dossierTemplateId);
@ResponseBody
@ResponseStatus(value = HttpStatus.OK)
@GetMapping(value = DOSSIER_STATUS_PATH + DOSSIER_STATUS_ID_PATH_VARIABLE, produces = MediaType.APPLICATION_JSON_VALUE)
DossierStatusInfo getDossierStatus(@PathVariable(DOSSIER_STATUS_ID) String dossierStatusId);
@ResponseBody
@ResponseStatus(value = HttpStatus.NO_CONTENT)
@DeleteMapping(value = DOSSIER_STATUS_PATH + DOSSIER_STATUS_ID_PATH_VARIABLE)
void deleteDossierStatus(@PathVariable(DOSSIER_STATUS_ID) String dossierStatusId);
}

View File

@ -98,4 +98,11 @@ public class DossierEntity {
@OneToMany(cascade = CascadeType.ALL, mappedBy = "dossier")
private List<DossierAttributeEntity> dossierAttributes = new ArrayList<>();
@JsonIgnore
@ManyToOne(fetch = FetchType.LAZY)
private DossierStatusEntity dossierStatus;
@Column(updatable = false, insertable = false, name = "dossier_status_id")
private String dossierStatusId;
}

View File

@ -0,0 +1,41 @@
package com.iqser.red.service.persistence.management.v1.processor.entity.dossier;
import com.fasterxml.jackson.annotation.JsonIgnore;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import javax.persistence.*;
import java.util.ArrayList;
import java.util.List;
@Data
@Entity
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Table(name = "dossier_status")
public class DossierStatusEntity {
@Id
private String id;
@Column
private String name;
@Column
private String description;
// un dossierTemplate, ( dossierTemplate are o lista de DossierStatus -> one to many )
@JsonIgnore
@ManyToOne(fetch = FetchType.LAZY)
private DossierTemplateEntity dossierTemplate;
@Column(updatable = false, insertable = false, name = "dossier_template_id")
private String dossierTemplateId;
//// si o lista de dossiers care sunt in acest status ( 0..n)
// @JsonIgnore
// @OneToMany(mappedBy = "dossierStatus")
// private List<DossierEntity> dossiers = new ArrayList<>();
}

View File

@ -87,4 +87,8 @@ public class DossierTemplateEntity {
@Transient
private DossierTemplateStatus dossierTemplateStatus;
@JsonIgnore
@OneToMany(mappedBy = "dossierTemplate")
private List<DossierStatusEntity> dossierStatusList = new ArrayList<>();
}

View File

@ -34,6 +34,7 @@ public class DossierPersistenceService {
private final FileRepository fileRepository;
private final DossierTemplateRepository dossierTemplateRepository;
private final ReportTemplateRepository reportTemplateRepository;
private final DossierStatusPersistenceService dossierStatusPersistenceService;
public DossierEntity insert(CreateOrUpdateDossierRequest createOrUpdateDossierRequest) {
@ -45,6 +46,10 @@ public class DossierPersistenceService {
dossier.setDate(OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS));
dossier.setLastUpdated(OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS));
dossier.setDossierTemplate(dossierTemplateRepository.getOne(createOrUpdateDossierRequest.getDossierTemplateId()));
if(createOrUpdateDossierRequest.getDossierStatusId() != null) {
//TODO: make other verifications that the dossierStatus matches the dossierTemplateId?
dossier.setDossierStatus(dossierStatusPersistenceService.getDossierStatus(createOrUpdateDossierRequest.getDossierStatusId()));
}
var reportTemplates = reportTemplateRepository.findAllById(createOrUpdateDossierRequest.getReportTemplateIds());
reportTemplates.forEach(r -> r.getDossiers().add(dossier));
dossier.setReportTemplates(reportTemplates);
@ -71,6 +76,9 @@ public class DossierPersistenceService {
}
});
dossier.setReportTemplates(reportTemplates);
if (createOrUpdateDossierRequest.getDossierStatusId() != null) {
dossier.setDossierStatus(dossierStatusPersistenceService.getDossierStatus(createOrUpdateDossierRequest.getDossierStatusId()));
}
});
}

View File

@ -0,0 +1,63 @@
package com.iqser.red.service.persistence.management.v1.processor.service.persistence;
import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.DossierStatusEntity;
import com.iqser.red.service.persistence.management.v1.processor.exception.NotFoundException;
import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.DossierStatusRepository;
import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.CreateOrUpdateDossierStatusRequest;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import javax.transaction.Transactional;
import java.util.List;
import java.util.Optional;
import java.util.UUID;
@Service
@RequiredArgsConstructor
public class DossierStatusPersistenceService {
public static final String DOSSIER_STATUS_NOT_FOUND_MESSAGE = "Dossier Status with Id %s not found.";
private final DossierStatusRepository dossierStatusRepository;
private final DossierTemplatePersistenceService dossierTemplatePersistenceService;
@Transactional
public DossierStatusEntity createOrUpdateDossierStatus(CreateOrUpdateDossierStatusRequest createOrUpdateDossierStatusRequest) {
if (createOrUpdateDossierStatusRequest.getDossierStatusId() != null) { //update
Optional<DossierStatusEntity> dossierStatus = dossierStatusRepository.findById(createOrUpdateDossierStatusRequest.getDossierStatusId());
if (dossierStatus.isPresent()) {
BeanUtils.copyProperties(createOrUpdateDossierStatusRequest, dossierStatus.get());
return dossierStatus.get();
} else {
throw new NotFoundException(String.format(DOSSIER_STATUS_NOT_FOUND_MESSAGE, createOrUpdateDossierStatusRequest.getDossierStatusId()));
}
} else {
DossierStatusEntity dossierStatus = new DossierStatusEntity();
dossierStatus.setId(UUID.randomUUID().toString());
BeanUtils.copyProperties(createOrUpdateDossierStatusRequest, dossierStatus);
var dossierTemplate = dossierTemplatePersistenceService.getDossierTemplate(createOrUpdateDossierStatusRequest.getDossierTemplateId());
var loadedDossierStatus = dossierStatusRepository.save(dossierStatus);
loadedDossierStatus.setDossierTemplate(dossierTemplate);
return loadedDossierStatus;
}
}
public List<DossierStatusEntity> getAllDossierStatus() {
return dossierStatusRepository.findAll();
}
public List<DossierStatusEntity> getAllDossierStatusForTemplate(String dossierTemplateId) {
return dossierStatusRepository.getAllDossierStatusForDossierTemplate(dossierTemplateId);
}
public DossierStatusEntity getDossierStatus(String dossierStatusId) {
return dossierStatusRepository.findById(dossierStatusId).orElseThrow(() -> new NotFoundException(String.format(DOSSIER_STATUS_NOT_FOUND_MESSAGE, dossierStatusId)));
}
public void deleteDossierStatus(String dossierStatusId) {
dossierStatusRepository.deleteById(dossierStatusId);
}
}

View File

@ -0,0 +1,13 @@
package com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository;
import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.DossierStatusEntity;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import java.util.List;
public interface DossierStatusRepository extends JpaRepository<DossierStatusEntity, String> {
@Query("select s from DossierStatusEntity s where s.dossierTemplateId = :dossierTemplateId")
List<DossierStatusEntity> getAllDossierStatusForDossierTemplate(String dossierTemplateId);
}

View File

@ -0,0 +1,48 @@
package com.iqser.red.service.peristence.v1.server.controller;
import com.iqser.red.service.persistence.management.v1.processor.service.persistence.DossierStatusPersistenceService;
import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.CreateOrUpdateDossierStatusRequest;
import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.DossierStatusInfo;
import com.iqser.red.service.persistence.service.v1.api.resources.DossierStatusResource;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
import static com.iqser.red.service.persistence.management.v1.processor.utils.MagicConverter.convert;
@Slf4j
@RestController
@RequiredArgsConstructor
public class DossierStatusController implements DossierStatusResource {
private final DossierStatusPersistenceService dossierStatusPersistenceService;
@Override
public DossierStatusInfo createOrUpdateDossierStatus(CreateOrUpdateDossierStatusRequest dossierStatusRequest) {
return convert(dossierStatusPersistenceService.createOrUpdateDossierStatus(dossierStatusRequest), DossierStatusInfo.class);
}
@Override
public List<DossierStatusInfo> getAllDossierStatus() {
return convert(dossierStatusPersistenceService.getAllDossierStatus(), DossierStatusInfo.class);
}
@Override
public List<DossierStatusInfo> getAllDossierStatusForTemplate(String dossierTemplateId) {
return convert(dossierStatusPersistenceService.getAllDossierStatus(), DossierStatusInfo.class);
}
@Override
public DossierStatusInfo getDossierStatus(String dossierStatusId) {
return convert(dossierStatusPersistenceService.getDossierStatus(dossierStatusId), DossierStatusInfo.class);
}
@Override
public void deleteDossierStatus(String dossierStatusId) {
dossierStatusPersistenceService.deleteDossierStatus(dossierStatusId);
}
}

View File

@ -0,0 +1,64 @@
databaseChangeLog:
- changeSet:
id: dossier-status-1
author: generated
changes:
- createTable:
columns:
- column:
constraints:
nullable: false
primaryKey: true
primaryKeyName: dossier_status_pkey
name: id
type: VARCHAR(255)
- column:
name: name
type: VARCHAR(255)
- column:
name: descriptiom
type: VARCHAR(255)
- column:
name: dossier_template_id
type: VARCHAR(255)
tableName: dossier_status
- changeSet:
id: dossier-status-2
author:
changes:
- addColumn:
columns:
- column:
name: dossier_status_id
type: VARCHAR(255)
tableName: dossier
- changeSet:
id: dossier-status-3
author: generated
changes:
- addForeignKeyConstraint:
baseColumnNames: dossier_template_id
baseTableName: dossier_status
constraintName: dossier_status_dossier_template_id
deferrable: false
initiallyDeferred: false
onDelete: NO ACTION
onUpdate: NO ACTION
referencedColumnNames: id
referencedTableName: dossier_template
validate: true
- changeSet:
id: dossier-status-4
author: generated
changes:
- addForeignKeyConstraint:
baseColumnNames: dossier_status_id
baseTableName: dossier
constraintName: dossier_dossier_status
deferrable: false
initiallyDeferred: false
onDelete: NO ACTION
onUpdate: NO ACTION
referencedColumnNames: id
referencedTableName: dossier_status
validate: true

View File

@ -7,3 +7,5 @@ databaseChangeLog:
file: db/changelog/3-added-annotation-modification-date.changelog.yaml
- include:
file: db/changelog/4-archived-dossier.changelog.yaml
- include:
file: db/changelog/5-dossier-status-table.changelog.yaml

View File

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

View File

@ -0,0 +1,40 @@
package com.iqser.red.service.peristence.v1.server.integration.tests;
import com.iqser.red.service.peristence.v1.server.integration.client.DossierStatusClient;
import com.iqser.red.service.peristence.v1.server.integration.service.DossierTemplateTesterAndProvider;
import com.iqser.red.service.peristence.v1.server.integration.utils.AbstractPersistenceServerServiceTest;
import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.CreateOrUpdateDossierStatusRequest;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
import static org.assertj.core.api.Assertions.assertThat;
public class DossierStatusTest extends AbstractPersistenceServerServiceTest {
@Autowired
private DossierStatusClient dossierStatusClient;
@Autowired
private DossierTemplateTesterAndProvider dossierTemplateTesterAndProvider;
@Test
public void testDossierStatus() {
var dossierTemplate = dossierTemplateTesterAndProvider.provideTestTemplate();
var allDossierStatus = dossierStatusClient.getAllDossierStatus();
assertThat(allDossierStatus.size()).isZero();
CreateOrUpdateDossierStatusRequest cru = new CreateOrUpdateDossierStatusRequest();
cru.setName("name1");
cru.setDescription("description1");
cru.setDossierTemplateId(dossierTemplate.getId());
var loadedDossierStatus = dossierStatusClient.createOrUpdateDossierStatus(cru);
assertThat(loadedDossierStatus).isNotNull();
allDossierStatus = dossierStatusClient.getAllDossierStatus();
assertThat(allDossierStatus.size()).isEqualTo(1);
}
}