diff --git a/dossierfacile-api-tenant/src/main/java/fr/dossierfacile/api/front/register/AbstractDocumentSaveStep.java b/dossierfacile-api-tenant/src/main/java/fr/dossierfacile/api/front/register/AbstractDocumentSaveStep.java index 2e712dc20..7f7453589 100644 --- a/dossierfacile-api-tenant/src/main/java/fr/dossierfacile/api/front/register/AbstractDocumentSaveStep.java +++ b/dossierfacile-api-tenant/src/main/java/fr/dossierfacile/api/front/register/AbstractDocumentSaveStep.java @@ -9,7 +9,6 @@ import fr.dossierfacile.common.entity.Document; import fr.dossierfacile.common.entity.DocumentPdfGenerationLog; import fr.dossierfacile.common.entity.Tenant; -import fr.dossierfacile.common.enums.LogType; import fr.dossierfacile.common.enums.PartnerCallBackType; import fr.dossierfacile.common.enums.TenantFileStatus; import fr.dossierfacile.common.repository.DocumentPdfGenerationLogRepository; @@ -51,7 +50,7 @@ public TenantModel saveStep(Tenant tenant, T documentForm) { } Document document = saveDocument(tenant, documentForm); - logService.saveLog(LogType.ACCOUNT_EDITED, tenant.getId()); + logService.saveDocumentEditedLog(document, tenant); Long logId = documentPdfGenerationLogRepository.save( DocumentPdfGenerationLog.builder() diff --git a/dossierfacile-api-tenant/src/main/java/fr/dossierfacile/api/front/service/FileServiceImpl.java b/dossierfacile-api-tenant/src/main/java/fr/dossierfacile/api/front/service/FileServiceImpl.java index 106dc5c0e..51b1505ed 100644 --- a/dossierfacile-api-tenant/src/main/java/fr/dossierfacile/api/front/service/FileServiceImpl.java +++ b/dossierfacile-api-tenant/src/main/java/fr/dossierfacile/api/front/service/FileServiceImpl.java @@ -32,7 +32,7 @@ public Document delete(Long id, Tenant tenant) { document.getFiles().remove(file); fileRepository.delete(file); - logService.saveLog(LogType.ACCOUNT_EDITED, tenant.getId()); + logService.saveDocumentEditedLog(document, tenant); if (document.getFiles().isEmpty()) { documentService.delete(document); diff --git a/dossierfacile-common-library/src/main/java/fr/dossierfacile/common/entity/Log.java b/dossierfacile-common-library/src/main/java/fr/dossierfacile/common/entity/Log.java index 520603958..1f4b11f80 100644 --- a/dossierfacile-common-library/src/main/java/fr/dossierfacile/common/entity/Log.java +++ b/dossierfacile-common-library/src/main/java/fr/dossierfacile/common/entity/Log.java @@ -58,6 +58,10 @@ public class Log implements Serializable { @Column(columnDefinition = "jsonb") private Object jsonProfile; + @Type(type = "jsonb") + @Column(columnDefinition = "jsonb") + private Object logDetails; + @Column private Long messageId; diff --git a/dossierfacile-common-library/src/main/java/fr/dossierfacile/common/model/EditedDocumentModel.java b/dossierfacile-common-library/src/main/java/fr/dossierfacile/common/model/EditedDocumentModel.java new file mode 100644 index 000000000..702be5fdb --- /dev/null +++ b/dossierfacile-common-library/src/main/java/fr/dossierfacile/common/model/EditedDocumentModel.java @@ -0,0 +1,41 @@ +package fr.dossierfacile.common.model; + +import com.fasterxml.jackson.annotation.JsonInclude; +import fr.dossierfacile.common.entity.Document; +import fr.dossierfacile.common.entity.Guarantor; +import fr.dossierfacile.common.entity.Tenant; +import fr.dossierfacile.common.enums.DocumentCategory; +import fr.dossierfacile.common.enums.DocumentSubCategory; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.Optional; + +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +@JsonInclude(JsonInclude.Include.NON_NULL) +public class EditedDocumentModel { + + private DocumentCategory documentCategory; + private DocumentSubCategory documentSubCategory; + private Boolean noDocument; + private Long tenantId; + private Long guarantorId; + + public static EditedDocumentModel from(Document document) { + return EditedDocumentModel.builder() + .documentCategory(document.getDocumentCategory()) + .documentSubCategory(document.getDocumentSubCategory()) + .noDocument(document.getNoDocument()) + .tenantId(Optional.ofNullable(document.getTenant()) + .map(Tenant::getId).orElse(null)) + .guarantorId(Optional.ofNullable(document.getGuarantor()) + .map(Guarantor::getId).orElse(null)) + .build(); + } + +} diff --git a/dossierfacile-common-library/src/main/java/fr/dossierfacile/common/service/LogServiceImpl.java b/dossierfacile-common-library/src/main/java/fr/dossierfacile/common/service/LogServiceImpl.java index 59a5981f7..9498288a7 100644 --- a/dossierfacile-common-library/src/main/java/fr/dossierfacile/common/service/LogServiceImpl.java +++ b/dossierfacile-common-library/src/main/java/fr/dossierfacile/common/service/LogServiceImpl.java @@ -1,11 +1,14 @@ package fr.dossierfacile.common.service; +import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; +import fr.dossierfacile.common.entity.Document; import fr.dossierfacile.common.entity.Log; import fr.dossierfacile.common.entity.Tenant; import fr.dossierfacile.common.enums.LogType; import fr.dossierfacile.common.mapper.DeletedTenantCommonMapper; +import fr.dossierfacile.common.model.EditedDocumentModel; import fr.dossierfacile.common.repository.LogRepository; import fr.dossierfacile.common.service.interfaces.LogService; import lombok.AllArgsConstructor; @@ -18,9 +21,9 @@ @Slf4j @AllArgsConstructor public class LogServiceImpl implements LogService { + private final LogRepository repository; private final DeletedTenantCommonMapper deletedTenantCommonMapper; - private ObjectMapper objectMapper = new ObjectMapper(); { @@ -56,4 +59,24 @@ public void saveLogWithTenantData(LogType logType, Tenant tenant) { ); } + @Override + public void saveDocumentEditedLog(Document document, Tenant editor) { + Log log = Log.builder() + .logType(LogType.ACCOUNT_EDITED) + .tenantId(editor.getId()) + .creationDateTime(LocalDateTime.now()) + .logDetails(writeDocumentEditionDetails(document, editor.getId())) + .build(); + saveLog(log); + } + + private String writeDocumentEditionDetails(Document document, Long tenantId) { + try { + return objectMapper.writeValueAsString(EditedDocumentModel.from(document)); + } catch (JsonProcessingException e) { + log.error("Cannot write details of document edition from tenant {}", tenantId); + } + return null; + } + } diff --git a/dossierfacile-common-library/src/main/java/fr/dossierfacile/common/service/interfaces/LogService.java b/dossierfacile-common-library/src/main/java/fr/dossierfacile/common/service/interfaces/LogService.java index 33b3e5cf5..5b3d69b73 100644 --- a/dossierfacile-common-library/src/main/java/fr/dossierfacile/common/service/interfaces/LogService.java +++ b/dossierfacile-common-library/src/main/java/fr/dossierfacile/common/service/interfaces/LogService.java @@ -1,5 +1,6 @@ package fr.dossierfacile.common.service.interfaces; +import fr.dossierfacile.common.entity.Document; import fr.dossierfacile.common.entity.Tenant; import fr.dossierfacile.common.enums.LogType; @@ -8,4 +9,7 @@ public interface LogService { void saveLog(LogType logType, Long tenantId); void saveLogWithTenantData(LogType logType, Tenant tenant); + + void saveDocumentEditedLog(Document document, Tenant editor); + } diff --git a/dossierfacile-common-library/src/main/resources/db/changelog/databaseChangeLog.xml b/dossierfacile-common-library/src/main/resources/db/changelog/databaseChangeLog.xml index 793dd2fea..e9e66e63f 100644 --- a/dossierfacile-common-library/src/main/resources/db/changelog/databaseChangeLog.xml +++ b/dossierfacile-common-library/src/main/resources/db/changelog/databaseChangeLog.xml @@ -130,5 +130,6 @@ + diff --git a/dossierfacile-common-library/src/main/resources/db/migration/202312010000-update-tenant-log-table.xml b/dossierfacile-common-library/src/main/resources/db/migration/202312010000-update-tenant-log-table.xml new file mode 100644 index 000000000..882375020 --- /dev/null +++ b/dossierfacile-common-library/src/main/resources/db/migration/202312010000-update-tenant-log-table.xml @@ -0,0 +1,12 @@ + + + + + + + + diff --git a/dossierfacile-common-library/src/test/java/fr/dossierfacile/common/service/LogServiceImplTest.java b/dossierfacile-common-library/src/test/java/fr/dossierfacile/common/service/LogServiceImplTest.java new file mode 100644 index 000000000..9ca76a801 --- /dev/null +++ b/dossierfacile-common-library/src/test/java/fr/dossierfacile/common/service/LogServiceImplTest.java @@ -0,0 +1,71 @@ +package fr.dossierfacile.common.service; + +import com.fasterxml.jackson.databind.ObjectMapper; +import fr.dossierfacile.common.entity.Document; +import fr.dossierfacile.common.entity.Guarantor; +import fr.dossierfacile.common.entity.Log; +import fr.dossierfacile.common.entity.Tenant; +import fr.dossierfacile.common.enums.DocumentCategory; +import fr.dossierfacile.common.enums.DocumentSubCategory; +import fr.dossierfacile.common.enums.LogType; +import fr.dossierfacile.common.repository.LogRepository; +import fr.dossierfacile.common.service.interfaces.LogService; +import org.junit.jupiter.api.Test; +import org.mockito.ArgumentCaptor; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; + +class LogServiceImplTest { + + private final LogRepository logRepository = mock(LogRepository.class); + private final LogService logService = new LogServiceImpl(logRepository, null, new ObjectMapper()); + + @Test + void should_save_edition_log_for_tenant_document() { + Document document = Document.builder() + .documentCategory(DocumentCategory.IDENTIFICATION) + .documentSubCategory(DocumentSubCategory.FRENCH_IDENTITY_CARD) + .tenant(tenantWithId(2L)) + .build(); + + logService.saveDocumentEditedLog(document, tenantWithId(1L)); + + Log savedLog = getSavedLog(); + assertThat(savedLog.getLogType()).isEqualTo(LogType.ACCOUNT_EDITED); + assertThat(savedLog.getTenantId()).isEqualTo(1L); + assertThat(savedLog.getLogDetails()).isEqualTo(""" + {"documentCategory":"IDENTIFICATION","documentSubCategory":"FRENCH_IDENTITY_CARD","tenantId":2}"""); + } + + @Test + void should_save_edition_log_for_guarantor_document() { + Document document = Document.builder() + .documentCategory(DocumentCategory.FINANCIAL) + .documentSubCategory(DocumentSubCategory.SALARY) + .noDocument(true) + .guarantor(Guarantor.builder().id(3L).build()) + .build(); + + logService.saveDocumentEditedLog(document, tenantWithId(2L)); + + Log savedLog = getSavedLog(); + assertThat(savedLog.getLogType()).isEqualTo(LogType.ACCOUNT_EDITED); + assertThat(savedLog.getTenantId()).isEqualTo(2L); + assertThat(savedLog.getLogDetails()).isEqualTo(""" + {"documentCategory":"FINANCIAL","documentSubCategory":"SALARY","noDocument":true,"guarantorId":3}"""); + } + + private static Tenant tenantWithId(long id) { + return Tenant.builder().id(id).build(); + } + + private Log getSavedLog() { + ArgumentCaptor logCaptor = ArgumentCaptor.forClass(Log.class); + verify(logRepository, times(1)).save(logCaptor.capture()); + return logCaptor.getAllValues().get(0); + } + +} \ No newline at end of file