From c270c35199bb244fd5a699d6b014d83c0f5c8a03 Mon Sep 17 00:00:00 2001 From: Marc Berger Date: Fri, 29 Mar 2024 11:12:44 +0100 Subject: [PATCH 01/75] rollback: suppression du "_" qui apparaissait devant _repondant_platine - MAJ du tU --- .../protools/backend/service/sugoi/SugoiCreateUserTaskTest.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/test/java/fr/insee/protools/backend/service/sugoi/SugoiCreateUserTaskTest.java b/src/test/java/fr/insee/protools/backend/service/sugoi/SugoiCreateUserTaskTest.java index d1fdf2f4..0da63561 100644 --- a/src/test/java/fr/insee/protools/backend/service/sugoi/SugoiCreateUserTaskTest.java +++ b/src/test/java/fr/insee/protools/backend/service/sugoi/SugoiCreateUserTaskTest.java @@ -77,6 +77,7 @@ void execute_should_work() throws JsonProcessingException { User userParam = acUserDto.getValue(); assertEquals(1, userParam.getHabilitations().size(),"We should have exactly one habilitation"); assertTrue(userParam.getHabilitations().contains(PLATINE_HABILITATION),"Platine habilitiation not found"); + assertEquals("repondant_platine",userParam.getHabilitations().get(0).getId(),"Platine habilitation should be repondant_platine"); //verif on password verify(sugoiService).postInitPassword(userId,expectedPwd); From 4e52ca9bb83884a1f26f903bde7ad600c36d244b Mon Sep 17 00:00:00 2001 From: Marc Berger Date: Tue, 16 Apr 2024 16:07:20 +0200 Subject: [PATCH 02/75] feat: gestion d'un champ mode (valeurs possibles "api" "queue") au json de contexte du processus --- .../service/FlowableVariableNameConstants.java | 2 ++ .../backend/service/context/ContextConstants.java | 3 ++- .../service/context/ContextServiceImpl.java | 14 ++++++++++++++ 3 files changed, 18 insertions(+), 1 deletion(-) diff --git a/src/main/java/fr/insee/protools/backend/service/FlowableVariableNameConstants.java b/src/main/java/fr/insee/protools/backend/service/FlowableVariableNameConstants.java index 0b728d5c..76996282 100644 --- a/src/main/java/fr/insee/protools/backend/service/FlowableVariableNameConstants.java +++ b/src/main/java/fr/insee/protools/backend/service/FlowableVariableNameConstants.java @@ -8,6 +8,8 @@ public class FlowableVariableNameConstants { //TODO : renommer toutes ces variables pour remplacer les - par des _ (comme ca ca sera utilisable dans les resolvers) //Protools context public static final String VARNAME_CONTEXT="context"; + //Async mode queue or api + public static final String VARNAME_MODE="mode"; public static final String VARNAME_CONTEXT_PARTITION_ID_LIST="contexte_partition_id_list"; public static final String VARNAME_CONTEXT_PARTITION_VARIABLES_BY_ID="contexte_partition_variables_by_partitionid"; //To treat partitions one by one (Long) diff --git a/src/main/java/fr/insee/protools/backend/service/context/ContextConstants.java b/src/main/java/fr/insee/protools/backend/service/context/ContextConstants.java index ad129b9e..a733d57d 100644 --- a/src/main/java/fr/insee/protools/backend/service/context/ContextConstants.java +++ b/src/main/java/fr/insee/protools/backend/service/context/ContextConstants.java @@ -7,7 +7,8 @@ public final class ContextConstants { public static final String CTX_CAMPAGNE_LABEL = "label"; public static final String CTX_CAMPAGNE_CONTEXTE = "contexte"; //Values: Enum CampaignContext... - + //Treatment using REST APIs or Asynch queue + public static final String CTX_MODE = "mode"; //api or queue //Metadonnees Part public static final String CTX_METADONNEES = "metadonnees"; public static final String CTX_META_OPERATION_ID = "operationId";//== platine : Survey diff --git a/src/main/java/fr/insee/protools/backend/service/context/ContextServiceImpl.java b/src/main/java/fr/insee/protools/backend/service/context/ContextServiceImpl.java index 7f3a5a7c..b94765bf 100644 --- a/src/main/java/fr/insee/protools/backend/service/context/ContextServiceImpl.java +++ b/src/main/java/fr/insee/protools/backend/service/context/ContextServiceImpl.java @@ -152,12 +152,21 @@ private Pair, JsonNode> processContextFile(MultipartFile fil if (!contextErrors.isEmpty()) { throw new BadContextIncorrectBPMNError(contextErrors.toString()); } + + String mode = rootContext.path(CTX_MODE).asText(); + if(!mode.equalsIgnoreCase("api") && mode.equalsIgnoreCase("queue")){ + throw new BadContextIncorrectBPMNError("The mode must be defined with values api or queue"); + } + log.info("idCampaign="+rootContext.path(CTX_CAMPAGNE_ID).textValue()); //Variables to store for this process Map variables = new HashMap<>(); //Store the raw json as string variables.put(VARNAME_CONTEXT, content); + //Store the mode + variables.put(VARNAME_MODE, mode); + // Extraction of campaign TIMER START/END dates // Do extraction of important BPMN Variables in separates functions @@ -181,6 +190,11 @@ private Pair, JsonNode> processContextFile(MultipartFile fil partitionVariables.put(CTX_PARTITION_DATE_FIN_COLLECTE,startEndDT.getValue() ); variablesByPartition.put(partitionId,partitionVariables); + + //The context defines only one partition + if(partitions.size()==1){ + variables.put(VARNAME_CURRENT_PARTITION_ID, partitionId); + } } variables.put(VARNAME_CONTEXT_PARTITION_ID_LIST, partitionIds); From 168ff25d570ab709fee5b3fc1453043476e61239 Mon Sep 17 00:00:00 2001 From: Marc Berger Date: Wed, 17 Apr 2024 14:53:41 +0200 Subject: [PATCH 03/75] feat: lecture REM en masse --- .../configuration/PropertiesLogger.java | 2 +- .../FlowableVariableNameConstants.java | 4 ++ .../backend/service/rem/RemService.java | 38 +++++++++++++++++-- .../RemGetPartitionListOfSuIdTask.java | 2 +- .../RemGetPartitionListOfSuIdTaskTest.java | 4 +- 5 files changed, 42 insertions(+), 8 deletions(-) diff --git a/src/main/java/fr/insee/protools/backend/configuration/PropertiesLogger.java b/src/main/java/fr/insee/protools/backend/configuration/PropertiesLogger.java index e0469771..37384a68 100644 --- a/src/main/java/fr/insee/protools/backend/configuration/PropertiesLogger.java +++ b/src/main/java/fr/insee/protools/backend/configuration/PropertiesLogger.java @@ -60,7 +60,7 @@ public class PropertiesLogger implements ApplicationListener baseMotsCaches = Set.of("password", "pwd", "jeton", "token", "secret", "credential", "pw"); - private static final Set prefixesAffichesParDefaut= Set.of("fr.insee","logging","keycloak","spring","application","server","springdoc","management"); + private static final Set prefixesAffichesParDefaut= Set.of("fr.insee","logging","keycloak","spring","application","server","springdoc","management","flowable","org.flowable"); private static final Set propertySourcesIgnoreesParDefaut = Set.of("systemProperties", "systemEnvironment"); public static final PropertySelectorEnum PROPERTY_SELECTOR_PAR_DEFAUT = PropertySelectorEnum.PREFIX; private static Set prefixForSelectedProps; diff --git a/src/main/java/fr/insee/protools/backend/service/FlowableVariableNameConstants.java b/src/main/java/fr/insee/protools/backend/service/FlowableVariableNameConstants.java index 76996282..352155ee 100644 --- a/src/main/java/fr/insee/protools/backend/service/FlowableVariableNameConstants.java +++ b/src/main/java/fr/insee/protools/backend/service/FlowableVariableNameConstants.java @@ -16,6 +16,10 @@ public class FlowableVariableNameConstants { public static final String VARNAME_CURRENT_PARTITION_ID="current_partition_id"; //to pass a list of REM survey ids (List) public static final String VARNAME_REM_SU_ID_LIST="rem_survey_unit_id_list"; + //To pass a list of REM Survey unit content (JsonNode) + public static final String VARNAME_REM_SU_LIST="rem_survey_unit_list"; + + //to pass a single REM survey unit's ID (Long) public static final String VARNAME_REM_SURVEY_UNIT_IDENTIFIER ="rem_survey_unit_id"; //to pass a REM survey unit content (JsonNode) diff --git a/src/main/java/fr/insee/protools/backend/service/rem/RemService.java b/src/main/java/fr/insee/protools/backend/service/rem/RemService.java index 7ce94ce9..b844cc07 100644 --- a/src/main/java/fr/insee/protools/backend/service/rem/RemService.java +++ b/src/main/java/fr/insee/protools/backend/service/rem/RemService.java @@ -1,5 +1,6 @@ package fr.insee.protools.backend.service.rem; +import com.fasterxml.jackson.databind.JsonNode; import fr.insee.protools.backend.dto.era.CensusJsonDto; import fr.insee.protools.backend.dto.rem.REMSurveyUnitDto; import fr.insee.protools.backend.dto.rem.SuIdMappingJson; @@ -21,8 +22,8 @@ public class RemService { private final WebClientHelper webClientHelper; - public Long[] getSampleSuIds(Long partitionId) { - log.debug("getSampleSuIds - partitionId={} ",partitionId); + public Long[] getPartitionSuIds(Long partitionId) { + log.debug("getPartitionSuIds - partitionId={} ",partitionId); try { var response = webClientHelper.getWebClient(KNOWN_API_REM) .get() @@ -32,13 +33,42 @@ public Long[] getSampleSuIds(Long partitionId) { .retrieve() .bodyToMono(Long[].class) .block(); - log.trace("partitionIds={} - response={} ", partitionId, response); + log.trace("partitionId={} - response={} ", partitionId, response); return response; } catch (WebClient4xxBPMNError e){ if(e.getHttpStatusCodeError().equals(HttpStatus.NOT_FOUND)){ String msg= - "Error 404/NOT_FOUND during get sample on REM with partitionId="+partitionId + "Error 404/NOT_FOUND during get partition on REM with partitionId="+partitionId + + " - msg="+e.getMessage(); + log.error(msg); + throw new WebClient4xxBPMNError(msg,e.getHttpStatusCodeError()); + } + //Currently no remediation so just rethrow + throw e; + } + } + + + public JsonNode[] getPartitionAllSU(Long partitionId) { + log.debug("getPartitionAllSU - partitionId={} ",partitionId); + try { + var response = webClientHelper.getWebClient(KNOWN_API_REM) + .get() + .uri(uriBuilder -> uriBuilder + .path("/survey-units/partitions/{partitionId}") + .queryParam("withExternals", true) + .build(partitionId)) + .retrieve() + .bodyToMono(JsonNode[].class) + .block(); + log.trace("partitionId={} - response.length={} ", partitionId, response.length); + return response; + } + catch (WebClient4xxBPMNError e){ + if(e.getHttpStatusCodeError().equals(HttpStatus.NOT_FOUND)){ + String msg= + "Error 404/NOT_FOUND during get SU on REM with partitionId="+partitionId + " - msg="+e.getMessage(); log.error(msg); throw new WebClient4xxBPMNError(msg,e.getHttpStatusCodeError()); diff --git a/src/main/java/fr/insee/protools/backend/service/rem/delegate/RemGetPartitionListOfSuIdTask.java b/src/main/java/fr/insee/protools/backend/service/rem/delegate/RemGetPartitionListOfSuIdTask.java index 07475f1c..fc1f4094 100644 --- a/src/main/java/fr/insee/protools/backend/service/rem/delegate/RemGetPartitionListOfSuIdTask.java +++ b/src/main/java/fr/insee/protools/backend/service/rem/delegate/RemGetPartitionListOfSuIdTask.java @@ -27,7 +27,7 @@ public void execute(DelegateExecution execution) { //No need protools context ==> no checkContextOrThrow log.info("ProcessInstanceId={} - partition={} begin",execution.getProcessInstanceId(),currentPartitionId); - Long[] partitionSUIds = remService.getSampleSuIds(currentPartitionId); + Long[] partitionSUIds = remService.getPartitionSuIds(currentPartitionId); List remSuIdList = List.of(partitionSUIds); execution.getParent().setVariableLocal(VARNAME_REM_SU_ID_LIST, remSuIdList); log.debug("ProcessInstanceId={} - partition={} - remSuIdList={} end",execution.getProcessInstanceId(),currentPartitionId,remSuIdList); diff --git a/src/test/java/fr/insee/protools/backend/service/rem/delegate/RemGetPartitionListOfSuIdTaskTest.java b/src/test/java/fr/insee/protools/backend/service/rem/delegate/RemGetPartitionListOfSuIdTaskTest.java index 6cf5d4b4..12f831bb 100644 --- a/src/test/java/fr/insee/protools/backend/service/rem/delegate/RemGetPartitionListOfSuIdTaskTest.java +++ b/src/test/java/fr/insee/protools/backend/service/rem/delegate/RemGetPartitionListOfSuIdTaskTest.java @@ -82,14 +82,14 @@ void execute_should_work_when_contextNpartition_and_variable_OK(String contexte, when(execution.getParent()).thenReturn(executionParent); List expectedResult = List.of(remSuIdList); - when(remService.getSampleSuIds(currentPartitionId)).thenReturn(remSuIdList); + when(remService.getPartitionSuIds(currentPartitionId)).thenReturn(remSuIdList); //Execute the unit under test remGetPartitionListOfSuIdTask.execute(execution); //Post conditions //Service called once and for the right partition - verify(remService).getSampleSuIds(currentPartitionId); + verify(remService).getPartitionSuIds(currentPartitionId); //Process instance variable set with the list of retrieved Ids verify(executionParent).setVariableLocal(VARNAME_REM_SU_ID_LIST, expectedResult); } From 58613a4146c2810b6ec0e18f4ba20adb35cf68aa Mon Sep 17 00:00:00 2001 From: Marc Berger Date: Wed, 17 Apr 2024 15:32:31 +0200 Subject: [PATCH 04/75] =?UTF-8?q?temporaire:=20force=20mont=C3=A9e=20sprin?= =?UTF-8?q?g=20pour=20contourner=20CVE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 70 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 70 insertions(+) diff --git a/pom.xml b/pom.xml index d7a5764b..6ad8ae11 100644 --- a/pom.xml +++ b/pom.xml @@ -35,6 +35,76 @@ + + org.springframework + spring-jdbc + 6.1.6 + + + org.springframework + spring-tx + 6.1.6 + + + org.springframework + spring-orm + 6.1.6 + + + org.springframework + spring-beans + 6.1.6 + + + org.springframework + spring-aop + 6.1.6 + + + org.springframework + spring-context + 6.1.6 + + + org.springframework + spring-expression + 6.1.6 + + + org.springframework + spring-web + 6.1.6 + + + org.springframework + spring-webmvc + 6.1.6 + + + org.springframework + spring-core + 6.1.6 + + + org.springframework + spring-jcl + 6.1.6 + + + org.springframework + spring-webflux + 6.1.6 + + + org.springframework + spring-test + 6.1.6 + test + + + + + org.flowable From 76ffd19c46e5e71858b842c90b1702d70c95ed19 Mon Sep 17 00:00:00 2001 From: Marc Berger Date: Wed, 17 Apr 2024 15:56:42 +0200 Subject: [PATCH 05/75] =?UTF-8?q?temporaire:=20force=20mont=C3=A9e=20sprin?= =?UTF-8?q?g=20pour=20contourner=20CVE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 153 +++++++++++++++++++++++++++++++------------------------- 1 file changed, 86 insertions(+), 67 deletions(-) diff --git a/pom.xml b/pom.xml index 6ad8ae11..539ad0bb 100644 --- a/pom.xml +++ b/pom.xml @@ -34,82 +34,95 @@ - - - org.springframework - spring-jdbc - 6.1.6 - - - org.springframework - spring-tx - 6.1.6 - - - org.springframework - spring-orm - 6.1.6 - - - org.springframework - spring-beans - 6.1.6 - - - org.springframework - spring-aop - 6.1.6 - - - org.springframework - spring-context - 6.1.6 - - - org.springframework - spring-expression - 6.1.6 - - - org.springframework - spring-web - 6.1.6 - - - org.springframework - spring-webmvc - 6.1.6 - - - org.springframework - spring-core - 6.1.6 - - - org.springframework - spring-jcl - 6.1.6 - - - org.springframework - spring-webflux - 6.1.6 - - - org.springframework - spring-test - 6.1.6 - test - + + + + org.springframework + spring-jdbc + 6.1.6 + + + org.springframework + spring-tx + 6.1.6 + + + org.springframework + spring-orm + 6.1.6 + + + org.springframework + spring-beans + 6.1.6 + + + org.springframework + spring-aop + 6.1.6 + + + org.springframework + spring-context + 6.1.6 + + + org.springframework + spring-expression + 6.1.6 + + + org.springframework + spring-web + 6.1.6 + + + org.springframework + spring-webmvc + 6.1.6 + + + org.springframework + spring-core + 6.1.6 + + + org.springframework + spring-jcl + 6.1.6 + + + org.springframework + spring-webflux + 6.1.6 + + + org.springframework + spring-test + 6.1.6 + test + + + + + + + org.flowable flowable-spring-boot-starter-process-rest ${flowable.version} + + + org.springframework + * + + @@ -124,6 +137,12 @@ org.flowable flowable-groovy-script-static-engine ${flowable.version} + + + org.springframework + * + + org.apache.groovy From c76a2a64f6a6ec063998136d273cfc4673ee68f9 Mon Sep 17 00:00:00 2001 From: Marc Berger Date: Wed, 17 Apr 2024 16:20:56 +0200 Subject: [PATCH 06/75] =?UTF-8?q?Revert=20"temporaire:=20force=20mont?= =?UTF-8?q?=C3=A9e=20spring=20pour=20contourner=20CVE"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This reverts commit 76ffd19c46e5e71858b842c90b1702d70c95ed19. --- pom.xml | 153 +++++++++++++++++++++++++------------------------------- 1 file changed, 67 insertions(+), 86 deletions(-) diff --git a/pom.xml b/pom.xml index 539ad0bb..6ad8ae11 100644 --- a/pom.xml +++ b/pom.xml @@ -34,95 +34,82 @@ - - - - - org.springframework - spring-jdbc - 6.1.6 - - - org.springframework - spring-tx - 6.1.6 - - - org.springframework - spring-orm - 6.1.6 - - - org.springframework - spring-beans - 6.1.6 - - - org.springframework - spring-aop - 6.1.6 - - - org.springframework - spring-context - 6.1.6 - - - org.springframework - spring-expression - 6.1.6 - - - org.springframework - spring-web - 6.1.6 - - - org.springframework - spring-webmvc - 6.1.6 - - - org.springframework - spring-core - 6.1.6 - - - org.springframework - spring-jcl - 6.1.6 - - - org.springframework - spring-webflux - 6.1.6 - - - org.springframework - spring-test - 6.1.6 - test - - - - - + + + org.springframework + spring-jdbc + 6.1.6 + + + org.springframework + spring-tx + 6.1.6 + + + org.springframework + spring-orm + 6.1.6 + + + org.springframework + spring-beans + 6.1.6 + + + org.springframework + spring-aop + 6.1.6 + + + org.springframework + spring-context + 6.1.6 + + + org.springframework + spring-expression + 6.1.6 + + + org.springframework + spring-web + 6.1.6 + + + org.springframework + spring-webmvc + 6.1.6 + + + org.springframework + spring-core + 6.1.6 + + + org.springframework + spring-jcl + 6.1.6 + + + org.springframework + spring-webflux + 6.1.6 + + + org.springframework + spring-test + 6.1.6 + test + - org.flowable flowable-spring-boot-starter-process-rest ${flowable.version} - - - org.springframework - * - - @@ -137,12 +124,6 @@ org.flowable flowable-groovy-script-static-engine ${flowable.version} - - - org.springframework - * - - org.apache.groovy From 9691258c524b132c878a706f6ef763f1d03f4c33 Mon Sep 17 00:00:00 2001 From: Marc Berger Date: Wed, 17 Apr 2024 16:21:00 +0200 Subject: [PATCH 07/75] =?UTF-8?q?Revert=20"temporaire:=20force=20mont?= =?UTF-8?q?=C3=A9e=20spring=20pour=20contourner=20CVE"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This reverts commit 58613a4146c2810b6ec0e18f4ba20adb35cf68aa. --- pom.xml | 70 --------------------------------------------------------- 1 file changed, 70 deletions(-) diff --git a/pom.xml b/pom.xml index 6ad8ae11..d7a5764b 100644 --- a/pom.xml +++ b/pom.xml @@ -35,76 +35,6 @@ - - org.springframework - spring-jdbc - 6.1.6 - - - org.springframework - spring-tx - 6.1.6 - - - org.springframework - spring-orm - 6.1.6 - - - org.springframework - spring-beans - 6.1.6 - - - org.springframework - spring-aop - 6.1.6 - - - org.springframework - spring-context - 6.1.6 - - - org.springframework - spring-expression - 6.1.6 - - - org.springframework - spring-web - 6.1.6 - - - org.springframework - spring-webmvc - 6.1.6 - - - org.springframework - spring-core - 6.1.6 - - - org.springframework - spring-jcl - 6.1.6 - - - org.springframework - spring-webflux - 6.1.6 - - - org.springframework - spring-test - 6.1.6 - test - - - - - org.flowable From a579bb6d7a4e1f53a3f0649cf15d86f84ca9576c Mon Sep 17 00:00:00 2001 From: Marc Berger Date: Wed, 17 Apr 2024 16:51:30 +0200 Subject: [PATCH 08/75] feat: lecture REM en masse --- .../delegate/RemGetPartitionListOfSuTask.java | 36 +++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 src/main/java/fr/insee/protools/backend/service/rem/delegate/RemGetPartitionListOfSuTask.java diff --git a/src/main/java/fr/insee/protools/backend/service/rem/delegate/RemGetPartitionListOfSuTask.java b/src/main/java/fr/insee/protools/backend/service/rem/delegate/RemGetPartitionListOfSuTask.java new file mode 100644 index 00000000..6cc9dcd7 --- /dev/null +++ b/src/main/java/fr/insee/protools/backend/service/rem/delegate/RemGetPartitionListOfSuTask.java @@ -0,0 +1,36 @@ +package fr.insee.protools.backend.service.rem.delegate; + +import com.fasterxml.jackson.databind.JsonNode; +import fr.insee.protools.backend.dto.rem.REMSurveyUnitDto; +import fr.insee.protools.backend.service.DelegateContextVerifier; +import fr.insee.protools.backend.service.rem.RemService; +import fr.insee.protools.backend.service.utils.FlowableVariableUtils; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.JavaDelegate; +import org.springframework.stereotype.Component; + +import java.util.List; + +import static fr.insee.protools.backend.service.FlowableVariableNameConstants.*; + +@Slf4j +@Component +@RequiredArgsConstructor +public class RemGetPartitionListOfSuTask implements JavaDelegate, DelegateContextVerifier { + + private final RemService remService; + + @Override + public void execute(DelegateExecution execution) { + Long currentPartitionId = FlowableVariableUtils.getVariableOrThrow(execution,VARNAME_CURRENT_PARTITION_ID, Long.class); + //No need protools context ==> no checkContextOrThrow + log.info("ProcessInstanceId={} - partition={} begin",execution.getProcessInstanceId(),currentPartitionId); + + JsonNode[] partitionSUs = remService.getPartitionAllSU(currentPartitionId); + List remSUList = List.of(partitionSUs); + execution.getParent().setVariableLocal(VARNAME_REM_SU_LIST, remSUList); + log.debug("ProcessInstanceId={} - partition={} - remSUList.size={} end",execution.getProcessInstanceId(),currentPartitionId,remSUList.size()); + } +} \ No newline at end of file From 8c8438d66b92537848cdc3a6cf223b799c4b5b56 Mon Sep 17 00:00:00 2001 From: Marc Berger Date: Thu, 18 Apr 2024 12:05:47 +0200 Subject: [PATCH 09/75] =?UTF-8?q?poc=20:=20ajout=20de=20logs=20pour=20obse?= =?UTF-8?q?rver=20temps=20de=20r=C3=A9ponse=20platine=20questionnaire?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../platine_sabiane/QuestionnairePlatineSabianeService.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/java/fr/insee/protools/backend/service/common/platine_sabiane/QuestionnairePlatineSabianeService.java b/src/main/java/fr/insee/protools/backend/service/common/platine_sabiane/QuestionnairePlatineSabianeService.java index d3752adf..e4bf16ba 100644 --- a/src/main/java/fr/insee/protools/backend/service/common/platine_sabiane/QuestionnairePlatineSabianeService.java +++ b/src/main/java/fr/insee/protools/backend/service/common/platine_sabiane/QuestionnairePlatineSabianeService.java @@ -156,6 +156,8 @@ else if(e.getHttpStatusCodeError().equals(HttpStatus.BAD_REQUEST)){ default void postSurveyUnit(SurveyUnitResponseDto suDto, String idCampaign) { WebClientHelper.logJson("postSurveyUnit: idCampaign="+idCampaign, suDto,getLogger(),Level.DEBUG); try { + //TODO : delete this log + getLogger().info("postSurveyUnit: BEFORE - idCampaign={} - idSu={}", idCampaign,suDto.getId()); var response = webClient() .post() .uri(uriBuilder -> uriBuilder @@ -165,7 +167,7 @@ default void postSurveyUnit(SurveyUnitResponseDto suDto, String idCampaign) { .retrieve() .bodyToMono(String.class) .block(); - getLogger().info("postSurveyUnit: idCampaign={} - idSu={} - response={} ", idCampaign,suDto.getId(), response); + getLogger().info("postSurveyUnit: AFTER - idCampaign={} - idSu={} - response={} ", idCampaign,suDto.getId(), response); } catch (WebClient4xxBPMNError e){ if(e.getHttpStatusCodeError().equals(HttpStatus.BAD_REQUEST)){ From b3bd1fa8e6a724c25b27aa982a4fe99dae574cbb Mon Sep 17 00:00:00 2001 From: Marc Berger Date: Thu, 18 Apr 2024 12:09:29 +0200 Subject: [PATCH 10/75] =?UTF-8?q?poc=20:=20ajout=20de=20logs=20pour=20obse?= =?UTF-8?q?rver=20temps=20de=20r=C3=A9ponse=20platine=20questionnaire?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../PlatineQuestionnaireCreateSurveyUnitTask.java | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/main/java/fr/insee/protools/backend/service/platine/delegate/PlatineQuestionnaireCreateSurveyUnitTask.java b/src/main/java/fr/insee/protools/backend/service/platine/delegate/PlatineQuestionnaireCreateSurveyUnitTask.java index 864abf91..36d727e9 100644 --- a/src/main/java/fr/insee/protools/backend/service/platine/delegate/PlatineQuestionnaireCreateSurveyUnitTask.java +++ b/src/main/java/fr/insee/protools/backend/service/platine/delegate/PlatineQuestionnaireCreateSurveyUnitTask.java @@ -13,6 +13,8 @@ import java.util.Set; +import static fr.insee.protools.backend.service.context.ContextConstants.CTX_CAMPAGNE_CONTEXTE; + @Slf4j @Component @RequiredArgsConstructor @@ -24,8 +26,16 @@ public class PlatineQuestionnaireCreateSurveyUnitTask implements JavaDelegate, D @Override public void execute(DelegateExecution execution) { JsonNode contextRootNode = protoolsContext.getContextByProcessInstance(execution.getProcessInstanceId()); + //TODO: delete this log if necessary + log.debug("ProcessInstanceId={} - campagne={} - begin" + ,execution.getProcessInstanceId(),contextRootNode.path(CTX_CAMPAGNE_CONTEXTE).asText()); + checkContextOrThrow(log,execution.getProcessInstanceId(), contextRootNode); QuestionnaireHelper.createSUTaskPlatine(execution,protoolsContext,platineQuestionnaireService); + log.debug("ProcessInstanceId={} - campagne={} - end", + execution.getProcessInstanceId(),contextRootNode.path(CTX_CAMPAGNE_CONTEXTE).asText()); + + } @Override From 61f5825f076bd0799b205db3898bbb8bdc7fd83e Mon Sep 17 00:00:00 2001 From: Chouchou 59 Date: Mon, 22 Apr 2024 11:29:42 +0200 Subject: [PATCH 11/75] =?UTF-8?q?feat:=20augmentation=20taille=20max=20fic?= =?UTF-8?q?hier=20=C3=A0=203Go?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fr/insee/protools/backend/webclient/WebClientHelper.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/fr/insee/protools/backend/webclient/WebClientHelper.java b/src/main/java/fr/insee/protools/backend/webclient/WebClientHelper.java index 4c12e189..48d24009 100644 --- a/src/main/java/fr/insee/protools/backend/webclient/WebClientHelper.java +++ b/src/main/java/fr/insee/protools/backend/webclient/WebClientHelper.java @@ -44,8 +44,8 @@ @Slf4j public class WebClientHelper { - private static final int DEFAULT_FILE_BUFFER_SIZE = 100 * 1024*1024; - private static final int DEFAULT_API_BUFFER_SIZE = 100 * 1024*1024; + private static final int DEFAULT_FILE_BUFFER_SIZE = 3000 * 1024*1024; + private static final int DEFAULT_API_BUFFER_SIZE = 3000 * 1024*1024; private final KeycloakService keycloakService; private final ApiConfigProperties apiConfigProperties; From 0c40b87f1a9fca021baca97e1527629147f34ba5 Mon Sep 17 00:00:00 2001 From: Chouchou 59 Date: Wed, 24 Apr 2024 15:50:25 +0200 Subject: [PATCH 12/75] log: add a log --- .../service/rem/delegate/RemGetPartitionListOfSuTask.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/fr/insee/protools/backend/service/rem/delegate/RemGetPartitionListOfSuTask.java b/src/main/java/fr/insee/protools/backend/service/rem/delegate/RemGetPartitionListOfSuTask.java index 6cc9dcd7..ee514e22 100644 --- a/src/main/java/fr/insee/protools/backend/service/rem/delegate/RemGetPartitionListOfSuTask.java +++ b/src/main/java/fr/insee/protools/backend/service/rem/delegate/RemGetPartitionListOfSuTask.java @@ -30,6 +30,7 @@ public void execute(DelegateExecution execution) { JsonNode[] partitionSUs = remService.getPartitionAllSU(currentPartitionId); List remSUList = List.of(partitionSUs); + log.trace("remSUList.length="+partitionSUs.length); execution.getParent().setVariableLocal(VARNAME_REM_SU_LIST, remSUList); log.debug("ProcessInstanceId={} - partition={} - remSUList.size={} end",execution.getProcessInstanceId(),currentPartitionId,remSUList.size()); } From 8827b41a9ab4f4d651822cf1f0b594bd5b76e48b Mon Sep 17 00:00:00 2001 From: Chouchou 59 Date: Fri, 26 Apr 2024 12:30:26 +0200 Subject: [PATCH 13/75] poc: tests de tout faire avec 2 taches --- .../platine_sabiane/QuestionnaireHelper.java | 30 +++++++++++- ...uestionnaireCreateSurveyUnitTask_old.java} | 2 +- ...neQuestionnaireCreateSurveyUnitTaskv2.java | 46 +++++++++++++++++++ .../backend/service/rem/RemService.java | 13 +++--- .../delegate/RemGetPartitionListOfSuTask.java | 7 ++- .../RemGetPartitionListOfSuTaskv2.java | 38 +++++++++++++++ ...QuestionnaireCreateSurveyUnitTaskTest.java | 4 +- 7 files changed, 128 insertions(+), 12 deletions(-) rename src/main/java/fr/insee/protools/backend/service/platine/delegate/{PlatineQuestionnaireCreateSurveyUnitTask.java => PlatineQuestionnaireCreateSurveyUnitTask_old.java} (94%) create mode 100644 src/main/java/fr/insee/protools/backend/service/platine/delegate/PlatineQuestionnaireCreateSurveyUnitTaskv2.java create mode 100644 src/main/java/fr/insee/protools/backend/service/rem/delegate/RemGetPartitionListOfSuTaskv2.java diff --git a/src/main/java/fr/insee/protools/backend/service/common/platine_sabiane/QuestionnaireHelper.java b/src/main/java/fr/insee/protools/backend/service/common/platine_sabiane/QuestionnaireHelper.java index 26f7e1ea..228ca8cb 100644 --- a/src/main/java/fr/insee/protools/backend/service/common/platine_sabiane/QuestionnaireHelper.java +++ b/src/main/java/fr/insee/protools/backend/service/common/platine_sabiane/QuestionnaireHelper.java @@ -9,6 +9,7 @@ import fr.insee.protools.backend.dto.platine_sabiane_questionnaire.campaign.MetadataValue; import fr.insee.protools.backend.dto.platine_sabiane_questionnaire.surveyunit.SurveyUnitResponseDto; import fr.insee.protools.backend.service.context.ContextService; +import fr.insee.protools.backend.service.exception.IncorrectSUBPMNError; import fr.insee.protools.backend.service.exception.JsonParsingBPMNError; import fr.insee.protools.backend.service.nomenclature.NomenclatureService; import fr.insee.protools.backend.service.platine.utils.PlatineHelper; @@ -25,8 +26,7 @@ import static com.fasterxml.jackson.databind.DeserializationFeature.FAIL_ON_MISSING_CREATOR_PROPERTIES; import static com.fasterxml.jackson.databind.DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES; -import static fr.insee.protools.backend.service.FlowableVariableNameConstants.VARNAME_CURRENT_PARTITION_ID; -import static fr.insee.protools.backend.service.FlowableVariableNameConstants.VARNAME_REM_SURVEY_UNIT; +import static fr.insee.protools.backend.service.FlowableVariableNameConstants.*; import static fr.insee.protools.backend.service.context.ContextConstants.*; import static fr.insee.protools.backend.service.utils.ContextUtils.getCurrentPartitionNode; @@ -252,6 +252,32 @@ public static void createSUTaskPlatine(DelegateExecution execution, ContextServi createSUTaskPlatineSabiane(execution, protoolsContext, service, false); } + public static void createAllSUTaskPlatine(DelegateExecution execution, ContextService protoolsContext, QuestionnairePlatineSabianeService service) { + JsonNode contextRootNode = protoolsContext.getContextByProcessInstance(execution.getProcessInstanceId()); + + Long currentPartitionId = FlowableVariableUtils.getVariableOrThrow(execution, VARNAME_CURRENT_PARTITION_ID, Long.class); + JsonNode[] suArray = FlowableVariableUtils.getVariableOrThrow(execution, VARNAME_REM_SU_LIST, JsonNode[].class); + + JsonNode currentPartitionNode = getCurrentPartitionNode(contextRootNode, currentPartitionId); + + for (int i = 0; i getContextErrors(JsonNode contextRootNode) { + return QuestionnaireHelper.getCreateSUContextErrorsPlatine(contextRootNode); + } + +} diff --git a/src/main/java/fr/insee/protools/backend/service/rem/RemService.java b/src/main/java/fr/insee/protools/backend/service/rem/RemService.java index b844cc07..68a88399 100644 --- a/src/main/java/fr/insee/protools/backend/service/rem/RemService.java +++ b/src/main/java/fr/insee/protools/backend/service/rem/RemService.java @@ -51,18 +51,19 @@ public Long[] getPartitionSuIds(Long partitionId) { public JsonNode[] getPartitionAllSU(Long partitionId) { - log.debug("getPartitionAllSU - partitionId={} ",partitionId); + log.error("getPartitionAllSU - partitionId={} ",partitionId); try { var response = webClientHelper.getWebClient(KNOWN_API_REM) .get() - .uri(uriBuilder -> uriBuilder - .path("/survey-units/partitions/{partitionId}") - .queryParam("withExternals", true) - .build(partitionId)) + // .uri(uriBuilder -> uriBuilder + // .path("/survey-units/partitions/{partitionId}") + // .queryParam("withExternals", true) + // .build(partitionId)) + .uri("/starter/ues") .retrieve() .bodyToMono(JsonNode[].class) .block(); - log.trace("partitionId={} - response.length={} ", partitionId, response.length); + log.error("partitionId={} - response.length={} ", partitionId, response.length); return response; } catch (WebClient4xxBPMNError e){ diff --git a/src/main/java/fr/insee/protools/backend/service/rem/delegate/RemGetPartitionListOfSuTask.java b/src/main/java/fr/insee/protools/backend/service/rem/delegate/RemGetPartitionListOfSuTask.java index ee514e22..334f54d9 100644 --- a/src/main/java/fr/insee/protools/backend/service/rem/delegate/RemGetPartitionListOfSuTask.java +++ b/src/main/java/fr/insee/protools/backend/service/rem/delegate/RemGetPartitionListOfSuTask.java @@ -11,7 +11,9 @@ import org.flowable.engine.delegate.JavaDelegate; import org.springframework.stereotype.Component; +import java.util.Arrays; import java.util.List; +import java.util.stream.Collectors; import static fr.insee.protools.backend.service.FlowableVariableNameConstants.*; @@ -29,7 +31,10 @@ public void execute(DelegateExecution execution) { log.info("ProcessInstanceId={} - partition={} begin",execution.getProcessInstanceId(),currentPartitionId); JsonNode[] partitionSUs = remService.getPartitionAllSU(currentPartitionId); - List remSUList = List.of(partitionSUs); + // Convert JsonNode array to List using streams + List remSUList = Arrays.stream(partitionSUs) + .map(JsonNode::toString) + .collect(Collectors.toList()); log.trace("remSUList.length="+partitionSUs.length); execution.getParent().setVariableLocal(VARNAME_REM_SU_LIST, remSUList); log.debug("ProcessInstanceId={} - partition={} - remSUList.size={} end",execution.getProcessInstanceId(),currentPartitionId,remSUList.size()); diff --git a/src/main/java/fr/insee/protools/backend/service/rem/delegate/RemGetPartitionListOfSuTaskv2.java b/src/main/java/fr/insee/protools/backend/service/rem/delegate/RemGetPartitionListOfSuTaskv2.java new file mode 100644 index 00000000..0b023620 --- /dev/null +++ b/src/main/java/fr/insee/protools/backend/service/rem/delegate/RemGetPartitionListOfSuTaskv2.java @@ -0,0 +1,38 @@ +package fr.insee.protools.backend.service.rem.delegate; + +import com.fasterxml.jackson.databind.JsonNode; +import fr.insee.protools.backend.service.DelegateContextVerifier; +import fr.insee.protools.backend.service.rem.RemService; +import fr.insee.protools.backend.service.utils.FlowableVariableUtils; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.JavaDelegate; +import org.springframework.stereotype.Component; + +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +import static fr.insee.protools.backend.service.FlowableVariableNameConstants.VARNAME_CURRENT_PARTITION_ID; +import static fr.insee.protools.backend.service.FlowableVariableNameConstants.VARNAME_REM_SU_LIST; + +@Slf4j +@Component +@RequiredArgsConstructor +public class RemGetPartitionListOfSuTaskv2 implements JavaDelegate, DelegateContextVerifier { + + private final RemService remService; + + @Override + public void execute(DelegateExecution execution) { + Long currentPartitionId = FlowableVariableUtils.getVariableOrThrow(execution,VARNAME_CURRENT_PARTITION_ID, Long.class); + //No need protools context ==> no checkContextOrThrow + log.info("ProcessInstanceId={} - partition={} begin",execution.getProcessInstanceId(),currentPartitionId); + + JsonNode[] partitionSUs = remService.getPartitionAllSU(currentPartitionId); + log.trace("remSUList.length="+partitionSUs.length); + execution.getParent().setVariableLocal(VARNAME_REM_SU_LIST, partitionSUs); + log.debug("ProcessInstanceId={} - partition={} - remSUList.size={} end",execution.getProcessInstanceId(),currentPartitionId,partitionSUs.length); + } +} \ No newline at end of file diff --git a/src/test/java/fr/insee/protools/backend/service/platine/delegate/PlatineQuestionnaireCreateSurveyUnitTaskTest.java b/src/test/java/fr/insee/protools/backend/service/platine/delegate/PlatineQuestionnaireCreateSurveyUnitTaskTest.java index 22afcdeb..c10deb8b 100644 --- a/src/test/java/fr/insee/protools/backend/service/platine/delegate/PlatineQuestionnaireCreateSurveyUnitTaskTest.java +++ b/src/test/java/fr/insee/protools/backend/service/platine/delegate/PlatineQuestionnaireCreateSurveyUnitTaskTest.java @@ -34,11 +34,11 @@ class PlatineQuestionnaireCreateSurveyUnitTaskTest extends TestWithContext { PlatineQuestionnaireService platineQuestionnaireService; @InjectMocks - PlatineQuestionnaireCreateSurveyUnitTask platineQuestionnaireCreateSurveyUnitTask; + PlatineQuestionnaireCreateSurveyUnitTask_old platineQuestionnaireCreateSurveyUnitTask; - final static String ressourceFolder = ClassUtils.convertClassNameToResourcePath(PlatineQuestionnaireCreateSurveyUnitTask.class.getPackageName()); + final static String ressourceFolder = ClassUtils.convertClassNameToResourcePath(PlatineQuestionnaireCreateSurveyUnitTask_old.class.getPackageName()); final static String platine_context_json = ressourceFolder+"/protools-contexte-platine-individu.json"; final static String platine_context_logement_json = ressourceFolder+"/protools-contexte-platine-individu.json"; From b247e23b2bbf4091e455eed1f8a980030ad16141 Mon Sep 17 00:00:00 2001 From: Chouchou 59 Date: Fri, 26 Apr 2024 12:43:00 +0200 Subject: [PATCH 14/75] poc: bonne uri rem --- .../insee/protools/backend/service/rem/RemService.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/main/java/fr/insee/protools/backend/service/rem/RemService.java b/src/main/java/fr/insee/protools/backend/service/rem/RemService.java index 68a88399..e50c9527 100644 --- a/src/main/java/fr/insee/protools/backend/service/rem/RemService.java +++ b/src/main/java/fr/insee/protools/backend/service/rem/RemService.java @@ -55,11 +55,11 @@ public JsonNode[] getPartitionAllSU(Long partitionId) { try { var response = webClientHelper.getWebClient(KNOWN_API_REM) .get() - // .uri(uriBuilder -> uriBuilder - // .path("/survey-units/partitions/{partitionId}") - // .queryParam("withExternals", true) - // .build(partitionId)) - .uri("/starter/ues") + .uri(uriBuilder -> uriBuilder + .path("/survey-units/partitions/{partitionId}") + .queryParam("withExternals", true) + .build(partitionId)) + // .uri("/starter/ues") .retrieve() .bodyToMono(JsonNode[].class) .block(); From 875838fabcc0363228dde581240024a0c37bdcec Mon Sep 17 00:00:00 2001 From: Chouchou 59 Date: Fri, 26 Apr 2024 23:09:59 +0200 Subject: [PATCH 15/75] =?UTF-8?q?poc:=20test=20en=20parall=C3=A8le?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../PlatinePilotageCreateSurveyUnitTask.java | 32 +++++++++---------- ...PlatineQuestionnaireCreateContextTask.java | 19 +++++------ .../delegate/RemGetPartitionListOfSuTask.java | 12 ++++--- 3 files changed, 33 insertions(+), 30 deletions(-) diff --git a/src/main/java/fr/insee/protools/backend/service/platine/delegate/PlatinePilotageCreateSurveyUnitTask.java b/src/main/java/fr/insee/protools/backend/service/platine/delegate/PlatinePilotageCreateSurveyUnitTask.java index 7ba7ff32..c9d7ba9c 100644 --- a/src/main/java/fr/insee/protools/backend/service/platine/delegate/PlatinePilotageCreateSurveyUnitTask.java +++ b/src/main/java/fr/insee/protools/backend/service/platine/delegate/PlatinePilotageCreateSurveyUnitTask.java @@ -45,22 +45,22 @@ public class PlatinePilotageCreateSurveyUnitTask implements JavaDelegate, Delega private final PlatinePilotageService platinePilotageService; @Override - public void execute(DelegateExecution execution) { - JsonNode contextRootNode = protoolsContext.getContextByProcessInstance(execution.getProcessInstanceId()); - checkContextOrThrow(log,execution.getProcessInstanceId(), contextRootNode); - String campainId = contextRootNode.path(CTX_CAMPAGNE_ID).asText(); - Long currentPartitionId = FlowableVariableUtils.getVariableOrThrow(execution,VARNAME_CURRENT_PARTITION_ID, Long.class); - JsonNode remSUNode = FlowableVariableUtils.getVariableOrThrow(execution,VARNAME_REM_SURVEY_UNIT, JsonNode.class); - String idInternaute = FlowableVariableUtils.getVariableOrThrow(execution, VARNAME_DIRECTORYACCESS_ID_CONTACT, String.class); - JsonNode currentPartitionNode = getCurrentPartitionNode(contextRootNode, currentPartitionId); - - //Create the platine DTO object - QuestioningWebclientDto dto = computeQuestioningWebclientDto(remSUNode,currentPartitionNode,idInternaute,campainId); - - log.info("ProcessInstanceId={} campainId={} - currentPartitionId={} - remSUNode.id={} ", - execution.getProcessInstanceId(), campainId,currentPartitionId,dto.getSurveyUnit().getIdSu()); - //Call service - platinePilotageService.putQuestionings(dto); + public void execute(DelegateExecution execution) { + JsonNode contextRootNode = protoolsContext.getContextByProcessInstance(execution.getProcessInstanceId()); + checkContextOrThrow(log,execution.getProcessInstanceId(), contextRootNode); + String campainId = contextRootNode.path(CTX_CAMPAGNE_ID).asText(); + Long currentPartitionId = FlowableVariableUtils.getVariableOrThrow(execution,VARNAME_CURRENT_PARTITION_ID, Long.class); + JsonNode remSUNode = FlowableVariableUtils.getVariableOrThrow(execution,VARNAME_REM_SURVEY_UNIT, JsonNode.class); + String idInternaute = FlowableVariableUtils.getVariableOrThrow(execution, VARNAME_DIRECTORYACCESS_ID_CONTACT, String.class); + JsonNode currentPartitionNode = getCurrentPartitionNode(contextRootNode, currentPartitionId); + + //Create the platine DTO object + QuestioningWebclientDto dto = computeQuestioningWebclientDto(remSUNode,currentPartitionNode,idInternaute,campainId); + + log.info("ProcessInstanceId={} campainId={} - currentPartitionId={} - remSUNode.id={} ", + execution.getProcessInstanceId(), campainId,currentPartitionId,dto.getSurveyUnit().getIdSu()); + //Call service + platinePilotageService.putQuestionings(dto); } private static QuestioningWebclientDto computeQuestioningWebclientDto(JsonNode remSUNode, JsonNode currentPartitionNode,String idInternaute, String idCampagne) { diff --git a/src/main/java/fr/insee/protools/backend/service/platine/delegate/PlatineQuestionnaireCreateContextTask.java b/src/main/java/fr/insee/protools/backend/service/platine/delegate/PlatineQuestionnaireCreateContextTask.java index 7b361066..cd8d6734 100644 --- a/src/main/java/fr/insee/protools/backend/service/platine/delegate/PlatineQuestionnaireCreateContextTask.java +++ b/src/main/java/fr/insee/protools/backend/service/platine/delegate/PlatineQuestionnaireCreateContextTask.java @@ -36,17 +36,18 @@ public class PlatineQuestionnaireCreateContextTask implements JavaDelegate, Dele @Override public void execute(DelegateExecution execution) { - JsonNode contextRootNode = protoolsContext.getContextByProcessInstance(execution.getProcessInstanceId()); - //check context - checkContextOrThrow(log,execution.getProcessInstanceId(), contextRootNode); + if(false) { + JsonNode contextRootNode = protoolsContext.getContextByProcessInstance(execution.getProcessInstanceId()); + //check context + checkContextOrThrow(log, execution.getProcessInstanceId(), contextRootNode); - MetadataValue metadataDto = createMetadataDto(contextRootNode); - log.info("ProcessInstanceId={} - campagne={}" - ,execution.getProcessInstanceId(),contextRootNode.path(CTX_CAMPAGNE_CONTEXTE).asText()); - - QuestionnaireHelper.createQuestionnaire(contextRootNode,platineQuestionnaireService,nomenclatureService, - questionnaireModelService,execution.getProcessInstanceId(),metadataDto); + MetadataValue metadataDto = createMetadataDto(contextRootNode); + log.info("ProcessInstanceId={} - campagne={}" + , execution.getProcessInstanceId(), contextRootNode.path(CTX_CAMPAGNE_CONTEXTE).asText()); + QuestionnaireHelper.createQuestionnaire(contextRootNode, platineQuestionnaireService, nomenclatureService, + questionnaireModelService, execution.getProcessInstanceId(), metadataDto); + } log.debug("ProcessInstanceId={} end",execution.getProcessInstanceId()); } diff --git a/src/main/java/fr/insee/protools/backend/service/rem/delegate/RemGetPartitionListOfSuTask.java b/src/main/java/fr/insee/protools/backend/service/rem/delegate/RemGetPartitionListOfSuTask.java index 334f54d9..ab8faa93 100644 --- a/src/main/java/fr/insee/protools/backend/service/rem/delegate/RemGetPartitionListOfSuTask.java +++ b/src/main/java/fr/insee/protools/backend/service/rem/delegate/RemGetPartitionListOfSuTask.java @@ -32,11 +32,13 @@ public void execute(DelegateExecution execution) { JsonNode[] partitionSUs = remService.getPartitionAllSU(currentPartitionId); // Convert JsonNode array to List using streams - List remSUList = Arrays.stream(partitionSUs) - .map(JsonNode::toString) - .collect(Collectors.toList()); - log.trace("remSUList.length="+partitionSUs.length); + //List remSUList = Arrays.stream(partitionSUs) + // .map(JsonNode::toString) + // .collect(Collectors.toList()); + // log.trace("remSUList.length="+partitionSUs.length); + // execution.getParent().setVariableLocal(VARNAME_REM_SU_LIST, remSUList); + List remSUList = List.of(partitionSUs); execution.getParent().setVariableLocal(VARNAME_REM_SU_LIST, remSUList); - log.debug("ProcessInstanceId={} - partition={} - remSUList.size={} end",execution.getProcessInstanceId(),currentPartitionId,remSUList.size()); + log.debug("ProcessInstanceId={} - partition={} - partitionSUs.size={} end",execution.getProcessInstanceId(),currentPartitionId,partitionSUs.length); } } \ No newline at end of file From 7ad597493eeece4ed983e804a098eec17334b401 Mon Sep 17 00:00:00 2001 From: Chouchou 59 Date: Tue, 30 Apr 2024 15:47:02 +0200 Subject: [PATCH 16/75] =?UTF-8?q?poc:=20r=C3=A9activation=20cr=C3=A9ation?= =?UTF-8?q?=20campagne?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../platine/delegate/PlatineQuestionnaireCreateContextTask.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/main/java/fr/insee/protools/backend/service/platine/delegate/PlatineQuestionnaireCreateContextTask.java b/src/main/java/fr/insee/protools/backend/service/platine/delegate/PlatineQuestionnaireCreateContextTask.java index cd8d6734..006d6a13 100644 --- a/src/main/java/fr/insee/protools/backend/service/platine/delegate/PlatineQuestionnaireCreateContextTask.java +++ b/src/main/java/fr/insee/protools/backend/service/platine/delegate/PlatineQuestionnaireCreateContextTask.java @@ -36,7 +36,6 @@ public class PlatineQuestionnaireCreateContextTask implements JavaDelegate, Dele @Override public void execute(DelegateExecution execution) { - if(false) { JsonNode contextRootNode = protoolsContext.getContextByProcessInstance(execution.getProcessInstanceId()); //check context checkContextOrThrow(log, execution.getProcessInstanceId(), contextRootNode); @@ -47,7 +46,6 @@ public void execute(DelegateExecution execution) { QuestionnaireHelper.createQuestionnaire(contextRootNode, platineQuestionnaireService, nomenclatureService, questionnaireModelService, execution.getProcessInstanceId(), metadataDto); - } log.debug("ProcessInstanceId={} end",execution.getProcessInstanceId()); } From 4d006eb2138c6453c3ad9a67387eac57012944d3 Mon Sep 17 00:00:00 2001 From: Chouchou 59 Date: Thu, 2 May 2024 12:12:45 +0200 Subject: [PATCH 17/75] poc: changement niveau log --- .../service/common/platine_sabiane/QuestionnaireHelper.java | 2 +- .../platine_sabiane/QuestionnairePlatineSabianeService.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/fr/insee/protools/backend/service/common/platine_sabiane/QuestionnaireHelper.java b/src/main/java/fr/insee/protools/backend/service/common/platine_sabiane/QuestionnaireHelper.java index 228ca8cb..384d8870 100644 --- a/src/main/java/fr/insee/protools/backend/service/common/platine_sabiane/QuestionnaireHelper.java +++ b/src/main/java/fr/insee/protools/backend/service/common/platine_sabiane/QuestionnaireHelper.java @@ -303,7 +303,7 @@ private static void createSUTaskPlatineSabiane(DelegateExecution execution, Cont : QuestionnaireHelper.computeDtoPlatine(remSUNode, currentPartitionNode); - log.info("ProcessInstanceId={} - mode={} - currentPartitionId={} - remSU.id={}", + log.debug("ProcessInstanceId={} - mode={} - currentPartitionId={} - remSU.id={}", execution.getProcessInstanceId(), modeSabiane ? "sabiane" : "platine", currentPartitionId, dto.getId()); //Call service diff --git a/src/main/java/fr/insee/protools/backend/service/common/platine_sabiane/QuestionnairePlatineSabianeService.java b/src/main/java/fr/insee/protools/backend/service/common/platine_sabiane/QuestionnairePlatineSabianeService.java index e4bf16ba..5bb5bb8c 100644 --- a/src/main/java/fr/insee/protools/backend/service/common/platine_sabiane/QuestionnairePlatineSabianeService.java +++ b/src/main/java/fr/insee/protools/backend/service/common/platine_sabiane/QuestionnairePlatineSabianeService.java @@ -157,7 +157,7 @@ default void postSurveyUnit(SurveyUnitResponseDto suDto, String idCampaign) { WebClientHelper.logJson("postSurveyUnit: idCampaign="+idCampaign, suDto,getLogger(),Level.DEBUG); try { //TODO : delete this log - getLogger().info("postSurveyUnit: BEFORE - idCampaign={} - idSu={}", idCampaign,suDto.getId()); + getLogger().debug("postSurveyUnit: BEFORE - idCampaign={} - idSu={}", idCampaign,suDto.getId()); var response = webClient() .post() .uri(uriBuilder -> uriBuilder From f46035325bcc3cee6c183fd96ce93bcc3f135e3d Mon Sep 17 00:00:00 2001 From: Chouchou 59 Date: Mon, 6 May 2024 09:49:35 +0200 Subject: [PATCH 18/75] =?UTF-8?q?poc:=20mode=20parall=C3=A8le=20stream?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../platine_sabiane/QuestionnaireHelper.java | 37 +++++++++++++------ .../service/context/ContextServiceImpl.java | 11 ++++++ 2 files changed, 37 insertions(+), 11 deletions(-) diff --git a/src/main/java/fr/insee/protools/backend/service/common/platine_sabiane/QuestionnaireHelper.java b/src/main/java/fr/insee/protools/backend/service/common/platine_sabiane/QuestionnaireHelper.java index 384d8870..0f80a3a5 100644 --- a/src/main/java/fr/insee/protools/backend/service/common/platine_sabiane/QuestionnaireHelper.java +++ b/src/main/java/fr/insee/protools/backend/service/common/platine_sabiane/QuestionnaireHelper.java @@ -23,6 +23,7 @@ import java.util.HashSet; import java.util.Iterator; import java.util.Set; +import java.util.stream.Stream; import static com.fasterxml.jackson.databind.DeserializationFeature.FAIL_ON_MISSING_CREATOR_PROPERTIES; import static com.fasterxml.jackson.databind.DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES; @@ -257,25 +258,39 @@ public static void createAllSUTaskPlatine(DelegateExecution execution, ContextSe Long currentPartitionId = FlowableVariableUtils.getVariableOrThrow(execution, VARNAME_CURRENT_PARTITION_ID, Long.class); JsonNode[] suArray = FlowableVariableUtils.getVariableOrThrow(execution, VARNAME_REM_SU_LIST, JsonNode[].class); - + Boolean parallele = FlowableVariableUtils.getVariableOrThrow(execution, "parallele", Boolean.class); JsonNode currentPartitionNode = getCurrentPartitionNode(contextRootNode, currentPartitionId); - for (int i = 0; i { + //Create the DTO object + SurveyUnitResponseDto dto = + QuestionnaireHelper.computeDtoPlatine(remSUNode, currentPartitionNode); + log.info("ProcessInstanceId={} - mode={} - currentPartitionId={} - remSU.id={}", + execution.getProcessInstanceId(), "platine", currentPartitionId, dto.getId()); + //Call service + service.postSurveyUnit(dto, contextRootNode.path(CTX_CAMPAGNE_ID).asText()); + }); + } + + log.debug("ProcessInstanceId={} end", execution.getProcessInstanceId()); } /** diff --git a/src/main/java/fr/insee/protools/backend/service/context/ContextServiceImpl.java b/src/main/java/fr/insee/protools/backend/service/context/ContextServiceImpl.java index b94765bf..0230f0d5 100644 --- a/src/main/java/fr/insee/protools/backend/service/context/ContextServiceImpl.java +++ b/src/main/java/fr/insee/protools/backend/service/context/ContextServiceImpl.java @@ -158,6 +158,15 @@ private Pair, JsonNode> processContextFile(MultipartFile fil throw new BadContextIncorrectBPMNError("The mode must be defined with values api or queue"); } + String parallele = rootContext.path("parallele").asText(); + Boolean paralleleB; + if(parallele.equalsIgnoreCase("true") ){ + paralleleB=Boolean.TRUE; + } + else{ + paralleleB=Boolean.FALSE; + } + log.info("idCampaign="+rootContext.path(CTX_CAMPAGNE_ID).textValue()); //Variables to store for this process @@ -166,6 +175,8 @@ private Pair, JsonNode> processContextFile(MultipartFile fil variables.put(VARNAME_CONTEXT, content); //Store the mode variables.put(VARNAME_MODE, mode); + variables.put("parallele", paralleleB); + // Extraction of campaign TIMER START/END dates From 35102265a744b540d5baea7b0839036e6f345764 Mon Sep 17 00:00:00 2001 From: Chouchou 59 Date: Mon, 6 May 2024 15:12:45 +0200 Subject: [PATCH 19/75] =?UTF-8?q?poc:=20mode=20parall=C3=A8le=20stream=20+?= =?UTF-8?q?=20log1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../protools/backend/service/context/ContextServiceImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/fr/insee/protools/backend/service/context/ContextServiceImpl.java b/src/main/java/fr/insee/protools/backend/service/context/ContextServiceImpl.java index 0230f0d5..acc57745 100644 --- a/src/main/java/fr/insee/protools/backend/service/context/ContextServiceImpl.java +++ b/src/main/java/fr/insee/protools/backend/service/context/ContextServiceImpl.java @@ -167,7 +167,7 @@ private Pair, JsonNode> processContextFile(MultipartFile fil paralleleB=Boolean.FALSE; } - log.info("idCampaign="+rootContext.path(CTX_CAMPAGNE_ID).textValue()); + log.info("idCampaign="+rootContext.path(CTX_CAMPAGNE_ID).textValue()+" - parallele="+paralleleB); //Variables to store for this process Map variables = new HashMap<>(); From 3eb8fc0e2d3bcdb1bd7013481f4d715df47d4ac5 Mon Sep 17 00:00:00 2001 From: Chouchou 59 Date: Mon, 6 May 2024 15:13:20 +0200 Subject: [PATCH 20/75] =?UTF-8?q?poc:=20mode=20parall=C3=A8le=20stream=20+?= =?UTF-8?q?=20log2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../insee/protools/backend/service/rem/RemService.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/main/java/fr/insee/protools/backend/service/rem/RemService.java b/src/main/java/fr/insee/protools/backend/service/rem/RemService.java index e50c9527..3a8dcf7c 100644 --- a/src/main/java/fr/insee/protools/backend/service/rem/RemService.java +++ b/src/main/java/fr/insee/protools/backend/service/rem/RemService.java @@ -55,11 +55,11 @@ public JsonNode[] getPartitionAllSU(Long partitionId) { try { var response = webClientHelper.getWebClient(KNOWN_API_REM) .get() - .uri(uriBuilder -> uriBuilder - .path("/survey-units/partitions/{partitionId}") - .queryParam("withExternals", true) - .build(partitionId)) - // .uri("/starter/ues") + //.uri(uriBuilder -> uriBuilder + // .path("/survey-units/partitions/{partitionId}") + // .queryParam("withExternals", true) + // .build(partitionId)) + .uri("/starter/ues") .retrieve() .bodyToMono(JsonNode[].class) .block(); From 1f86d8b308403c139fe38820efde15a7b0269709 Mon Sep 17 00:00:00 2001 From: Chouchou 59 Date: Mon, 6 May 2024 17:01:26 +0200 Subject: [PATCH 21/75] poc: annulation bidouille --- .../common/platine_sabiane/QuestionnaireHelper.java | 1 + .../insee/protools/backend/service/rem/RemService.java | 10 +++++----- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/src/main/java/fr/insee/protools/backend/service/common/platine_sabiane/QuestionnaireHelper.java b/src/main/java/fr/insee/protools/backend/service/common/platine_sabiane/QuestionnaireHelper.java index 0f80a3a5..6908f0de 100644 --- a/src/main/java/fr/insee/protools/backend/service/common/platine_sabiane/QuestionnaireHelper.java +++ b/src/main/java/fr/insee/protools/backend/service/common/platine_sabiane/QuestionnaireHelper.java @@ -260,6 +260,7 @@ public static void createAllSUTaskPlatine(DelegateExecution execution, ContextSe JsonNode[] suArray = FlowableVariableUtils.getVariableOrThrow(execution, VARNAME_REM_SU_LIST, JsonNode[].class); Boolean parallele = FlowableVariableUtils.getVariableOrThrow(execution, "parallele", Boolean.class); JsonNode currentPartitionNode = getCurrentPartitionNode(contextRootNode, currentPartitionId); + log.info("parallele="+parallele+"- Boolean.FALSE.equals(parallele)="+Boolean.FALSE.equals(parallele)); if(Boolean.FALSE.equals(parallele)) { for (int i = 0; i < suArray.length; i++) { diff --git a/src/main/java/fr/insee/protools/backend/service/rem/RemService.java b/src/main/java/fr/insee/protools/backend/service/rem/RemService.java index 3a8dcf7c..42dfbf31 100644 --- a/src/main/java/fr/insee/protools/backend/service/rem/RemService.java +++ b/src/main/java/fr/insee/protools/backend/service/rem/RemService.java @@ -55,11 +55,11 @@ public JsonNode[] getPartitionAllSU(Long partitionId) { try { var response = webClientHelper.getWebClient(KNOWN_API_REM) .get() - //.uri(uriBuilder -> uriBuilder - // .path("/survey-units/partitions/{partitionId}") - // .queryParam("withExternals", true) - // .build(partitionId)) - .uri("/starter/ues") + .uri(uriBuilder -> uriBuilder + .path("/survey-units/partitions/{partitionId}") + .queryParam("withExternals", true) + .build(partitionId)) + //.uri("/starter/ues") .retrieve() .bodyToMono(JsonNode[].class) .block(); From 6f8ecc44ec1e400df38d42adc22b94e07251a23f Mon Sep 17 00:00:00 2001 From: Chouchou 59 Date: Tue, 7 May 2024 09:12:43 +0200 Subject: [PATCH 22/75] poc: fix sur listes --- .../common/platine_sabiane/QuestionnaireHelper.java | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/main/java/fr/insee/protools/backend/service/common/platine_sabiane/QuestionnaireHelper.java b/src/main/java/fr/insee/protools/backend/service/common/platine_sabiane/QuestionnaireHelper.java index 6908f0de..4b054c1c 100644 --- a/src/main/java/fr/insee/protools/backend/service/common/platine_sabiane/QuestionnaireHelper.java +++ b/src/main/java/fr/insee/protools/backend/service/common/platine_sabiane/QuestionnaireHelper.java @@ -22,6 +22,7 @@ import java.util.HashSet; import java.util.Iterator; +import java.util.List; import java.util.Set; import java.util.stream.Stream; @@ -257,14 +258,15 @@ public static void createAllSUTaskPlatine(DelegateExecution execution, ContextSe JsonNode contextRootNode = protoolsContext.getContextByProcessInstance(execution.getProcessInstanceId()); Long currentPartitionId = FlowableVariableUtils.getVariableOrThrow(execution, VARNAME_CURRENT_PARTITION_ID, Long.class); - JsonNode[] suArray = FlowableVariableUtils.getVariableOrThrow(execution, VARNAME_REM_SU_LIST, JsonNode[].class); + List listeUe = FlowableVariableUtils.getVariableOrThrow(execution, VARNAME_REM_SU_LIST, List.class); + + Boolean parallele = FlowableVariableUtils.getVariableOrThrow(execution, "parallele", Boolean.class); JsonNode currentPartitionNode = getCurrentPartitionNode(contextRootNode, currentPartitionId); log.info("parallele="+parallele+"- Boolean.FALSE.equals(parallele)="+Boolean.FALSE.equals(parallele)); if(Boolean.FALSE.equals(parallele)) { - for (int i = 0; i < suArray.length; i++) { - JsonNode remSUNode = suArray[i]; + for (JsonNode remSUNode : listeUe){ //Create the DTO object SurveyUnitResponseDto dto = QuestionnaireHelper.computeDtoPlatine(remSUNode, currentPartitionNode); @@ -277,8 +279,7 @@ public static void createAllSUTaskPlatine(DelegateExecution execution, ContextSe } } else{ - - Stream.of(suArray).parallel().forEach(remSUNode -> { + listeUe.stream().parallel().forEach(remSUNode -> { //Create the DTO object SurveyUnitResponseDto dto = QuestionnaireHelper.computeDtoPlatine(remSUNode, currentPartitionNode); From 2da21f791960e3b4d33179d73abb9475846a1d68 Mon Sep 17 00:00:00 2001 From: Chouchou 59 Date: Tue, 7 May 2024 09:58:09 +0200 Subject: [PATCH 23/75] poc: sleep pour retry dans le stream --- .../platine_sabiane/QuestionnaireHelper.java | 25 ++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-) diff --git a/src/main/java/fr/insee/protools/backend/service/common/platine_sabiane/QuestionnaireHelper.java b/src/main/java/fr/insee/protools/backend/service/common/platine_sabiane/QuestionnaireHelper.java index 4b054c1c..0496aa83 100644 --- a/src/main/java/fr/insee/protools/backend/service/common/platine_sabiane/QuestionnaireHelper.java +++ b/src/main/java/fr/insee/protools/backend/service/common/platine_sabiane/QuestionnaireHelper.java @@ -18,6 +18,7 @@ import fr.insee.protools.backend.service.sabiane.SabianeIdHelper; import fr.insee.protools.backend.service.utils.FlowableVariableUtils; import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.delegate.BpmnError; import org.flowable.engine.delegate.DelegateExecution; import java.util.HashSet; @@ -280,15 +281,33 @@ public static void createAllSUTaskPlatine(DelegateExecution execution, ContextSe } else{ listeUe.stream().parallel().forEach(remSUNode -> { + int retryCount = 0; + boolean finished=false; //Create the DTO object SurveyUnitResponseDto dto = QuestionnaireHelper.computeDtoPlatine(remSUNode, currentPartitionNode); log.info("ProcessInstanceId={} - mode={} - currentPartitionId={} - remSU.id={}", execution.getProcessInstanceId(), "platine", currentPartitionId, dto.getId()); - - //Call service - service.postSurveyUnit(dto, contextRootNode.path(CTX_CAMPAGNE_ID).asText()); + while(retryCount<3 && !finished) + try { + //Call service + service.postSurveyUnit(dto, contextRootNode.path(CTX_CAMPAGNE_ID).asText()); + finished=true; + } + catch (BpmnError e){ + retryCount++; + if(retryCount>=3){ + throw e; + } + + + try { + Thread.sleep(retryCount*1000); + } catch (InterruptedException ex) { + throw new RuntimeException(ex); + } + } }); } From 34bb20a02bb3f4ac0f466ed76ba7e10984996767 Mon Sep 17 00:00:00 2001 From: Chouchou 59 Date: Tue, 7 May 2024 10:40:47 +0200 Subject: [PATCH 24/75] poc: messages dans la gestion des exceptions dans le stream --- .../common/platine_sabiane/QuestionnaireHelper.java | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/main/java/fr/insee/protools/backend/service/common/platine_sabiane/QuestionnaireHelper.java b/src/main/java/fr/insee/protools/backend/service/common/platine_sabiane/QuestionnaireHelper.java index 0496aa83..22bad659 100644 --- a/src/main/java/fr/insee/protools/backend/service/common/platine_sabiane/QuestionnaireHelper.java +++ b/src/main/java/fr/insee/protools/backend/service/common/platine_sabiane/QuestionnaireHelper.java @@ -295,16 +295,19 @@ public static void createAllSUTaskPlatine(DelegateExecution execution, ContextSe service.postSurveyUnit(dto, contextRootNode.path(CTX_CAMPAGNE_ID).asText()); finished=true; } - catch (BpmnError e){ + catch (Exception e){ retryCount++; + log.error("Exception : msg="+e.getMessage()); + log.error("RETRY retryCount="+retryCount); if(retryCount>=3){ throw e; } try { + log.error("RETRY sleep="+retryCount*1000); Thread.sleep(retryCount*1000); - } catch (InterruptedException ex) { + } catch (Exception ex) { throw new RuntimeException(ex); } } From 37042f93ec53469376d81bc532e2c157aa0badf6 Mon Sep 17 00:00:00 2001 From: Chouchou 59 Date: Tue, 7 May 2024 10:50:18 +0200 Subject: [PATCH 25/75] poc: catch throwable --- .../service/common/platine_sabiane/QuestionnaireHelper.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/fr/insee/protools/backend/service/common/platine_sabiane/QuestionnaireHelper.java b/src/main/java/fr/insee/protools/backend/service/common/platine_sabiane/QuestionnaireHelper.java index 22bad659..3ce090c2 100644 --- a/src/main/java/fr/insee/protools/backend/service/common/platine_sabiane/QuestionnaireHelper.java +++ b/src/main/java/fr/insee/protools/backend/service/common/platine_sabiane/QuestionnaireHelper.java @@ -295,7 +295,7 @@ public static void createAllSUTaskPlatine(DelegateExecution execution, ContextSe service.postSurveyUnit(dto, contextRootNode.path(CTX_CAMPAGNE_ID).asText()); finished=true; } - catch (Exception e){ + catch (Throwable e){ retryCount++; log.error("Exception : msg="+e.getMessage()); log.error("RETRY retryCount="+retryCount); From 7718a74f70e4c3b0c51b13f455f259ecf4cfd0af Mon Sep 17 00:00:00 2001 From: Chouchou 59 Date: Tue, 7 May 2024 11:12:26 +0200 Subject: [PATCH 26/75] poc: catch throwable - sleep plus longtemps --- .../platine_sabiane/QuestionnaireHelper.java | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/main/java/fr/insee/protools/backend/service/common/platine_sabiane/QuestionnaireHelper.java b/src/main/java/fr/insee/protools/backend/service/common/platine_sabiane/QuestionnaireHelper.java index 3ce090c2..67f9aa2c 100644 --- a/src/main/java/fr/insee/protools/backend/service/common/platine_sabiane/QuestionnaireHelper.java +++ b/src/main/java/fr/insee/protools/backend/service/common/platine_sabiane/QuestionnaireHelper.java @@ -272,7 +272,7 @@ public static void createAllSUTaskPlatine(DelegateExecution execution, ContextSe SurveyUnitResponseDto dto = QuestionnaireHelper.computeDtoPlatine(remSUNode, currentPartitionNode); - log.info("ProcessInstanceId={} - mode={} - currentPartitionId={} - remSU.id={}", + log.trace("ProcessInstanceId={} - mode={} - currentPartitionId={} - remSU.id={}", execution.getProcessInstanceId(), "platine", currentPartitionId, dto.getId()); //Call service @@ -287,9 +287,9 @@ public static void createAllSUTaskPlatine(DelegateExecution execution, ContextSe SurveyUnitResponseDto dto = QuestionnaireHelper.computeDtoPlatine(remSUNode, currentPartitionNode); - log.info("ProcessInstanceId={} - mode={} - currentPartitionId={} - remSU.id={}", + log.trace("ProcessInstanceId={} - mode={} - currentPartitionId={} - remSU.id={}", execution.getProcessInstanceId(), "platine", currentPartitionId, dto.getId()); - while(retryCount<3 && !finished) + while(retryCount<10 && !finished) try { //Call service service.postSurveyUnit(dto, contextRootNode.path(CTX_CAMPAGNE_ID).asText()); @@ -297,16 +297,16 @@ public static void createAllSUTaskPlatine(DelegateExecution execution, ContextSe } catch (Throwable e){ retryCount++; - log.error("Exception : msg="+e.getMessage()); - log.error("RETRY retryCount="+retryCount); - if(retryCount>=3){ + int sleepMs = 1000 + retryCount*10000; + log.error(" Exception : remSU.id={} - retryCount={} - - sleepMs={} - msg={} ", + dto.getId(), retryCount,sleepMs,e.getMessage());; + if(retryCount>=10){ throw e; } try { - log.error("RETRY sleep="+retryCount*1000); - Thread.sleep(retryCount*1000); + Thread.sleep(15000); } catch (Exception ex) { throw new RuntimeException(ex); } From 3bb64927a0a5cf5da22926faeb67a87b63032fd7 Mon Sep 17 00:00:00 2001 From: Chouchou 59 Date: Tue, 7 May 2024 11:12:48 +0200 Subject: [PATCH 27/75] poc: catch throwable - sleep plus longtemps --- .../service/common/platine_sabiane/QuestionnaireHelper.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/fr/insee/protools/backend/service/common/platine_sabiane/QuestionnaireHelper.java b/src/main/java/fr/insee/protools/backend/service/common/platine_sabiane/QuestionnaireHelper.java index 67f9aa2c..6e2d8019 100644 --- a/src/main/java/fr/insee/protools/backend/service/common/platine_sabiane/QuestionnaireHelper.java +++ b/src/main/java/fr/insee/protools/backend/service/common/platine_sabiane/QuestionnaireHelper.java @@ -298,7 +298,7 @@ public static void createAllSUTaskPlatine(DelegateExecution execution, ContextSe catch (Throwable e){ retryCount++; int sleepMs = 1000 + retryCount*10000; - log.error(" Exception : remSU.id={} - retryCount={} - - sleepMs={} - msg={} ", + log.error(" Exception : remSU.id={} - retryCount={} - sleepMs={} - msg={} ", dto.getId(), retryCount,sleepMs,e.getMessage());; if(retryCount>=10){ throw e; From d896a61d4d476006cb035ac0930b95b51a16863d Mon Sep 17 00:00:00 2001 From: Chouchou 59 Date: Tue, 7 May 2024 11:13:24 +0200 Subject: [PATCH 28/75] =?UTF-8?q?poc:=20catch=20throwable=20-=20sleep=20pl?= =?UTF-8?q?us=20longtemps=20:=201000ms=20le=201er=20coup=20et=2010s=20*=20?= =?UTF-8?q?nb=20r=C3=A9essais?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/common/platine_sabiane/QuestionnaireHelper.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/fr/insee/protools/backend/service/common/platine_sabiane/QuestionnaireHelper.java b/src/main/java/fr/insee/protools/backend/service/common/platine_sabiane/QuestionnaireHelper.java index 6e2d8019..aa85450f 100644 --- a/src/main/java/fr/insee/protools/backend/service/common/platine_sabiane/QuestionnaireHelper.java +++ b/src/main/java/fr/insee/protools/backend/service/common/platine_sabiane/QuestionnaireHelper.java @@ -296,8 +296,8 @@ public static void createAllSUTaskPlatine(DelegateExecution execution, ContextSe finished=true; } catch (Throwable e){ - retryCount++; int sleepMs = 1000 + retryCount*10000; + retryCount++; log.error(" Exception : remSU.id={} - retryCount={} - sleepMs={} - msg={} ", dto.getId(), retryCount,sleepMs,e.getMessage());; if(retryCount>=10){ From 9304c3109613fbfd427e3b34b2a20f24053fc1a7 Mon Sep 17 00:00:00 2001 From: Chouchou 59 Date: Tue, 7 May 2024 12:37:42 +0200 Subject: [PATCH 29/75] poc: retry avec boucle for --- .../platine_sabiane/QuestionnaireHelper.java | 60 ++++++++++--------- 1 file changed, 33 insertions(+), 27 deletions(-) diff --git a/src/main/java/fr/insee/protools/backend/service/common/platine_sabiane/QuestionnaireHelper.java b/src/main/java/fr/insee/protools/backend/service/common/platine_sabiane/QuestionnaireHelper.java index aa85450f..5ffee9fe 100644 --- a/src/main/java/fr/insee/protools/backend/service/common/platine_sabiane/QuestionnaireHelper.java +++ b/src/main/java/fr/insee/protools/backend/service/common/platine_sabiane/QuestionnaireHelper.java @@ -266,57 +266,63 @@ public static void createAllSUTaskPlatine(DelegateExecution execution, ContextSe JsonNode currentPartitionNode = getCurrentPartitionNode(contextRootNode, currentPartitionId); log.info("parallele="+parallele+"- Boolean.FALSE.equals(parallele)="+Boolean.FALSE.equals(parallele)); + String idCampaign = contextRootNode.path(CTX_CAMPAGNE_ID).asText(); + if(Boolean.FALSE.equals(parallele)) { for (JsonNode remSUNode : listeUe){ //Create the DTO object SurveyUnitResponseDto dto = QuestionnaireHelper.computeDtoPlatine(remSUNode, currentPartitionNode); - log.trace("ProcessInstanceId={} - mode={} - currentPartitionId={} - remSU.id={}", execution.getProcessInstanceId(), "platine", currentPartitionId, dto.getId()); //Call service - service.postSurveyUnit(dto, contextRootNode.path(CTX_CAMPAGNE_ID).asText()); + postSUWithRetry(service, dto, idCampaign); } } else{ + listeUe.stream().parallel().forEach(remSUNode -> { - int retryCount = 0; - boolean finished=false; //Create the DTO object SurveyUnitResponseDto dto = QuestionnaireHelper.computeDtoPlatine(remSUNode, currentPartitionNode); - log.trace("ProcessInstanceId={} - mode={} - currentPartitionId={} - remSU.id={}", execution.getProcessInstanceId(), "platine", currentPartitionId, dto.getId()); - while(retryCount<10 && !finished) - try { - //Call service - service.postSurveyUnit(dto, contextRootNode.path(CTX_CAMPAGNE_ID).asText()); - finished=true; - } - catch (Throwable e){ - int sleepMs = 1000 + retryCount*10000; - retryCount++; - log.error(" Exception : remSU.id={} - retryCount={} - sleepMs={} - msg={} ", - dto.getId(), retryCount,sleepMs,e.getMessage());; - if(retryCount>=10){ - throw e; - } - - - try { - Thread.sleep(15000); - } catch (Exception ex) { - throw new RuntimeException(ex); - } - } + + postSUWithRetry(service, dto, idCampaign); }); } log.debug("ProcessInstanceId={} end", execution.getProcessInstanceId()); } + private static void postSUWithRetry(QuestionnairePlatineSabianeService service, SurveyUnitResponseDto dto, String idCampaign) { + int retryCount = 0; + boolean finished=false; + while(retryCount<10 && !finished) + try { + //Call service + service.postSurveyUnit(dto, idCampaign); + finished=true; + } + catch (Throwable e){ + int sleepMs = 1000 + retryCount*10000; + retryCount++; + log.error(" Exception : remSU.id={} - retryCount={} - sleepMs={} - msg={} ", + dto.getId(), retryCount,sleepMs,e.getMessage());; + if(retryCount>=10){ + throw e; + } + + + try { + Thread.sleep(15000); + } catch (Exception ex) { + throw new RuntimeException(ex); + } + } + } + /** * Create a SU in Sabiane Questionnaire * @param execution From 2988e6ab294a6e64bb3813101b7d72fed38f5b65 Mon Sep 17 00:00:00 2001 From: Marc SNDIL Date: Tue, 14 May 2024 11:23:11 +0200 Subject: [PATCH 30/75] =?UTF-8?q?feat:=20La=20taille=20du=20mot=20de=20pas?= =?UTF-8?q?se=20g=C3=A9n=C3=A9r=C3=A9=20pour=20les=20comptes=20sugoi=20est?= =?UTF-8?q?=20de=208=20pour=20household=20et=20de=2012=20sinon?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../context/enums/CampaignContextEnum.java | 8 +++ .../service/sugoi/SugoiCreateUserTask.java | 49 ++++++++++++++++- .../utils/password/PasswordService.java | 2 +- .../utils/password/PasswordServiceImpl.java | 5 +- src/main/resources/application.properties | 1 - .../sugoi/SugoiCreateUserTaskTest.java | 55 ++++++++++++++++++- .../utils/password/PasswordServiceTest.java | 17 +++--- 7 files changed, 120 insertions(+), 17 deletions(-) diff --git a/src/main/java/fr/insee/protools/backend/service/context/enums/CampaignContextEnum.java b/src/main/java/fr/insee/protools/backend/service/context/enums/CampaignContextEnum.java index 1ff1c1f8..fe7a7142 100644 --- a/src/main/java/fr/insee/protools/backend/service/context/enums/CampaignContextEnum.java +++ b/src/main/java/fr/insee/protools/backend/service/context/enums/CampaignContextEnum.java @@ -13,4 +13,12 @@ public enum CampaignContextEnum { public String getAsString() { return contexte; } + + public static CampaignContextEnum fromLabel(String label) { + return switch (label.toLowerCase()) { + case "household" -> HOUSEHOLD; + case "business" -> BUSINESS; + default -> throw new IllegalStateException("Unexpected value for CampaignContextEnum: " + label); + }; + } } diff --git a/src/main/java/fr/insee/protools/backend/service/sugoi/SugoiCreateUserTask.java b/src/main/java/fr/insee/protools/backend/service/sugoi/SugoiCreateUserTask.java index 067f6879..566db79e 100644 --- a/src/main/java/fr/insee/protools/backend/service/sugoi/SugoiCreateUserTask.java +++ b/src/main/java/fr/insee/protools/backend/service/sugoi/SugoiCreateUserTask.java @@ -1,19 +1,27 @@ package fr.insee.protools.backend.service.sugoi; +import com.fasterxml.jackson.databind.JsonNode; import fr.insee.protools.backend.dto.sugoi.Habilitation; import fr.insee.protools.backend.dto.sugoi.User; import fr.insee.protools.backend.service.DelegateContextVerifier; +import fr.insee.protools.backend.service.context.ContextService; +import fr.insee.protools.backend.service.context.enums.CampaignContextEnum; import fr.insee.protools.backend.service.utils.password.PasswordService; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.EnumUtils; import org.flowable.engine.delegate.DelegateExecution; import org.flowable.engine.delegate.JavaDelegate; import org.springframework.stereotype.Component; +import java.util.Arrays; +import java.util.HashSet; import java.util.List; +import java.util.Set; import static fr.insee.protools.backend.service.FlowableVariableNameConstants.VARNAME_DIRECTORYACCESS_ID_CONTACT; import static fr.insee.protools.backend.service.FlowableVariableNameConstants.VARNAME_DIRECTORYACCESS_PWD_CONTACT; +import static fr.insee.protools.backend.service.context.ContextConstants.CTX_CAMPAGNE_CONTEXTE; @Slf4j @Component @@ -25,15 +33,23 @@ public class SugoiCreateUserTask implements JavaDelegate, DelegateContextVerifie private final SugoiService sugoiService; private final PasswordService passwordService; + private final ContextService protoolsContext; + + public static final int householdPasswordSize=8; + public static final int defaultPasswordSize=12; + @Override public void execute(DelegateExecution execution) { log.debug("ProcessInstanceId={} begin", execution.getProcessInstanceId()); + JsonNode contextRootNode = protoolsContext.getContextByProcessInstance(execution.getProcessInstanceId()); + checkContextOrThrow(log,execution.getProcessInstanceId(), contextRootNode); + int passwordSize = getPasswordSize(contextRootNode); //Create User User createdUser = sugoiService.postCreateUsers(createSugoiUserBody); //init password - String userPassword = passwordService.generatePassword(); + String userPassword = passwordService.generatePassword(passwordSize); sugoiService.postInitPassword(createdUser.getUsername(), userPassword); execution.setVariableLocal(VARNAME_DIRECTORYACCESS_ID_CONTACT, createdUser.getUsername()); @@ -43,4 +59,35 @@ public void execute(DelegateExecution execution) { log.info("ProcessInstanceId={} username={} end", execution.getProcessInstanceId(), createdUser.getUsername()); } + public static int getPasswordSize(JsonNode contextRootNode){ + String contexte=contextRootNode.path(CTX_CAMPAGNE_CONTEXTE).asText(); + CampaignContextEnum contextEnum = CampaignContextEnum.fromLabel(contexte); + if(CampaignContextEnum.HOUSEHOLD.equals(contextEnum)){ + return householdPasswordSize; + } + return defaultPasswordSize; + } + + @Override + public Set getContextErrors(JsonNode contextRootNode) { + if(contextRootNode==null){ + return Set.of("Context is missing"); + } + Set results=new HashSet<>(); + Set requiredNodes = + Set.of( + //Global & Campaign + CTX_CAMPAGNE_CONTEXTE + ); + + results.addAll(DelegateContextVerifier.computeMissingChildrenMessages(requiredNodes,contextRootNode,getClass())); + + String contexte = contextRootNode.path(CTX_CAMPAGNE_CONTEXTE).asText(); + if(! EnumUtils.isValidEnumIgnoreCase(CampaignContextEnum.class, contexte)){ + results.add(DelegateContextVerifier.computeIncorrectEnumMessage(CTX_CAMPAGNE_CONTEXTE,contexte, Arrays.toString(CampaignContextEnum.values()),getClass())); + } + + return results; + } + } diff --git a/src/main/java/fr/insee/protools/backend/service/utils/password/PasswordService.java b/src/main/java/fr/insee/protools/backend/service/utils/password/PasswordService.java index da2e8924..84abd86b 100644 --- a/src/main/java/fr/insee/protools/backend/service/utils/password/PasswordService.java +++ b/src/main/java/fr/insee/protools/backend/service/utils/password/PasswordService.java @@ -2,5 +2,5 @@ public interface PasswordService { - String generatePassword(); + String generatePassword(int pCreateSize); } diff --git a/src/main/java/fr/insee/protools/backend/service/utils/password/PasswordServiceImpl.java b/src/main/java/fr/insee/protools/backend/service/utils/password/PasswordServiceImpl.java index 8058a27f..e537c717 100644 --- a/src/main/java/fr/insee/protools/backend/service/utils/password/PasswordServiceImpl.java +++ b/src/main/java/fr/insee/protools/backend/service/utils/password/PasswordServiceImpl.java @@ -11,9 +11,6 @@ @Service public class PasswordServiceImpl implements PasswordService { - @Value("${fr.insee.protools.password.create.length:12}") - private int pCreateSize; - @Value("${fr.insee.protools.password.create.withDigits:true}") private boolean pCreateWithDigits; @@ -27,7 +24,7 @@ public class PasswordServiceImpl implements PasswordService { private boolean pCreateWithSpecial; @Override - public String generatePassword() { + public String generatePassword(int pCreateSize) { PasswordGenerator passwordGenerator = new PasswordGenerator(); return passwordGenerator.generatePassword( diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index a2d213ee..163e0ca4 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -9,7 +9,6 @@ fr.insee.protools.keycloak.client.id=protools-service spring.banner.location=classpath:/banner.txt #Password generation rules -fr.insee.protools.password.create.length=12 fr.insee.protools.password.create.withDigits=true fr.insee.protools.password.create.withUpperCase=true fr.insee.protools.password.create.withLowerCase=true diff --git a/src/test/java/fr/insee/protools/backend/service/sugoi/SugoiCreateUserTaskTest.java b/src/test/java/fr/insee/protools/backend/service/sugoi/SugoiCreateUserTaskTest.java index d1fdf2f4..68e59420 100644 --- a/src/test/java/fr/insee/protools/backend/service/sugoi/SugoiCreateUserTaskTest.java +++ b/src/test/java/fr/insee/protools/backend/service/sugoi/SugoiCreateUserTaskTest.java @@ -3,17 +3,24 @@ import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.DeserializationFeature; import com.fasterxml.jackson.databind.ObjectMapper; +import fr.insee.protools.backend.ProtoolsTestUtils; import fr.insee.protools.backend.dto.sugoi.User; +import fr.insee.protools.backend.service.context.exception.BadContextIncorrectBPMNError; +import fr.insee.protools.backend.service.utils.TestWithContext; import fr.insee.protools.backend.service.utils.password.PasswordService; import org.flowable.engine.delegate.DelegateExecution; import org.flowable.engine.test.FlowableTest; +import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.ArgumentCaptor; import org.mockito.InjectMocks; import org.mockito.Mock; +import org.mockito.Mockito; import org.mockito.junit.jupiter.MockitoExtension; +import java.util.List; + import static fr.insee.protools.backend.service.FlowableVariableNameConstants.VARNAME_DIRECTORYACCESS_ID_CONTACT; import static fr.insee.protools.backend.service.sugoi.SugoiCreateUserTask.PLATINE_HABILITATION; import static org.junit.jupiter.api.Assertions.*; @@ -21,7 +28,7 @@ @ExtendWith(MockitoExtension.class) @FlowableTest -class SugoiCreateUserTaskTest { +class SugoiCreateUserTaskTest extends TestWithContext { @Mock SugoiService sugoiService; @Mock PasswordService passwordService; @@ -35,7 +42,7 @@ void execute_should_work() throws JsonProcessingException { DelegateExecution execution = mock(DelegateExecution.class); doReturn(dumyId).when(execution).getProcessInstanceId(); String expectedPwd="veryComplicatedPassword"; - doReturn(expectedPwd).when(passwordService).generatePassword(); + doReturn(expectedPwd).when(passwordService).generatePassword(anyInt()); final String userId="D96QSST"; final String sugoiResponse = """ @@ -81,4 +88,48 @@ void execute_should_work() throws JsonProcessingException { //verif on password verify(sugoiService).postInitPassword(userId,expectedPwd); } + + @Test + @DisplayName("Test execute method - should throw if Context is not correct") + void execute_should_throw_BadContext_when_contextIncorrect() throws JsonProcessingException { + //Precondition + DelegateExecution execution = mock(DelegateExecution.class); + lenient().when(execution.getProcessInstanceId()).thenReturn(dumyId); + + //Erreur + final String contextKO1 = + "{ \"partitions\": [{ \"id\": 1 }] }"; + final String contextKO2 = + "{\"contexte\": \"xxxx\" } }"; + + List contextErrorTestList=List.of(contextKO1,contextKO2); + for(String context : contextErrorTestList){ + //Precondition + ProtoolsTestUtils.initContexteMockFromString(protoolsContext, context); + //Run test + assertThrows(BadContextIncorrectBPMNError.class, () -> task.execute(execution)); + Mockito.reset(protoolsContext); + } + } + @Test + @DisplayName("Test getPasswordSize method - should return 8 for household") + void getPasswordSize_should_return_8_for_household() throws JsonProcessingException { + + final String context = + "{\"contexte\": \"household\" } }"; + ProtoolsTestUtils.initContexteMockFromString(protoolsContext, context); + assertEquals(8,task.getPasswordSize(protoolsContext.getContextByProcessInstance(dumyId))); + Mockito.reset(protoolsContext); + } + + @Test + @DisplayName("Test getPasswordSize method - should return 12 for non household") + void getPasswordSize_should_return_12_for_NonHousehold() throws JsonProcessingException { + + final String context = + "{\"contexte\": \"business\" } }"; + ProtoolsTestUtils.initContexteMockFromString(protoolsContext, context); + assertEquals(12,task.getPasswordSize(protoolsContext.getContextByProcessInstance(dumyId))); + Mockito.reset(protoolsContext); + } } \ No newline at end of file diff --git a/src/test/java/fr/insee/protools/backend/service/utils/password/PasswordServiceTest.java b/src/test/java/fr/insee/protools/backend/service/utils/password/PasswordServiceTest.java index 4caa095c..791a6d22 100644 --- a/src/test/java/fr/insee/protools/backend/service/utils/password/PasswordServiceTest.java +++ b/src/test/java/fr/insee/protools/backend/service/utils/password/PasswordServiceTest.java @@ -14,7 +14,6 @@ @SpringBootTest(classes = PasswordServiceImpl.class) @TestPropertySource(properties = { - "fr.insee.protools.password.create.length = 19", "fr.insee.protools.password.create.withDigits = true", "fr.insee.protools.password.create.withUpperCase = true", "fr.insee.protools.password.create.withLowerCase = true", @@ -32,15 +31,17 @@ void testGeneratePassword() { //Generate and validate X1000 for (int i = 0; i < 1000 ; i++) { - //Execute method under test - String generatePassword=passwordService.generatePassword(); + for(int length=8; length < 19; length ++) { // and for various sizes + //Execute method under test + String generatePassword = passwordService.generatePassword(length); - //Post condition - PasswordData passwordData = new PasswordData(generatePassword); - RuleResult validate = passwordValidator.validate(passwordData); + //Post condition + PasswordData passwordData = new PasswordData(generatePassword); + RuleResult validate = passwordValidator.validate(passwordData); - assertTrue(validate.isValid(),"Generated password meets the rules : "+generatePassword); - assertEquals(19,generatePassword.length(),"Generated password length should meets the confif : "+generatePassword); + assertTrue(validate.isValid(), "Generated password meets the rules : " + generatePassword); + assertEquals(length, generatePassword.length(), "Generated password length should meets the confif : " + generatePassword); + } } } From 99bef7051af5fe970d201453fa8b064229ee744a Mon Sep 17 00:00:00 2001 From: Marc SNDIL Date: Tue, 14 May 2024 11:23:45 +0200 Subject: [PATCH 31/75] fix: petit bug dans un message d erreur --- .../meshuggah/MeshuggahCreateCommunicationsContextTask.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/fr/insee/protools/backend/service/meshuggah/MeshuggahCreateCommunicationsContextTask.java b/src/main/java/fr/insee/protools/backend/service/meshuggah/MeshuggahCreateCommunicationsContextTask.java index 9c0e6a59..f38e24d6 100644 --- a/src/main/java/fr/insee/protools/backend/service/meshuggah/MeshuggahCreateCommunicationsContextTask.java +++ b/src/main/java/fr/insee/protools/backend/service/meshuggah/MeshuggahCreateCommunicationsContextTask.java @@ -160,10 +160,10 @@ public Set getContextErrors(JsonNode contextRootNode) { results.add(DelegateContextVerifier.computeIncorrectEnumMessage(CTX_PARTITION_COMMUNICATION_MOYEN,medium, Arrays.toString(MeshuggahUtils.MediumEnum.values()),getClass())); } - //Verify medium enum + //Verify phase enum String phase = communicationNode.path(CTX_PARTITION_COMMUNICATION_PHASE).asText(); if(! EnumUtils.isValidEnumIgnoreCase(MeshuggahUtils.PhaseEnum.class, phase)){ - results.add(DelegateContextVerifier.computeIncorrectEnumMessage(CTX_PARTITION_COMMUNICATION_PHASE,medium, Arrays.toString(MeshuggahUtils.PhaseEnum.values()),getClass())); + results.add(DelegateContextVerifier.computeIncorrectEnumMessage(CTX_PARTITION_COMMUNICATION_PHASE,phase, Arrays.toString(MeshuggahUtils.PhaseEnum.values()),getClass())); } } } From 090a1bc97008cdf1d201345d3ae925e7606c77e5 Mon Sep 17 00:00:00 2001 From: Marc SNDIL Date: Tue, 14 May 2024 11:43:07 +0200 Subject: [PATCH 32/75] =?UTF-8?q?tests=20:=20am=C3=A9liorations/fixes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- changelog.md | 12 +++++++++--- .../service/sugoi/SugoiCreateUserTaskTest.java | 8 ++++++-- .../backend/service/utils/TestWithContext.java | 6 ++++++ 3 files changed, 21 insertions(+), 5 deletions(-) diff --git a/changelog.md b/changelog.md index d1f155a8..aec70687 100644 --- a/changelog.md +++ b/changelog.md @@ -4,16 +4,22 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](http://keepachangelog.com/) and this project adheres to [Semantic Versioning](http://semver.org/). +## [Unreleased 1.1.1-SNAPSHOT] - xx-xx-xxxx +### Changed +#### BPMN TASKS +- [sugoiCreateUserTask](TODO) + La longueur du mot de passe crée dépend du contexte (8 pour household ; 12 sinon) -## [Unreleased 1.1.0-SNAPSHOT] - yyyy-mm-dd + +## [1.1.0] - 14-05-2024 ### Added #### BPMN TASKS - [SabianePilotageCreateSUTask](http://preparation_collecte.gitlab-pages.insee.fr/prepadoc/Protools/taches/#cr%c3%a9er-une-ue-dans-la-plateforme-de-collecte-enqu%c3%aateur-partie-pilotage) Tâche de création d'une UE dans sabiane pilotage - [SabianeQuestionnaireCreateSUTask](http://preparation_collecte.gitlab-pages.insee.fr/prepadoc/Protools/taches/#cr%c3%a9er-une-ue-dans-la-plateforme-de-collecte-enqu%c3%aateur-partie-questionnaire) Tâche de création d'une UE dans sabiane questionnaire -- [sugoiCreateUserTask](TODO) - Tâche de création d'un utilisateur dans l'annuaire Sugoi et initialization d'un mot de passe par défaut. +- [sugoiCreateUserTask](http://preparation_collecte.gitlab-pages.insee.fr/prepadoc/Protools/taches/#cr%c3%a9ation-de-comptes-dans-lannuaire-sugoi) + Tâche de création d'un utilisateur dans l'annuaire Sugoi et initialization d'un mot de passe par défaut - [platinePilotageGetSUIsToFollowUpTask]( TODO) Tâche de lecture dans Platine Pilotage de l'état a-relancer/eligible/isToFollowUp d'une UE (d'une partition). - [platinePilotageAddSUFollowUpTask]( TODO) diff --git a/src/test/java/fr/insee/protools/backend/service/sugoi/SugoiCreateUserTaskTest.java b/src/test/java/fr/insee/protools/backend/service/sugoi/SugoiCreateUserTaskTest.java index 68e59420..4e264d31 100644 --- a/src/test/java/fr/insee/protools/backend/service/sugoi/SugoiCreateUserTaskTest.java +++ b/src/test/java/fr/insee/protools/backend/service/sugoi/SugoiCreateUserTaskTest.java @@ -10,6 +10,7 @@ import fr.insee.protools.backend.service.utils.password.PasswordService; import org.flowable.engine.delegate.DelegateExecution; import org.flowable.engine.test.FlowableTest; +import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; @@ -41,6 +42,11 @@ void execute_should_work() throws JsonProcessingException { //Prepare DelegateExecution execution = mock(DelegateExecution.class); doReturn(dumyId).when(execution).getProcessInstanceId(); + + final String context = + "{\"contexte\": \"household\" } }"; + ProtoolsTestUtils.initContexteMockFromString(protoolsContext, context); + String expectedPwd="veryComplicatedPassword"; doReturn(expectedPwd).when(passwordService).generatePassword(anyInt()); final String userId="D96QSST"; @@ -119,7 +125,6 @@ void getPasswordSize_should_return_8_for_household() throws JsonProcessingExcept "{\"contexte\": \"household\" } }"; ProtoolsTestUtils.initContexteMockFromString(protoolsContext, context); assertEquals(8,task.getPasswordSize(protoolsContext.getContextByProcessInstance(dumyId))); - Mockito.reset(protoolsContext); } @Test @@ -130,6 +135,5 @@ void getPasswordSize_should_return_12_for_NonHousehold() throws JsonProcessingEx "{\"contexte\": \"business\" } }"; ProtoolsTestUtils.initContexteMockFromString(protoolsContext, context); assertEquals(12,task.getPasswordSize(protoolsContext.getContextByProcessInstance(dumyId))); - Mockito.reset(protoolsContext); } } \ No newline at end of file diff --git a/src/test/java/fr/insee/protools/backend/service/utils/TestWithContext.java b/src/test/java/fr/insee/protools/backend/service/utils/TestWithContext.java index f68ac6b4..6cd2f3dd 100644 --- a/src/test/java/fr/insee/protools/backend/service/utils/TestWithContext.java +++ b/src/test/java/fr/insee/protools/backend/service/utils/TestWithContext.java @@ -6,7 +6,9 @@ import fr.insee.protools.backend.service.context.exception.BadContextIncorrectBPMNError; import org.flowable.engine.delegate.DelegateExecution; import org.flowable.engine.delegate.JavaDelegate; +import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.Mockito; import org.mockito.Spy; import org.mockito.junit.jupiter.MockitoExtension; @@ -24,6 +26,10 @@ public abstract class TestWithContext { protected final String dumyId="ID1"; + @AfterEach + void mockitoResetContext() { + Mockito.reset(protoolsContext); + } protected JsonNode initContexteMockWithFile(String contexteToLoad){ JsonNode contextRootNode = ProtoolsTestUtils.asJsonNode(contexteToLoad); doReturn(contextRootNode).when(protoolsContext).getContextByProcessInstance(anyString()); From 1b7b96efec33a03b3801e898b4aa814c32e181e3 Mon Sep 17 00:00:00 2001 From: Marc SNDIL Date: Tue, 14 May 2024 11:52:20 +0200 Subject: [PATCH 33/75] prepare next release --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index d7a5764b..832b0e8b 100644 --- a/pom.xml +++ b/pom.xml @@ -10,7 +10,7 @@ fr.insee.sndil.protools protools-protlsbo - 1.1.0-SNAPSHOT + 1.1.1-SNAPSHOT Protools Back Office Protools Back Office: Survey Orchestrator and Management Tool - Built with Flowable Engine From ba1c91b802d1fd6a14ae7336c172116d6c6e5d26 Mon Sep 17 00:00:00 2001 From: Marc SNDIL Date: Wed, 15 May 2024 17:39:30 +0200 Subject: [PATCH 34/75] update: authorise contexte business pour platine --- .../delegate/PlatinePilotageCreateSurveyUnitTask.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/java/fr/insee/protools/backend/service/platine/delegate/PlatinePilotageCreateSurveyUnitTask.java b/src/main/java/fr/insee/protools/backend/service/platine/delegate/PlatinePilotageCreateSurveyUnitTask.java index 7ba7ff32..1acaaa60 100644 --- a/src/main/java/fr/insee/protools/backend/service/platine/delegate/PlatinePilotageCreateSurveyUnitTask.java +++ b/src/main/java/fr/insee/protools/backend/service/platine/delegate/PlatinePilotageCreateSurveyUnitTask.java @@ -108,8 +108,9 @@ public Set getContextErrors(JsonNode contextRootNode) { results.addAll(DelegateContextVerifier.computeMissingChildrenMessages(requiredNodes,contextRootNode,getClass())); - if (!contextRootNode.path(CTX_CAMPAGNE_CONTEXTE).asText().equalsIgnoreCase(CampaignContextEnum.HOUSEHOLD.getAsString())) { - results.add(DelegateContextVerifier.computeIncorrectMessage(CTX_CAMPAGNE_CONTEXTE,"contexte for platine can only be "+CampaignContextEnum.HOUSEHOLD,getClass())); + String contexte = contextRootNode.path(CTX_CAMPAGNE_CONTEXTE).asText(); + if(! EnumUtils.isValidEnumIgnoreCase(CampaignContextEnum.class, contexte)){ + results.add(DelegateContextVerifier.computeIncorrectEnumMessage(CTX_CAMPAGNE_CONTEXTE,contexte, Arrays.toString(CampaignContextEnum.values()),getClass())); } //Maybe one day we will have partitions for platine and partitions for sabiane and we will only validate the platine ones From f910aea27be31b9cd2b6f3ad5c3cc9e3035f5a16 Mon Sep 17 00:00:00 2001 From: Marc SNDIL Date: Wed, 22 May 2024 09:07:40 +0200 Subject: [PATCH 35/75] =?UTF-8?q?poc:=20ajout=20d'un=20BPMN=20commun=20ave?= =?UTF-8?q?c=20une=20t=C3=A2che=20unqiue=20de=20cr=C3=A9ation=20dans=20pla?= =?UTF-8?q?tine=20pour=20queue=20et=20api?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/resources/processes/poc-all-su.bpmn | 221 +++++++++++++++++++ 1 file changed, 221 insertions(+) create mode 100644 src/main/resources/processes/poc-all-su.bpmn diff --git a/src/main/resources/processes/poc-all-su.bpmn b/src/main/resources/processes/poc-all-su.bpmn new file mode 100644 index 00000000..650a1328 --- /dev/null +++ b/src/main/resources/processes/poc-all-su.bpmn @@ -0,0 +1,221 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file From 2b4ea65235ec76dd5347b3c6f1eaee3e6520ae1e Mon Sep 17 00:00:00 2001 From: Marc SNDIL Date: Wed, 22 May 2024 16:12:50 +0200 Subject: [PATCH 36/75] =?UTF-8?q?update:=20chemin=20nomenclatures=20dans?= =?UTF-8?q?=20gitlab=20a=20chang=C3=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/resources/application-dev.properties | 2 +- src/test/resources/application-test.properties | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/resources/application-dev.properties b/src/main/resources/application-dev.properties index 71479ab4..24da19f9 100644 --- a/src/main/resources/application-dev.properties +++ b/src/main/resources/application-dev.properties @@ -21,7 +21,7 @@ springdoc.swagger-ui.oauth.clientId=localhost-frontend fr.insee.sndil.starter.auth.url=${fr.insee.protools.keycloak-interne-auth-url} #URL For nomenclatures service -fr.insee.protools.nomenclature.uri=https://gitlab.insee.fr/enquetes-menages/integration-metallica/-/raw/master/Nomenclatures +fr.insee.protools.nomenclature.uri=https://gitlab.insee.fr/enquetes-menages/integration-metallica/-/raw/master/_Nomenclatures #URL For questionnaire models service fr.insee.protools.questionnaire.model.uri=https://gitlab.insee.fr/enquetes-menages/integration-metallica/-/raw/master/Questionnaire-Models diff --git a/src/test/resources/application-test.properties b/src/test/resources/application-test.properties index 7d31fe91..ac174907 100644 --- a/src/test/resources/application-test.properties +++ b/src/test/resources/application-test.properties @@ -21,7 +21,7 @@ springdoc.swagger-ui.oauth.clientId=localhost-frontend fr.insee.sndil.starter.auth.url=${fr.insee.protools.keycloak-interne-auth-url} #URL For nomenclatures service -fr.insee.protools.nomenclature.uri=https://gitlab.insee.fr/enquetes-menages/integration-metallica/-/raw/master/Nomenclatures +fr.insee.protools.nomenclature.uri=https://gitlab.insee.fr/enquetes-menages/integration-metallica/-/raw/master/_Nomenclatures #URL For questionnaire models service fr.insee.protools.questionnaire.model.uri=https://gitlab.insee.fr/enquetes-menages/integration-metallica/-/raw/master/Questionnaire-Models From 2b6974f6c446a806633b54cbfe07dba88be6cf0b Mon Sep 17 00:00:00 2001 From: Marc SNDIL Date: Thu, 30 May 2024 10:18:16 +0200 Subject: [PATCH 37/75] =?UTF-8?q?chore:=20am=C3=A9lioration=20de=20la=20co?= =?UTF-8?q?ncat=C3=A9nation=20d'une=20chaine=20de=20caract=C3=A8re?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../QuestionnaireModelFromStaticWebsiteServiceImpl.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/main/java/fr/insee/protools/backend/service/questionnaire_model/QuestionnaireModelFromStaticWebsiteServiceImpl.java b/src/main/java/fr/insee/protools/backend/service/questionnaire_model/QuestionnaireModelFromStaticWebsiteServiceImpl.java index c1c40fbd..a3fa0924 100644 --- a/src/main/java/fr/insee/protools/backend/service/questionnaire_model/QuestionnaireModelFromStaticWebsiteServiceImpl.java +++ b/src/main/java/fr/insee/protools/backend/service/questionnaire_model/QuestionnaireModelFromStaticWebsiteServiceImpl.java @@ -24,12 +24,11 @@ public class QuestionnaireModelFromStaticWebsiteServiceImpl implements Questionn @Value("${fr.insee.protools.questionnaire.model.uri}") private String questionnaireModelUri; - @Override public String getQuestionnaireModel(String questionnaireModelId, String folderPath){ log.info("Get Questionnaire Model Value for questionnaireModelId={}", questionnaireModelId); String uri; - String fullPath=questionnaireModelUri+"/" +folderPath+ "/"+questionnaireModelId + ".json"; + String fullPath = String.format("%s/%s/%s.json", questionnaireModelUri, folderPath, questionnaireModelId); try { uri = new URI(fullPath).normalize().toString(); } catch (URISyntaxException e) { From 53785da955357f5382213b5e3d3c8afafa693e82 Mon Sep 17 00:00:00 2001 From: SNDIL - Marc Date: Thu, 13 Jun 2024 16:38:13 +0200 Subject: [PATCH 38/75] =?UTF-8?q?feat:=20Suppression=20du=20mot=20de=20pas?= =?UTF-8?q?se=20stock=C3=A9=20dans=20le=20contexte=20et=20l'historique=20:?= =?UTF-8?q?=20CleanUserPasswordTask?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/sugoi/CleanUserPasswordTask.java | 49 +++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100644 src/main/java/fr/insee/protools/backend/service/sugoi/CleanUserPasswordTask.java diff --git a/src/main/java/fr/insee/protools/backend/service/sugoi/CleanUserPasswordTask.java b/src/main/java/fr/insee/protools/backend/service/sugoi/CleanUserPasswordTask.java new file mode 100644 index 00000000..5e52c048 --- /dev/null +++ b/src/main/java/fr/insee/protools/backend/service/sugoi/CleanUserPasswordTask.java @@ -0,0 +1,49 @@ +package fr.insee.protools.backend.service.sugoi; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.HistoryService; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.JavaDelegate; +import org.flowable.engine.impl.cfg.ProcessEngineConfigurationImpl; +import org.flowable.variable.api.history.HistoricVariableInstance; +import org.flowable.variable.api.history.HistoricVariableInstanceQuery; +import org.flowable.variable.service.HistoricVariableService; +import org.flowable.variable.service.impl.persistence.entity.HistoricVariableInstanceEntity; +import org.springframework.stereotype.Component; + +import java.util.List; + +import static fr.insee.protools.backend.service.FlowableVariableNameConstants.VARNAME_DIRECTORYACCESS_PWD_CONTACT; + +/** + * Suprime la variable mot de passe et supprime aussi toutes les occurences de l'historique + */ +@Slf4j +@Component +@RequiredArgsConstructor +public class CleanUserPasswordTask implements JavaDelegate { + + private final ProcessEngineConfigurationImpl processEngineConfiguration; + + @Override + public void execute(DelegateExecution execution) { + log.debug("ProcessInstanceId={} begin", execution.getProcessInstanceId()); + + //Supprime la variable mot de passe si elle existe + execution.removeVariable(VARNAME_DIRECTORYACCESS_PWD_CONTACT); + + //La supprime aussi de l'historique + HistoricVariableService historicVariableService = processEngineConfiguration.getVariableServiceConfiguration().getHistoricVariableService(); + HistoryService historyService = processEngineConfiguration.getHistoryService(); + + HistoricVariableInstanceQuery query = historyService.createHistoricVariableInstanceQuery() + .processInstanceId(execution.getProcessInstanceId()) + .variableName(VARNAME_DIRECTORYACCESS_PWD_CONTACT); + + List variableInstances = query.list(); + for (HistoricVariableInstance variableInstance : variableInstances) { + historicVariableService.deleteHistoricVariableInstance((HistoricVariableInstanceEntity) variableInstance); + } + } +} From 3ca0f62221eba41ae18b5f5060b530fecf45737f Mon Sep 17 00:00:00 2001 From: SNDIL - Marc Date: Fri, 14 Jun 2024 10:21:04 +0200 Subject: [PATCH 39/75] fix: message d'erreur --- .../backend/controller/ProtoolsProcessControllerAdvice.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/fr/insee/protools/backend/controller/ProtoolsProcessControllerAdvice.java b/src/main/java/fr/insee/protools/backend/controller/ProtoolsProcessControllerAdvice.java index 75a129b3..6249690b 100644 --- a/src/main/java/fr/insee/protools/backend/controller/ProtoolsProcessControllerAdvice.java +++ b/src/main/java/fr/insee/protools/backend/controller/ProtoolsProcessControllerAdvice.java @@ -39,7 +39,7 @@ public ResponseEntity exceptionContextIncorrectHandler(/*final HttpServl @ExceptionHandler({ TaskNotFoundException.class }) public ResponseEntity exeptionTaskNotFoundHandler(/*final HttpServletRequest req, */final TaskNotFoundException exception) { - log.error("exceptionContextIncorrectHandler : "+exception.getMessage()); + log.error("exeptionTaskNotFoundHandler : "+exception.getMessage()); return new ResponseEntity<>(exception.getMessage(), HttpStatus.NOT_FOUND); } From 582a92ee7ba4e3eba01d92ec00e6c6eea9f4ff21 Mon Sep 17 00:00:00 2001 From: SNDIL - Marc Date: Fri, 14 Jun 2024 10:21:23 +0200 Subject: [PATCH 40/75] maj: changelog --- changelog.md | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/changelog.md b/changelog.md index aec70687..2d261ecb 100644 --- a/changelog.md +++ b/changelog.md @@ -1,6 +1,6 @@ # Change Log All notable changes to this project will be documented in this file. - + The format is based on [Keep a Changelog](http://keepachangelog.com/) and this project adheres to [Semantic Versioning](http://semver.org/). @@ -44,7 +44,7 @@ Travail sur les tâches BPMN pour ERA et REM. - [remGetSUTask](http://preparation_collecte.gitlab-pages.insee.fr/prepadoc/Protools/taches/#r%c3%a9cup%c3%a9ration-dune-ue-dans-rem) Tâche de récupération d'une UE dans REM à partir de son ID. - [extractContactIdentifierFromREMSUTask](http://preparation_collecte.gitlab-pages.insee.fr/prepadoc/Protools/taches/#extraire-lidentifiant-de-compte-des-additionals-info-dans-une-ue-rem) - Tâche d'extraction de l'identifiant internet depuis les additionalInformations d'un json d'UE REM + Tâche d'extraction de l'identifiant internet depuis les additionalInformations d'un json d'UE REM - [remWriteEraSUListTask](http://preparation_collecte.gitlab-pages.insee.fr/prepadoc/Protools/taches/#ecriture-dune-liste-due-dans-une-partition-rem) Tâche d'écriture dans REM d'une liste d'UE récupérée dans ERA - [eraGetSUForPeriodAndGenderTask](http://preparation_collecte.gitlab-pages.insee.fr/prepadoc/Protools/taches/#extractions-de-donn%c3%a9ees-du-rp-avec-era) @@ -60,24 +60,24 @@ Travail sur les tâches BPMN pour ERA et REM. #### Endpoints - /api_configuration qui renverra la configuration de chaque API orchestrée par protools. Cela permet donc de savoir -quelle plateforme est appelée. + quelle plateforme est appelée. #### Autres - Vérification que le fichier de contexte satisfait bien toutes les tâches du BPMN associé au processus. - Possibilité d'utiliser la date de début et de fin de collecte d'une partition dans les expressions BPMN via PartitionCtxResolver -- Ajout des périodes X01 à X99 à l'énumération pour pilotage +- Ajout des périodes X01 à X99 à l'énumération pour pilotage -- +- ### Changed #### Variables du processus - "sugoi-id-contact" devient "directory_access-id-contact" (peut casser les BPMN la référençant en dur). - + ### Fixed - + ## [0.0.3] - 2023-05-16 ### Added - Création de contexte de campagne dans sabiane et platine +Création de contexte de campagne dans sabiane et platine ### Changed ### Fixed From afe8246150693f95ebb9dfef1ecc6c71dd777117 Mon Sep 17 00:00:00 2001 From: SNDIL - Marc Date: Fri, 14 Jun 2024 10:23:47 +0200 Subject: [PATCH 41/75] add: fichiers github --- .github/workflows/maven.yml | 27 +++++++++++++++++++++++++++ renovate.json | 6 ++++++ 2 files changed, 33 insertions(+) create mode 100644 .github/workflows/maven.yml create mode 100644 renovate.json diff --git a/.github/workflows/maven.yml b/.github/workflows/maven.yml new file mode 100644 index 00000000..1e00fa1f --- /dev/null +++ b/.github/workflows/maven.yml @@ -0,0 +1,27 @@ +name: Java CI with Maven + +on: + push: + branches: [ "main" , "develop" ] + pull_request: + branches: [ "main", "develop" ] + +jobs: + build: + + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v3 + - name: Set up JDK 17 + uses: actions/setup-java@v3 + with: + java-version: '17' + distribution: 'temurin' + cache: maven + - name: Build with Maven + run: mvn -B package --file pom.xml + + # Optional: Uploads the full dependency graph to GitHub to improve the quality of Dependabot alerts this repository can receive + - name: Update dependency graph + uses: advanced-security/maven-dependency-submission-action@571e99aab1055c2e71a1e2309b9691de18d6b7d6 diff --git a/renovate.json b/renovate.json new file mode 100644 index 00000000..39a2b6e9 --- /dev/null +++ b/renovate.json @@ -0,0 +1,6 @@ +{ + "$schema": "https://docs.renovatebot.com/renovate-schema.json", + "extends": [ + "config:base" + ] +} From 964d65d53fea5043c4b89ed1c4f41d742d450e70 Mon Sep 17 00:00:00 2001 From: SNDIL - Marc Date: Fri, 14 Jun 2024 10:37:20 +0200 Subject: [PATCH 42/75] doc: changelog --- changelog.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/changelog.md b/changelog.md index 2d261ecb..4f94a7cf 100644 --- a/changelog.md +++ b/changelog.md @@ -9,7 +9,8 @@ and this project adheres to [Semantic Versioning](http://semver.org/). #### BPMN TASKS - [sugoiCreateUserTask](TODO) La longueur du mot de passe crée dépend du contexte (8 pour household ; 12 sinon) - +- [cleanUserPasswordTask](TODO) + Suppression de toutes les variables de mots de passe (sur le contexte et dans l'historique) ## [1.1.0] - 14-05-2024 ### Added From 77b9e0e2728f42ab320359edc4e476e2dc417ff8 Mon Sep 17 00:00:00 2001 From: SNDIL - Marc Date: Tue, 25 Jun 2024 14:48:48 +0200 Subject: [PATCH 43/75] lib: utilisation de la lib de loggin des properties --- pom.xml | 8 + .../configuration/PropertiesLogger.java | 193 ------------------ src/main/resources/application-dev.properties | 16 +- 3 files changed, 10 insertions(+), 207 deletions(-) delete mode 100644 src/main/java/fr/insee/protools/backend/configuration/PropertiesLogger.java diff --git a/pom.xml b/pom.xml index 0c4ac231..c541f06d 100644 --- a/pom.xml +++ b/pom.xml @@ -16,6 +16,7 @@ 17 2.5.0 + 1.0.0 7.0.1-insee 1.16.1 1.2.1 @@ -42,6 +43,13 @@ ${flowable.version} + + + fr.insee + boot-properties-logger-starter + ${properties-logger.version} + + org.passay diff --git a/src/main/java/fr/insee/protools/backend/configuration/PropertiesLogger.java b/src/main/java/fr/insee/protools/backend/configuration/PropertiesLogger.java deleted file mode 100644 index e0469771..00000000 --- a/src/main/java/fr/insee/protools/backend/configuration/PropertiesLogger.java +++ /dev/null @@ -1,193 +0,0 @@ -package fr.insee.protools.backend.configuration; - -import lombok.AccessLevel; -import lombok.AllArgsConstructor; -import lombok.NonNull; -import lombok.extern.slf4j.Slf4j; -import org.springframework.boot.context.event.ApplicationEnvironmentPreparedEvent; -import org.springframework.context.ApplicationListener; -import org.springframework.core.env.AbstractEnvironment; -import org.springframework.core.env.EnumerablePropertySource; -import org.springframework.core.env.Environment; -import org.springframework.core.env.PropertySource; - -import java.util.*; -import java.util.function.Supplier; - -/** - * Listener Spring permettant d'afficher les props dans les logs au démarrage de l'application : se déclenche - * sur l'évènement ApplicationEnvironmentPreparedEvent. - * - * Par défaut affiche les propriétés qui vérifient les conditions suivantes : - * 1. passées soit par la ligne de commande (--maProp=valeur), soit présentes dans les fichiers properties - * détectés par Spring boot au démarrage (une propriété présente uniquement dans le code sous la forme - * @Value("${ma.propriete}") dont la valeur serait passée uniquement par variable d'environnement ne sera - * donc pas détectée. Pour qu'elle le soit, il faut la faire figurer dans le fichier application.properties par exemple) - * 2. qui sont préfixées par l'un des éléments de PropertiesLogger.prefixesAffichesParDefaut - * - * Pour chaque propriété affichée : - * - si la clé contient l'un des mots parmi PropertiesLogger.motsCachesParDefaut, affiche alors "****" - * - sinon c'est la valeur de la propriété telle qu'elle sera résolue par Spring boot dans l'application qui est affichée - * - * Enfin, sont loguées également les noms des PropertySource de Spring dont proviennent les clés des propriétés qui sont affichées - * - * Le comportement de cette classe peut être amendé par les propriétés suivantes : - * - fr.insee.properties.log.key.select : stratégie de sélection des sources de propriétés qui seront affichées : - * - trois valeurs possibles : - * - ALL(toutes les propriétés des propertysource traitées seront affichées, peu importe les prefixes) - * - NONE (rien ne sera affiché) - * - PREFIX (valeur par défaut) : affiche les propriétés dont le prefixe est dans fr.insee.properties.log.key.prefixes - * et qui ne font pas partie des propertySource ignorés (le nom des propertysource ignorés figurent - * dans fr.insee.properties.log.sources.ignored)) - * - cf enum PropertySelectorEnum - * - fr.insee.properties.log.sources.ignored : nom des propertysource (ex: application-dev.properties) qui seront ignorées. - * - la valeur attendue est une liste de noms séparés par des virgules. Si vide alors aucune propertysource ne sera ignorée - * - Valeur par défaut : PropertiesLogger.propertySourcesIgnoreesParDefaut - * - fr.insee.properties.log.key.prefixes : permet de définir les préfixes des propriétés qui seront affichées. - * - Valeur par défaut : PropertiesLogger.prefixesAffichesParDefaut - * - la valeur attendue est une liste de noms séparés par des virgules. Si vide aucune propriété ne sera affichée - * - fr.insee.properties.log.key.hidden : liste des mots pour lesquels la valeur de la propriété sera masquée (si la clé de - * la propriété contient l'un des mots de la liste alors la valeur sera masquée). - * - Valeur par défaut : PropertiesLogger.motsCachesParDefaut - * - la valeur attendue est une liste de noms séparés par des virgules. /!\ ☠️ si vide tous les secrets seront affichés dans la log - * - */ -@Slf4j -public class PropertiesLogger implements ApplicationListener { - - public static final String PROPERTY_KEY_FOR_PREFIXES = "fr.insee.properties.log.key.prefixes"; - public static final String PROPERTY_KEY_FOR_MORE_HIDDEN = "fr.insee.properties.log.key.hidden.more"; - public static final String PROPERTY_KEY_FOR_SOURCES_IGNORED = "fr.insee.properties.log.sources.ignored"; - public static final String PROPERTY_KEY_FOR_SOURCES_SELECT = "fr.insee.properties.log.key.select"; - private static final Set baseMotsCaches = Set.of("password", "pwd", "jeton", "token", "secret", "credential", "pw"); - private static final Set prefixesAffichesParDefaut= Set.of("fr.insee","logging","keycloak","spring","application","server","springdoc","management"); - private static final Set propertySourcesIgnoreesParDefaut = Set.of("systemProperties", "systemEnvironment"); - public static final PropertySelectorEnum PROPERTY_SELECTOR_PAR_DEFAUT = PropertySelectorEnum.PREFIX; - private static Set prefixForSelectedProps; - - private final Collection propertySourceNames=new ArrayList<>(); - private Set hiddensProps; - private Set ignoredPropertySources; - private PropertySelector propertySelector; - - @Override - public void onApplicationEvent(@NonNull ApplicationEnvironmentPreparedEvent event) { - Environment environment=event.getEnvironment(); - - var props= new StringBuilder(); - this.hiddensProps = getMoreHiddenPropsFromPropertyAndMerge(environment); - prefixForSelectedProps = environment.getProperty(PROPERTY_KEY_FOR_PREFIXES, Set.class, prefixesAffichesParDefaut); - this.ignoredPropertySources = environment.getProperty(PROPERTY_KEY_FOR_SOURCES_IGNORED, Set.class, propertySourcesIgnoreesParDefaut); - var propertySelectorType=this.getSelectorFromProperty(environment.getProperty(PROPERTY_KEY_FOR_SOURCES_SELECT)) - .orElse(PROPERTY_SELECTOR_PAR_DEFAUT); - log.atDebug().log(()->"Logging "+propertySelectorType.forLogging()); - this.propertySelector=propertySelectorType.propertySelector(); - - ((AbstractEnvironment) environment).getPropertySources().stream() - .filter(this::isEnumerable) - .filter(this::sourceWillBeProcessed) - .map(this::rememberPropertySourceNameThenCast) - .map(EnumerablePropertySource::getPropertyNames) - .flatMap(Arrays::stream) - .distinct() - .filter(Objects::nonNull) - .filter(this::filterFromPropertySelector) - .forEach(key-> props.append(key).append(" = ") - .append(resoutValeurAvecMasquePwd(key, environment)) - .append(System.lineSeparator())); - props.append("============================================================================"); - props.insert(0, """ - =============================================================================================== - Valeurs des properties pour : - %s - =============================================================================================== - """.formatted(this.propertySourceNames.stream().reduce("",(l, e)->l+System.lineSeparator()+"- "+e ))); - log.info(props.toString()); - - } - - private static Set getMoreHiddenPropsFromPropertyAndMerge(Environment environment) { - var moreProps = environment.getProperty(PROPERTY_KEY_FOR_MORE_HIDDEN, Set.class); - var retour = baseMotsCaches; - if (moreProps != null){ - retour=new HashSet<>(moreProps); - retour.addAll(baseMotsCaches); - } - return retour; - } - - private Optional getSelectorFromProperty(String property) { - if(property!=null){ - try{ - return Optional.of(PropertySelectorEnum.valueOf(property)); - }catch (IllegalArgumentException ie){ - log.atTrace().log(()->"Impossible de convertir "+property+" en une constante de PropertySelectorEnum. Le PropertySelector par défaut sera utilisé."); - } - } - return Optional.empty(); - } - - private boolean filterFromPropertySelector(@NonNull String s) { - if (! this.propertySelector.filter(s)){ - log.atDebug().log(()->s+ " ne commence pas par un des prefix retenus pour être loguée"); - return false; - } - return true; - } - - private boolean sourceWillBeProcessed(PropertySource propertySource) { - - if (ignoredPropertySources.contains(propertySource.getName())){ - log.atDebug().log(()->propertySource+ " sera ignorée"); - return false; - } - return true; - } - - private EnumerablePropertySource rememberPropertySourceNameThenCast(PropertySource propertySource) { - this.propertySourceNames.add(propertySource.getName()); - return (EnumerablePropertySource) propertySource; - } - - private boolean isEnumerable(PropertySource propertySource) { - if (! (propertySource instanceof EnumerablePropertySource)){ - log.atDebug().log(()->propertySource+ " n'est pas EnumerablePropertySource : impossible à lister"); - return false; - } - return true; - } - - private Object resoutValeurAvecMasquePwd(String key, Environment environment) { - if (hiddensProps.stream().anyMatch(key::contains)) { - return "******"; - } - return environment.getProperty(key); - - } - - - @FunctionalInterface - private interface PropertySelector { - boolean filter(String s); - } - - @AllArgsConstructor(access = AccessLevel.PRIVATE) - private enum PropertySelectorEnum { - ALL(s->true, ()->"all properties"), - NONE(s->false, ()->"no properties"), - PREFIX(k->prefixForSelectedProps.stream().anyMatch(k::startsWith), () -> "properties starting with "+ prefixForSelectedProps); - - private final PropertySelector propertySelector; - private final Supplier logString; - - public PropertySelector propertySelector() { - return propertySelector; - } - - public String forLogging(){ - return logString.get(); - } - - } -} - diff --git a/src/main/resources/application-dev.properties b/src/main/resources/application-dev.properties index 24da19f9..505b5fbd 100644 --- a/src/main/resources/application-dev.properties +++ b/src/main/resources/application-dev.properties @@ -101,20 +101,8 @@ fr.insee.protools.api.sugoi.auth.url=${fr.insee.protools.keycloak-interne-auth-u fr.insee.protools.api.sugoi.dmz-account-creation-realm=questionnaire-particuliers ######################### Log des properties ######################### -#fr.insee.properties.log.key.select : NONE ALL ou PREFIX(default) - -#Pour desactviter le log des properties -#fr.insee.properties.log.key.select=NONE - -#Pour afficher toutes les properties sans prendre en compte leur prefixe -#propritete de test qui sera affichee avec des **** (non affichee par defaut avec PREFIX) -#fr.pwd=toto -#Avec ce parametre, la property fr.pwd est affichee (on ignore les prefixes), on a donc toutes les properties -#fr.insee.properties.log.key.select=ALL -#Avec ce parametre, si on est en mode PREFIX, on ne voit que fr.pwd ; si on est en mode ALL aucun effet -#fr.insee.properties.log.key.prefixes=fr.pwd -#Avec ce parametre, si on est en mode PREFIX, va afficher uniquement les properties commencant par fr.insee et fr.pwd -#fr.insee.properties.log.key.prefixes=fr.pwd,fr.insee +properties.logger.prefix-for-properties = fr.insee, debug, info, logging, spring, server,management, keycloak, springdoc + #Log logging.level.fr.insee.protools=INFO From 8505e941d65212dc6457aee21354fcf5fe2b3bf0 Mon Sep 17 00:00:00 2001 From: "farid.ait-karra" Date: Mon, 8 Jul 2024 14:28:27 +0200 Subject: [PATCH 44/75] =?UTF-8?q?feat/implementation-mongo=20:=20-=20Ajout?= =?UTF-8?q?=20de=20la=20fonctionnalit=C3=A9=20d'=C3=A9criture=20dans=20mon?= =?UTF-8?q?goDb?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 5 + pom.xml | 10 ++ .../configuration/SpringMongoConfig.java | 10 ++ .../backend/repository/IUniteEnquetee.java | 16 +++ .../backend/repository/UniteEnqueteeImpl.java | 106 ++++++++++++++++++ .../platine_sabiane/QuestionnaireHelper.java | 27 ++++- ...uestionnaireCreateSurveyUnitTaskAsync.java | 47 ++++++++ ...aireModelFromStaticWebsiteServiceImpl.java | 3 +- src/main/resources/application.properties | 3 + 9 files changed, 221 insertions(+), 6 deletions(-) create mode 100644 src/main/java/fr/insee/protools/backend/configuration/SpringMongoConfig.java create mode 100644 src/main/java/fr/insee/protools/backend/repository/IUniteEnquetee.java create mode 100644 src/main/java/fr/insee/protools/backend/repository/UniteEnqueteeImpl.java create mode 100644 src/main/java/fr/insee/protools/backend/service/platine/delegate/PlatineQuestionnaireCreateSurveyUnitTaskAsync.java diff --git a/.gitignore b/.gitignore index 9b1ae502..0c187eaa 100644 --- a/.gitignore +++ b/.gitignore @@ -51,3 +51,8 @@ glowroot.jar /secrets/postgres_password.txt /secrets/secrets_protools_properties.properties /secrets/** +/src/main/resources/application-conteneur.properties +/src/main/resources/application-dev.properties +/src/main/resources/application-kubedev.properties + +/src/test/httpRequests/fak/ diff --git a/pom.xml b/pom.xml index d7a5764b..dece310e 100644 --- a/pom.xml +++ b/pom.xml @@ -125,6 +125,16 @@ test + + io.micrometer + micrometer-core + 1.12.3 + + + + org.springframework.boot + spring-boot-starter-data-mongodb + diff --git a/src/main/java/fr/insee/protools/backend/configuration/SpringMongoConfig.java b/src/main/java/fr/insee/protools/backend/configuration/SpringMongoConfig.java new file mode 100644 index 00000000..ec0f90b1 --- /dev/null +++ b/src/main/java/fr/insee/protools/backend/configuration/SpringMongoConfig.java @@ -0,0 +1,10 @@ +package fr.insee.protools.backend.configuration; + +import org.springframework.context.annotation.Configuration; + +@Configuration +public class SpringMongoConfig{ + +// TODO remove _class + +} \ No newline at end of file diff --git a/src/main/java/fr/insee/protools/backend/repository/IUniteEnquetee.java b/src/main/java/fr/insee/protools/backend/repository/IUniteEnquetee.java new file mode 100644 index 00000000..66a4cdc8 --- /dev/null +++ b/src/main/java/fr/insee/protools/backend/repository/IUniteEnquetee.java @@ -0,0 +1,16 @@ +package fr.insee.protools.backend.repository; + +import com.fasterxml.jackson.databind.JsonNode; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; + +public interface IUniteEnquetee { + + @Transactional + void addManyUniteEnquetee(List listeUe); + + void addManyUniteEnquetee(List listeUe, String processInstanceId, String campaignId, String questionnaireId); + + void addManyUniteEnqueteeDeleteColonneClass(List listeUe); +} \ No newline at end of file diff --git a/src/main/java/fr/insee/protools/backend/repository/UniteEnqueteeImpl.java b/src/main/java/fr/insee/protools/backend/repository/UniteEnqueteeImpl.java new file mode 100644 index 00000000..a84c3d99 --- /dev/null +++ b/src/main/java/fr/insee/protools/backend/repository/UniteEnqueteeImpl.java @@ -0,0 +1,106 @@ +package fr.insee.protools.backend.repository; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.mongodb.BasicDBObject; +import lombok.Getter; +import lombok.Setter; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.mongodb.core.MongoTemplate; +import org.springframework.data.mongodb.core.convert.DefaultMongoTypeMapper; +import org.springframework.data.mongodb.core.convert.MappingMongoConverter; +import org.springframework.data.mongodb.core.mapping.MongoMappingContext; +import org.springframework.stereotype.Repository; + +import java.util.HashMap; +import java.util.List; +import java.util.UUID; + +import static com.fasterxml.jackson.databind.DeserializationFeature.FAIL_ON_MISSING_CREATOR_PROPERTIES; +import static com.fasterxml.jackson.databind.DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES; +import static org.codehaus.groovy.runtime.DefaultGroovyMethods.collect; + +@Repository +@Slf4j +public class UniteEnqueteeImpl implements IUniteEnquetee { + + @Autowired + private MongoTemplate mongoTemplate; + + @Setter + @Getter + private String processInstanceId; + @Setter + @Getter + private String idCampaign; + @Setter + @Getter + private String questionnaireId; + + private static final ObjectMapper objectMapper = + new ObjectMapper() + .configure(FAIL_ON_UNKNOWN_PROPERTIES, false) + .configure(FAIL_ON_MISSING_CREATOR_PROPERTIES, true); + + + private BasicDBObject getUEUpdate(JsonNode test){ + String correlationID = UUID.randomUUID().toString(); + BasicDBObject dbObject = new BasicDBObject(); + HashMap keyValuePairs = null; + keyValuePairs = new HashMap<>(); + try { + keyValuePairs.put("payload", new ObjectMapper().writeValueAsString(test)); + } catch (JsonProcessingException e) { + throw new RuntimeException(e); + } + keyValuePairs.put("correlationID", correlationID); + keyValuePairs.put("inProgress", false); + keyValuePairs.put("done", false); + keyValuePairs.put("processInstanceID", getProcessInstanceId()); + keyValuePairs.put("CampaignID", getIdCampaign()); + keyValuePairs.put("questionnaireID", getQuestionnaireId()); + dbObject.putAll(keyValuePairs); + return dbObject; + } + + + @Override + public void addManyUniteEnquetee(List listeUe) { + List bo = listeUe.parallelStream() + .map(this::getUEUpdate) + .toList(); + mongoTemplate.insert(bo, "commandes"); + } + + @Override + public void addManyUniteEnqueteeDeleteColonneClass(List listeUe) { + List bo = listeUe.parallelStream() + .map(this::getUEUpdate) + .toList(); + //remove _class + MappingMongoConverter converter = + new MappingMongoConverter(mongoTemplate.getMongoDatabaseFactory(), new MongoMappingContext()); + converter.setTypeMapper(new DefaultMongoTypeMapper(null)); + MongoTemplate mongoTemplate2 = new MongoTemplate(mongoTemplate.getMongoDatabaseFactory(), converter); + mongoTemplate2.insert(bo, "commandes"); + } + + @Override + public void addManyUniteEnquetee(List listeUe, String processInstanceId, String campaignId, String questionnaireId) { + this.setProcessInstanceId(processInstanceId); + this.setIdCampaign(campaignId); + this.setQuestionnaireId(questionnaireId); + List bo = listeUe.parallelStream() + .map(this::getUEUpdate) + .toList(); + //remove _class + MappingMongoConverter converter = + new MappingMongoConverter(mongoTemplate.getMongoDatabaseFactory(), new MongoMappingContext()); + converter.setTypeMapper(new DefaultMongoTypeMapper(null)); + MongoTemplate mongoTemplate2 = new MongoTemplate(mongoTemplate.getMongoDatabaseFactory(), converter); + mongoTemplate2.insert(bo, "commandes"); + } + +} \ No newline at end of file diff --git a/src/main/java/fr/insee/protools/backend/service/common/platine_sabiane/QuestionnaireHelper.java b/src/main/java/fr/insee/protools/backend/service/common/platine_sabiane/QuestionnaireHelper.java index 5ffee9fe..f99a549a 100644 --- a/src/main/java/fr/insee/protools/backend/service/common/platine_sabiane/QuestionnaireHelper.java +++ b/src/main/java/fr/insee/protools/backend/service/common/platine_sabiane/QuestionnaireHelper.java @@ -4,28 +4,26 @@ import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.node.ArrayNode; -import fr.insee.protools.backend.service.DelegateContextVerifier; import fr.insee.protools.backend.dto.platine_sabiane_questionnaire.campaign.CampaignDto; import fr.insee.protools.backend.dto.platine_sabiane_questionnaire.campaign.MetadataValue; import fr.insee.protools.backend.dto.platine_sabiane_questionnaire.surveyunit.SurveyUnitResponseDto; +import fr.insee.protools.backend.dto.rem.REMSurveyUnitDto; +import fr.insee.protools.backend.repository.IUniteEnquetee; +import fr.insee.protools.backend.service.DelegateContextVerifier; import fr.insee.protools.backend.service.context.ContextService; -import fr.insee.protools.backend.service.exception.IncorrectSUBPMNError; import fr.insee.protools.backend.service.exception.JsonParsingBPMNError; import fr.insee.protools.backend.service.nomenclature.NomenclatureService; import fr.insee.protools.backend.service.platine.utils.PlatineHelper; import fr.insee.protools.backend.service.questionnaire_model.QuestionnaireModelService; -import fr.insee.protools.backend.dto.rem.REMSurveyUnitDto; import fr.insee.protools.backend.service.sabiane.SabianeIdHelper; import fr.insee.protools.backend.service.utils.FlowableVariableUtils; import lombok.extern.slf4j.Slf4j; -import org.flowable.engine.delegate.BpmnError; import org.flowable.engine.delegate.DelegateExecution; import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Set; -import java.util.stream.Stream; import static com.fasterxml.jackson.databind.DeserializationFeature.FAIL_ON_MISSING_CREATOR_PROPERTIES; import static com.fasterxml.jackson.databind.DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES; @@ -400,4 +398,23 @@ private static Set getCreateSUContextErrorsCommonPlatineSabiane(JsonNode } return results; } + + public static void createSUTaskPlatineAsync(DelegateExecution execution, ContextService protoolsContext, IUniteEnquetee iUniteEnquetee, QuestionnairePlatineSabianeService service) { + JsonNode contextRootNode = protoolsContext.getContextByProcessInstance(execution.getProcessInstanceId()); + + Long currentPartitionId = FlowableVariableUtils.getVariableOrThrow(execution, VARNAME_CURRENT_PARTITION_ID, Long.class); + List listeUe = FlowableVariableUtils.getVariableOrThrow(execution, VARNAME_REM_SU_LIST, List.class); + + Boolean parallele = FlowableVariableUtils.getVariableOrThrow(execution, "parallele", Boolean.class); + JsonNode currentPartitionNode = getCurrentPartitionNode(contextRootNode, currentPartitionId); + String questionnaireId = currentPartitionNode.path(CTX_PARTITION_QUESTIONNAIRE_MODEL).asText(); + log.info("parallele="+parallele+"- Boolean.FALSE.equals(parallele)="+Boolean.FALSE.equals(parallele)); + + String processInstanceId = execution.getProcessInstanceId(); + String campaignId = contextRootNode.path(CTX_CAMPAGNE_ID).asText(); + + iUniteEnquetee.addManyUniteEnquetee(listeUe, processInstanceId, campaignId, questionnaireId); +// iUniteEnquetee.addManyUniteEnqueteeDeleteColonneClass(listeUe); + } + } diff --git a/src/main/java/fr/insee/protools/backend/service/platine/delegate/PlatineQuestionnaireCreateSurveyUnitTaskAsync.java b/src/main/java/fr/insee/protools/backend/service/platine/delegate/PlatineQuestionnaireCreateSurveyUnitTaskAsync.java new file mode 100644 index 00000000..b3ca6e04 --- /dev/null +++ b/src/main/java/fr/insee/protools/backend/service/platine/delegate/PlatineQuestionnaireCreateSurveyUnitTaskAsync.java @@ -0,0 +1,47 @@ +package fr.insee.protools.backend.service.platine.delegate; + +import com.fasterxml.jackson.databind.JsonNode; +import fr.insee.protools.backend.repository.IUniteEnquetee; +import fr.insee.protools.backend.service.DelegateContextVerifier; +import fr.insee.protools.backend.service.common.platine_sabiane.QuestionnaireHelper; +import fr.insee.protools.backend.service.context.ContextService; +import fr.insee.protools.backend.service.platine.questionnaire.PlatineQuestionnaireService; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.JavaDelegate; +import org.springframework.stereotype.Component; + +import java.util.Set; + +import static fr.insee.protools.backend.service.context.ContextConstants.CTX_CAMPAGNE_CONTEXTE; + +@Slf4j +@Component +@RequiredArgsConstructor +public class PlatineQuestionnaireCreateSurveyUnitTaskAsync implements JavaDelegate, DelegateContextVerifier { + + private final ContextService protoolsContext; + private final PlatineQuestionnaireService platineQuestionnaireService; + private final IUniteEnquetee iUniteEnquetee; + @Override + public void execute(DelegateExecution execution) { + JsonNode contextRootNode = protoolsContext.getContextByProcessInstance(execution.getProcessInstanceId()); + //TODO: delete this log if necessary + log.debug("ProcessInstanceId={} - campagne={} - begin" + ,execution.getProcessInstanceId(),contextRootNode.path(CTX_CAMPAGNE_CONTEXTE).asText()); + + checkContextOrThrow(log,execution.getProcessInstanceId(), contextRootNode); + QuestionnaireHelper.createSUTaskPlatineAsync(execution,protoolsContext,iUniteEnquetee,platineQuestionnaireService); + log.debug("ProcessInstanceId={} - campagne={} - end", + execution.getProcessInstanceId(),contextRootNode.path(CTX_CAMPAGNE_CONTEXTE).asText()); + + + } + + @Override + public Set getContextErrors(JsonNode contextRootNode) { + return QuestionnaireHelper.getCreateSUContextErrorsPlatine(contextRootNode); + } + +} diff --git a/src/main/java/fr/insee/protools/backend/service/questionnaire_model/QuestionnaireModelFromStaticWebsiteServiceImpl.java b/src/main/java/fr/insee/protools/backend/service/questionnaire_model/QuestionnaireModelFromStaticWebsiteServiceImpl.java index a3fa0924..c1c40fbd 100644 --- a/src/main/java/fr/insee/protools/backend/service/questionnaire_model/QuestionnaireModelFromStaticWebsiteServiceImpl.java +++ b/src/main/java/fr/insee/protools/backend/service/questionnaire_model/QuestionnaireModelFromStaticWebsiteServiceImpl.java @@ -24,11 +24,12 @@ public class QuestionnaireModelFromStaticWebsiteServiceImpl implements Questionn @Value("${fr.insee.protools.questionnaire.model.uri}") private String questionnaireModelUri; + @Override public String getQuestionnaireModel(String questionnaireModelId, String folderPath){ log.info("Get Questionnaire Model Value for questionnaireModelId={}", questionnaireModelId); String uri; - String fullPath = String.format("%s/%s/%s.json", questionnaireModelUri, folderPath, questionnaireModelId); + String fullPath=questionnaireModelUri+"/" +folderPath+ "/"+questionnaireModelId + ".json"; try { uri = new URI(fullPath).normalize().toString(); } catch (URISyntaxException e) { diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index a2d213ee..e1f5e783 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -1,3 +1,6 @@ +#Local MongoDB config +spring.data.mongodb.uri=mongodb://${MONGO_USER}:${MONGO_PASSWORD}@${MONGO_URL}:${MONGO_PORT}/${MONGO_COLLECTION}?&authSource=${MONGO_COLLECTION} + #Role administrateur (au sens keycloak, creable et administrable via sugoi) #https://gestion-comptes-utilisateurs.recette.insee.fr/ #ce role protege le endpoint starter/healthcheckadmin From 4554067489815825aaea8ebffa9040d00ac77935 Mon Sep 17 00:00:00 2001 From: SNDIL - Marc Date: Tue, 13 Aug 2024 15:03:33 +0200 Subject: [PATCH 45/75] add: propertiesLogger reworked --- .../java/fr/insee/protools/backend/StarterApplication.java | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/main/java/fr/insee/protools/backend/StarterApplication.java b/src/main/java/fr/insee/protools/backend/StarterApplication.java index f18c8d6f..522df08e 100644 --- a/src/main/java/fr/insee/protools/backend/StarterApplication.java +++ b/src/main/java/fr/insee/protools/backend/StarterApplication.java @@ -1,6 +1,5 @@ package fr.insee.protools.backend; -import fr.insee.protools.backend.configuration.PropertiesLogger; import jakarta.servlet.ServletRequest; import jakarta.servlet.http.HttpServletRequest; import org.springdoc.core.utils.SpringDocUtils; @@ -15,8 +14,7 @@ public static void main(String[] args) { configureApplicationBuilder(new SpringApplicationBuilder()).build().run(args); } public static SpringApplicationBuilder configureApplicationBuilder(SpringApplicationBuilder springApplicationBuilder){ - return springApplicationBuilder.sources(StarterApplication.class) - .listeners(new PropertiesLogger()); + return springApplicationBuilder.sources(StarterApplication.class); } @EventListener(ApplicationReadyEvent.class) From 2512b1142d7a20320b7371cad0ec914643d16adc Mon Sep 17 00:00:00 2001 From: SNDIL - Marc Date: Tue, 13 Aug 2024 15:29:58 +0200 Subject: [PATCH 46/75] restclient, partitions... --- .../ProtoolsProcessControllerAdvice.java | 12 +- .../backend/controller/StarterController.java | 2 +- .../internal/ProtoolsInterrogationDto.java | 22 ++ .../configuration/APIProperties.java | 2 +- .../configuration/ApiConfigProperties.java | 2 +- .../exception/ApiNotConfiguredBPMNError.java | 2 +- .../KeycloakTokenConfigBPMNError.java | 2 +- ...KeycloakTokenConfigUncheckedBPMNError.java | 2 +- .../runtime/HttpClient4xxBPMNError.java} | 6 +- .../runtime/HttpClient5xxBPMNError.java} | 6 +- .../HttpClientNetworkExceptionBPMNError.java} | 6 +- .../HttpClientNullReturnBPMNError.java} | 6 +- .../HttpClientRequestExceptionBPMNError.java} | 6 +- .../keycloak}/KeycloakResponse.java | 4 +- .../keycloak}/KeycloakService.java | 41 ++-- .../keycloak}/Token.java | 2 +- .../httpclients/pagination/PageResponse.java | 26 +++ .../restclient/RestClientHelper.java | 177 +++++++++++++++ .../RestClientKeycloakHeadersInterceptor.java | 38 ++++ .../webclient/KeycloakHeadersFilter.java | 9 +- .../webclient/WebClientHelper.java | 28 +-- .../FlowableVariableNameConstants.java | 15 +- .../platine_sabiane/QuestionnaireHelper.java | 58 ++--- .../QuestionnairePlatineSabianeService.java | 52 +++-- .../backend/service/era/EraService.java | 4 +- .../exception/PageableAPIBPMNError.java | 13 ++ .../service/meshuggah/MeshuggahService.java | 24 ++- ...unicationForInterrogationListTaskREST.java | 36 ++++ ...enclatureFromStaticWebsiteServiceImpl.java | 2 +- ...nePilotageCreateInterrogationListTask.java | 202 ++++++++++++++++++ .../PlatinePilotageCreateSurveyUnitTask.java | 172 +-------------- ...stionnaireCreateInterrogationListTask.java | 36 ++++ ...tineQuestionnaireCreateSurveyUnitTask.java | 5 +- .../PlatinePilotageCreateContextTaskv2.java | 41 ++++ ...lotageCreateInterrogationListTaskREST.java | 19 ++ ...nnaireCreateInterrogationListTaskREST.java | 24 +++ .../pilotage/PlatinePilotageService.java | 35 ++- .../PlatineQuestionnaireService.java | 4 +- .../service/platine/utils/PlatineHelper.java | 16 +- ...aireModelFromStaticWebsiteServiceImpl.java | 2 +- .../backend/service/rem/RemService.java | 117 ++++++++-- ...ExtractContactIdentifierFromREMSUTask.java | 4 +- .../RemGetPartitionListOfSuIdTask.java | 4 +- .../service/rem/delegate/RemGetSUTask.java | 4 +- .../rem/delegate/RemWriteEraSUListTask.java | 6 +- .../RemGetPartitionListOfSUPaginatedTask.java | 97 +++++++++ .../delegate/SabianePilotageCreateSUTask.java | 6 +- .../pilotage/SabianePilotageService.java | 4 +- .../SabianeQuestionnaireService.java | 4 +- .../backend/service/sugoi/LogTask.java | 47 ++++ .../sugoi/SugoiCreateUserListTask.java | 102 +++++++++ .../backend/service/sugoi/SugoiService.java | 15 +- .../service/sugoi/v2/CleanPasswordsTask.java | 50 +++++ .../sugoi/v2/SugoiREMCreateUserListTask.java | 106 +++++++++ .../service/utils/FlowableVariableUtils.java | 14 ++ .../DefaultCallServiceInterroListTask.java | 54 +++++ src/main/resources/application-dev.properties | 3 +- .../noCTX_getREMAvecSousProcess.bpmn20.xml | 4 +- .../controller/StarterControllerTest.java | 2 +- .../restclient/RestClientHelperTest.java | 190 ++++++++++++++++ .../webclient/KeycloakServiceTest.java | 8 +- .../webclient/WebClientHelperTest.java | 16 +- ...atinePilotageCreateSurveyUnitTaskTest.java | 34 +-- ...QuestionnaireCreateSurveyUnitTaskTest.java | 4 +- ...actContactIdentifierFromREMSUTaskTest.java | 10 +- .../RemGetPartitionListOfSuIdTaskTest.java | 4 +- .../rem/delegate/RemGetSUTaskTest.java | 4 +- .../delegate/RemWriteEraSUListTaskTest.java | 2 +- .../SabianePilotageCreateSUTaskTest.java | 10 +- .../SabianeQuestionnaireCreateSUTaskTest.java | 10 +- 70 files changed, 1700 insertions(+), 396 deletions(-) create mode 100644 src/main/java/fr/insee/protools/backend/dto/internal/ProtoolsInterrogationDto.java rename src/main/java/fr/insee/protools/backend/{webclient => httpclients}/configuration/APIProperties.java (96%) rename src/main/java/fr/insee/protools/backend/{webclient => httpclients}/configuration/ApiConfigProperties.java (98%) rename src/main/java/fr/insee/protools/backend/{webclient => httpclients}/exception/ApiNotConfiguredBPMNError.java (85%) rename src/main/java/fr/insee/protools/backend/{webclient => httpclients}/exception/KeycloakTokenConfigBPMNError.java (85%) rename src/main/java/fr/insee/protools/backend/{webclient => httpclients}/exception/KeycloakTokenConfigUncheckedBPMNError.java (86%) rename src/main/java/fr/insee/protools/backend/{webclient/exception/runtime/WebClient4xxBPMNError.java => httpclients/exception/runtime/HttpClient4xxBPMNError.java} (68%) rename src/main/java/fr/insee/protools/backend/{webclient/exception/runtime/WebClient5xxBPMNError.java => httpclients/exception/runtime/HttpClient5xxBPMNError.java} (53%) rename src/main/java/fr/insee/protools/backend/{webclient/exception/runtime/WebClientNetworkExceptionBPMNError.java => httpclients/exception/runtime/HttpClientNetworkExceptionBPMNError.java} (82%) rename src/main/java/fr/insee/protools/backend/{webclient/exception/runtime/WebClientNullReturnBPMNError.java => httpclients/exception/runtime/HttpClientNullReturnBPMNError.java} (51%) rename src/main/java/fr/insee/protools/backend/{webclient/exception/runtime/WebClientRequestExceptionBPMNError.java => httpclients/exception/runtime/HttpClientRequestExceptionBPMNError.java} (81%) rename src/main/java/fr/insee/protools/backend/{webclient => httpclients/keycloak}/KeycloakResponse.java (82%) rename src/main/java/fr/insee/protools/backend/{webclient => httpclients/keycloak}/KeycloakService.java (76%) rename src/main/java/fr/insee/protools/backend/{webclient => httpclients/keycloak}/Token.java (81%) create mode 100644 src/main/java/fr/insee/protools/backend/httpclients/pagination/PageResponse.java create mode 100644 src/main/java/fr/insee/protools/backend/httpclients/restclient/RestClientHelper.java create mode 100644 src/main/java/fr/insee/protools/backend/httpclients/restclient/RestClientKeycloakHeadersInterceptor.java rename src/main/java/fr/insee/protools/backend/{ => httpclients}/webclient/KeycloakHeadersFilter.java (80%) rename src/main/java/fr/insee/protools/backend/{ => httpclients}/webclient/WebClientHelper.java (93%) create mode 100644 src/main/java/fr/insee/protools/backend/service/exception/PageableAPIBPMNError.java create mode 100644 src/main/java/fr/insee/protools/backend/service/meshuggah/v2/MeshuggahSendCommunicationForInterrogationListTaskREST.java create mode 100644 src/main/java/fr/insee/protools/backend/service/platine/delegate/PlatinePilotageCreateInterrogationListTask.java create mode 100644 src/main/java/fr/insee/protools/backend/service/platine/delegate/PlatineQuestionnaireCreateInterrogationListTask.java create mode 100644 src/main/java/fr/insee/protools/backend/service/platine/delegate/v2/PlatinePilotageCreateContextTaskv2.java create mode 100644 src/main/java/fr/insee/protools/backend/service/platine/delegate/v2/PlatinePilotageCreateInterrogationListTaskREST.java create mode 100644 src/main/java/fr/insee/protools/backend/service/platine/delegate/v2/PlatineQuestionnaireCreateInterrogationListTaskREST.java create mode 100644 src/main/java/fr/insee/protools/backend/service/rem/delegate/v2/RemGetPartitionListOfSUPaginatedTask.java create mode 100644 src/main/java/fr/insee/protools/backend/service/sugoi/LogTask.java create mode 100644 src/main/java/fr/insee/protools/backend/service/sugoi/SugoiCreateUserListTask.java create mode 100644 src/main/java/fr/insee/protools/backend/service/sugoi/v2/CleanPasswordsTask.java create mode 100644 src/main/java/fr/insee/protools/backend/service/sugoi/v2/SugoiREMCreateUserListTask.java create mode 100644 src/main/java/fr/insee/protools/backend/service/utils/delegate/DefaultCallServiceInterroListTask.java create mode 100644 src/test/java/fr/insee/protools/backend/httpclients/restclient/RestClientHelperTest.java rename src/test/java/fr/insee/protools/backend/{ => httpclients}/webclient/KeycloakServiceTest.java (95%) rename src/test/java/fr/insee/protools/backend/{ => httpclients}/webclient/WebClientHelperTest.java (94%) diff --git a/src/main/java/fr/insee/protools/backend/controller/ProtoolsProcessControllerAdvice.java b/src/main/java/fr/insee/protools/backend/controller/ProtoolsProcessControllerAdvice.java index 6249690b..d6da3805 100644 --- a/src/main/java/fr/insee/protools/backend/controller/ProtoolsProcessControllerAdvice.java +++ b/src/main/java/fr/insee/protools/backend/controller/ProtoolsProcessControllerAdvice.java @@ -4,8 +4,8 @@ import fr.insee.protools.backend.service.context.exception.BadContextIncorrectBPMNError; import fr.insee.protools.backend.service.context.exception.BadContextNotJSONBPMNError; import fr.insee.protools.backend.service.exception.*; -import fr.insee.protools.backend.webclient.exception.runtime.WebClient4xxBPMNError; -import fr.insee.protools.backend.webclient.exception.runtime.WebClient5xxBPMNError; +import fr.insee.protools.backend.httpclients.exception.runtime.HttpClient4xxBPMNError; +import fr.insee.protools.backend.httpclients.exception.runtime.HttpClient5xxBPMNError; import lombok.extern.slf4j.Slf4j; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; @@ -49,14 +49,14 @@ public ResponseEntity exeptionProcessDefinitionNotFoundHandler(/*final H return new ResponseEntity<>(exception.getMessage(), HttpStatus.NOT_FOUND); } - @ExceptionHandler({ WebClient4xxBPMNError.class }) - public ResponseEntity exceptionWebClient4xxHandler(/*final HttpServletRequest req, */final WebClient4xxBPMNError exception) { + @ExceptionHandler({ HttpClient4xxBPMNError.class }) + public ResponseEntity exceptionWebClient4xxHandler(/*final HttpServletRequest req, */final HttpClient4xxBPMNError exception) { log.error("exceptionWebClient4xxHandler : "+exception.getMessage()); return new ResponseEntity<>(exception.getMessage(), exception.getHttpStatusCodeError()); } - @ExceptionHandler({ WebClient5xxBPMNError.class }) - public ResponseEntity exceptionWebClient5xxHandler(/*final HttpServletRequest req, */final WebClient5xxBPMNError exception) { + @ExceptionHandler({ HttpClient5xxBPMNError.class }) + public ResponseEntity exceptionWebClient5xxHandler(/*final HttpServletRequest req, */final HttpClient5xxBPMNError exception) { log.error("exceptionWebClient5xxHandler : "+exception.getMessage()); return new ResponseEntity<>(exception.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR); } diff --git a/src/main/java/fr/insee/protools/backend/controller/StarterController.java b/src/main/java/fr/insee/protools/backend/controller/StarterController.java index b6c9cce9..4f25bafb 100644 --- a/src/main/java/fr/insee/protools/backend/controller/StarterController.java +++ b/src/main/java/fr/insee/protools/backend/controller/StarterController.java @@ -1,7 +1,7 @@ package fr.insee.protools.backend.controller; import com.fasterxml.jackson.databind.JsonNode; -import fr.insee.protools.backend.webclient.WebClientHelper; +import fr.insee.protools.backend.httpclients.webclient.WebClientHelper; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.info.BuildProperties; import org.springframework.core.io.ClassPathResource; diff --git a/src/main/java/fr/insee/protools/backend/dto/internal/ProtoolsInterrogationDto.java b/src/main/java/fr/insee/protools/backend/dto/internal/ProtoolsInterrogationDto.java new file mode 100644 index 00000000..eb38672f --- /dev/null +++ b/src/main/java/fr/insee/protools/backend/dto/internal/ProtoolsInterrogationDto.java @@ -0,0 +1,22 @@ +package fr.insee.protools.backend.dto.internal; + +import com.fasterxml.jackson.databind.JsonNode; +import fr.insee.protools.backend.dto.rem.REMSurveyUnitDto; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; + +@Builder +@NoArgsConstructor +@AllArgsConstructor +@Data +public class ProtoolsInterrogationDto implements Serializable { + String idInterrogation; + JsonNode remInterrogation; + String webPassword; + //TODO: à supprimer + String webConnectionId; +} diff --git a/src/main/java/fr/insee/protools/backend/webclient/configuration/APIProperties.java b/src/main/java/fr/insee/protools/backend/httpclients/configuration/APIProperties.java similarity index 96% rename from src/main/java/fr/insee/protools/backend/webclient/configuration/APIProperties.java rename to src/main/java/fr/insee/protools/backend/httpclients/configuration/APIProperties.java index 37734c3c..05ec12e5 100644 --- a/src/main/java/fr/insee/protools/backend/webclient/configuration/APIProperties.java +++ b/src/main/java/fr/insee/protools/backend/httpclients/configuration/APIProperties.java @@ -1,4 +1,4 @@ -package fr.insee.protools.backend.webclient.configuration; +package fr.insee.protools.backend.httpclients.configuration; import com.fasterxml.jackson.annotation.JsonIgnore; import jakarta.validation.Valid; diff --git a/src/main/java/fr/insee/protools/backend/webclient/configuration/ApiConfigProperties.java b/src/main/java/fr/insee/protools/backend/httpclients/configuration/ApiConfigProperties.java similarity index 98% rename from src/main/java/fr/insee/protools/backend/webclient/configuration/ApiConfigProperties.java rename to src/main/java/fr/insee/protools/backend/httpclients/configuration/ApiConfigProperties.java index b15867d3..958aba28 100644 --- a/src/main/java/fr/insee/protools/backend/webclient/configuration/ApiConfigProperties.java +++ b/src/main/java/fr/insee/protools/backend/httpclients/configuration/ApiConfigProperties.java @@ -1,4 +1,4 @@ -package fr.insee.protools.backend.webclient.configuration; +package fr.insee.protools.backend.httpclients.configuration; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.context.annotation.Bean; diff --git a/src/main/java/fr/insee/protools/backend/webclient/exception/ApiNotConfiguredBPMNError.java b/src/main/java/fr/insee/protools/backend/httpclients/exception/ApiNotConfiguredBPMNError.java similarity index 85% rename from src/main/java/fr/insee/protools/backend/webclient/exception/ApiNotConfiguredBPMNError.java rename to src/main/java/fr/insee/protools/backend/httpclients/exception/ApiNotConfiguredBPMNError.java index 0b5c99ea..388a5277 100644 --- a/src/main/java/fr/insee/protools/backend/webclient/exception/ApiNotConfiguredBPMNError.java +++ b/src/main/java/fr/insee/protools/backend/httpclients/exception/ApiNotConfiguredBPMNError.java @@ -1,4 +1,4 @@ -package fr.insee.protools.backend.webclient.exception; +package fr.insee.protools.backend.httpclients.exception; import fr.insee.protools.backend.exception.ProtoolsBpmnError; diff --git a/src/main/java/fr/insee/protools/backend/webclient/exception/KeycloakTokenConfigBPMNError.java b/src/main/java/fr/insee/protools/backend/httpclients/exception/KeycloakTokenConfigBPMNError.java similarity index 85% rename from src/main/java/fr/insee/protools/backend/webclient/exception/KeycloakTokenConfigBPMNError.java rename to src/main/java/fr/insee/protools/backend/httpclients/exception/KeycloakTokenConfigBPMNError.java index a4306881..19c44ae3 100644 --- a/src/main/java/fr/insee/protools/backend/webclient/exception/KeycloakTokenConfigBPMNError.java +++ b/src/main/java/fr/insee/protools/backend/httpclients/exception/KeycloakTokenConfigBPMNError.java @@ -1,4 +1,4 @@ -package fr.insee.protools.backend.webclient.exception; +package fr.insee.protools.backend.httpclients.exception; import fr.insee.protools.backend.exception.ProtoolsBpmnError; diff --git a/src/main/java/fr/insee/protools/backend/webclient/exception/KeycloakTokenConfigUncheckedBPMNError.java b/src/main/java/fr/insee/protools/backend/httpclients/exception/KeycloakTokenConfigUncheckedBPMNError.java similarity index 86% rename from src/main/java/fr/insee/protools/backend/webclient/exception/KeycloakTokenConfigUncheckedBPMNError.java rename to src/main/java/fr/insee/protools/backend/httpclients/exception/KeycloakTokenConfigUncheckedBPMNError.java index 925739ee..f91c4742 100644 --- a/src/main/java/fr/insee/protools/backend/webclient/exception/KeycloakTokenConfigUncheckedBPMNError.java +++ b/src/main/java/fr/insee/protools/backend/httpclients/exception/KeycloakTokenConfigUncheckedBPMNError.java @@ -1,4 +1,4 @@ -package fr.insee.protools.backend.webclient.exception; +package fr.insee.protools.backend.httpclients.exception; import fr.insee.protools.backend.exception.ProtoolsBpmnError; diff --git a/src/main/java/fr/insee/protools/backend/webclient/exception/runtime/WebClient4xxBPMNError.java b/src/main/java/fr/insee/protools/backend/httpclients/exception/runtime/HttpClient4xxBPMNError.java similarity index 68% rename from src/main/java/fr/insee/protools/backend/webclient/exception/runtime/WebClient4xxBPMNError.java rename to src/main/java/fr/insee/protools/backend/httpclients/exception/runtime/HttpClient4xxBPMNError.java index a8a2a908..dc829d07 100644 --- a/src/main/java/fr/insee/protools/backend/webclient/exception/runtime/WebClient4xxBPMNError.java +++ b/src/main/java/fr/insee/protools/backend/httpclients/exception/runtime/HttpClient4xxBPMNError.java @@ -1,15 +1,15 @@ -package fr.insee.protools.backend.webclient.exception.runtime; +package fr.insee.protools.backend.httpclients.exception.runtime; import fr.insee.protools.backend.exception.ProtoolsBpmnError; import org.springframework.http.HttpStatusCode; import static fr.insee.protools.backend.service.BPMNErrorCode.BPMNERROR_CODE_DEFAULT; -public class WebClient4xxBPMNError extends ProtoolsBpmnError { +public class HttpClient4xxBPMNError extends ProtoolsBpmnError { private final HttpStatusCode httpStatusCodeError; - public WebClient4xxBPMNError(String message, HttpStatusCode httpStatusCodeError) { + public HttpClient4xxBPMNError(String message, HttpStatusCode httpStatusCodeError) { super(BPMNERROR_CODE_DEFAULT, message); this.httpStatusCodeError = httpStatusCodeError; } diff --git a/src/main/java/fr/insee/protools/backend/webclient/exception/runtime/WebClient5xxBPMNError.java b/src/main/java/fr/insee/protools/backend/httpclients/exception/runtime/HttpClient5xxBPMNError.java similarity index 53% rename from src/main/java/fr/insee/protools/backend/webclient/exception/runtime/WebClient5xxBPMNError.java rename to src/main/java/fr/insee/protools/backend/httpclients/exception/runtime/HttpClient5xxBPMNError.java index 2ad46b17..8223dd77 100644 --- a/src/main/java/fr/insee/protools/backend/webclient/exception/runtime/WebClient5xxBPMNError.java +++ b/src/main/java/fr/insee/protools/backend/httpclients/exception/runtime/HttpClient5xxBPMNError.java @@ -1,11 +1,11 @@ -package fr.insee.protools.backend.webclient.exception.runtime; +package fr.insee.protools.backend.httpclients.exception.runtime; import fr.insee.protools.backend.exception.ProtoolsBpmnError; import static fr.insee.protools.backend.service.BPMNErrorCode.BPMNERROR_CODE_DEFAULT; -public class WebClient5xxBPMNError extends ProtoolsBpmnError { - public WebClient5xxBPMNError(String message) { +public class HttpClient5xxBPMNError extends ProtoolsBpmnError { + public HttpClient5xxBPMNError(String message) { super(BPMNERROR_CODE_DEFAULT, message); } } diff --git a/src/main/java/fr/insee/protools/backend/webclient/exception/runtime/WebClientNetworkExceptionBPMNError.java b/src/main/java/fr/insee/protools/backend/httpclients/exception/runtime/HttpClientNetworkExceptionBPMNError.java similarity index 82% rename from src/main/java/fr/insee/protools/backend/webclient/exception/runtime/WebClientNetworkExceptionBPMNError.java rename to src/main/java/fr/insee/protools/backend/httpclients/exception/runtime/HttpClientNetworkExceptionBPMNError.java index b2a8390d..c82e6683 100644 --- a/src/main/java/fr/insee/protools/backend/webclient/exception/runtime/WebClientNetworkExceptionBPMNError.java +++ b/src/main/java/fr/insee/protools/backend/httpclients/exception/runtime/HttpClientNetworkExceptionBPMNError.java @@ -1,4 +1,4 @@ -package fr.insee.protools.backend.webclient.exception.runtime; +package fr.insee.protools.backend.httpclients.exception.runtime; import fr.insee.protools.backend.exception.ProtoolsBpmnError; import lombok.extern.slf4j.Slf4j; @@ -7,11 +7,11 @@ import static fr.insee.protools.backend.service.BPMNErrorCode.BPMNERROR_CODE_DEFAULT; @Slf4j -public class WebClientNetworkExceptionBPMNError extends ProtoolsBpmnError { +public class HttpClientNetworkExceptionBPMNError extends ProtoolsBpmnError { private final WebClientRequestException ex; - public WebClientNetworkExceptionBPMNError(WebClientRequestException ex) { + public HttpClientNetworkExceptionBPMNError(WebClientRequestException ex) { super(BPMNERROR_CODE_DEFAULT, computeMessage(ex)); this.ex = ex; log.error(this.getMessage()); diff --git a/src/main/java/fr/insee/protools/backend/webclient/exception/runtime/WebClientNullReturnBPMNError.java b/src/main/java/fr/insee/protools/backend/httpclients/exception/runtime/HttpClientNullReturnBPMNError.java similarity index 51% rename from src/main/java/fr/insee/protools/backend/webclient/exception/runtime/WebClientNullReturnBPMNError.java rename to src/main/java/fr/insee/protools/backend/httpclients/exception/runtime/HttpClientNullReturnBPMNError.java index 589f866f..5a11d540 100644 --- a/src/main/java/fr/insee/protools/backend/webclient/exception/runtime/WebClientNullReturnBPMNError.java +++ b/src/main/java/fr/insee/protools/backend/httpclients/exception/runtime/HttpClientNullReturnBPMNError.java @@ -1,12 +1,12 @@ -package fr.insee.protools.backend.webclient.exception.runtime; +package fr.insee.protools.backend.httpclients.exception.runtime; import fr.insee.protools.backend.exception.ProtoolsBpmnError; import static fr.insee.protools.backend.service.BPMNErrorCode.BPMNERROR_CODE_DEFAULT; -public class WebClientNullReturnBPMNError extends ProtoolsBpmnError { - public WebClientNullReturnBPMNError(String message) { +public class HttpClientNullReturnBPMNError extends ProtoolsBpmnError { + public HttpClientNullReturnBPMNError(String message) { super(BPMNERROR_CODE_DEFAULT, message); } } diff --git a/src/main/java/fr/insee/protools/backend/webclient/exception/runtime/WebClientRequestExceptionBPMNError.java b/src/main/java/fr/insee/protools/backend/httpclients/exception/runtime/HttpClientRequestExceptionBPMNError.java similarity index 81% rename from src/main/java/fr/insee/protools/backend/webclient/exception/runtime/WebClientRequestExceptionBPMNError.java rename to src/main/java/fr/insee/protools/backend/httpclients/exception/runtime/HttpClientRequestExceptionBPMNError.java index a11c1aa0..291a0ca8 100644 --- a/src/main/java/fr/insee/protools/backend/webclient/exception/runtime/WebClientRequestExceptionBPMNError.java +++ b/src/main/java/fr/insee/protools/backend/httpclients/exception/runtime/HttpClientRequestExceptionBPMNError.java @@ -1,4 +1,4 @@ -package fr.insee.protools.backend.webclient.exception.runtime; +package fr.insee.protools.backend.httpclients.exception.runtime; import fr.insee.protools.backend.exception.ProtoolsBpmnError; import lombok.extern.slf4j.Slf4j; @@ -7,11 +7,11 @@ import static fr.insee.protools.backend.service.BPMNErrorCode.BPMNERROR_CODE_DEFAULT; @Slf4j -public class WebClientRequestExceptionBPMNError extends ProtoolsBpmnError { +public class HttpClientRequestExceptionBPMNError extends ProtoolsBpmnError { private final WebClientRequestException ex; - public WebClientRequestExceptionBPMNError(WebClientRequestException ex) { + public HttpClientRequestExceptionBPMNError(WebClientRequestException ex) { super(BPMNERROR_CODE_DEFAULT, computeMessage(ex)); this.ex = ex; log.error(this.getMessage()); diff --git a/src/main/java/fr/insee/protools/backend/webclient/KeycloakResponse.java b/src/main/java/fr/insee/protools/backend/httpclients/keycloak/KeycloakResponse.java similarity index 82% rename from src/main/java/fr/insee/protools/backend/webclient/KeycloakResponse.java rename to src/main/java/fr/insee/protools/backend/httpclients/keycloak/KeycloakResponse.java index 615e675d..7cd1e03c 100644 --- a/src/main/java/fr/insee/protools/backend/webclient/KeycloakResponse.java +++ b/src/main/java/fr/insee/protools/backend/httpclients/keycloak/KeycloakResponse.java @@ -1,10 +1,10 @@ -package fr.insee.protools.backend.webclient; +package fr.insee.protools.backend.httpclients.keycloak; import com.fasterxml.jackson.annotation.JsonProperty; import lombok.Data; @Data -class KeycloakResponse { +public class KeycloakResponse { @JsonProperty("access_token") private String accesToken; diff --git a/src/main/java/fr/insee/protools/backend/webclient/KeycloakService.java b/src/main/java/fr/insee/protools/backend/httpclients/keycloak/KeycloakService.java similarity index 76% rename from src/main/java/fr/insee/protools/backend/webclient/KeycloakService.java rename to src/main/java/fr/insee/protools/backend/httpclients/keycloak/KeycloakService.java index 02d2f31b..9a1f3b75 100644 --- a/src/main/java/fr/insee/protools/backend/webclient/KeycloakService.java +++ b/src/main/java/fr/insee/protools/backend/httpclients/keycloak/KeycloakService.java @@ -1,7 +1,7 @@ -package fr.insee.protools.backend.webclient; +package fr.insee.protools.backend.httpclients.keycloak; -import fr.insee.protools.backend.webclient.configuration.APIProperties; -import fr.insee.protools.backend.webclient.exception.KeycloakTokenConfigBPMNError; +import fr.insee.protools.backend.httpclients.configuration.APIProperties; +import fr.insee.protools.backend.httpclients.exception.KeycloakTokenConfigBPMNError; import io.netty.handler.logging.LogLevel; import jakarta.annotation.PostConstruct; import lombok.Data; @@ -9,13 +9,13 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.core.env.Environment; import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpStatusCode; import org.springframework.http.MediaType; -import org.springframework.http.client.reactive.ReactorClientHttpConnector; +import org.springframework.http.client.ReactorNettyClientRequestFactory; import org.springframework.stereotype.Service; import org.springframework.util.LinkedMultiValueMap; import org.springframework.util.MultiValueMap; -import org.springframework.web.reactive.function.BodyInserters; -import org.springframework.web.reactive.function.client.WebClient; +import org.springframework.web.client.RestClient; import reactor.netty.http.client.HttpClient; import reactor.netty.transport.logging.AdvancedByteBufFormat; @@ -34,7 +34,7 @@ public class KeycloakService { private final Environment environment; - private WebClient webClient; + private RestClient restClient; public static final int TOKEN_REFRESH_LIMIT_MILLISECONDS = 30*1000; //We will keep one token by auth server / realm / clientId @@ -77,15 +77,12 @@ private void refreshToken(APIProperties.AuthProperties authProperties) throws Ke long endValidityTimeMillis = Instant.now().toEpochMilli(); - KeycloakResponse response = webClient.post() + KeycloakResponse response = restClient.post() .uri(uri) .header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_FORM_URLENCODED_VALUE) - .body(BodyInserters.fromValue(requestBody)) + .body(requestBody) .retrieve() - //.onStatus(httpStatus -> HttpStatus.NOT_FOUND.equals(httpStatus), - // clientResponse -> Mono.empty()) - .bodyToMono(KeycloakResponse.class) - .block(); + .toEntity(KeycloakResponse.class).getBody(); //TODO: timeout configurable ; handling des exceptions (ex: block) ; codes erreur http //TODO : voir aussi cette histoire de timeout if(response!=null) { @@ -98,16 +95,14 @@ private void refreshToken(APIProperties.AuthProperties authProperties) throws Ke } @PostConstruct - void initialize() { - webClient = WebClient.builder() - .clientConnector( - new ReactorClientHttpConnector( - HttpClient.create() - //Handles a proxy conf passed on system properties - .proxyWithSystemProperties() - //enable logging of request/responses - //configurable in properties as if it was this class logers - .wiretap(this.getClass().getCanonicalName(), LogLevel.DEBUG, AdvancedByteBufFormat.TEXTUAL))) + public void initialize() { + restClient = RestClient.builder() + .requestFactory(new ReactorNettyClientRequestFactory(HttpClient.create() + //Handles a proxy conf passed on system properties + .proxyWithSystemProperties() + //enable logging of request/responses + //configurable in properties as if it was this class logers + .wiretap(this.getClass().getCanonicalName(), LogLevel.DEBUG, AdvancedByteBufFormat.TEXTUAL))) .build(); } diff --git a/src/main/java/fr/insee/protools/backend/webclient/Token.java b/src/main/java/fr/insee/protools/backend/httpclients/keycloak/Token.java similarity index 81% rename from src/main/java/fr/insee/protools/backend/webclient/Token.java rename to src/main/java/fr/insee/protools/backend/httpclients/keycloak/Token.java index 2a6cdf8d..205d42c0 100644 --- a/src/main/java/fr/insee/protools/backend/webclient/Token.java +++ b/src/main/java/fr/insee/protools/backend/httpclients/keycloak/Token.java @@ -1,4 +1,4 @@ -package fr.insee.protools.backend.webclient; +package fr.insee.protools.backend.httpclients.keycloak; class Token { public final String value; diff --git a/src/main/java/fr/insee/protools/backend/httpclients/pagination/PageResponse.java b/src/main/java/fr/insee/protools/backend/httpclients/pagination/PageResponse.java new file mode 100644 index 00000000..850e749d --- /dev/null +++ b/src/main/java/fr/insee/protools/backend/httpclients/pagination/PageResponse.java @@ -0,0 +1,26 @@ +package fr.insee.protools.backend.httpclients.pagination; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import lombok.*; + +import java.util.ArrayList; +import java.util.List; + +@Builder +@Data +@NoArgsConstructor +@AllArgsConstructor +@ToString +@JsonIgnoreProperties(ignoreUnknown=true) +public class PageResponse { + private int totalElements; + private int totalPages; + private int size; + @ToString.Exclude + private List content; + private long number; + private int numberOfElements; + private boolean first; + private boolean last; + private boolean empty; +} \ No newline at end of file diff --git a/src/main/java/fr/insee/protools/backend/httpclients/restclient/RestClientHelper.java b/src/main/java/fr/insee/protools/backend/httpclients/restclient/RestClientHelper.java new file mode 100644 index 00000000..b81dbb8c --- /dev/null +++ b/src/main/java/fr/insee/protools/backend/httpclients/restclient/RestClientHelper.java @@ -0,0 +1,177 @@ +package fr.insee.protools.backend.httpclients.restclient; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.node.ArrayNode; +import com.fasterxml.jackson.databind.node.ObjectNode; +import fr.insee.protools.backend.httpclients.keycloak.KeycloakService; +import fr.insee.protools.backend.httpclients.configuration.APIProperties; +import fr.insee.protools.backend.httpclients.configuration.ApiConfigProperties; +import fr.insee.protools.backend.httpclients.exception.ApiNotConfiguredBPMNError; +import fr.insee.protools.backend.httpclients.exception.KeycloakTokenConfigBPMNError; +import fr.insee.protools.backend.httpclients.exception.runtime.HttpClient4xxBPMNError; +import fr.insee.protools.backend.httpclients.exception.runtime.HttpClient5xxBPMNError; +import io.netty.handler.logging.LogLevel; +import lombok.extern.slf4j.Slf4j; +import org.springframework.http.HttpRequest; +import org.springframework.http.HttpStatus; +import org.springframework.http.HttpStatusCode; +import org.springframework.http.client.ClientHttpResponse; +import org.springframework.http.client.ReactorNettyClientRequestFactory; +import org.springframework.stereotype.Component; +import org.springframework.util.StreamUtils; +import org.springframework.web.client.RestClient; +import reactor.netty.http.client.HttpClient; +import reactor.netty.transport.logging.AdvancedByteBufFormat; + +import java.io.IOException; +import java.nio.charset.StandardCharsets; +import java.util.*; + +/** + * Helper class for RestClient + */ +@Component +@Slf4j +public class RestClientHelper { + private final KeycloakService keycloakService; + private final ApiConfigProperties apiConfigProperties; + + private final EnumMap initializedClients = new EnumMap<>(ApiConfigProperties.KNOWN_API.class); + + public RestClientHelper(KeycloakService keycloakService, ApiConfigProperties apiConfigProperties) { + this.keycloakService = keycloakService; + this.apiConfigProperties = apiConfigProperties; + } + + //I cannot have a single builder and store it in a private variable because every call to .filter(...) append a new filter to the builder + //Still true for Restclient? + public RestClient.Builder getBuilder() { + return RestClient.builder() + .defaultStatusHandler(HttpStatusCode::isError, this::handleError) + .requestFactory(new ReactorNettyClientRequestFactory(HttpClient.create() + //Handles a proxy conf passed on system properties + .proxyWithSystemProperties() + //enable logging of request/responses + //configurable in properties as if it was this class logers + .wiretap(this.getClass().getCanonicalName(), LogLevel.DEBUG, AdvancedByteBufFormat.TEXTUAL))); + } + + private void handleError(HttpRequest httpRequest, ClientHttpResponse clientResponse) throws IOException { + String errorMsg = String.format("request=[%s %s] - statusCode=[%s]", + httpRequest.getMethod(),httpRequest.getURI(), clientResponse.getStatusCode()); + if (clientResponse.getStatusCode().equals(HttpStatusCode.valueOf(HttpStatus.UNAUTHORIZED.value()))) { + errorMsg = "HttpStatus.UNAUTHORIZED. WWW-Authenticate=[" + String.join("", clientResponse.getHeaders().get("WWW-Authenticate")) + "]"; + } + + String finalErrorMsg = errorMsg; + String errorMessage = StreamUtils.copyToString(clientResponse.getBody(), StandardCharsets.UTF_8); + if(errorMessage.isBlank()){ + errorMessage= "No error message provided by API"; + } + if (clientResponse.getStatusCode().is4xxClientError()) { + throw new HttpClient4xxBPMNError(finalErrorMsg + " - " + errorMessage, clientResponse.getStatusCode()); + } else { + throw new HttpClient5xxBPMNError(finalErrorMsg + " - " + errorMessage); + } + } + + + /** + * init a new RestClient proxy aware (default one ignore system proxy) + */ + public RestClient getRestClient() { + return getBuilder() + .build(); + } + + + /** + * Get a RestClient preconfigured for proxy and able to get the JWT token required for authentication + * + * @param api the client will connect to this api + * @return preconfigured RestClient for the api + */ + public RestClient getRestClient(ApiConfigProperties.KNOWN_API api) { + APIProperties apiProperties = apiConfigProperties.getAPIProperties(api); + if (apiProperties == null) { + throw new ApiNotConfiguredBPMNError(String.format("API %s is not configured in properties", api)); + } else if (Boolean.FALSE.equals(apiProperties.getEnabled())) { + throw new ApiNotConfiguredBPMNError(String.format("API %s is disabled in properties", api)); + } + return initializedClients.computeIfAbsent(api, + knownApi -> + getBuilder() + .baseUrl(apiProperties.getUrl()) + .requestInitializer(new RestClientKeycloakHeadersInitializer(keycloakService, apiProperties.getAuth())) + .build()); + } + + + public Map getTokenDetailsByAPI(){ + Map result = new HashMap<>(); + for (var api :ApiConfigProperties.KNOWN_API.values() ) { + try { + APIProperties apiProperties = apiConfigProperties.getAPIProperties(api); + if (apiProperties == null) { + throw new ApiNotConfiguredBPMNError(String.format("API %s is not configured in properties", api)); + } else if (Boolean.FALSE.equals(apiProperties.getEnabled())) { + throw new ApiNotConfiguredBPMNError(String.format("API %s is disabled in properties", api)); + } + var token = keycloakService.getToken(apiProperties.getAuth()); + if(token !=null && !token.isBlank()) { + String details = analyseToken(token); + result.put(api.name(),details); + + } + } catch (KeycloakTokenConfigBPMNError | ApiNotConfiguredBPMNError e) { + result.put(api.name(),e.getMessage()); + } + catch (Exception e){ + result.put(api.name(),"Internal error with token"); + } + } + return result; + } + + /** + * @return A json with the configuration of the APIs handled by protools + */ + public JsonNode getAPIConfigDetails(){ + ObjectMapper objectMapper = new ObjectMapper(); + ArrayNode rootNode = objectMapper.createArrayNode(); + for (var api :ApiConfigProperties.KNOWN_API.values() ) { + APIProperties apiProperties = apiConfigProperties.getAPIProperties(api); + ObjectNode apiNode = objectMapper.valueToTree(apiProperties); + apiNode.put("name",api.name()); + rootNode.add(apiNode); + } + return rootNode; + } + + //analyse a single token to retrieve roles + private static String analyseToken(String token) { + String result; + String[] chunks = token.split("\\."); + if(chunks.length<2){ + return "Token size is incorrect. It should contain at least one dot"; + } + Base64.Decoder decoder = Base64.getUrlDecoder(); + String payload = new String(decoder.decode(chunks[1])); + ObjectMapper objectMapper = new ObjectMapper(); + try { + JsonNode tokenPayloadNode = objectMapper.readTree(payload); + String roles = tokenPayloadNode.path("realm_access").path("roles").toString(); + if(roles==null || roles.isBlank()){ + result="No Role found in token"; + } + else{ + result= roles; + } + } catch (JsonProcessingException e) { + result=payload; + } + return result; + } +} diff --git a/src/main/java/fr/insee/protools/backend/httpclients/restclient/RestClientKeycloakHeadersInterceptor.java b/src/main/java/fr/insee/protools/backend/httpclients/restclient/RestClientKeycloakHeadersInterceptor.java new file mode 100644 index 00000000..a542a593 --- /dev/null +++ b/src/main/java/fr/insee/protools/backend/httpclients/restclient/RestClientKeycloakHeadersInterceptor.java @@ -0,0 +1,38 @@ +package fr.insee.protools.backend.httpclients.restclient; + + +import fr.insee.protools.backend.httpclients.keycloak.KeycloakService; +import fr.insee.protools.backend.httpclients.configuration.APIProperties; +import fr.insee.protools.backend.httpclients.exception.KeycloakTokenConfigBPMNError; +import fr.insee.protools.backend.httpclients.exception.KeycloakTokenConfigUncheckedBPMNError; +import org.springframework.http.HttpRequest; +import org.springframework.http.MediaType; +import org.springframework.http.client.*; + +import java.io.IOException; + +/** + * Class in charge of adding the correct bearer token for API calls + * It will retrieve a fresh token if needed using our KeycloakService + */ +class RestClientKeycloakHeadersInitializer implements ClientHttpRequestInitializer { + + KeycloakService keycloakService; + //Configuration of the connexion to the auth server + private APIProperties.AuthProperties authProperties; + + public RestClientKeycloakHeadersInitializer(KeycloakService keycloakService, APIProperties.AuthProperties authProperties) { + this.keycloakService = keycloakService; + this.authProperties = authProperties; + } + + @Override + public void initialize(ClientHttpRequest request) { + try { + request.getHeaders().setBearerAuth(keycloakService.getToken(authProperties)); + } catch (KeycloakTokenConfigBPMNError e) { + throw new KeycloakTokenConfigUncheckedBPMNError(e); + } + request.getHeaders().setContentType(MediaType.APPLICATION_JSON); + } +} diff --git a/src/main/java/fr/insee/protools/backend/webclient/KeycloakHeadersFilter.java b/src/main/java/fr/insee/protools/backend/httpclients/webclient/KeycloakHeadersFilter.java similarity index 80% rename from src/main/java/fr/insee/protools/backend/webclient/KeycloakHeadersFilter.java rename to src/main/java/fr/insee/protools/backend/httpclients/webclient/KeycloakHeadersFilter.java index 551634ec..bac670a1 100644 --- a/src/main/java/fr/insee/protools/backend/webclient/KeycloakHeadersFilter.java +++ b/src/main/java/fr/insee/protools/backend/httpclients/webclient/KeycloakHeadersFilter.java @@ -1,9 +1,10 @@ -package fr.insee.protools.backend.webclient; +package fr.insee.protools.backend.httpclients.webclient; -import fr.insee.protools.backend.webclient.configuration.APIProperties; -import fr.insee.protools.backend.webclient.exception.KeycloakTokenConfigBPMNError; -import fr.insee.protools.backend.webclient.exception.KeycloakTokenConfigUncheckedBPMNError; +import fr.insee.protools.backend.httpclients.keycloak.KeycloakService; +import fr.insee.protools.backend.httpclients.configuration.APIProperties; +import fr.insee.protools.backend.httpclients.exception.KeycloakTokenConfigBPMNError; +import fr.insee.protools.backend.httpclients.exception.KeycloakTokenConfigUncheckedBPMNError; import org.springframework.http.MediaType; import org.springframework.web.reactive.function.client.ClientRequest; import org.springframework.web.reactive.function.client.ClientResponse; diff --git a/src/main/java/fr/insee/protools/backend/webclient/WebClientHelper.java b/src/main/java/fr/insee/protools/backend/httpclients/webclient/WebClientHelper.java similarity index 93% rename from src/main/java/fr/insee/protools/backend/webclient/WebClientHelper.java rename to src/main/java/fr/insee/protools/backend/httpclients/webclient/WebClientHelper.java index 4c12e189..0943340f 100644 --- a/src/main/java/fr/insee/protools/backend/webclient/WebClientHelper.java +++ b/src/main/java/fr/insee/protools/backend/httpclients/webclient/WebClientHelper.java @@ -1,18 +1,19 @@ -package fr.insee.protools.backend.webclient; +package fr.insee.protools.backend.httpclients.webclient; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.node.ArrayNode; import com.fasterxml.jackson.databind.node.ObjectNode; -import fr.insee.protools.backend.webclient.configuration.APIProperties; -import fr.insee.protools.backend.webclient.configuration.ApiConfigProperties; -import fr.insee.protools.backend.webclient.exception.ApiNotConfiguredBPMNError; -import fr.insee.protools.backend.webclient.exception.KeycloakTokenConfigBPMNError; -import fr.insee.protools.backend.webclient.exception.runtime.WebClient4xxBPMNError; -import fr.insee.protools.backend.webclient.exception.runtime.WebClient5xxBPMNError; -import fr.insee.protools.backend.webclient.exception.runtime.WebClientNetworkExceptionBPMNError; -import fr.insee.protools.backend.webclient.exception.runtime.WebClientRequestExceptionBPMNError; +import fr.insee.protools.backend.httpclients.keycloak.KeycloakService; +import fr.insee.protools.backend.httpclients.configuration.APIProperties; +import fr.insee.protools.backend.httpclients.configuration.ApiConfigProperties; +import fr.insee.protools.backend.httpclients.exception.ApiNotConfiguredBPMNError; +import fr.insee.protools.backend.httpclients.exception.KeycloakTokenConfigBPMNError; +import fr.insee.protools.backend.httpclients.exception.runtime.HttpClient4xxBPMNError; +import fr.insee.protools.backend.httpclients.exception.runtime.HttpClient5xxBPMNError; +import fr.insee.protools.backend.httpclients.exception.runtime.HttpClientNetworkExceptionBPMNError; +import fr.insee.protools.backend.httpclients.exception.runtime.HttpClientRequestExceptionBPMNError; import io.netty.channel.ConnectTimeoutException; import io.netty.handler.logging.LogLevel; import lombok.extern.slf4j.Slf4j; @@ -49,6 +50,7 @@ public class WebClientHelper { private final KeycloakService keycloakService; private final ApiConfigProperties apiConfigProperties; + //TODO : a mutualiser entre les deux clients private final EnumMap initializedClients = new EnumMap<>(ApiConfigProperties.KNOWN_API.class); public WebClientHelper(KeycloakService keycloakService, ApiConfigProperties apiConfigProperties) { @@ -74,9 +76,9 @@ private WebClient.Builder getBuilder() { result = clientResponse.bodyToMono(String.class).defaultIfEmpty("No error message provided by API") .flatMap(error -> { if (clientResponse.statusCode().is4xxClientError()) { - return Mono.error(new WebClient4xxBPMNError(finalErrorMsg + " - " + error, clientResponse.statusCode())); + return Mono.error(new HttpClient4xxBPMNError(finalErrorMsg + " - " + error, clientResponse.statusCode())); } else { - return Mono.error(new WebClient5xxBPMNError(finalErrorMsg + " - " + error)); + return Mono.error(new HttpClient5xxBPMNError(finalErrorMsg + " - " + error)); } }); return result; @@ -89,9 +91,9 @@ private WebClient.Builder getBuilder() { if(containsCauseOfType(ex, List.of(SocketException.class,UnresolvedAddressException.class,PrematureCloseException.class, ConnectTimeoutException.class, UnknownHostException.class))){ - return Mono.error(new WebClientNetworkExceptionBPMNError(ex)); + return Mono.error(new HttpClientNetworkExceptionBPMNError(ex)); } - return Mono.error(new WebClientRequestExceptionBPMNError(ex)); + return Mono.error(new HttpClientRequestExceptionBPMNError(ex)); }) ) //To allow up to 20Mb diff --git a/src/main/java/fr/insee/protools/backend/service/FlowableVariableNameConstants.java b/src/main/java/fr/insee/protools/backend/service/FlowableVariableNameConstants.java index 0b728d5c..eaf7a2b0 100644 --- a/src/main/java/fr/insee/protools/backend/service/FlowableVariableNameConstants.java +++ b/src/main/java/fr/insee/protools/backend/service/FlowableVariableNameConstants.java @@ -12,16 +12,25 @@ public class FlowableVariableNameConstants { public static final String VARNAME_CONTEXT_PARTITION_VARIABLES_BY_ID="contexte_partition_variables_by_partitionid"; //To treat partitions one by one (Long) public static final String VARNAME_CURRENT_PARTITION_ID="current_partition_id"; - //to pass a list of REM survey ids (List) - public static final String VARNAME_REM_SU_ID_LIST="rem_survey_unit_id_list"; + //to pass a list of REM interrogation ids (List) + public static final String VARNAME_REM_INTERRO_ID_LIST ="rem_interrogation_id_list"; //to pass a single REM survey unit's ID (Long) public static final String VARNAME_REM_SURVEY_UNIT_IDENTIFIER ="rem_survey_unit_id"; //to pass a REM survey unit content (JsonNode) - public static final String VARNAME_REM_SURVEY_UNIT ="rem_survey_unit"; + public static final String VARNAME_REM_INTERROGATION ="rem_interrogation"; + //To pass a list of REM interrogations content (JsonNode) + public static final String VARNAME_REM_INTERRO_LIST ="rem_interrogation_list"; + //REM PAGEABLE + public static final String VARNAME_REM_INTERRO_LIST_PAGEABLE_IS_LAST_PAGE ="rem_su_list_page_is_last"; + public static final String VARNAME_REM_INTERRO_LIST_PAGEABLE_CURRENT_PAGE ="rem_interro_list_page_current"; + + //Sugoi ID/PWD public static final String VARNAME_DIRECTORYACCESS_ID_CONTACT ="directory_access_id_contact"; public static final String VARNAME_DIRECTORYACCESS_PWD_CONTACT ="directory_access_pwd_contact"; + public static final String VARNAME_DIRECTORYACCESS_PWD_FOR_INTERRO_ID_MAP ="directory_access_pwd_contact_by_interroration_id"; + //ERA response public static final String VARNAME_ERA_RESPONSE="era_response_list"; public static final String VARNAME_ERA_QUERY_START_DATE="era_query_start_date"; diff --git a/src/main/java/fr/insee/protools/backend/service/common/platine_sabiane/QuestionnaireHelper.java b/src/main/java/fr/insee/protools/backend/service/common/platine_sabiane/QuestionnaireHelper.java index 26f7e1ea..7c36039a 100644 --- a/src/main/java/fr/insee/protools/backend/service/common/platine_sabiane/QuestionnaireHelper.java +++ b/src/main/java/fr/insee/protools/backend/service/common/platine_sabiane/QuestionnaireHelper.java @@ -4,6 +4,7 @@ import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.node.ArrayNode; +import fr.insee.protools.backend.dto.internal.ProtoolsInterrogationDto; import fr.insee.protools.backend.service.DelegateContextVerifier; import fr.insee.protools.backend.dto.platine_sabiane_questionnaire.campaign.CampaignDto; import fr.insee.protools.backend.dto.platine_sabiane_questionnaire.campaign.MetadataValue; @@ -11,6 +12,7 @@ import fr.insee.protools.backend.service.context.ContextService; import fr.insee.protools.backend.service.exception.JsonParsingBPMNError; import fr.insee.protools.backend.service.nomenclature.NomenclatureService; +import fr.insee.protools.backend.service.platine.questionnaire.PlatineQuestionnaireService; import fr.insee.protools.backend.service.platine.utils.PlatineHelper; import fr.insee.protools.backend.service.questionnaire_model.QuestionnaireModelService; import fr.insee.protools.backend.dto.rem.REMSurveyUnitDto; @@ -21,12 +23,12 @@ import java.util.HashSet; import java.util.Iterator; +import java.util.List; import java.util.Set; import static com.fasterxml.jackson.databind.DeserializationFeature.FAIL_ON_MISSING_CREATOR_PROPERTIES; import static com.fasterxml.jackson.databind.DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES; -import static fr.insee.protools.backend.service.FlowableVariableNameConstants.VARNAME_CURRENT_PARTITION_ID; -import static fr.insee.protools.backend.service.FlowableVariableNameConstants.VARNAME_REM_SURVEY_UNIT; +import static fr.insee.protools.backend.service.FlowableVariableNameConstants.*; import static fr.insee.protools.backend.service.context.ContextConstants.*; import static fr.insee.protools.backend.service.utils.ContextUtils.getCurrentPartitionNode; @@ -202,7 +204,7 @@ private static String missingCTXMessage(String parent, int index, String child) } private static SurveyUnitResponseDto computeDtoPlatine(JsonNode remSUNode, JsonNode currentPartitionNode) { - REMSurveyUnitDto remSurveyUnitDto = PlatineHelper.parseRemSUNode(objectMapper, VARNAME_REM_SURVEY_UNIT, remSUNode); + REMSurveyUnitDto remSurveyUnitDto = PlatineHelper.parseRemSUNode(objectMapper, remSUNode); String id = remSurveyUnitDto.getRepositoryId().toString(); String nameKey = "name"; String valueKey = "value"; @@ -229,7 +231,7 @@ private static SurveyUnitResponseDto computeDtoPlatine(JsonNode remSUNode, JsonN } private static SurveyUnitResponseDto computeDtoSabiane(JsonNode remSUNode, JsonNode currentPartitionNode) { - REMSurveyUnitDto remSurveyUnitDto = PlatineHelper.parseRemSUNode(objectMapper, VARNAME_REM_SURVEY_UNIT, remSUNode); + REMSurveyUnitDto remSurveyUnitDto = PlatineHelper.parseRemSUNode(objectMapper, remSUNode); String id = SabianeIdHelper.computeSabianeID(currentPartitionNode.path(CTX_PARTITION_ID).asText(),remSurveyUnitDto.getRepositoryId().toString()); return SurveyUnitResponseDto.builder() @@ -242,16 +244,6 @@ private static SurveyUnitResponseDto computeDtoSabiane(JsonNode remSUNode, JsonN .build(); } - /** - * Create a SU in Platine Questionnaire - * @param execution - * @param protoolsContext - * @param service - */ - public static void createSUTaskPlatine(DelegateExecution execution, ContextService protoolsContext, QuestionnairePlatineSabianeService service) { - createSUTaskPlatineSabiane(execution, protoolsContext, service, false); - } - /** * Create a SU in Sabiane Questionnaire * @param execution @@ -259,26 +251,17 @@ public static void createSUTaskPlatine(DelegateExecution execution, ContextServi * @param service */ public static void createSUTaskSabiane(DelegateExecution execution, ContextService protoolsContext, QuestionnairePlatineSabianeService service) { - createSUTaskPlatineSabiane(execution, protoolsContext, service, true); - } - - private static void createSUTaskPlatineSabiane(DelegateExecution execution, ContextService protoolsContext, QuestionnairePlatineSabianeService service, boolean modeSabiane) { JsonNode contextRootNode = protoolsContext.getContextByProcessInstance(execution.getProcessInstanceId()); Long currentPartitionId = FlowableVariableUtils.getVariableOrThrow(execution, VARNAME_CURRENT_PARTITION_ID, Long.class); - JsonNode remSUNode = FlowableVariableUtils.getVariableOrThrow(execution, VARNAME_REM_SURVEY_UNIT, JsonNode.class); + JsonNode remSUNode = FlowableVariableUtils.getVariableOrThrow(execution, VARNAME_REM_INTERROGATION, JsonNode.class); JsonNode currentPartitionNode = getCurrentPartitionNode(contextRootNode, currentPartitionId); //Create the DTO object - SurveyUnitResponseDto dto = - (modeSabiane) - ? - QuestionnaireHelper.computeDtoSabiane(remSUNode, currentPartitionNode) - : - QuestionnaireHelper.computeDtoPlatine(remSUNode, currentPartitionNode); + SurveyUnitResponseDto dto = QuestionnaireHelper.computeDtoSabiane(remSUNode, currentPartitionNode); - log.info("ProcessInstanceId={} - mode={} - currentPartitionId={} - remSU.id={}", - execution.getProcessInstanceId(), modeSabiane ? "sabiane" : "platine", currentPartitionId, dto.getId()); + log.info("ProcessInstanceId={} - currentPartitionId={} - remSU.id={}", + execution.getProcessInstanceId(), currentPartitionId, dto.getId()); //Call service service.postSurveyUnit(dto, contextRootNode.path(CTX_CAMPAGNE_ID).asText()); @@ -286,6 +269,7 @@ private static void createSUTaskPlatineSabiane(DelegateExecution execution, Cont log.debug("ProcessInstanceId={} end", execution.getProcessInstanceId()); } + /** * Get the context errors for an SU creation in Platine * @param contextRootNode : the context to verify @@ -329,4 +313,24 @@ private static Set getCreateSUContextErrorsCommonPlatineSabiane(JsonNode } return results; } + + public static void createInterrogationsTaskPlatine(DelegateExecution execution, ContextService protoolsContext, PlatineQuestionnaireService service) { + JsonNode contextRootNode = protoolsContext.getContextByProcessInstance(execution.getProcessInstanceId()); + + Long currentPartitionId = FlowableVariableUtils.getVariableOrThrow(execution, VARNAME_CURRENT_PARTITION_ID, Long.class); + List interrogationList = FlowableVariableUtils.getVariableOrThrow(execution, VARNAME_REM_INTERRO_LIST, List.class); + JsonNode currentPartitionNode = getCurrentPartitionNode(contextRootNode, currentPartitionId); + + for (ProtoolsInterrogationDto protoolsInterrogationDto : interrogationList){ + //Create the DTO object + SurveyUnitResponseDto dto = QuestionnaireHelper.computeDtoPlatine(protoolsInterrogationDto.getRemInterrogation(), currentPartitionNode); + + log.debug("ProcessInstanceId={} - currentPartitionId={} - id={}", + execution.getProcessInstanceId(), currentPartitionId, dto.getId()); + //Call service + service.postSurveyUnit(dto, contextRootNode.path(CTX_CAMPAGNE_ID).asText()); + } + + log.info("ProcessInstanceId={} end", execution.getProcessInstanceId()); + } } diff --git a/src/main/java/fr/insee/protools/backend/service/common/platine_sabiane/QuestionnairePlatineSabianeService.java b/src/main/java/fr/insee/protools/backend/service/common/platine_sabiane/QuestionnairePlatineSabianeService.java index d3752adf..07ff218f 100644 --- a/src/main/java/fr/insee/protools/backend/service/common/platine_sabiane/QuestionnairePlatineSabianeService.java +++ b/src/main/java/fr/insee/protools/backend/service/common/platine_sabiane/QuestionnairePlatineSabianeService.java @@ -5,10 +5,10 @@ import fr.insee.protools.backend.dto.platine_sabiane_questionnaire.QuestionnaireModelCreateDto; import fr.insee.protools.backend.dto.platine_sabiane_questionnaire.campaign.CampaignDto; import fr.insee.protools.backend.dto.platine_sabiane_questionnaire.surveyunit.SurveyUnitResponseDto; -import fr.insee.protools.backend.webclient.WebClientHelper; -import fr.insee.protools.backend.webclient.exception.runtime.WebClient4xxBPMNError; -import fr.insee.protools.backend.webclient.exception.runtime.WebClient5xxBPMNError; -import fr.insee.protools.backend.webclient.exception.runtime.WebClientNullReturnBPMNError; +import fr.insee.protools.backend.httpclients.webclient.WebClientHelper; +import fr.insee.protools.backend.httpclients.exception.runtime.HttpClient4xxBPMNError; +import fr.insee.protools.backend.httpclients.exception.runtime.HttpClient5xxBPMNError; +import fr.insee.protools.backend.httpclients.exception.runtime.HttpClientNullReturnBPMNError; import org.slf4j.event.Level; import org.springframework.http.HttpStatus; import org.springframework.web.reactive.function.client.WebClient; @@ -81,7 +81,7 @@ default boolean questionnaireModelExists(String idQuestionnaireModel) { .build(idQuestionnaireModel)) .retrieve().toBodilessEntity().block(); if(response==null) { - throw new WebClientNullReturnBPMNError("Error while checking if questionnaireModel exists - null result"); + throw new HttpClientNullReturnBPMNError("Error while checking if questionnaireModel exists - null result"); } if(response.getStatusCode().is2xxSuccessful()) { @@ -92,15 +92,15 @@ else if(response.getStatusCode().is4xxClientError()){ modelExists=false; } else{ - throw new WebClient4xxBPMNError("Error while checking if questionnaireModel exists ", response.getStatusCode()); + throw new HttpClient4xxBPMNError("Error while checking if questionnaireModel exists ", response.getStatusCode()); } } else{ - throw new WebClient5xxBPMNError("Error while checking if questionnaireModel exists "); + throw new HttpClient5xxBPMNError("Error while checking if questionnaireModel exists "); } getLogger().debug("response code={}",response.getStatusCode()); } - catch (WebClient4xxBPMNError e){ + catch (HttpClient4xxBPMNError e){ if(e.getHttpStatusCodeError().equals(HttpStatus.NOT_FOUND)){ modelExists=false; } @@ -129,7 +129,7 @@ default void postCampaign(CampaignDto campaignDto) { .block(); getLogger().info("postCampaign: idCampaign={} - response={} ", campaignDto.getId(), response); } - catch (WebClient4xxBPMNError e){ + catch (HttpClient4xxBPMNError e){ if(e.getHttpStatusCodeError().equals(HttpStatus.FORBIDDEN)){ String msg= "Error 403/FORBIDEN during Questionnaire postCampaign." @@ -138,14 +138,14 @@ default void postCampaign(CampaignDto campaignDto) { +" is already assigned to another campaign." + " msg="+e.getMessage(); getLogger().error(msg); - throw new WebClient4xxBPMNError(msg,e.getHttpStatusCodeError()); + throw new HttpClient4xxBPMNError(msg,e.getHttpStatusCodeError()); } else if(e.getHttpStatusCodeError().equals(HttpStatus.BAD_REQUEST)){ String msg="Error 400/BAD_REQUEST during Questionnaire postCampaign." + " One possible cause is that the campaign already exists " + " msg="+e.getMessage(); getLogger().error(msg); - throw new WebClient4xxBPMNError(msg,e.getHttpStatusCodeError()); + throw new HttpClient4xxBPMNError(msg,e.getHttpStatusCodeError()); } //Currently no remediation so just rethrow throw e; @@ -167,12 +167,38 @@ default void postSurveyUnit(SurveyUnitResponseDto suDto, String idCampaign) { .block(); getLogger().info("postSurveyUnit: idCampaign={} - idSu={} - response={} ", idCampaign,suDto.getId(), response); } - catch (WebClient4xxBPMNError e){ + catch (HttpClient4xxBPMNError e){ if(e.getHttpStatusCodeError().equals(HttpStatus.BAD_REQUEST)){ String msg="Error 400/BAD_REQUEST during Questionnaire postSurveyUnit." + " msg="+e.getMessage(); getLogger().error(msg); - throw new WebClient4xxBPMNError(msg,e.getHttpStatusCodeError()); + throw new HttpClient4xxBPMNError(msg,e.getHttpStatusCodeError()); + } + //Currently no remediation so just rethrow + throw e; + } + } + + //V2 + default void postSurveyUnits(String idCampaign, List interrogations) { + WebClientHelper.logJson("postSurveyUnits: idCampaign=" + idCampaign, interrogations, getLogger(), Level.DEBUG); + try { + var response = webClient() + .post() + .uri(uriBuilder -> uriBuilder + .path("/api/campaign/{id}/survey-unit") + .build(idCampaign)) + .bodyValue(interrogations) + .retrieve() + .bodyToMono(String.class) + .block(); + getLogger().info("postSurveyUnits: idCampaign={} - response={} ", idCampaign, response); + } catch (HttpClient4xxBPMNError e) { + if (e.getHttpStatusCodeError().equals(HttpStatus.BAD_REQUEST)) { + String msg = "Error 400/BAD_REQUEST during Questionnaire postSurveyUnits." + + " msg=" + e.getMessage(); + getLogger().error(msg); + throw new HttpClient4xxBPMNError(msg, e.getHttpStatusCodeError()); } //Currently no remediation so just rethrow throw e; diff --git a/src/main/java/fr/insee/protools/backend/service/era/EraService.java b/src/main/java/fr/insee/protools/backend/service/era/EraService.java index c6b1720d..9d69451b 100644 --- a/src/main/java/fr/insee/protools/backend/service/era/EraService.java +++ b/src/main/java/fr/insee/protools/backend/service/era/EraService.java @@ -2,7 +2,7 @@ import fr.insee.protools.backend.dto.era.CensusJsonDto; import fr.insee.protools.backend.dto.era.GenderType; -import fr.insee.protools.backend.webclient.WebClientHelper; +import fr.insee.protools.backend.httpclients.webclient.WebClientHelper; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.core.ParameterizedTypeReference; @@ -12,7 +12,7 @@ import java.time.format.DateTimeFormatter; import java.util.List; -import static fr.insee.protools.backend.webclient.configuration.ApiConfigProperties.KNOWN_API.KNOWN_API_ERA; +import static fr.insee.protools.backend.httpclients.configuration.ApiConfigProperties.KNOWN_API.KNOWN_API_ERA; @Service @Slf4j diff --git a/src/main/java/fr/insee/protools/backend/service/exception/PageableAPIBPMNError.java b/src/main/java/fr/insee/protools/backend/service/exception/PageableAPIBPMNError.java new file mode 100644 index 00000000..b7f1e897 --- /dev/null +++ b/src/main/java/fr/insee/protools/backend/service/exception/PageableAPIBPMNError.java @@ -0,0 +1,13 @@ +package fr.insee.protools.backend.service.exception; + +import fr.insee.protools.backend.exception.ProtoolsBpmnError; + +import static fr.insee.protools.backend.service.BPMNErrorCode.BPMNERROR_CODE_DEFAULT; + +public class PageableAPIBPMNError extends ProtoolsBpmnError { + + + public PageableAPIBPMNError(String message) { + super(BPMNERROR_CODE_DEFAULT,message); + } +} \ No newline at end of file diff --git a/src/main/java/fr/insee/protools/backend/service/meshuggah/MeshuggahService.java b/src/main/java/fr/insee/protools/backend/service/meshuggah/MeshuggahService.java index a216b6c5..342a4348 100644 --- a/src/main/java/fr/insee/protools/backend/service/meshuggah/MeshuggahService.java +++ b/src/main/java/fr/insee/protools/backend/service/meshuggah/MeshuggahService.java @@ -2,12 +2,14 @@ import com.fasterxml.jackson.databind.JsonNode; import fr.insee.protools.backend.dto.meshuggah.MeshuggahComDetails; -import fr.insee.protools.backend.webclient.WebClientHelper; +import fr.insee.protools.backend.httpclients.webclient.WebClientHelper; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; -import static fr.insee.protools.backend.webclient.configuration.ApiConfigProperties.KNOWN_API.KNOWN_API_MESHUGGAH; +import java.util.List; + +import static fr.insee.protools.backend.httpclients.configuration.ApiConfigProperties.KNOWN_API.KNOWN_API_MESHUGGAH; @Service @Slf4j @@ -63,4 +65,22 @@ public void postSendCommunication(MeshuggahComDetails meshuggahComDetails, JsonN } + + //V2 + + public void sendCommunications(String campaign, String mode, List interrogations) { + log.debug("postSendCommunication: campaign={} - mode={} - interrogations.size={}",campaign,mode,interrogations.size()); + String response = webClientHelper.getWebClient(KNOWN_API_MESHUGGAH) + .post() + .uri(uriBuilder -> uriBuilder + .path("/api/campagne/{campaignId}/mode/{mode}") + .build(campaign,mode)) + .bodyValue(interrogations) + .retrieve() + .bodyToMono(String.class) + .block(); + log.debug("postSendCommunication: campaign={} - mode={} - response={}",campaign,mode,response); + + } + } diff --git a/src/main/java/fr/insee/protools/backend/service/meshuggah/v2/MeshuggahSendCommunicationForInterrogationListTaskREST.java b/src/main/java/fr/insee/protools/backend/service/meshuggah/v2/MeshuggahSendCommunicationForInterrogationListTaskREST.java new file mode 100644 index 00000000..b06d88da --- /dev/null +++ b/src/main/java/fr/insee/protools/backend/service/meshuggah/v2/MeshuggahSendCommunicationForInterrogationListTaskREST.java @@ -0,0 +1,36 @@ +package fr.insee.protools.backend.service.meshuggah.v2; + +import com.fasterxml.jackson.databind.JsonNode; +import fr.insee.protools.backend.service.meshuggah.MeshuggahService; +import fr.insee.protools.backend.service.utils.FlowableVariableUtils; +import fr.insee.protools.backend.service.utils.delegate.DefaultCallServiceInterroListTask; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.delegate.DelegateExecution; + +import java.util.List; + +@Slf4j +@RequiredArgsConstructor +public class MeshuggahSendCommunicationForInterrogationListTaskREST extends DefaultCallServiceInterroListTask { + + private final MeshuggahService meshuggahService; + + + @Override + protected void serviceAction(String campaignId, List list, String... params) { + if(params.length!=1){ + log.error("Wrong number of paramaters : {} - expected 1",params.length); + } + String mode=params[0]; + meshuggahService.sendCommunications(campaignId,mode,list); + } + + @Override + protected void callService(DelegateExecution execution, JsonNode contextRootNode, String campaignId, List list) { + //TODO : communicationMode + String communicationMode = FlowableVariableUtils.getVariableOrThrow(execution,"communicationMode", String.class); + serviceAction(campaignId, list,communicationMode); + } +} + diff --git a/src/main/java/fr/insee/protools/backend/service/nomenclature/NomenclatureFromStaticWebsiteServiceImpl.java b/src/main/java/fr/insee/protools/backend/service/nomenclature/NomenclatureFromStaticWebsiteServiceImpl.java index 4a1e1319..35030355 100644 --- a/src/main/java/fr/insee/protools/backend/service/nomenclature/NomenclatureFromStaticWebsiteServiceImpl.java +++ b/src/main/java/fr/insee/protools/backend/service/nomenclature/NomenclatureFromStaticWebsiteServiceImpl.java @@ -1,7 +1,7 @@ package fr.insee.protools.backend.service.nomenclature; import fr.insee.protools.backend.service.context.exception.BadContextIncorrectBPMNError; -import fr.insee.protools.backend.webclient.WebClientHelper; +import fr.insee.protools.backend.httpclients.webclient.WebClientHelper; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; diff --git a/src/main/java/fr/insee/protools/backend/service/platine/delegate/PlatinePilotageCreateInterrogationListTask.java b/src/main/java/fr/insee/protools/backend/service/platine/delegate/PlatinePilotageCreateInterrogationListTask.java new file mode 100644 index 00000000..ba5ff039 --- /dev/null +++ b/src/main/java/fr/insee/protools/backend/service/platine/delegate/PlatinePilotageCreateInterrogationListTask.java @@ -0,0 +1,202 @@ +package fr.insee.protools.backend.service.platine.delegate; + +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; +import fr.insee.protools.backend.dto.internal.ProtoolsInterrogationDto; +import fr.insee.protools.backend.dto.platine.pilotage.PlatineAddressDto; +import fr.insee.protools.backend.dto.platine.pilotage.PlatinePilotageGenderType; +import fr.insee.protools.backend.dto.platine.pilotage.query.ContactAccreditationDto; +import fr.insee.protools.backend.dto.platine.pilotage.query.QuestioningWebclientDto; +import fr.insee.protools.backend.dto.platine.pilotage.questioning.PlatineQuestioningSurveyUnitDto; +import fr.insee.protools.backend.dto.rem.*; +import fr.insee.protools.backend.service.DelegateContextVerifier; +import fr.insee.protools.backend.service.context.ContextService; +import fr.insee.protools.backend.service.context.enums.CampaignContextEnum; +import fr.insee.protools.backend.service.context.enums.PartitionTypeEchantillon; +import fr.insee.protools.backend.service.platine.pilotage.PlatinePilotageService; +import fr.insee.protools.backend.service.platine.utils.PlatineHelper; +import fr.insee.protools.backend.service.rem.RemDtoUtils; +import fr.insee.protools.backend.service.utils.FlowableVariableUtils; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.EnumUtils; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.JavaDelegate; +import org.springframework.beans.BeanUtils; +import org.springframework.stereotype.Component; + +import java.util.Arrays; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +import static com.fasterxml.jackson.databind.DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES; +import static fr.insee.protools.backend.service.FlowableVariableNameConstants.VARNAME_CURRENT_PARTITION_ID; +import static fr.insee.protools.backend.service.FlowableVariableNameConstants.VARNAME_REM_INTERRO_LIST; +import static fr.insee.protools.backend.service.context.ContextConstants.*; +import static fr.insee.protools.backend.service.utils.ContextUtils.getCurrentPartitionNode; + +@Slf4j +@Component +@RequiredArgsConstructor +public class PlatinePilotageCreateInterrogationListTask implements JavaDelegate, DelegateContextVerifier { + + private static final ObjectMapper objectMapper = new ObjectMapper().configure(FAIL_ON_UNKNOWN_PROPERTIES,false); + + private final ContextService protoolsContext; + private final PlatinePilotageService platinePilotageService; + + @Override + public void execute(DelegateExecution execution) { + JsonNode contextRootNode = protoolsContext.getContextByProcessInstance(execution.getProcessInstanceId()); + checkContextOrThrow(log,execution.getProcessInstanceId(), contextRootNode); + + String campainId = contextRootNode.path(CTX_CAMPAGNE_ID).asText(); + Long currentPartitionId = FlowableVariableUtils.getVariableOrThrow(execution, VARNAME_CURRENT_PARTITION_ID, Long.class); + List interrogationList = FlowableVariableUtils.getVariableOrThrow(execution, VARNAME_REM_INTERRO_LIST, List.class); + + JsonNode currentPartitionNode = getCurrentPartitionNode(contextRootNode, currentPartitionId); + for (ProtoolsInterrogationDto interrogationDto : interrogationList){ + //Create the platine DTO object + QuestioningWebclientDto dto = computeQuestioningWebclientDto(interrogationDto.getRemInterrogation(), + interrogationDto.getWebConnectionId(),//TODO: a terme fait partie de l'interrogation + currentPartitionNode,campainId); + log.info("ProcessInstanceId={} campainId={} - currentPartitionId={} - remSUNode.id={} ", + execution.getProcessInstanceId(), campainId,currentPartitionId,dto.getSurveyUnit().getIdSu()); + //Call service + platinePilotageService.putQuestionings(dto); + } + + log.info("ProcessInstanceId={} campainId={} - currentPartitionId={} - end ", + execution.getProcessInstanceId(), campainId,currentPartitionId); + } + + private static QuestioningWebclientDto computeQuestioningWebclientDto(JsonNode remSUNode, String webConnectionId,JsonNode currentPartitionNode, String idCampagne) { + REMSurveyUnitDto remSurveyUnitDto=PlatineHelper.parseRemSUNode(objectMapper,remSUNode); + boolean isLogement = currentPartitionNode.path(CTX_PARTITION_TYPE_ECHANTILLON).textValue().equalsIgnoreCase(PartitionTypeEchantillon.LOGEMENT.getAsString()); + PersonDto contact = RemDtoUtils.findContact(remSUNode, remSurveyUnitDto, isLogement); + + PlatineAddressDto platineAdress = computePlatineAdress(remSurveyUnitDto.getAddress()); + ContactAccreditationDto platineContact = convertREMPersonToPlatineContact(webConnectionId, platineAdress, contact); + + return + QuestioningWebclientDto.builder() + .idPartitioning(PlatineHelper.computePilotagePartitionID(idCampagne,currentPartitionNode.path(CTX_PARTITION_ID).asLong())) + .modelName(currentPartitionNode.path(CTX_PARTITION_QUESTIONNAIRE_MODEL).asText()) + .surveyUnit(computeSurveyUnitDto(remSurveyUnitDto)) + .contacts(List.of(platineContact)) + .build(); + } + + + + private static PlatineQuestioningSurveyUnitDto computeSurveyUnitDto(REMSurveyUnitDto remSurveyUnitDto) { + + return PlatineQuestioningSurveyUnitDto.builder() + .idSu(remSurveyUnitDto.getRepositoryId().toString()) + .identificationCode("") + .identificationName("") + .address(computePlatineAdress(remSurveyUnitDto.getAddress())) + .build(); + } + + @Override + public Set getContextErrors(JsonNode contextRootNode) { + if(contextRootNode==null){ + return Set.of("Context is missing"); + } + Set results=new HashSet<>(); + Set requiredNodes = + Set.of( + //Global & Campaign + CTX_CAMPAGNE_ID,CTX_CAMPAGNE_CONTEXTE, CTX_PARTITIONS + ); + Set requiredPartition = + Set.of(CTX_PARTITION_ID, CTX_PARTITION_QUESTIONNAIRE_MODEL, CTX_PARTITION_TYPE_ECHANTILLON); + + + results.addAll(DelegateContextVerifier.computeMissingChildrenMessages(requiredNodes,contextRootNode,getClass())); + String contexte = contextRootNode.path(CTX_CAMPAGNE_CONTEXTE).asText(); + if(! EnumUtils.isValidEnumIgnoreCase(CampaignContextEnum.class, contexte)){ + results.add(DelegateContextVerifier.computeIncorrectEnumMessage(CTX_CAMPAGNE_CONTEXTE,contexte, Arrays.toString(CampaignContextEnum.values()),getClass())); + } + + //Maybe one day we will have partitions for platine and partitions for sabiane and we will only validate the platine ones + //Partitions + var partitionIterator =contextRootNode.path(CTX_PARTITIONS).elements(); + while (partitionIterator.hasNext()) { + var partitionNode = partitionIterator.next(); + results.addAll(DelegateContextVerifier.computeMissingChildrenMessages(requiredPartition,partitionNode,getClass())); + + //Check value of Enum + String enumVal = partitionNode.path(CTX_PARTITION_TYPE_ECHANTILLON).asText(); + if(! EnumUtils.isValidEnumIgnoreCase(PartitionTypeEchantillon.class, enumVal)){ + results.add(DelegateContextVerifier.computeIncorrectEnumMessage(CTX_PARTITION_TYPE_ECHANTILLON,enumVal,Arrays.toString(PartitionTypeEchantillon.values()),getClass())); + } + } + return results; + } + + /** + * Compute the lastname to send to platine. + * @param lastname from rem + * @param birthname from rem + * @return the computed platine last name + */ + protected static String getPlatineLastname(String lastname, String birthname){ + if(lastname!=null) + return lastname; + else if(birthname!=null) + return birthname; + return ""; + } + + private static ContactAccreditationDto convertREMPersonToPlatineContact(String idInternaute, PlatineAddressDto platineAdress, PersonDto remPersonDto) { + //If lastname is null then we use birthname + String platineName = getPlatineLastname(remPersonDto.getLastName(),remPersonDto.getBirthName()); + return ContactAccreditationDto.builder() + .identifier(idInternaute) + .externalId(remPersonDto.getExternalId()) + .function("") + .lastName(platineName) + .firstName(remPersonDto.getFirstName()) + .isMain(true) + .civility(convertREMGenderToPlatineCivility(remPersonDto.getGender()).getLabel()) + //Get favorite phone/mail ; if no favorite get the first of the list ; else empty + .email(remPersonDto.getEmails().stream() + .filter(email -> email.getFavorite()!=null && email.getFavorite()) + .findFirst() + .orElse(remPersonDto.getEmails().stream().findFirst().orElse(new EmailDto())) + .getMailAddress()) + .phone( + remPersonDto.getPhoneNumbers().stream() + .filter(phoneNumber -> phoneNumber.getFavorite()!=null && phoneNumber.getFavorite()) + .findFirst() + .orElse(remPersonDto.getPhoneNumbers().stream().findFirst().orElse(new PhoneNumberDto())) + .getNumber()) + .address(platineAdress) + .build(); + } + + static PlatinePilotageGenderType convertREMGenderToPlatineCivility(String remGender) { + if(remGender==null) + return PlatinePilotageGenderType.Undefined; + return switch (remGender) { + case "2": + yield PlatinePilotageGenderType.Female; + case "1" : + yield PlatinePilotageGenderType.Male; + default: + yield PlatinePilotageGenderType.Undefined; + }; + } + + private static PlatineAddressDto computePlatineAdress(REMAddressDto remAddressDto) { + //The REM REMAddressDto and Platine PlatineQuestioningSurveyUnitDto are identical + //I'll use the copyProperty to recopy identical members + var platineAdresse = BeanUtils.instantiateClass(PlatineAddressDto.class); + BeanUtils.copyProperties(remAddressDto, platineAdresse); + return platineAdresse; + } + +} diff --git a/src/main/java/fr/insee/protools/backend/service/platine/delegate/PlatinePilotageCreateSurveyUnitTask.java b/src/main/java/fr/insee/protools/backend/service/platine/delegate/PlatinePilotageCreateSurveyUnitTask.java index 1acaaa60..26d1bcf8 100644 --- a/src/main/java/fr/insee/protools/backend/service/platine/delegate/PlatinePilotageCreateSurveyUnitTask.java +++ b/src/main/java/fr/insee/protools/backend/service/platine/delegate/PlatinePilotageCreateSurveyUnitTask.java @@ -1,195 +1,29 @@ package fr.insee.protools.backend.service.platine.delegate; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; -import fr.insee.protools.backend.dto.platine.pilotage.PlatineAddressDto; -import fr.insee.protools.backend.dto.platine.pilotage.PlatinePilotageGenderType; -import fr.insee.protools.backend.dto.platine.pilotage.query.ContactAccreditationDto; -import fr.insee.protools.backend.dto.platine.pilotage.query.QuestioningWebclientDto; -import fr.insee.protools.backend.dto.platine.pilotage.questioning.PlatineQuestioningSurveyUnitDto; -import fr.insee.protools.backend.dto.rem.*; import fr.insee.protools.backend.service.DelegateContextVerifier; import fr.insee.protools.backend.service.context.ContextService; -import fr.insee.protools.backend.service.context.enums.CampaignContextEnum; -import fr.insee.protools.backend.service.context.enums.PartitionTypeEchantillon; +import fr.insee.protools.backend.service.exception.ProtoolsTaskBPMNError; import fr.insee.protools.backend.service.platine.pilotage.PlatinePilotageService; -import fr.insee.protools.backend.service.platine.utils.PlatineHelper; -import fr.insee.protools.backend.service.rem.RemDtoUtils; -import fr.insee.protools.backend.service.utils.FlowableVariableUtils; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.EnumUtils; import org.flowable.engine.delegate.DelegateExecution; import org.flowable.engine.delegate.JavaDelegate; -import org.springframework.beans.BeanUtils; import org.springframework.stereotype.Component; -import java.util.Arrays; -import java.util.HashSet; -import java.util.List; -import java.util.Set; - -import static com.fasterxml.jackson.databind.DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES; -import static fr.insee.protools.backend.service.FlowableVariableNameConstants.*; -import static fr.insee.protools.backend.service.context.ContextConstants.*; -import static fr.insee.protools.backend.service.utils.ContextUtils.getCurrentPartitionNode; +//TODO : à supprimer @Slf4j @Component @RequiredArgsConstructor public class PlatinePilotageCreateSurveyUnitTask implements JavaDelegate, DelegateContextVerifier { - private static final ObjectMapper objectMapper = new ObjectMapper().configure(FAIL_ON_UNKNOWN_PROPERTIES,false); - private final ContextService protoolsContext; private final PlatinePilotageService platinePilotageService; @Override public void execute(DelegateExecution execution) { - JsonNode contextRootNode = protoolsContext.getContextByProcessInstance(execution.getProcessInstanceId()); - checkContextOrThrow(log,execution.getProcessInstanceId(), contextRootNode); - String campainId = contextRootNode.path(CTX_CAMPAGNE_ID).asText(); - Long currentPartitionId = FlowableVariableUtils.getVariableOrThrow(execution,VARNAME_CURRENT_PARTITION_ID, Long.class); - JsonNode remSUNode = FlowableVariableUtils.getVariableOrThrow(execution,VARNAME_REM_SURVEY_UNIT, JsonNode.class); - String idInternaute = FlowableVariableUtils.getVariableOrThrow(execution, VARNAME_DIRECTORYACCESS_ID_CONTACT, String.class); - JsonNode currentPartitionNode = getCurrentPartitionNode(contextRootNode, currentPartitionId); - - //Create the platine DTO object - QuestioningWebclientDto dto = computeQuestioningWebclientDto(remSUNode,currentPartitionNode,idInternaute,campainId); - - log.info("ProcessInstanceId={} campainId={} - currentPartitionId={} - remSUNode.id={} ", - execution.getProcessInstanceId(), campainId,currentPartitionId,dto.getSurveyUnit().getIdSu()); - //Call service - platinePilotageService.putQuestionings(dto); - } - - private static QuestioningWebclientDto computeQuestioningWebclientDto(JsonNode remSUNode, JsonNode currentPartitionNode,String idInternaute, String idCampagne) { - REMSurveyUnitDto remSurveyUnitDto=PlatineHelper.parseRemSUNode(objectMapper,VARNAME_REM_SURVEY_UNIT,remSUNode); - boolean isLogement = currentPartitionNode.path(CTX_PARTITION_TYPE_ECHANTILLON).textValue().equalsIgnoreCase(PartitionTypeEchantillon.LOGEMENT.getAsString()); - PersonDto contact = RemDtoUtils.findContact(remSUNode, remSurveyUnitDto, isLogement); - - PlatineAddressDto platineAdress = computePlatineAdress(remSurveyUnitDto.getAddress()); - ContactAccreditationDto platineContact = convertREMPersonToPlatineContact(idInternaute, platineAdress, contact); - - return - QuestioningWebclientDto.builder() - .idPartitioning(PlatineHelper.computePilotagePartitionID(idCampagne,currentPartitionNode.path(CTX_PARTITION_ID).asLong())) - .modelName(currentPartitionNode.path(CTX_PARTITION_QUESTIONNAIRE_MODEL).asText()) - .surveyUnit(computeSurveyUnitDto(remSurveyUnitDto)) - .contacts(List.of(platineContact)) - .build(); - } - - - - private static PlatineQuestioningSurveyUnitDto computeSurveyUnitDto(REMSurveyUnitDto remSurveyUnitDto) { - - return PlatineQuestioningSurveyUnitDto.builder() - .idSu(remSurveyUnitDto.getRepositoryId().toString()) - .identificationCode("") - .identificationName("") - .address(computePlatineAdress(remSurveyUnitDto.getAddress())) - .build(); - } - - @Override - public Set getContextErrors(JsonNode contextRootNode) { - if(contextRootNode==null){ - return Set.of("Context is missing"); - } - Set results=new HashSet<>(); - Set requiredNodes = - Set.of( - //Global & Campaign - CTX_CAMPAGNE_ID,CTX_CAMPAGNE_CONTEXTE, CTX_PARTITIONS - ); - Set requiredPartition = - Set.of(CTX_PARTITION_ID,CTX_PARTITION_QUESTIONNAIRE_MODEL, CTX_PARTITION_TYPE_ECHANTILLON); - - - results.addAll(DelegateContextVerifier.computeMissingChildrenMessages(requiredNodes,contextRootNode,getClass())); - String contexte = contextRootNode.path(CTX_CAMPAGNE_CONTEXTE).asText(); - if(! EnumUtils.isValidEnumIgnoreCase(CampaignContextEnum.class, contexte)){ - results.add(DelegateContextVerifier.computeIncorrectEnumMessage(CTX_CAMPAGNE_CONTEXTE,contexte, Arrays.toString(CampaignContextEnum.values()),getClass())); - } - - //Maybe one day we will have partitions for platine and partitions for sabiane and we will only validate the platine ones - //Partitions - var partitionIterator =contextRootNode.path(CTX_PARTITIONS).elements(); - while (partitionIterator.hasNext()) { - var partitionNode = partitionIterator.next(); - results.addAll(DelegateContextVerifier.computeMissingChildrenMessages(requiredPartition,partitionNode,getClass())); - - //Check value of Enum - String enumVal = partitionNode.path(CTX_PARTITION_TYPE_ECHANTILLON).asText(); - if(! EnumUtils.isValidEnumIgnoreCase(PartitionTypeEchantillon.class, enumVal)){ - results.add(DelegateContextVerifier.computeIncorrectEnumMessage(CTX_PARTITION_TYPE_ECHANTILLON,enumVal,Arrays.toString(PartitionTypeEchantillon.values()),getClass())); - } - } - return results; - } - - /** - * Compute the lastname to send to platine. - * @param lastname from rem - * @param birthname from rem - * @return the computed platine last name - */ - protected static String getPlatineLastname(String lastname, String birthname){ - if(lastname!=null) - return lastname; - else if(birthname!=null) - return birthname; - return ""; - } - - private static ContactAccreditationDto convertREMPersonToPlatineContact(String idInternaute, PlatineAddressDto platineAdress, PersonDto remPersonDto) { - //If lastname is null then we use birthname - String platineName = getPlatineLastname(remPersonDto.getLastName(),remPersonDto.getBirthName()); - return ContactAccreditationDto.builder() - .identifier(idInternaute) - .externalId(remPersonDto.getExternalId()) - .function("") - .lastName(platineName) - .firstName(remPersonDto.getFirstName()) - .isMain(true) - .civility(convertREMGenderToPlatineCivility(remPersonDto.getGender()).getLabel()) - //Get favorite phone/mail ; if no favorite get the first of the list ; else empty - .email(remPersonDto.getEmails().stream() - .filter(EmailDto::getFavorite) - .findFirst() - .orElse(remPersonDto.getEmails().stream().findFirst().orElse(new EmailDto())) - .getMailAddress()) - - .phone( - remPersonDto.getPhoneNumbers().stream() - .filter(PhoneNumberDto::getFavorite) - .findFirst() - .orElse(remPersonDto.getPhoneNumbers().stream().findFirst().orElse(new PhoneNumberDto())) - .getNumber()) - .address(platineAdress) - .build(); - } - - static PlatinePilotageGenderType convertREMGenderToPlatineCivility(String remGender) { - if(remGender==null) - return PlatinePilotageGenderType.Undefined; - return switch (remGender) { - case "2": - yield PlatinePilotageGenderType.Female; - case "1" : - yield PlatinePilotageGenderType.Male; - default: - yield PlatinePilotageGenderType.Undefined; - }; - } + throw new ProtoolsTaskBPMNError("Removed"); - private static PlatineAddressDto computePlatineAdress(REMAddressDto remAddressDto) { - //The REM REMAddressDto and Platine PlatineQuestioningSurveyUnitDto are identical - //I'll use the copyProperty to recopy identical members - var platineAdresse = BeanUtils.instantiateClass(PlatineAddressDto.class); - BeanUtils.copyProperties(remAddressDto, platineAdresse); - return platineAdresse; } } diff --git a/src/main/java/fr/insee/protools/backend/service/platine/delegate/PlatineQuestionnaireCreateInterrogationListTask.java b/src/main/java/fr/insee/protools/backend/service/platine/delegate/PlatineQuestionnaireCreateInterrogationListTask.java new file mode 100644 index 00000000..a36f5fbf --- /dev/null +++ b/src/main/java/fr/insee/protools/backend/service/platine/delegate/PlatineQuestionnaireCreateInterrogationListTask.java @@ -0,0 +1,36 @@ +package fr.insee.protools.backend.service.platine.delegate; + +import com.fasterxml.jackson.databind.JsonNode; +import fr.insee.protools.backend.service.DelegateContextVerifier; +import fr.insee.protools.backend.service.common.platine_sabiane.QuestionnaireHelper; +import fr.insee.protools.backend.service.context.ContextService; +import fr.insee.protools.backend.service.platine.questionnaire.PlatineQuestionnaireService; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.JavaDelegate; +import org.springframework.stereotype.Component; + +import java.util.Set; + +@Slf4j +@Component +@RequiredArgsConstructor +public class PlatineQuestionnaireCreateInterrogationListTask implements JavaDelegate, DelegateContextVerifier { + + private final ContextService protoolsContext; + private final PlatineQuestionnaireService platineQuestionnaireService; + + @Override + public void execute(DelegateExecution execution) { + JsonNode contextRootNode = protoolsContext.getContextByProcessInstance(execution.getProcessInstanceId()); + checkContextOrThrow(log,execution.getProcessInstanceId(), contextRootNode); + QuestionnaireHelper.createInterrogationsTaskPlatine(execution,protoolsContext,platineQuestionnaireService); + } + + @Override + public Set getContextErrors(JsonNode contextRootNode) { + return QuestionnaireHelper.getCreateSUContextErrorsPlatine(contextRootNode); + } + +} diff --git a/src/main/java/fr/insee/protools/backend/service/platine/delegate/PlatineQuestionnaireCreateSurveyUnitTask.java b/src/main/java/fr/insee/protools/backend/service/platine/delegate/PlatineQuestionnaireCreateSurveyUnitTask.java index 864abf91..4e3d01f5 100644 --- a/src/main/java/fr/insee/protools/backend/service/platine/delegate/PlatineQuestionnaireCreateSurveyUnitTask.java +++ b/src/main/java/fr/insee/protools/backend/service/platine/delegate/PlatineQuestionnaireCreateSurveyUnitTask.java @@ -4,6 +4,7 @@ import fr.insee.protools.backend.service.DelegateContextVerifier; import fr.insee.protools.backend.service.common.platine_sabiane.QuestionnaireHelper; import fr.insee.protools.backend.service.context.ContextService; +import fr.insee.protools.backend.service.exception.ProtoolsTaskBPMNError; import fr.insee.protools.backend.service.platine.questionnaire.PlatineQuestionnaireService; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -23,9 +24,7 @@ public class PlatineQuestionnaireCreateSurveyUnitTask implements JavaDelegate, D @Override public void execute(DelegateExecution execution) { - JsonNode contextRootNode = protoolsContext.getContextByProcessInstance(execution.getProcessInstanceId()); - checkContextOrThrow(log,execution.getProcessInstanceId(), contextRootNode); - QuestionnaireHelper.createSUTaskPlatine(execution,protoolsContext,platineQuestionnaireService); + throw new ProtoolsTaskBPMNError("Removed"); } @Override diff --git a/src/main/java/fr/insee/protools/backend/service/platine/delegate/v2/PlatinePilotageCreateContextTaskv2.java b/src/main/java/fr/insee/protools/backend/service/platine/delegate/v2/PlatinePilotageCreateContextTaskv2.java new file mode 100644 index 00000000..6bf49dea --- /dev/null +++ b/src/main/java/fr/insee/protools/backend/service/platine/delegate/v2/PlatinePilotageCreateContextTaskv2.java @@ -0,0 +1,41 @@ +package fr.insee.protools.backend.service.platine.delegate.v2; + +import com.fasterxml.jackson.databind.JsonNode; +import fr.insee.protools.backend.service.DelegateContextVerifier; +import fr.insee.protools.backend.service.context.ContextService; +import fr.insee.protools.backend.service.platine.pilotage.PlatinePilotageService; +import fr.insee.protools.backend.service.platine.pilotage.metadata.*; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.EnumUtils; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.JavaDelegate; +import org.springframework.stereotype.Component; + +import java.util.Arrays; +import java.util.HashSet; +import java.util.Set; + +import static fr.insee.protools.backend.service.context.ContextConstants.*; +import static fr.insee.protools.backend.service.platine.utils.PlatineHelper.computePilotagePartitionID; + +@Slf4j +@RequiredArgsConstructor +public class PlatinePilotageCreateContextTaskv2 implements JavaDelegate, DelegateContextVerifier { + + private final ContextService protoolsContext; + private final PlatinePilotageService platinePilotageService; + + @Override + public void execute(DelegateExecution execution) { + log.info("ProcessInstanceId={} begin",execution.getProcessInstanceId()); + JsonNode contextRootNode = protoolsContext.getContextByProcessInstance(execution.getProcessInstanceId()); + String campainId = contextRootNode.path(CTX_CAMPAGNE_ID).asText(); + + checkContextOrThrow(log,execution.getProcessInstanceId(), contextRootNode); + platinePilotageService.postCreateCampaign(campainId,contextRootNode); + + log.info("ProcessInstanceId={} end",execution.getProcessInstanceId()); + + } +} \ No newline at end of file diff --git a/src/main/java/fr/insee/protools/backend/service/platine/delegate/v2/PlatinePilotageCreateInterrogationListTaskREST.java b/src/main/java/fr/insee/protools/backend/service/platine/delegate/v2/PlatinePilotageCreateInterrogationListTaskREST.java new file mode 100644 index 00000000..64139069 --- /dev/null +++ b/src/main/java/fr/insee/protools/backend/service/platine/delegate/v2/PlatinePilotageCreateInterrogationListTaskREST.java @@ -0,0 +1,19 @@ +package fr.insee.protools.backend.service.platine.delegate.v2; + +import com.fasterxml.jackson.databind.JsonNode; +import fr.insee.protools.backend.service.platine.pilotage.PlatinePilotageService; +import fr.insee.protools.backend.service.utils.delegate.DefaultCallServiceInterroListTask; +import lombok.RequiredArgsConstructor; + +import java.util.List; + +@RequiredArgsConstructor +public class PlatinePilotageCreateInterrogationListTaskREST extends DefaultCallServiceInterroListTask { + + private final PlatinePilotageService platinePilotageService; + + @Override + protected void serviceAction(String campaignId, List list, String... params) { + platinePilotageService.putQuestionings(campaignId,list); + } +} diff --git a/src/main/java/fr/insee/protools/backend/service/platine/delegate/v2/PlatineQuestionnaireCreateInterrogationListTaskREST.java b/src/main/java/fr/insee/protools/backend/service/platine/delegate/v2/PlatineQuestionnaireCreateInterrogationListTaskREST.java new file mode 100644 index 00000000..a2315927 --- /dev/null +++ b/src/main/java/fr/insee/protools/backend/service/platine/delegate/v2/PlatineQuestionnaireCreateInterrogationListTaskREST.java @@ -0,0 +1,24 @@ +package fr.insee.protools.backend.service.platine.delegate.v2; + +import com.fasterxml.jackson.databind.JsonNode; +import fr.insee.protools.backend.service.platine.questionnaire.PlatineQuestionnaireService; +import fr.insee.protools.backend.service.utils.delegate.DefaultCallServiceInterroListTask; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import java.util.List; + +@Slf4j +@Component +@RequiredArgsConstructor +public class PlatineQuestionnaireCreateInterrogationListTaskREST extends DefaultCallServiceInterroListTask { + + private final PlatineQuestionnaireService platineQuestionnaireService; + + @Override + protected void serviceAction(String campaignId,List list, String... params) { + platineQuestionnaireService.postSurveyUnits(campaignId,list); + } + +} diff --git a/src/main/java/fr/insee/protools/backend/service/platine/pilotage/PlatinePilotageService.java b/src/main/java/fr/insee/protools/backend/service/platine/pilotage/PlatinePilotageService.java index 996eeabd..16466e70 100644 --- a/src/main/java/fr/insee/protools/backend/service/platine/pilotage/PlatinePilotageService.java +++ b/src/main/java/fr/insee/protools/backend/service/platine/pilotage/PlatinePilotageService.java @@ -1,17 +1,20 @@ package fr.insee.protools.backend.service.platine.pilotage; +import com.fasterxml.jackson.databind.JsonNode; import fr.insee.protools.backend.dto.platine.pilotage.PlatinePilotageEligibleDto; import fr.insee.protools.backend.dto.platine.pilotage.contact.PlatineContactDto; import fr.insee.protools.backend.dto.platine.pilotage.query.QuestioningWebclientDto; import fr.insee.protools.backend.service.platine.pilotage.metadata.MetadataDto; -import fr.insee.protools.backend.webclient.WebClientHelper; +import fr.insee.protools.backend.httpclients.webclient.WebClientHelper; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.slf4j.event.Level; import org.springframework.stereotype.Service; -import static fr.insee.protools.backend.webclient.WebClientHelper.logJson; -import static fr.insee.protools.backend.webclient.configuration.ApiConfigProperties.KNOWN_API.KNOWN_API_PLATINE_PILOTAGE; +import java.util.List; + +import static fr.insee.protools.backend.httpclients.webclient.WebClientHelper.logJson; +import static fr.insee.protools.backend.httpclients.configuration.ApiConfigProperties.KNOWN_API.KNOWN_API_PLATINE_PILOTAGE; @Service @Slf4j @@ -33,6 +36,7 @@ public void putMetadata(String partitionId , MetadataDto dto) { .block(); log.trace("putMetadata : partitionId={} - response={} ",partitionId,response); } + public void putQuestionings(QuestioningWebclientDto dto) { log.debug("putQuestionings: idPartitioning={} - idSu={}",dto.getIdPartitioning(),dto.getSurveyUnit().getIdSu()); logJson("putMetadata ",dto,log,Level.TRACE); @@ -77,4 +81,29 @@ public Boolean isToFollowUp(Long idSU, String platinePartitionId){ return result; } + //V2 + public void putQuestionings(String campaignId, List interrogations) { + log.trace("putQuestionings: campaignId={}",campaignId); + logJson("putMetadata ",interrogations,log,Level.TRACE); + var response = webClientHelper.getWebClient(KNOWN_API_PLATINE_PILOTAGE) + .put() + .uri("/api/questionings") + .bodyValue(interrogations) + .retrieve() + .bodyToMono(String.class) + .block(); + log.trace("putQuestionings: campaignId={} - response={} ",campaignId,response); + } + + public void postCreateCampaign(String campaignId,JsonNode contextRootNode) { + log.trace("postCreateCampaign: campaignId={}",campaignId); + var response = webClientHelper.getWebClient(KNOWN_API_PLATINE_PILOTAGE) + .post() + .uri("/api/campaign") + .bodyValue(contextRootNode) + .retrieve() + .bodyToMono(String.class) + .block(); + log.trace("postCreateCampaign: campaignId={} - response={} ",campaignId,response); + } } diff --git a/src/main/java/fr/insee/protools/backend/service/platine/questionnaire/PlatineQuestionnaireService.java b/src/main/java/fr/insee/protools/backend/service/platine/questionnaire/PlatineQuestionnaireService.java index b8bae3a3..5e3f2f34 100644 --- a/src/main/java/fr/insee/protools/backend/service/platine/questionnaire/PlatineQuestionnaireService.java +++ b/src/main/java/fr/insee/protools/backend/service/platine/questionnaire/PlatineQuestionnaireService.java @@ -1,14 +1,14 @@ package fr.insee.protools.backend.service.platine.questionnaire; import fr.insee.protools.backend.service.common.platine_sabiane.QuestionnairePlatineSabianeService; -import fr.insee.protools.backend.webclient.WebClientHelper; +import fr.insee.protools.backend.httpclients.webclient.WebClientHelper; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.slf4j.Logger; import org.springframework.stereotype.Service; import org.springframework.web.reactive.function.client.WebClient; -import static fr.insee.protools.backend.webclient.configuration.ApiConfigProperties.KNOWN_API.KNOWN_API_PLATINE_QUESTIONNAIRE; +import static fr.insee.protools.backend.httpclients.configuration.ApiConfigProperties.KNOWN_API.KNOWN_API_PLATINE_QUESTIONNAIRE; @Service @Slf4j diff --git a/src/main/java/fr/insee/protools/backend/service/platine/utils/PlatineHelper.java b/src/main/java/fr/insee/protools/backend/service/platine/utils/PlatineHelper.java index 15fd4eee..f5b69548 100644 --- a/src/main/java/fr/insee/protools/backend/service/platine/utils/PlatineHelper.java +++ b/src/main/java/fr/insee/protools/backend/service/platine/utils/PlatineHelper.java @@ -6,8 +6,12 @@ import fr.insee.protools.backend.service.exception.IncorrectSUBPMNError; import fr.insee.protools.backend.dto.rem.REMSurveyUnitDto; +import static com.fasterxml.jackson.databind.DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES; + public class PlatineHelper { + private static final ObjectMapper objectMapper = new ObjectMapper().configure(FAIL_ON_UNKNOWN_PROPERTIES,false); + //In platine pilotage, partition ID must start by the campaignId. We decide to follow it with the configured REM partitionID public static String computePilotagePartitionID(String campaignId, Long partitionId){ if(campaignId==null||partitionId==null){ @@ -16,18 +20,24 @@ public static String computePilotagePartitionID(String campaignId, Long partitio return campaignId+partitionId; } - public static REMSurveyUnitDto parseRemSUNode(ObjectMapper objectMapper, String key , JsonNode remSUNode){ + public static REMSurveyUnitDto parseRemSUNode(ObjectMapper objectMapper, JsonNode remSUNode){ REMSurveyUnitDto remSurveyUnitDto; try { remSurveyUnitDto = objectMapper.treeToValue(remSUNode, REMSurveyUnitDto.class); } catch (JsonProcessingException e) { - throw new IncorrectSUBPMNError("Error while parsing the json retrieved from REM : " + key,remSUNode, e); + throw new IncorrectSUBPMNError("Error while parsing the json retrieved from REM " ,remSUNode, e); } if(remSurveyUnitDto.getRepositoryId()==null){ - throw new IncorrectSUBPMNError("Error json retrieved from REM has no repositoryId : " + key,remSUNode); + throw new IncorrectSUBPMNError("Error json retrieved from REM has no repositoryId " , remSUNode); } return remSurveyUnitDto; } + + + public static REMSurveyUnitDto parseRemSUNode(JsonNode remSUNode){ + return parseRemSUNode(objectMapper,remSUNode); + } + private PlatineHelper(){} } diff --git a/src/main/java/fr/insee/protools/backend/service/questionnaire_model/QuestionnaireModelFromStaticWebsiteServiceImpl.java b/src/main/java/fr/insee/protools/backend/service/questionnaire_model/QuestionnaireModelFromStaticWebsiteServiceImpl.java index c1c40fbd..86188494 100644 --- a/src/main/java/fr/insee/protools/backend/service/questionnaire_model/QuestionnaireModelFromStaticWebsiteServiceImpl.java +++ b/src/main/java/fr/insee/protools/backend/service/questionnaire_model/QuestionnaireModelFromStaticWebsiteServiceImpl.java @@ -1,7 +1,7 @@ package fr.insee.protools.backend.service.questionnaire_model; import fr.insee.protools.backend.service.context.exception.BadContextIncorrectBPMNError; -import fr.insee.protools.backend.webclient.WebClientHelper; +import fr.insee.protools.backend.httpclients.webclient.WebClientHelper; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; diff --git a/src/main/java/fr/insee/protools/backend/service/rem/RemService.java b/src/main/java/fr/insee/protools/backend/service/rem/RemService.java index 7ce94ce9..7f513acc 100644 --- a/src/main/java/fr/insee/protools/backend/service/rem/RemService.java +++ b/src/main/java/fr/insee/protools/backend/service/rem/RemService.java @@ -1,47 +1,54 @@ package fr.insee.protools.backend.service.rem; +import com.fasterxml.jackson.databind.JsonNode; import fr.insee.protools.backend.dto.era.CensusJsonDto; import fr.insee.protools.backend.dto.rem.REMSurveyUnitDto; import fr.insee.protools.backend.dto.rem.SuIdMappingJson; -import fr.insee.protools.backend.webclient.WebClientHelper; -import fr.insee.protools.backend.webclient.exception.runtime.WebClient4xxBPMNError; +import fr.insee.protools.backend.httpclients.restclient.RestClientHelper; +import fr.insee.protools.backend.httpclients.webclient.WebClientHelper; +import fr.insee.protools.backend.httpclients.exception.runtime.HttpClient4xxBPMNError; +import fr.insee.protools.backend.httpclients.pagination.PageResponse; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.core.ParameterizedTypeReference; import org.springframework.http.HttpStatus; import org.springframework.stereotype.Service; import java.util.List; +import java.util.Map; -import static fr.insee.protools.backend.webclient.configuration.ApiConfigProperties.KNOWN_API.KNOWN_API_REM; +import static fr.insee.protools.backend.httpclients.configuration.ApiConfigProperties.KNOWN_API.KNOWN_API_REM; @Service @Slf4j @RequiredArgsConstructor public class RemService { - private final WebClientHelper webClientHelper; + private final RestClientHelper restClientHelper; + @Value("${fr.insee.protools.api.rem.su.page.size:5000}") + private int pageSizeGetSU; public Long[] getSampleSuIds(Long partitionId) { log.debug("getSampleSuIds - partitionId={} ",partitionId); try { - var response = webClientHelper.getWebClient(KNOWN_API_REM) + Long[] response = restClientHelper.getRestClient(KNOWN_API_REM) .get() .uri(uriBuilder -> uriBuilder .path("/survey-units/partitions/{partitionId}/ids") .build(partitionId)) .retrieve() - .bodyToMono(Long[].class) - .block(); + .body(Long[].class); log.trace("partitionIds={} - response={} ", partitionId, response); return response; } - catch (WebClient4xxBPMNError e){ + catch (HttpClient4xxBPMNError e){ if(e.getHttpStatusCodeError().equals(HttpStatus.NOT_FOUND)){ String msg= "Error 404/NOT_FOUND during get sample on REM with partitionId="+partitionId + " - msg="+e.getMessage(); log.error(msg); - throw new WebClient4xxBPMNError(msg,e.getHttpStatusCodeError()); + throw new HttpClient4xxBPMNError(msg,e.getHttpStatusCodeError()); } //Currently no remediation so just rethrow throw e; @@ -51,25 +58,24 @@ public Long[] getSampleSuIds(Long partitionId) { public REMSurveyUnitDto getSurveyUnit(Long surveyUnitId ) { log.debug("getSurveyUnit - surveyUnitId ={}",surveyUnitId ); try { - var response = webClientHelper.getWebClient(KNOWN_API_REM) + var response = restClientHelper.getRestClient(KNOWN_API_REM) .get() .uri(uriBuilder -> uriBuilder .path("/survey-units/{surveyUnitId}") .queryParam("withExternals", true) .build(surveyUnitId)) .retrieve() - .bodyToMono(REMSurveyUnitDto.class) - .block(); + .body(REMSurveyUnitDto.class); log.trace("surveyUnitId={} - response={} ", surveyUnitId, response); return response; } - catch (WebClient4xxBPMNError e){ + catch (HttpClient4xxBPMNError e){ if(e.getHttpStatusCodeError().equals(HttpStatus.NOT_FOUND)){ String msg= "Error 404/NOT_FOUND during get SU on REM with surveyUnitId="+surveyUnitId + " - msg="+e.getMessage(); log.error(msg); - throw new WebClient4xxBPMNError(msg,e.getHttpStatusCodeError()); + throw new HttpClient4xxBPMNError(msg,e.getHttpStatusCodeError()); } //Currently no remediation so just rethrow throw e; @@ -88,27 +94,98 @@ public SuIdMappingJson writeERASUList(long partitionId, List valu return null; } try { - var response = webClientHelper.getWebClient(KNOWN_API_REM) + var response = restClientHelper.getRestClient(KNOWN_API_REM) .post() .uri(uriBuilder -> uriBuilder .path("/survey-units/households/partitions/{partitionId}/census-upload") .build(partitionId)) - .bodyValue(values) + .body(values) .retrieve() - .bodyToMono(SuIdMappingJson.class) - .block(); + .body(SuIdMappingJson.class); log.trace("writeERASUList - partitionId={} - response={} ", partitionId, response); return response; - } catch (WebClient4xxBPMNError e) { + } catch (HttpClient4xxBPMNError e) { if (e.getHttpStatusCodeError().equals(HttpStatus.NOT_FOUND)) { String msg = "Error 404/NOT_FOUND during REM post census-upload partitionId=" + partitionId + " (check that the partition exists in REM) - msg=" + e.getMessage(); log.error(msg); - throw new WebClient4xxBPMNError(msg, e.getHttpStatusCodeError()); + throw new HttpClient4xxBPMNError(msg, e.getHttpStatusCodeError()); } //Currently no remediation so just rethrow throw e; } } + + + public PageResponse getPartitionAllSuPaginated(Long partitionId, long page) { + log.debug("partitionId={} - page={} - pageSizeGetSU={}",partitionId,page,pageSizeGetSU); + ParameterizedTypeReference> typeReference = new ParameterizedTypeReference<>() { + }; + try { + + PageResponse response = restClientHelper.getRestClient(KNOWN_API_REM) + .get() + .uri(uriBuilder -> uriBuilder + .path("survey-units/partitions/paginated/{partitionId}") + .queryParam("page", page) + .queryParam("size", pageSizeGetSU) + .queryParam("withExternals", true) + .build(partitionId)) + .retrieve() + .body(typeReference) ; + log.trace("partitionId={} - page={} - pageSizeGetSU={} - response={} ", partitionId,page,pageSizeGetSU, response.getContent().size()); + return response; + } + catch (HttpClient4xxBPMNError e){ + if(e.getHttpStatusCodeError().equals(HttpStatus.NOT_FOUND)){ + String msg= + "Error 404/NOT_FOUND during get sample on REM with partitionId="+partitionId + + " - msg="+e.getMessage(); + log.error(msg); + throw new HttpClient4xxBPMNError(msg,e.getHttpStatusCodeError()); + } + //Currently no remediation so just rethrow + throw e; + } + } + + //V2 + + public Long[] getInterrogationIdsWithoutAccountForLot(Long lotId) { + log.debug("getSampleSuIds - lotId={} ",lotId); + try { + Long[] response = restClientHelper.getRestClient(KNOWN_API_REM) + .get() + .uri(uriBuilder -> uriBuilder + .path("/interrogations/lots/{lotId}/ids") + .build(lotId)) + .retrieve() + .body(Long[].class); + log.trace("partitionIds={} - response={} ", lotId, response); + return response; + } + catch (HttpClient4xxBPMNError e){ + if(e.getHttpStatusCodeError().equals(HttpStatus.NOT_FOUND)){ + String msg= + "Error 404/NOT_FOUND during get lot interrogations ids on REM with lot="+lotId + + " - msg="+e.getMessage(); + log.error(msg); + throw new HttpClient4xxBPMNError(msg,e.getHttpStatusCodeError()); + } + //Currently no remediation so just rethrow + throw e; + } + } + + public void patchInterrogationsSetAccounts(Map userByInterroId) { + log.debug("patchInterrogationsSetAccounts - userByInterroId.size={}", userByInterroId.size()); + var response = restClientHelper.getRestClient(KNOWN_API_REM) + .post() + .uri("/interrogations/updateAccounts") + .body(userByInterroId) + .retrieve() + .body(SuIdMappingJson.class); + log.trace("patchInterrogationsSetAccounts - response={} ", response); + } } diff --git a/src/main/java/fr/insee/protools/backend/service/rem/delegate/ExtractContactIdentifierFromREMSUTask.java b/src/main/java/fr/insee/protools/backend/service/rem/delegate/ExtractContactIdentifierFromREMSUTask.java index 29b7374a..7e67a16a 100644 --- a/src/main/java/fr/insee/protools/backend/service/rem/delegate/ExtractContactIdentifierFromREMSUTask.java +++ b/src/main/java/fr/insee/protools/backend/service/rem/delegate/ExtractContactIdentifierFromREMSUTask.java @@ -12,7 +12,7 @@ import java.util.Optional; import static fr.insee.protools.backend.service.FlowableVariableNameConstants.VARNAME_DIRECTORYACCESS_ID_CONTACT; -import static fr.insee.protools.backend.service.FlowableVariableNameConstants.VARNAME_REM_SURVEY_UNIT; +import static fr.insee.protools.backend.service.FlowableVariableNameConstants.VARNAME_REM_INTERROGATION; /** * This delegate will search for the identifiantCompte (internet identifier) in a REM SU @@ -30,7 +30,7 @@ public class ExtractContactIdentifierFromREMSUTask implements JavaDelegate { public void execute(DelegateExecution execution) { //No need protools context ==> no checkContextOrThrow log.debug("ProcessInstanceId={} - begin",execution.getProcessInstanceId()); - JsonNode remSUNode = FlowableVariableUtils.getVariableOrThrow(execution,VARNAME_REM_SURVEY_UNIT, JsonNode.class); + JsonNode remSUNode = FlowableVariableUtils.getVariableOrThrow(execution, VARNAME_REM_INTERROGATION, JsonNode.class); Optional optionalIdentifiantCompte = RemDtoUtils.searchAdditionalInformation(REM_ADDITIONALINFOS_KEY_IDENTIFIANTCOMPTE,remSUNode); String idInternaute = optionalIdentifiantCompte.orElseThrow(() -> { diff --git a/src/main/java/fr/insee/protools/backend/service/rem/delegate/RemGetPartitionListOfSuIdTask.java b/src/main/java/fr/insee/protools/backend/service/rem/delegate/RemGetPartitionListOfSuIdTask.java index 07475f1c..a3264402 100644 --- a/src/main/java/fr/insee/protools/backend/service/rem/delegate/RemGetPartitionListOfSuIdTask.java +++ b/src/main/java/fr/insee/protools/backend/service/rem/delegate/RemGetPartitionListOfSuIdTask.java @@ -12,7 +12,7 @@ import java.util.List; import static fr.insee.protools.backend.service.FlowableVariableNameConstants.VARNAME_CURRENT_PARTITION_ID; -import static fr.insee.protools.backend.service.FlowableVariableNameConstants.VARNAME_REM_SU_ID_LIST; +import static fr.insee.protools.backend.service.FlowableVariableNameConstants.VARNAME_REM_INTERRO_ID_LIST; @Slf4j @Component @@ -29,7 +29,7 @@ public void execute(DelegateExecution execution) { Long[] partitionSUIds = remService.getSampleSuIds(currentPartitionId); List remSuIdList = List.of(partitionSUIds); - execution.getParent().setVariableLocal(VARNAME_REM_SU_ID_LIST, remSuIdList); + execution.getParent().setVariableLocal(VARNAME_REM_INTERRO_ID_LIST, remSuIdList); log.debug("ProcessInstanceId={} - partition={} - remSuIdList={} end",execution.getProcessInstanceId(),currentPartitionId,remSuIdList); } } \ No newline at end of file diff --git a/src/main/java/fr/insee/protools/backend/service/rem/delegate/RemGetSUTask.java b/src/main/java/fr/insee/protools/backend/service/rem/delegate/RemGetSUTask.java index e064c61d..b722833e 100644 --- a/src/main/java/fr/insee/protools/backend/service/rem/delegate/RemGetSUTask.java +++ b/src/main/java/fr/insee/protools/backend/service/rem/delegate/RemGetSUTask.java @@ -11,7 +11,7 @@ import org.flowable.engine.delegate.JavaDelegate; import org.springframework.stereotype.Component; -import static fr.insee.protools.backend.service.FlowableVariableNameConstants.VARNAME_REM_SURVEY_UNIT; +import static fr.insee.protools.backend.service.FlowableVariableNameConstants.VARNAME_REM_INTERROGATION; import static fr.insee.protools.backend.service.FlowableVariableNameConstants.VARNAME_REM_SURVEY_UNIT_IDENTIFIER; @Slf4j @@ -31,7 +31,7 @@ public void execute(DelegateExecution execution) { log.info("ProcessInstanceId={} - suId={}",execution.getProcessInstanceId(), suId); //TODO : ne pas créer le DTO ici : Ca ne sert à rien... REMSurveyUnitDto remSurveyUnitDto = remService.getSurveyUnit(suId); - execution.setVariableLocal(VARNAME_REM_SURVEY_UNIT,objectMapper.valueToTree(remSurveyUnitDto)); + execution.setVariableLocal(VARNAME_REM_INTERROGATION,objectMapper.valueToTree(remSurveyUnitDto)); log.trace("suId={} - content={}", suId, remSurveyUnitDto); log.debug("ProcessInstanceId={} - suId={} end",execution.getProcessInstanceId(), suId); } diff --git a/src/main/java/fr/insee/protools/backend/service/rem/delegate/RemWriteEraSUListTask.java b/src/main/java/fr/insee/protools/backend/service/rem/delegate/RemWriteEraSUListTask.java index eb812ed4..d14f8c11 100644 --- a/src/main/java/fr/insee/protools/backend/service/rem/delegate/RemWriteEraSUListTask.java +++ b/src/main/java/fr/insee/protools/backend/service/rem/delegate/RemWriteEraSUListTask.java @@ -33,7 +33,7 @@ public void execute(DelegateExecution execution) { Long currentPartitionId = FlowableVariableUtils.getVariableOrThrow(execution,VARNAME_CURRENT_PARTITION_ID, Long.class); if(eraSUList==null||eraSUList.isEmpty()){ log.info("ProcessInstanceId={} - currentPartitionId={} - variable {} is empty",execution.getProcessInstanceId(), currentPartitionId,VARNAME_ERA_RESPONSE); - execution.getParent().setVariableLocal(VARNAME_REM_SU_ID_LIST, List.of()); + execution.getParent().setVariableLocal(VARNAME_REM_INTERRO_ID_LIST, List.of()); return; } @@ -42,13 +42,13 @@ public void execute(DelegateExecution execution) { SuIdMappingJson remMapping = remService.writeERASUList(currentPartitionId, eraSUList); if(remMapping==null){ log.error("ProcessInstanceId={} - currentPartitionId={} remMapping is empty/null end",execution.getProcessInstanceId(), currentPartitionId); - execution.getParent().setVariableLocal(VARNAME_REM_SU_ID_LIST, List.of()); + execution.getParent().setVariableLocal(VARNAME_REM_INTERRO_ID_LIST, List.of()); throw new ProtoolsTaskBPMNError("Error while writing list of Era SU to REM : REM returned a null result "); } //STORE the list of REM identifier created List remSuIdList = remMapping.getData().stream().map(SuIdMappingRecord::repositoryId).toList(); - execution.getParent().setVariableLocal(VARNAME_REM_SU_ID_LIST, remSuIdList); + execution.getParent().setVariableLocal(VARNAME_REM_INTERRO_ID_LIST, remSuIdList); log.info("ProcessInstanceId={} - currentPartitionId={} - remSuIdList={} end",execution.getProcessInstanceId(), currentPartitionId,remSuIdList); } } diff --git a/src/main/java/fr/insee/protools/backend/service/rem/delegate/v2/RemGetPartitionListOfSUPaginatedTask.java b/src/main/java/fr/insee/protools/backend/service/rem/delegate/v2/RemGetPartitionListOfSUPaginatedTask.java new file mode 100644 index 00000000..3134c1ca --- /dev/null +++ b/src/main/java/fr/insee/protools/backend/service/rem/delegate/v2/RemGetPartitionListOfSUPaginatedTask.java @@ -0,0 +1,97 @@ +package fr.insee.protools.backend.service.rem.delegate.v2; + +import com.fasterxml.jackson.databind.JsonNode; +import fr.insee.protools.backend.dto.internal.ProtoolsInterrogationDto; +import fr.insee.protools.backend.service.DelegateContextVerifier; +import fr.insee.protools.backend.service.exception.PageableAPIBPMNError; +import fr.insee.protools.backend.service.rem.RemService; +import fr.insee.protools.backend.service.utils.FlowableVariableUtils; +import fr.insee.protools.backend.httpclients.pagination.PageResponse; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.JavaDelegate; +import org.springframework.stereotype.Component; + +import java.util.List; +import java.util.Map; + +import static fr.insee.protools.backend.service.FlowableVariableNameConstants.*; + +@Slf4j +@Component +@RequiredArgsConstructor +public class RemGetPartitionListOfSUPaginatedTask implements JavaDelegate, DelegateContextVerifier { + + private final RemService remService; + + + @Override + public void execute(DelegateExecution execution) { + Long currentPartitionId = FlowableVariableUtils.getVariableOrThrow(execution, VARNAME_CURRENT_PARTITION_ID, Long.class); + log.info("ProcessInstanceId={} - partition={} begin", execution.getProcessInstanceId(), currentPartitionId); + //No need protools context ==> no checkContextOrThrow + + Long currentPage = FlowableVariableUtils.getVariableOrNull(execution, VARNAME_REM_INTERRO_LIST_PAGEABLE_CURRENT_PAGE, Long.class); + Boolean isLastPage = FlowableVariableUtils.getVariableOrNull(execution, VARNAME_REM_INTERRO_LIST_PAGEABLE_IS_LAST_PAGE, Boolean.class); + if (currentPage == null) { + currentPage = 0L; + } + else if(isLastPage == null) { + isLastPage = Boolean.FALSE; + } + else { + currentPage++; + } + + if (Boolean.TRUE.equals(isLastPage)) { + log.warn("ProcessInstanceId={} - partition={} : last page already reached", execution.getProcessInstanceId(), currentPartitionId); + } else { + PageResponse pageResponse = remService.getPartitionAllSuPaginated(currentPartitionId, currentPage); + int nbValRead = treatPage(execution, pageResponse, currentPage, + VARNAME_REM_INTERRO_LIST, VARNAME_REM_INTERRO_LIST_PAGEABLE_CURRENT_PAGE, VARNAME_REM_INTERRO_LIST_PAGEABLE_IS_LAST_PAGE) + .size(); + log.debug("ProcessInstanceId={} - partition={} - nbValRead={} end", execution.getProcessInstanceId(), currentPartitionId, nbValRead); + } + } + + + private static List treatPage(DelegateExecution execution, + PageResponse pageResponse, + Long expectedCurrentPage, + String varname_list, + String varname_current_page, + String varname_is_last_page) { + Boolean isLastPage = pageResponse.isLast(); + long responseCurrentPage = pageResponse.getNumber(); + if (responseCurrentPage != expectedCurrentPage) { + throw new PageableAPIBPMNError(String.format("Error while reading SU from REM- expected page=%s got page=%s", + expectedCurrentPage, responseCurrentPage)); + } + + String jsonKeyId="id"; + + List contentList = pageResponse.getContent(); + List protoolsInterrogationDtos = contentList.stream() + .filter(jsonNode -> { + boolean hasId = jsonNode.has(jsonKeyId) && !jsonNode.get(jsonKeyId).isNull(); + if (!hasId) { + log.warn("Skipping interrogation without id: {}", jsonNode); + } + return hasId; + }) + .map(jsonNode -> ProtoolsInterrogationDto.builder() + .idInterrogation(jsonNode.get(jsonKeyId).asText()) + .remInterrogation(jsonNode) + .build()) + .toList(); + + Map variables = Map.of( + varname_list, protoolsInterrogationDtos, + varname_current_page, expectedCurrentPage, + varname_is_last_page, isLastPage + ); + execution.getParent().setVariablesLocal(variables); + return contentList; + } +} \ No newline at end of file diff --git a/src/main/java/fr/insee/protools/backend/service/sabiane/delegate/SabianePilotageCreateSUTask.java b/src/main/java/fr/insee/protools/backend/service/sabiane/delegate/SabianePilotageCreateSUTask.java index 1dd4f339..0a2a757d 100644 --- a/src/main/java/fr/insee/protools/backend/service/sabiane/delegate/SabianePilotageCreateSUTask.java +++ b/src/main/java/fr/insee/protools/backend/service/sabiane/delegate/SabianePilotageCreateSUTask.java @@ -34,7 +34,7 @@ import static com.fasterxml.jackson.databind.DeserializationFeature.FAIL_ON_MISSING_CREATOR_PROPERTIES; import static com.fasterxml.jackson.databind.DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES; import static fr.insee.protools.backend.service.FlowableVariableNameConstants.VARNAME_CURRENT_PARTITION_ID; -import static fr.insee.protools.backend.service.FlowableVariableNameConstants.VARNAME_REM_SURVEY_UNIT; +import static fr.insee.protools.backend.service.FlowableVariableNameConstants.VARNAME_REM_INTERROGATION; import static fr.insee.protools.backend.service.context.ContextConstants.*; import static fr.insee.protools.backend.service.utils.ContextUtils.getCurrentPartitionNode; @@ -56,7 +56,7 @@ public void execute(DelegateExecution execution) { checkContextOrThrow(log, execution.getProcessInstanceId(), contextRootNode); Long currentPartitionId = FlowableVariableUtils.getVariableOrThrow(execution, VARNAME_CURRENT_PARTITION_ID, Long.class); - JsonNode remSUNode = FlowableVariableUtils.getVariableOrThrow(execution, VARNAME_REM_SURVEY_UNIT, JsonNode.class); + JsonNode remSUNode = FlowableVariableUtils.getVariableOrThrow(execution, VARNAME_REM_INTERROGATION, JsonNode.class); JsonNode currentPartitionNode = getCurrentPartitionNode(contextRootNode, currentPartitionId); Boolean priority = currentPartitionNode.path(CTX_PARTITION_PRIORITAIRE).asBoolean(); @@ -226,7 +226,7 @@ private static SabianePersonDto createSabianePersonFromRemPerson(PersonDto remPe } protected static SurveyUnitContextDto createSabianeSUContextDto(JsonNode contextRootNode, Long currentPartitionId, JsonNode remSUNode, Boolean isLogement, Boolean priority) { - REMSurveyUnitDto remSurveyUnitDto = PlatineHelper.parseRemSUNode(objectMapper, VARNAME_REM_SURVEY_UNIT, remSUNode); + REMSurveyUnitDto remSurveyUnitDto = PlatineHelper.parseRemSUNode(objectMapper, remSUNode); Pair> mainAndSecondaryPerson = RemDtoUtils.findContactAndSecondary(remSUNode, remSurveyUnitDto, isLogement); String id = SabianeIdHelper.computeSabianeID(currentPartitionId.toString(), remSurveyUnitDto.getRepositoryId().toString()); diff --git a/src/main/java/fr/insee/protools/backend/service/sabiane/pilotage/SabianePilotageService.java b/src/main/java/fr/insee/protools/backend/service/sabiane/pilotage/SabianePilotageService.java index ecc9a1ff..af06cc35 100644 --- a/src/main/java/fr/insee/protools/backend/service/sabiane/pilotage/SabianePilotageService.java +++ b/src/main/java/fr/insee/protools/backend/service/sabiane/pilotage/SabianePilotageService.java @@ -2,7 +2,7 @@ import fr.insee.protools.backend.dto.sabiane.pilotage.CampaignContextDto; import fr.insee.protools.backend.dto.sabiane.pilotage.SurveyUnitContextDto; -import fr.insee.protools.backend.webclient.WebClientHelper; +import fr.insee.protools.backend.httpclients.webclient.WebClientHelper; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.slf4j.event.Level; @@ -10,7 +10,7 @@ import java.util.List; -import static fr.insee.protools.backend.webclient.configuration.ApiConfigProperties.KNOWN_API.KNOWN_API_SABIANE_PILOTAGE; +import static fr.insee.protools.backend.httpclients.configuration.ApiConfigProperties.KNOWN_API.KNOWN_API_SABIANE_PILOTAGE; @Service diff --git a/src/main/java/fr/insee/protools/backend/service/sabiane/questionnaire/SabianeQuestionnaireService.java b/src/main/java/fr/insee/protools/backend/service/sabiane/questionnaire/SabianeQuestionnaireService.java index c3b2b881..170553f5 100644 --- a/src/main/java/fr/insee/protools/backend/service/sabiane/questionnaire/SabianeQuestionnaireService.java +++ b/src/main/java/fr/insee/protools/backend/service/sabiane/questionnaire/SabianeQuestionnaireService.java @@ -1,14 +1,14 @@ package fr.insee.protools.backend.service.sabiane.questionnaire; import fr.insee.protools.backend.service.common.platine_sabiane.QuestionnairePlatineSabianeService; -import fr.insee.protools.backend.webclient.WebClientHelper; +import fr.insee.protools.backend.httpclients.webclient.WebClientHelper; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.slf4j.Logger; import org.springframework.stereotype.Service; import org.springframework.web.reactive.function.client.WebClient; -import static fr.insee.protools.backend.webclient.configuration.ApiConfigProperties.KNOWN_API.KNOWN_API_SABIANE_QUESTIONNAIRE; +import static fr.insee.protools.backend.httpclients.configuration.ApiConfigProperties.KNOWN_API.KNOWN_API_SABIANE_QUESTIONNAIRE; @Service diff --git a/src/main/java/fr/insee/protools/backend/service/sugoi/LogTask.java b/src/main/java/fr/insee/protools/backend/service/sugoi/LogTask.java new file mode 100644 index 00000000..ac48f830 --- /dev/null +++ b/src/main/java/fr/insee/protools/backend/service/sugoi/LogTask.java @@ -0,0 +1,47 @@ +package fr.insee.protools.backend.service.sugoi; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.HistoryService; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.JavaDelegate; +import org.flowable.engine.impl.cfg.ProcessEngineConfigurationImpl; +import org.flowable.variable.api.history.HistoricVariableInstance; +import org.flowable.variable.api.history.HistoricVariableInstanceQuery; +import org.flowable.variable.service.HistoricVariableService; +import org.flowable.variable.service.impl.persistence.entity.HistoricVariableInstanceEntity; +import org.springframework.stereotype.Component; + +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; + +import static fr.insee.protools.backend.service.FlowableVariableNameConstants.VARNAME_DIRECTORYACCESS_PWD_CONTACT; + +/** + * Supprime la variable mot de passe et supprime aussi toutes les occurences de l'historique + */ +@Slf4j +@Component +@RequiredArgsConstructor +public class LogTask implements JavaDelegate { + + private final ProcessEngineConfigurationImpl processEngineConfiguration; + + @Override + public void execute(DelegateExecution execution) { + HistoryService historyService = processEngineConfiguration.getHistoryService(); + HistoricVariableInstanceQuery query = historyService.createHistoricVariableInstanceQuery() + .processInstanceId(execution.getProcessInstanceId()) + .variableName(VARNAME_DIRECTORYACCESS_PWD_CONTACT); + List variableInstances = query.list(); + + Set excludeKeys = new HashSet<>(); + excludeKeys.add("context"); + + execution.getVariables().entrySet().stream() + .filter(entry -> !excludeKeys.contains(entry.getKey())) + .forEach(entry -> log.info(entry.getKey() + ": " + entry.getValue())); + } +} diff --git a/src/main/java/fr/insee/protools/backend/service/sugoi/SugoiCreateUserListTask.java b/src/main/java/fr/insee/protools/backend/service/sugoi/SugoiCreateUserListTask.java new file mode 100644 index 00000000..3388238d --- /dev/null +++ b/src/main/java/fr/insee/protools/backend/service/sugoi/SugoiCreateUserListTask.java @@ -0,0 +1,102 @@ +package fr.insee.protools.backend.service.sugoi; + +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; +import fr.insee.protools.backend.dto.internal.ProtoolsInterrogationDto; +import fr.insee.protools.backend.dto.sugoi.Habilitation; +import fr.insee.protools.backend.dto.sugoi.User; +import fr.insee.protools.backend.service.DelegateContextVerifier; +import fr.insee.protools.backend.service.context.ContextService; +import fr.insee.protools.backend.service.context.enums.CampaignContextEnum; +import fr.insee.protools.backend.service.utils.FlowableVariableUtils; +import fr.insee.protools.backend.service.utils.password.PasswordService; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.EnumUtils; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.JavaDelegate; +import org.springframework.stereotype.Component; + +import java.util.*; + +import static com.fasterxml.jackson.databind.DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES; +import static fr.insee.protools.backend.service.FlowableVariableNameConstants.*; +import static fr.insee.protools.backend.service.context.ContextConstants.CTX_CAMPAGNE_CONTEXTE; + +@Slf4j +@Component +@RequiredArgsConstructor +public class SugoiCreateUserListTask implements JavaDelegate, DelegateContextVerifier { + + protected static final Habilitation PLATINE_HABILITATION = new Habilitation("platine", "repondant", null); + protected static final User createSugoiUserBody = User.builder().habilitations(List.of(PLATINE_HABILITATION)).build(); + + private final SugoiService sugoiService; + private final PasswordService passwordService; + private final ContextService protoolsContext; + + public static final int householdPasswordSize=8; + public static final int defaultPasswordSize=12; + + private static final ObjectMapper objectMapper = new ObjectMapper().configure(FAIL_ON_UNKNOWN_PROPERTIES,false); + + + @Override + public void execute(DelegateExecution execution) { + log.debug("ProcessInstanceId={} begin", execution.getProcessInstanceId()); + JsonNode contextRootNode = protoolsContext.getContextByProcessInstance(execution.getProcessInstanceId()); + List interrogationList = FlowableVariableUtils.getVariableOrThrow(execution, VARNAME_REM_INTERRO_LIST, List.class); + + checkContextOrThrow(log,execution.getProcessInstanceId(), contextRootNode); + int passwordSize = getPasswordSize(contextRootNode); + + for (ProtoolsInterrogationDto interrogation : interrogationList){ + //Create User + User createdUser = sugoiService.postCreateUsers(createSugoiUserBody); + //init password + String userPassword = passwordService.generatePassword(passwordSize); + sugoiService.postInitPassword(createdUser.getUsername(), userPassword); + + //TODO : bidouille à supprimer (à la cible on met à jour REM) + interrogation.setWebConnectionId(createdUser.getUsername()); + + interrogation.setWebPassword(userPassword); + log.debug("ProcessInstanceId={} - username={} ", createdUser.getUsername()); + } + + execution.setVariableLocal(VARNAME_REM_INTERRO_LIST, interrogationList); + log.info("ProcessInstanceId={} - size={} end", execution.getProcessInstanceId(), interrogationList.size()); + } + + public static int getPasswordSize(JsonNode contextRootNode){ + String contexte=contextRootNode.path(CTX_CAMPAGNE_CONTEXTE).asText(); + CampaignContextEnum contextEnum = CampaignContextEnum.fromLabel(contexte); + if(CampaignContextEnum.HOUSEHOLD.equals(contextEnum)){ + return householdPasswordSize; + } + return defaultPasswordSize; + } + + @Override + public Set getContextErrors(JsonNode contextRootNode) { + if(contextRootNode==null){ + return Set.of("Context is missing"); + } + Set results=new HashSet<>(); + Set requiredNodes = + Set.of( + //Global & Campaign + CTX_CAMPAGNE_CONTEXTE + ); + + results.addAll(DelegateContextVerifier.computeMissingChildrenMessages(requiredNodes,contextRootNode,getClass())); + + String contexte = contextRootNode.path(CTX_CAMPAGNE_CONTEXTE).asText(); + if(! EnumUtils.isValidEnumIgnoreCase(CampaignContextEnum.class, contexte)){ + results.add(DelegateContextVerifier.computeIncorrectEnumMessage(CTX_CAMPAGNE_CONTEXTE,contexte, Arrays.toString(CampaignContextEnum.values()),getClass())); + } + + return results; + } + +} diff --git a/src/main/java/fr/insee/protools/backend/service/sugoi/SugoiService.java b/src/main/java/fr/insee/protools/backend/service/sugoi/SugoiService.java index 934227da..caa9ef36 100644 --- a/src/main/java/fr/insee/protools/backend/service/sugoi/SugoiService.java +++ b/src/main/java/fr/insee/protools/backend/service/sugoi/SugoiService.java @@ -4,15 +4,15 @@ import com.fasterxml.jackson.databind.node.ObjectNode; import fr.insee.protools.backend.dto.sugoi.User; import fr.insee.protools.backend.service.exception.UsernameAlreadyExistsSugoiBPMNError; -import fr.insee.protools.backend.webclient.WebClientHelper; -import fr.insee.protools.backend.webclient.exception.runtime.WebClient4xxBPMNError; +import fr.insee.protools.backend.httpclients.webclient.WebClientHelper; +import fr.insee.protools.backend.httpclients.exception.runtime.HttpClient4xxBPMNError; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; import org.springframework.http.HttpStatus; import org.springframework.stereotype.Service; -import static fr.insee.protools.backend.webclient.configuration.ApiConfigProperties.KNOWN_API.KNOWN_API_SUGOI; +import static fr.insee.protools.backend.httpclients.configuration.ApiConfigProperties.KNOWN_API.KNOWN_API_SUGOI; @Service @Slf4j @@ -27,7 +27,7 @@ public class SugoiService { private String realm; public User postCreateUsers(User userBody) { - log.info("postCreateUsers"); + log.debug("postCreateUsers"); try { User userCreated = webClientHelper.getWebClient(KNOWN_API_SUGOI) .post() @@ -38,10 +38,9 @@ public User postCreateUsers(User userBody) { .retrieve() .bodyToMono(User.class) .block(); - log.trace("postCreateUsers - response={} ", userCreated); - log.info("postCreateUsers: end"); + log.info("postCreateUsers - response={} ", userCreated); return userCreated; - } catch (WebClient4xxBPMNError e) { + } catch (HttpClient4xxBPMNError e) { if (e.getHttpStatusCodeError().equals(HttpStatus.CONFLICT)) { String msg = "Error 409/CONFLICT during SUGOI post create users userBody.username=" + ((userBody == null) ? "null" : userBody.getUsername()) @@ -56,7 +55,7 @@ public User postCreateUsers(User userBody) { public void postInitPassword(String userId, String password) { - log.info("postInitPassword - userId={} begin", userId); + log.debug("postInitPassword - userId={} begin", userId); ObjectNode body = objectMapper.createObjectNode(); body.put("password", password); webClientHelper.getWebClient(KNOWN_API_SUGOI) diff --git a/src/main/java/fr/insee/protools/backend/service/sugoi/v2/CleanPasswordsTask.java b/src/main/java/fr/insee/protools/backend/service/sugoi/v2/CleanPasswordsTask.java new file mode 100644 index 00000000..f5a6f402 --- /dev/null +++ b/src/main/java/fr/insee/protools/backend/service/sugoi/v2/CleanPasswordsTask.java @@ -0,0 +1,50 @@ +package fr.insee.protools.backend.service.sugoi.v2; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.HistoryService; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.JavaDelegate; +import org.flowable.engine.impl.cfg.ProcessEngineConfigurationImpl; +import org.flowable.variable.api.history.HistoricVariableInstance; +import org.flowable.variable.api.history.HistoricVariableInstanceQuery; +import org.flowable.variable.service.HistoricVariableService; +import org.flowable.variable.service.impl.persistence.entity.HistoricVariableInstanceEntity; +import org.springframework.stereotype.Component; + +import java.util.List; + +import static fr.insee.protools.backend.service.FlowableVariableNameConstants.VARNAME_DIRECTORYACCESS_PWD_CONTACT; +import static fr.insee.protools.backend.service.FlowableVariableNameConstants.VARNAME_DIRECTORYACCESS_PWD_FOR_INTERRO_ID_MAP; + +/** + * Suprime la variable mot de passe et supprime aussi toutes les occurences de l'historique + */ +@Slf4j +@Component +@RequiredArgsConstructor +public class CleanPasswordsTask implements JavaDelegate { + + private final ProcessEngineConfigurationImpl processEngineConfiguration; + + @Override + public void execute(DelegateExecution execution) { + log.debug("ProcessInstanceId={} begin", execution.getProcessInstanceId()); + + //Supprime la variable mot de passe si elle existe + execution.removeVariable(VARNAME_DIRECTORYACCESS_PWD_FOR_INTERRO_ID_MAP); + + //La supprime aussi de l'historique + HistoricVariableService historicVariableService = processEngineConfiguration.getVariableServiceConfiguration().getHistoricVariableService(); + HistoryService historyService = processEngineConfiguration.getHistoryService(); + + HistoricVariableInstanceQuery query = historyService.createHistoricVariableInstanceQuery() + .processInstanceId(execution.getProcessInstanceId()) + .variableName(VARNAME_DIRECTORYACCESS_PWD_FOR_INTERRO_ID_MAP); + + List variableInstances = query.list(); + for (HistoricVariableInstance variableInstance : variableInstances) { + historicVariableService.deleteHistoricVariableInstance((HistoricVariableInstanceEntity) variableInstance); + } + } +} diff --git a/src/main/java/fr/insee/protools/backend/service/sugoi/v2/SugoiREMCreateUserListTask.java b/src/main/java/fr/insee/protools/backend/service/sugoi/v2/SugoiREMCreateUserListTask.java new file mode 100644 index 00000000..f3a3087b --- /dev/null +++ b/src/main/java/fr/insee/protools/backend/service/sugoi/v2/SugoiREMCreateUserListTask.java @@ -0,0 +1,106 @@ +package fr.insee.protools.backend.service.sugoi.v2; + +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; +import fr.insee.protools.backend.dto.internal.ProtoolsInterrogationDto; +import fr.insee.protools.backend.dto.sugoi.Habilitation; +import fr.insee.protools.backend.dto.sugoi.User; +import fr.insee.protools.backend.service.DelegateContextVerifier; +import fr.insee.protools.backend.service.context.ContextService; +import fr.insee.protools.backend.service.context.enums.CampaignContextEnum; +import fr.insee.protools.backend.service.rem.RemService; +import fr.insee.protools.backend.service.sugoi.SugoiService; +import fr.insee.protools.backend.service.utils.FlowableVariableUtils; +import fr.insee.protools.backend.service.utils.password.PasswordService; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.EnumUtils; +import org.apache.commons.lang3.tuple.Pair; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.JavaDelegate; +import org.springframework.stereotype.Component; + +import java.util.*; + +import static com.fasterxml.jackson.databind.DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES; +import static fr.insee.protools.backend.service.FlowableVariableNameConstants.*; +import static fr.insee.protools.backend.service.context.ContextConstants.CTX_CAMPAGNE_CONTEXTE; + +@Slf4j +@Component +@RequiredArgsConstructor +public class SugoiREMCreateUserListTask implements JavaDelegate, DelegateContextVerifier { + + protected static final Habilitation PLATINE_HABILITATION = new Habilitation("platine", "repondant", null); + protected static final User createSugoiUserBody = User.builder().habilitations(List.of(PLATINE_HABILITATION)).build(); + + private final SugoiService sugoiService; + private final RemService remService; + + private final PasswordService passwordService; + private final ContextService protoolsContext; + + public static final int householdPasswordSize=8; + public static final int defaultPasswordSize=12; + + @Override + public void execute(DelegateExecution execution) { + log.debug("ProcessInstanceId={} begin", execution.getProcessInstanceId()); + JsonNode contextRootNode = protoolsContext.getContextByProcessInstance(execution.getProcessInstanceId()); + Long currentLotId = FlowableVariableUtils.getVariableOrThrow(execution, VARNAME_CURRENT_PARTITION_ID, Long.class); + checkContextOrThrow(log,execution.getProcessInstanceId(), contextRootNode); + Long[] interrogationIdsWithoutAccount = remService.getInterrogationIdsWithoutAccountForLot(currentLotId); + + Map userByInterroId = new LinkedHashMap<>(interrogationIdsWithoutAccount.length); + Map pwdByInterroId = new LinkedHashMap<>(interrogationIdsWithoutAccount.length); + + int passwordSize = getPasswordSize(contextRootNode); + for (Long interrogationId : interrogationIdsWithoutAccount){ + //Create User + User createdUser = sugoiService.postCreateUsers(createSugoiUserBody); + //init password + String userPassword = passwordService.generatePassword(passwordSize); + sugoiService.postInitPassword(createdUser.getUsername(), userPassword); + userByInterroId.put(interrogationId,createdUser.getUsername()); + pwdByInterroId.put(interrogationId,userPassword); + log.debug("ProcessInstanceId={} - username={} ", createdUser.getUsername()); + } + + remService.patchInterrogationsSetAccounts(userByInterroId); + + execution.setVariableLocal(VARNAME_DIRECTORYACCESS_PWD_FOR_INTERRO_ID_MAP, pwdByInterroId); + log.info("ProcessInstanceId={} - size={} end", execution.getProcessInstanceId(), userByInterroId.size()); + } + + public static int getPasswordSize(JsonNode contextRootNode){ + String contexte=contextRootNode.path(CTX_CAMPAGNE_CONTEXTE).asText(); + CampaignContextEnum contextEnum = CampaignContextEnum.fromLabel(contexte); + if(CampaignContextEnum.HOUSEHOLD.equals(contextEnum)){ + return householdPasswordSize; + } + return defaultPasswordSize; + } + + @Override + public Set getContextErrors(JsonNode contextRootNode) { + if(contextRootNode==null){ + return Set.of("Context is missing"); + } + Set results=new HashSet<>(); + Set requiredNodes = + Set.of( + //Global & Campaign + CTX_CAMPAGNE_CONTEXTE + ); + + results.addAll(DelegateContextVerifier.computeMissingChildrenMessages(requiredNodes,contextRootNode,getClass())); + + String contexte = contextRootNode.path(CTX_CAMPAGNE_CONTEXTE).asText(); + if(! EnumUtils.isValidEnumIgnoreCase(CampaignContextEnum.class, contexte)){ + results.add(DelegateContextVerifier.computeIncorrectEnumMessage(CTX_CAMPAGNE_CONTEXTE,contexte, Arrays.toString(CampaignContextEnum.values()),getClass())); + } + + return results; + } + +} diff --git a/src/main/java/fr/insee/protools/backend/service/utils/FlowableVariableUtils.java b/src/main/java/fr/insee/protools/backend/service/utils/FlowableVariableUtils.java index a9dae8b3..a7d54e3d 100644 --- a/src/main/java/fr/insee/protools/backend/service/utils/FlowableVariableUtils.java +++ b/src/main/java/fr/insee/protools/backend/service/utils/FlowableVariableUtils.java @@ -31,4 +31,18 @@ private FlowableVariableUtils(){} public static String getMissingVariableMessage(String variableName){ return "Variable '" + variableName + "' was not found"; } + + /** + * Helper to call VariableScopeImpl#getVariable(String,Class). + * Throws Protools VariableClassCastException if the cast is not successful + * return null if the variable is not defined + */ + public static T getVariableOrNull(DelegateExecution execution, String variableName, Class variableClass ){ + try{ + return execution.getVariable(variableName, variableClass); + } + catch (ClassCastException e) { + throw new VariableClassCastException(String.format("Variable ID=[%s] val=[%s] cannot be casted to %s", variableName, execution.getVariable(variableName), variableClass)); + } + } } diff --git a/src/main/java/fr/insee/protools/backend/service/utils/delegate/DefaultCallServiceInterroListTask.java b/src/main/java/fr/insee/protools/backend/service/utils/delegate/DefaultCallServiceInterroListTask.java new file mode 100644 index 00000000..73160c0c --- /dev/null +++ b/src/main/java/fr/insee/protools/backend/service/utils/delegate/DefaultCallServiceInterroListTask.java @@ -0,0 +1,54 @@ +package fr.insee.protools.backend.service.utils.delegate; + +import com.fasterxml.jackson.databind.JsonNode; +import fr.insee.protools.backend.dto.internal.ProtoolsInterrogationDto; +import fr.insee.protools.backend.service.DelegateContextVerifier; +import fr.insee.protools.backend.service.context.ContextService; +import fr.insee.protools.backend.service.utils.FlowableVariableUtils; +import lombok.NoArgsConstructor; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.JavaDelegate; +import org.springframework.stereotype.Component; + +import java.util.List; + +import static fr.insee.protools.backend.service.FlowableVariableNameConstants.VARNAME_CURRENT_PARTITION_ID; +import static fr.insee.protools.backend.service.FlowableVariableNameConstants.VARNAME_REM_INTERRO_LIST; +import static fr.insee.protools.backend.service.context.ContextConstants.CTX_CAMPAGNE_ID; + + +@Slf4j +@Component +@RequiredArgsConstructor +@NoArgsConstructor(force = true) +public abstract class DefaultCallServiceInterroListTask implements JavaDelegate, DelegateContextVerifier { + + private final ContextService protoolsContext; + + // Abstract method for the specific service action + protected abstract void serviceAction(String campaignId,List list,String ... params); + protected void callService(DelegateExecution execution, JsonNode contextRootNode, String campaignId,List list){ + serviceAction(campaignId,list); + } + + @Override + public void execute(DelegateExecution execution) { + JsonNode contextRootNode = protoolsContext.getContextByProcessInstance(execution.getProcessInstanceId()); + checkContextOrThrow(log,execution.getProcessInstanceId(), contextRootNode); + + String campainId = contextRootNode.path(CTX_CAMPAGNE_ID).asText(); + Long currentPartitionId = FlowableVariableUtils.getVariableOrThrow(execution, VARNAME_CURRENT_PARTITION_ID, Long.class); + List protoolsInterrogationList = FlowableVariableUtils.getVariableOrThrow(execution, VARNAME_REM_INTERRO_LIST, List.class); + + List interrogationList = protoolsInterrogationList.stream() + .map(protoolsInterrogationDto -> { + log.trace("ProcessInstanceId={} - campainId={} - currentPartitionId={} - idInterrogation={}", + execution.getProcessInstanceId(),campainId,currentPartitionId,protoolsInterrogationDto.getIdInterrogation()); + return protoolsInterrogationDto.getRemInterrogation(); + }) + .toList(); + callService(execution,contextRootNode,campainId,interrogationList); + } +} diff --git a/src/main/resources/application-dev.properties b/src/main/resources/application-dev.properties index 505b5fbd..5a2edca4 100644 --- a/src/main/resources/application-dev.properties +++ b/src/main/resources/application-dev.properties @@ -74,6 +74,7 @@ fr.insee.protools.api.rem.auth.client-id=${fr.insee.protools.keycloak.client.id} fr.insee.protools.api.rem.auth.client-secret=${fr.insee.protools.token.provider.interne-agents-insee-interne.client-secret} fr.insee.protools.api.rem.auth.realm=agents-insee-interne fr.insee.protools.api.rem.auth.url=${fr.insee.protools.keycloak-interne-auth-url} +fr.insee.protools.api.rem.su.page.size=4 #ERA fr.insee.protools.api.era.enabled=true @@ -93,7 +94,7 @@ fr.insee.protools.api.meshuggah.auth.url=${fr.insee.protools.keycloak-interne-au #SUGOI externe fr.insee.protools.api.sugoi.enabled=true -fr.insee.protools.api.sugoi.url=https://api.comptes-utilisateurs.recette.insee.fr/ +fr.insee.protools.api.sugoi.url=https://api.gestion-comptes-utilisateurs.recette.insee.fr/ fr.insee.protools.api.sugoi.auth.client-id=${fr.insee.protools.keycloak.client.id} fr.insee.protools.api.sugoi.auth.client-secret=${fr.insee.protools.token.provider.interne-agents-insee-interne.client-secret} fr.insee.protools.api.sugoi.auth.realm=agents-insee-interne diff --git a/src/test/httpRequests/bpmnAndContext/creation_context_and_su_platine/noCTX_getREMAvecSousProcess.bpmn20.xml b/src/test/httpRequests/bpmnAndContext/creation_context_and_su_platine/noCTX_getREMAvecSousProcess.bpmn20.xml index e77accb4..aa58cac4 100644 --- a/src/test/httpRequests/bpmnAndContext/creation_context_and_su_platine/noCTX_getREMAvecSousProcess.bpmn20.xml +++ b/src/test/httpRequests/bpmnAndContext/creation_context_and_su_platine/noCTX_getREMAvecSousProcess.bpmn20.xml @@ -18,8 +18,8 @@ - contexte_partition_id_list - + contexte_lot_id_list + diff --git a/src/test/java/fr/insee/protools/backend/controller/StarterControllerTest.java b/src/test/java/fr/insee/protools/backend/controller/StarterControllerTest.java index f6092ddf..441eaf2e 100644 --- a/src/test/java/fr/insee/protools/backend/controller/StarterControllerTest.java +++ b/src/test/java/fr/insee/protools/backend/controller/StarterControllerTest.java @@ -1,6 +1,6 @@ package fr.insee.protools.backend.controller; -import fr.insee.protools.backend.webclient.WebClientHelper; +import fr.insee.protools.backend.httpclients.webclient.WebClientHelper; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; diff --git a/src/test/java/fr/insee/protools/backend/httpclients/restclient/RestClientHelperTest.java b/src/test/java/fr/insee/protools/backend/httpclients/restclient/RestClientHelperTest.java new file mode 100644 index 00000000..a8c39346 --- /dev/null +++ b/src/test/java/fr/insee/protools/backend/httpclients/restclient/RestClientHelperTest.java @@ -0,0 +1,190 @@ +package fr.insee.protools.backend.httpclients.restclient; + +import com.fasterxml.jackson.databind.ObjectMapper; +import fr.insee.protools.backend.ProtoolsTestUtils; +import fr.insee.protools.backend.httpclients.configuration.APIProperties; +import fr.insee.protools.backend.httpclients.configuration.ApiConfigProperties; +import fr.insee.protools.backend.httpclients.exception.ApiNotConfiguredBPMNError; +import fr.insee.protools.backend.httpclients.exception.KeycloakTokenConfigUncheckedBPMNError; +import fr.insee.protools.backend.httpclients.exception.runtime.HttpClient4xxBPMNError; +import fr.insee.protools.backend.httpclients.keycloak.KeycloakResponse; +import fr.insee.protools.backend.httpclients.keycloak.KeycloakService; +import okhttp3.mockwebserver.MockResponse; +import okhttp3.mockwebserver.MockWebServer; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.Mock; +import org.mockito.Spy; +import org.mockito.junit.jupiter.MockitoExtension; +import org.springframework.core.env.Environment; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.web.client.RestClient; + +import java.io.File; +import java.io.IOException; +import java.io.RandomAccessFile; +import java.util.List; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.when; + +@ExtendWith(MockitoExtension.class) +public class RestClientHelperTest { + + @Spy + private Environment environment; + + private KeycloakService keycloakService; + + @Mock + private ApiConfigProperties apiConfigProperties; + + private RestClientHelper restClientHelper; + + + private MockWebServer mockWebServer; + private static final int port = 80; + private static String getDummyUriWithPort() { return getServerHostPort()+"/api/test"; } + private static String getServerHostPort() { return "http://localhost:"+port; } + + @BeforeEach + public void prepare() { + keycloakService= new KeycloakService(environment); + restClientHelper = new RestClientHelper(keycloakService,apiConfigProperties); + this.keycloakService.initialize(); + } + + //close the mocked web server if it has been initialized + @AfterEach + void mockServerCleanup() throws Exception { + if(this.mockWebServer!=null){ + this.mockWebServer.close(); + } + } + + private void initMockWebServer() throws IOException { + this.mockWebServer = new MockWebServer(); + mockWebServer.start(port); + } + + @Test + @DisplayName("Test getRestClient method without specifying an API") + void testGetRestClientWithoutApi() { + RestClient client = restClientHelper.getRestClient(); + assertThat(client).isNotNull(); + } + + private void testGetRestClientWithIncompleteKCConfig(APIProperties.AuthProperties kcAuth){ + when(apiConfigProperties.getAPIProperties(any())).thenReturn(new APIProperties(getServerHostPort(), kcAuth, true)); + var restClient = restClientHelper.getRestClient(ApiConfigProperties.KNOWN_API.KNOWN_API_ERA); + assertThat(restClient).isNotNull(); + //Should throw an exception as the realm is missing + assertThrows(KeycloakTokenConfigUncheckedBPMNError.class , () -> restClient.get().uri(getDummyUriWithPort()).retrieve()); + } + @Test + @DisplayName("Test getRestClient method without incomplete keycloak configuration") + void getRestClientWithIncompleteKCConfig() throws IOException { + //Missing realm + APIProperties.AuthProperties kcAuth = new APIProperties.AuthProperties(getDummyUriWithPort(),null, "toto","toto"); + //Should throw an exception as the realm is missing + testGetRestClientWithIncompleteKCConfig(kcAuth); + + //Missing url + kcAuth = new APIProperties.AuthProperties("null","realm", "toto","toto"); + testGetRestClientWithIncompleteKCConfig(kcAuth); + + //Missing clientId + kcAuth = new APIProperties.AuthProperties(getDummyUriWithPort(),"realm", null,"toto"); + testGetRestClientWithIncompleteKCConfig(kcAuth); + + //Missing secret + kcAuth = new APIProperties.AuthProperties(getDummyUriWithPort(),"realm", "toto",null); + testGetRestClientWithIncompleteKCConfig(kcAuth); + } + + @Test + void getRestClient() throws IOException { + + APIProperties.AuthProperties kcAuth = new APIProperties.AuthProperties(); + kcAuth.setClientId("clientId-toto"); + kcAuth.setClientSecret("client-pwd-toto"); + kcAuth.setRealm("realm-toto"); + kcAuth.setUrl(getDummyUriWithPort()); + + + when(apiConfigProperties.getAPIProperties(any())).thenReturn(new APIProperties(getServerHostPort(), kcAuth, true)); + RestClient restClient = restClientHelper.getRestClient(ApiConfigProperties.KNOWN_API.KNOWN_API_ERA); + assertThat(restClient).isNotNull(); + + KeycloakResponse kcResponse = new KeycloakResponse(); + kcResponse.setAccesToken("MYTOKEN"); + kcResponse.setExpiresIn(5*60*1000); + MockResponse mockResponseKC = new MockResponse() + .addHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON) + .setResponseCode(HttpStatus.OK.value()) + .setBody(new ObjectMapper().writeValueAsString(kcResponse)); + + MockResponse mockResponse = new MockResponse() + .setResponseCode(HttpStatus.NO_CONTENT.value()) + .setBody("XXX"); + + initMockWebServer(); + mockWebServer.enqueue(mockResponseKC); + mockWebServer.enqueue(mockResponse); + + + + assertThat(restClient.get().uri(getDummyUriWithPort()).retrieve().toBodilessEntity().getStatusCode()).isEqualTo(HttpStatus.NO_CONTENT); + } + + @Test + void getRestClient_withInvalidApiConfig() { + when(apiConfigProperties.getAPIProperties(any())).thenReturn(null); + assertThatThrownBy(() -> restClientHelper.getRestClient(any())) + .isInstanceOf(ApiNotConfiguredBPMNError.class) + .hasMessageContaining("is not configured in properties"); + } + + @Test + void getRestClient_withDisabledApiConfig() { + when(apiConfigProperties.getAPIProperties(any())).thenReturn(new APIProperties("http://localhost:8080", new APIProperties.AuthProperties(), false )); + assertThatThrownBy(() -> restClientHelper.getRestClient(any())) + .isInstanceOf(ApiNotConfiguredBPMNError.class) + .hasMessageContaining("is disabled in properties"); + } + + @Test + @DisplayName("Test that the retrieval of spring private field still works") + void extractClientResponseRequestDescriptionPrivateFiledUsingReflexion_shouldWork() throws IOException { + RestClient restClient = restClientHelper.getRestClient(); + assertThat(restClient).isNotNull(); + + //Mock an error response + MockResponse mockResponse = new MockResponse() + .setResponseCode(HttpStatus.BAD_REQUEST.value()) + .setBody("XXX"); + + initMockWebServer(); + mockWebServer.enqueue(mockResponse); + + //Call method under test + HttpClient4xxBPMNError exception = assertThrows(HttpClient4xxBPMNError.class , () ->restClient.get().uri(getDummyUriWithPort()).retrieve() + .toBodilessEntity()); + + //Post call conditions (we get more or less the expected message with the original request) + //IF it is not the case, check that the spring private field has not changed or been renamed + String actualMessage = exception.getMessage(); + assertThat(actualMessage) + .contains("GET") + .contains(getDummyUriWithPort()) + .contains(String.valueOf(HttpStatus.BAD_REQUEST.value())); + } +} \ No newline at end of file diff --git a/src/test/java/fr/insee/protools/backend/webclient/KeycloakServiceTest.java b/src/test/java/fr/insee/protools/backend/httpclients/webclient/KeycloakServiceTest.java similarity index 95% rename from src/test/java/fr/insee/protools/backend/webclient/KeycloakServiceTest.java rename to src/test/java/fr/insee/protools/backend/httpclients/webclient/KeycloakServiceTest.java index b05f9722..056e2b71 100644 --- a/src/test/java/fr/insee/protools/backend/webclient/KeycloakServiceTest.java +++ b/src/test/java/fr/insee/protools/backend/httpclients/webclient/KeycloakServiceTest.java @@ -1,8 +1,10 @@ -package fr.insee.protools.backend.webclient; +package fr.insee.protools.backend.httpclients.webclient; import com.fasterxml.jackson.databind.ObjectMapper; -import fr.insee.protools.backend.webclient.configuration.APIProperties; -import fr.insee.protools.backend.webclient.exception.KeycloakTokenConfigBPMNError; +import fr.insee.protools.backend.httpclients.keycloak.KeycloakResponse; +import fr.insee.protools.backend.httpclients.keycloak.KeycloakService; +import fr.insee.protools.backend.httpclients.configuration.APIProperties; +import fr.insee.protools.backend.httpclients.exception.KeycloakTokenConfigBPMNError; import okhttp3.mockwebserver.MockResponse; import okhttp3.mockwebserver.MockWebServer; import org.junit.jupiter.api.AfterEach; diff --git a/src/test/java/fr/insee/protools/backend/webclient/WebClientHelperTest.java b/src/test/java/fr/insee/protools/backend/httpclients/webclient/WebClientHelperTest.java similarity index 94% rename from src/test/java/fr/insee/protools/backend/webclient/WebClientHelperTest.java rename to src/test/java/fr/insee/protools/backend/httpclients/webclient/WebClientHelperTest.java index 10bcaeb1..575afe87 100644 --- a/src/test/java/fr/insee/protools/backend/webclient/WebClientHelperTest.java +++ b/src/test/java/fr/insee/protools/backend/httpclients/webclient/WebClientHelperTest.java @@ -1,12 +1,14 @@ -package fr.insee.protools.backend.webclient; +package fr.insee.protools.backend.httpclients.webclient; import com.fasterxml.jackson.databind.ObjectMapper; import fr.insee.protools.backend.ProtoolsTestUtils; -import fr.insee.protools.backend.webclient.configuration.APIProperties; -import fr.insee.protools.backend.webclient.configuration.ApiConfigProperties; -import fr.insee.protools.backend.webclient.exception.ApiNotConfiguredBPMNError; -import fr.insee.protools.backend.webclient.exception.KeycloakTokenConfigUncheckedBPMNError; -import fr.insee.protools.backend.webclient.exception.runtime.WebClient4xxBPMNError; +import fr.insee.protools.backend.httpclients.keycloak.KeycloakResponse; +import fr.insee.protools.backend.httpclients.keycloak.KeycloakService; +import fr.insee.protools.backend.httpclients.configuration.APIProperties; +import fr.insee.protools.backend.httpclients.configuration.ApiConfigProperties; +import fr.insee.protools.backend.httpclients.exception.ApiNotConfiguredBPMNError; +import fr.insee.protools.backend.httpclients.exception.KeycloakTokenConfigUncheckedBPMNError; +import fr.insee.protools.backend.httpclients.exception.runtime.HttpClient4xxBPMNError; import okhttp3.mockwebserver.MockResponse; import okhttp3.mockwebserver.MockWebServer; import org.junit.jupiter.api.AfterEach; @@ -277,7 +279,7 @@ void extractClientResponseRequestDescriptionPrivateFiledUsingReflexion_shouldWor mockWebServer.enqueue(mockResponse); //Call method under test - WebClient4xxBPMNError exception = assertThrows(WebClient4xxBPMNError.class , () ->webClient.get().uri(getDummyUriWithPort()).retrieve() + HttpClient4xxBPMNError exception = assertThrows(HttpClient4xxBPMNError.class , () ->webClient.get().uri(getDummyUriWithPort()).retrieve() .bodyToMono(String.class) .block()); diff --git a/src/test/java/fr/insee/protools/backend/service/platine/delegate/PlatinePilotageCreateSurveyUnitTaskTest.java b/src/test/java/fr/insee/protools/backend/service/platine/delegate/PlatinePilotageCreateSurveyUnitTaskTest.java index 7824c22b..bdf886ec 100644 --- a/src/test/java/fr/insee/protools/backend/service/platine/delegate/PlatinePilotageCreateSurveyUnitTaskTest.java +++ b/src/test/java/fr/insee/protools/backend/service/platine/delegate/PlatinePilotageCreateSurveyUnitTaskTest.java @@ -78,7 +78,7 @@ void execute_should_work_when_ContextOK(String context_json) { JsonNode remSU = ProtoolsTestUtils.asJsonNode(RemSUData.rem_su_3personnes); Long idPArtition=1l; lenient().doReturn(idPArtition).when(execution).getVariable(VARNAME_CURRENT_PARTITION_ID,Long.class); - lenient().doReturn(remSU).when(execution).getVariable(VARNAME_REM_SURVEY_UNIT,JsonNode.class); + lenient().doReturn(remSU).when(execution).getVariable(VARNAME_REM_INTERROGATION,JsonNode.class); lenient().doReturn("TOTO").when(execution).getVariable(VARNAME_DIRECTORYACCESS_ID_CONTACT,String.class); //Execute the unit under test @@ -128,17 +128,17 @@ void findContact_should_return_CorrectContactForLogement() { @Test @DisplayName("convertREMGenderToPlatineCivility should return Female when param '2' ; 'Male' when param is '1' and Undefined in other cases") void convertREMGenderToPlatineCivility_should_ReturnCorrectValues() { - assertThat(PlatinePilotageCreateSurveyUnitTask.convertREMGenderToPlatineCivility("2")).isEqualTo(PlatinePilotageGenderType.Female); - assertThat(PlatinePilotageCreateSurveyUnitTask.convertREMGenderToPlatineCivility("1")).isEqualTo(PlatinePilotageGenderType.Male); - assertThat(PlatinePilotageCreateSurveyUnitTask.convertREMGenderToPlatineCivility("22")).isEqualTo(PlatinePilotageGenderType.Undefined); - assertThat(PlatinePilotageCreateSurveyUnitTask.convertREMGenderToPlatineCivility(" 2")).isEqualTo(PlatinePilotageGenderType.Undefined); - assertThat(PlatinePilotageCreateSurveyUnitTask.convertREMGenderToPlatineCivility(" 2 ")).isEqualTo(PlatinePilotageGenderType.Undefined); - assertThat(PlatinePilotageCreateSurveyUnitTask.convertREMGenderToPlatineCivility("3")).isEqualTo(PlatinePilotageGenderType.Undefined); - assertThat(PlatinePilotageCreateSurveyUnitTask.convertREMGenderToPlatineCivility("23JZKEOSJF")).isEqualTo(PlatinePilotageGenderType.Undefined); - assertThat(PlatinePilotageCreateSurveyUnitTask.convertREMGenderToPlatineCivility("0")).isEqualTo(PlatinePilotageGenderType.Undefined); - assertThat(PlatinePilotageCreateSurveyUnitTask.convertREMGenderToPlatineCivility("-1")).isEqualTo(PlatinePilotageGenderType.Undefined); - assertThat(PlatinePilotageCreateSurveyUnitTask.convertREMGenderToPlatineCivility("-2")).isEqualTo(PlatinePilotageGenderType.Undefined); - assertThat(PlatinePilotageCreateSurveyUnitTask.convertREMGenderToPlatineCivility("& ukdslw,kvlk,l")).isEqualTo(PlatinePilotageGenderType.Undefined); + assertThat(PlatinePilotageCreateInterrogationListTask.convertREMGenderToPlatineCivility("2")).isEqualTo(PlatinePilotageGenderType.Female); + assertThat(PlatinePilotageCreateInterrogationListTask.convertREMGenderToPlatineCivility("1")).isEqualTo(PlatinePilotageGenderType.Male); + assertThat(PlatinePilotageCreateInterrogationListTask.convertREMGenderToPlatineCivility("22")).isEqualTo(PlatinePilotageGenderType.Undefined); + assertThat(PlatinePilotageCreateInterrogationListTask.convertREMGenderToPlatineCivility(" 2")).isEqualTo(PlatinePilotageGenderType.Undefined); + assertThat(PlatinePilotageCreateInterrogationListTask.convertREMGenderToPlatineCivility(" 2 ")).isEqualTo(PlatinePilotageGenderType.Undefined); + assertThat(PlatinePilotageCreateInterrogationListTask.convertREMGenderToPlatineCivility("3")).isEqualTo(PlatinePilotageGenderType.Undefined); + assertThat(PlatinePilotageCreateInterrogationListTask.convertREMGenderToPlatineCivility("23JZKEOSJF")).isEqualTo(PlatinePilotageGenderType.Undefined); + assertThat(PlatinePilotageCreateInterrogationListTask.convertREMGenderToPlatineCivility("0")).isEqualTo(PlatinePilotageGenderType.Undefined); + assertThat(PlatinePilotageCreateInterrogationListTask.convertREMGenderToPlatineCivility("-1")).isEqualTo(PlatinePilotageGenderType.Undefined); + assertThat(PlatinePilotageCreateInterrogationListTask.convertREMGenderToPlatineCivility("-2")).isEqualTo(PlatinePilotageGenderType.Undefined); + assertThat(PlatinePilotageCreateInterrogationListTask.convertREMGenderToPlatineCivility("& ukdslw,kvlk,l")).isEqualTo(PlatinePilotageGenderType.Undefined); } @Test @@ -146,10 +146,10 @@ void convertREMGenderToPlatineCivility_should_ReturnCorrectValues() { void getPlatineLastname_should_work(){ String lastname="lastname"; String birthname="birthname"; - assertThat(PlatinePilotageCreateSurveyUnitTask.getPlatineLastname(lastname,birthname)).isEqualTo(lastname); - assertThat(PlatinePilotageCreateSurveyUnitTask.getPlatineLastname(null,birthname)).isEqualTo(birthname); - assertThat(PlatinePilotageCreateSurveyUnitTask.getPlatineLastname(lastname,null)).isEqualTo(lastname); - assertThat(PlatinePilotageCreateSurveyUnitTask.getPlatineLastname(null,null)).isEmpty(); + assertThat(PlatinePilotageCreateInterrogationListTask.getPlatineLastname(lastname,birthname)).isEqualTo(lastname); + assertThat(PlatinePilotageCreateInterrogationListTask.getPlatineLastname(null,birthname)).isEqualTo(birthname); + assertThat(PlatinePilotageCreateInterrogationListTask.getPlatineLastname(lastname,null)).isEqualTo(lastname); + assertThat(PlatinePilotageCreateInterrogationListTask.getPlatineLastname(null,null)).isEmpty(); } @@ -164,7 +164,7 @@ void execute_should_throw_IncorrectSUException_when_wrongSU() { ((ObjectNode) remSU).remove("repositoryId"); Long idPartition=1l; lenient().doReturn(idPartition).when(execution).getVariable(VARNAME_CURRENT_PARTITION_ID,Long.class); - lenient().doReturn(remSU).when(execution).getVariable(VARNAME_REM_SURVEY_UNIT,JsonNode.class); + lenient().doReturn(remSU).when(execution).getVariable(VARNAME_REM_INTERROGATION,JsonNode.class); lenient().doReturn("TOTO").when(execution).getVariable(VARNAME_DIRECTORYACCESS_ID_CONTACT,String.class); diff --git a/src/test/java/fr/insee/protools/backend/service/platine/delegate/PlatineQuestionnaireCreateSurveyUnitTaskTest.java b/src/test/java/fr/insee/protools/backend/service/platine/delegate/PlatineQuestionnaireCreateSurveyUnitTaskTest.java index 22afcdeb..a554c059 100644 --- a/src/test/java/fr/insee/protools/backend/service/platine/delegate/PlatineQuestionnaireCreateSurveyUnitTaskTest.java +++ b/src/test/java/fr/insee/protools/backend/service/platine/delegate/PlatineQuestionnaireCreateSurveyUnitTaskTest.java @@ -69,7 +69,7 @@ void execute_should_work_when_ContextOK(String context_json) throws JsonProcessi JsonNode remSU = ProtoolsTestUtils.asJsonNode(RemSUData.rem_su_3personnes); Long idPartition=1l; lenient().doReturn(idPartition).when(execution).getVariable(VARNAME_CURRENT_PARTITION_ID,Long.class); - lenient().doReturn(remSU).when(execution).getVariable(VARNAME_REM_SURVEY_UNIT,JsonNode.class); + lenient().doReturn(remSU).when(execution).getVariable(VARNAME_REM_INTERROGATION,JsonNode.class); lenient().doReturn("TOTO").when(execution).getVariable(VARNAME_DIRECTORYACCESS_ID_CONTACT,String.class); //Execute the unit under test @@ -101,7 +101,7 @@ void execute_should_throw_IncorrectSUException_when_wrongSU() { ((ObjectNode) remSU).remove("repositoryId"); Long idPartition=1l; lenient().doReturn(idPartition).when(execution).getVariable(VARNAME_CURRENT_PARTITION_ID,Long.class); - lenient().doReturn(remSU).when(execution).getVariable(VARNAME_REM_SURVEY_UNIT,JsonNode.class); + lenient().doReturn(remSU).when(execution).getVariable(VARNAME_REM_INTERROGATION,JsonNode.class); lenient().doReturn("TOTO").when(execution).getVariable(VARNAME_DIRECTORYACCESS_ID_CONTACT,String.class); diff --git a/src/test/java/fr/insee/protools/backend/service/rem/delegate/ExtractContactIdentifierFromREMSUTaskTest.java b/src/test/java/fr/insee/protools/backend/service/rem/delegate/ExtractContactIdentifierFromREMSUTaskTest.java index 9b110583..6b9c277e 100644 --- a/src/test/java/fr/insee/protools/backend/service/rem/delegate/ExtractContactIdentifierFromREMSUTaskTest.java +++ b/src/test/java/fr/insee/protools/backend/service/rem/delegate/ExtractContactIdentifierFromREMSUTaskTest.java @@ -14,7 +14,7 @@ import org.mockito.junit.jupiter.MockitoExtension; import static fr.insee.protools.backend.service.FlowableVariableNameConstants.VARNAME_DIRECTORYACCESS_ID_CONTACT; -import static fr.insee.protools.backend.service.FlowableVariableNameConstants.VARNAME_REM_SURVEY_UNIT; +import static fr.insee.protools.backend.service.FlowableVariableNameConstants.VARNAME_REM_INTERROGATION; import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; import static org.junit.jupiter.api.Assertions.assertThrows; import static org.mockito.Mockito.*; @@ -35,7 +35,7 @@ void execute_should_throw_when_variable_missing() { assertThrows(FlowableIllegalArgumentException.class, () -> extractTask.execute(execution)); //Wrong Type ==> Error - lenient().doReturn(Boolean.FALSE).when(execution).getVariable(VARNAME_REM_SURVEY_UNIT, Boolean.class); + lenient().doReturn(Boolean.FALSE).when(execution).getVariable(VARNAME_REM_INTERROGATION, Boolean.class); assertThrows(FlowableIllegalArgumentException.class, () -> extractTask.execute(execution)); } @@ -57,7 +57,7 @@ void execute_should_thow_when_variable_OKand_UEJson_NOT_OK() throws JsonProcessi "missing_tag": [ ] } """; - doReturn(objectMapper.readTree(content)).when(execution).getVariable(VARNAME_REM_SURVEY_UNIT, JsonNode.class); + doReturn(objectMapper.readTree(content)).when(execution).getVariable(VARNAME_REM_INTERROGATION, JsonNode.class); //Execute assertThrows(IncorrectSUBPMNError.class, () -> extractTask.execute(execution)); @@ -77,7 +77,7 @@ void execute_should_thow_when_variable_OKand_UEJson_NOT_OK() throws JsonProcessi } ] } """; - doReturn(objectMapper.readTree(content)).when(execution).getVariable(VARNAME_REM_SURVEY_UNIT, JsonNode.class); + doReturn(objectMapper.readTree(content)).when(execution).getVariable(VARNAME_REM_INTERROGATION, JsonNode.class); //Execute assertThrows(IncorrectSUBPMNError.class, () -> extractTask.execute(execution)); } @@ -109,7 +109,7 @@ void execute_should_work_when_variable_and_UEJson_OK() throws JsonProcessingExce } ] } """; - doReturn(objectMapper.readTree(content)).when(execution).getVariable(VARNAME_REM_SURVEY_UNIT, JsonNode.class); + doReturn(objectMapper.readTree(content)).when(execution).getVariable(VARNAME_REM_INTERROGATION, JsonNode.class); //Execute assertDoesNotThrow(() -> extractTask.execute(execution)); diff --git a/src/test/java/fr/insee/protools/backend/service/rem/delegate/RemGetPartitionListOfSuIdTaskTest.java b/src/test/java/fr/insee/protools/backend/service/rem/delegate/RemGetPartitionListOfSuIdTaskTest.java index 6cf5d4b4..dd936887 100644 --- a/src/test/java/fr/insee/protools/backend/service/rem/delegate/RemGetPartitionListOfSuIdTaskTest.java +++ b/src/test/java/fr/insee/protools/backend/service/rem/delegate/RemGetPartitionListOfSuIdTaskTest.java @@ -17,7 +17,7 @@ import java.util.List; import static fr.insee.protools.backend.service.FlowableVariableNameConstants.VARNAME_CURRENT_PARTITION_ID; -import static fr.insee.protools.backend.service.FlowableVariableNameConstants.VARNAME_REM_SU_ID_LIST; +import static fr.insee.protools.backend.service.FlowableVariableNameConstants.VARNAME_REM_INTERRO_ID_LIST; import static fr.insee.protools.backend.service.utils.FlowableVariableUtils.getMissingVariableMessage; import static org.assertj.core.api.Assertions.assertThat; import static org.junit.jupiter.api.Assertions.assertThrows; @@ -91,7 +91,7 @@ void execute_should_work_when_contextNpartition_and_variable_OK(String contexte, //Service called once and for the right partition verify(remService).getSampleSuIds(currentPartitionId); //Process instance variable set with the list of retrieved Ids - verify(executionParent).setVariableLocal(VARNAME_REM_SU_ID_LIST, expectedResult); + verify(executionParent).setVariableLocal(VARNAME_REM_INTERRO_ID_LIST, expectedResult); } @Test diff --git a/src/test/java/fr/insee/protools/backend/service/rem/delegate/RemGetSUTaskTest.java b/src/test/java/fr/insee/protools/backend/service/rem/delegate/RemGetSUTaskTest.java index 185a4994..bdadbe3b 100644 --- a/src/test/java/fr/insee/protools/backend/service/rem/delegate/RemGetSUTaskTest.java +++ b/src/test/java/fr/insee/protools/backend/service/rem/delegate/RemGetSUTaskTest.java @@ -14,7 +14,7 @@ import org.mockito.Spy; import org.mockito.junit.jupiter.MockitoExtension; -import static fr.insee.protools.backend.service.FlowableVariableNameConstants.VARNAME_REM_SURVEY_UNIT; +import static fr.insee.protools.backend.service.FlowableVariableNameConstants.VARNAME_REM_INTERROGATION; import static fr.insee.protools.backend.service.FlowableVariableNameConstants.VARNAME_REM_SURVEY_UNIT_IDENTIFIER; import static fr.insee.protools.backend.service.utils.FlowableVariableUtils.getMissingVariableMessage; import static org.assertj.core.api.Assertions.assertThat; @@ -60,6 +60,6 @@ void execute_should_work_when_variable_OK() { //Service called once and for the right SU ID verify(remService).getSurveyUnit(variableSuId); //Process instance variable set with the retrieved SU content - verify(execution).setVariableLocal(VARNAME_REM_SURVEY_UNIT, objectMapper.valueToTree(expectedREMSU)); + verify(execution).setVariableLocal(VARNAME_REM_INTERROGATION, objectMapper.valueToTree(expectedREMSU)); } } \ No newline at end of file diff --git a/src/test/java/fr/insee/protools/backend/service/rem/delegate/RemWriteEraSUListTaskTest.java b/src/test/java/fr/insee/protools/backend/service/rem/delegate/RemWriteEraSUListTaskTest.java index 21ca242b..57f61cae 100644 --- a/src/test/java/fr/insee/protools/backend/service/rem/delegate/RemWriteEraSUListTaskTest.java +++ b/src/test/java/fr/insee/protools/backend/service/rem/delegate/RemWriteEraSUListTaskTest.java @@ -95,6 +95,6 @@ void execute_should_work_when_variables_Ok() throws JsonProcessingException { //Post conditions verify(remService,times(1)).writeERASUList(partitionID,listOfEraSU); - verify(executionParent,times(1)).setVariableLocal(VARNAME_REM_SU_ID_LIST,List.of(remId1,remId2)); + verify(executionParent,times(1)).setVariableLocal(VARNAME_REM_INTERRO_ID_LIST,List.of(remId1,remId2)); } } \ No newline at end of file diff --git a/src/test/java/fr/insee/protools/backend/service/sabiane/delegate/SabianePilotageCreateSUTaskTest.java b/src/test/java/fr/insee/protools/backend/service/sabiane/delegate/SabianePilotageCreateSUTaskTest.java index 3a860ed0..df34d81c 100644 --- a/src/test/java/fr/insee/protools/backend/service/sabiane/delegate/SabianePilotageCreateSUTaskTest.java +++ b/src/test/java/fr/insee/protools/backend/service/sabiane/delegate/SabianePilotageCreateSUTaskTest.java @@ -38,7 +38,7 @@ import java.util.stream.Stream; import static fr.insee.protools.backend.service.FlowableVariableNameConstants.VARNAME_CURRENT_PARTITION_ID; -import static fr.insee.protools.backend.service.FlowableVariableNameConstants.VARNAME_REM_SURVEY_UNIT; +import static fr.insee.protools.backend.service.FlowableVariableNameConstants.VARNAME_REM_INTERROGATION; import static fr.insee.protools.backend.service.utils.FlowableVariableUtils.getMissingVariableMessage; import static org.assertj.core.api.Assertions.assertThat; import static org.junit.jupiter.api.Assertions.*; @@ -622,10 +622,10 @@ void execute_should_throw_FlowableIllegalArgumentException_when_variables_notDef //Execute again exception = assertThrows(FlowableIllegalArgumentException.class, () -> sabianePilotageTask.execute(execution)); //Check the error - assertThat(exception.getMessage()).isEqualTo(getMissingVariableMessage(VARNAME_REM_SURVEY_UNIT)); + assertThat(exception.getMessage()).isEqualTo(getMissingVariableMessage(VARNAME_REM_INTERROGATION)); //Create 2nd variable - when(execution.getVariable(VARNAME_REM_SURVEY_UNIT, JsonNode.class)).thenReturn(ProtoolsTestUtils.asJsonNode(RemSUData.rem_su_1personne)); + when(execution.getVariable(VARNAME_REM_INTERROGATION, JsonNode.class)).thenReturn(ProtoolsTestUtils.asJsonNode(RemSUData.rem_su_1personne)); //Execute again assertDoesNotThrow(() -> sabianePilotageTask.execute(execution)); } @@ -649,7 +649,7 @@ void execute_should_throw_BadContext_when_contextIncorrect(String context_json) DelegateExecution execution = createMockedExecution(); //Variables lenient().when(execution.getVariable(VARNAME_CURRENT_PARTITION_ID, Long.class)).thenReturn(CtxExamples.ctx_partition1); - lenient().when(execution.getVariable(VARNAME_REM_SURVEY_UNIT, JsonNode.class)).thenReturn(ProtoolsTestUtils.asJsonNode(RemSUData.rem_su_1personne)); + lenient().when(execution.getVariable(VARNAME_REM_INTERROGATION, JsonNode.class)).thenReturn(ProtoolsTestUtils.asJsonNode(RemSUData.rem_su_1personne)); //Ctx ProtoolsTestUtils.initContexteMockFromString(protoolsContext, context_json); @@ -681,7 +681,7 @@ void execute_should_work_when_ctx_1part_logement(String inputCtx, String inputRe lenient().when(execution.getProcessInstanceId()).thenReturn(dumyId); lenient().when(execution.getVariable(VARNAME_CURRENT_PARTITION_ID, Long.class)).thenReturn(CtxExamples.ctx_partition1); JsonNode remSU = ProtoolsTestUtils.asJsonNode(inputRemSU); - lenient().when(execution.getVariable(VARNAME_REM_SURVEY_UNIT, JsonNode.class)).thenReturn(remSU); + lenient().when(execution.getVariable(VARNAME_REM_INTERROGATION, JsonNode.class)).thenReturn(remSU); //Ctx initContexteMockWithString(inputCtx); diff --git a/src/test/java/fr/insee/protools/backend/service/sabiane/delegate/SabianeQuestionnaireCreateSUTaskTest.java b/src/test/java/fr/insee/protools/backend/service/sabiane/delegate/SabianeQuestionnaireCreateSUTaskTest.java index 7c574839..e5af13e2 100644 --- a/src/test/java/fr/insee/protools/backend/service/sabiane/delegate/SabianeQuestionnaireCreateSUTaskTest.java +++ b/src/test/java/fr/insee/protools/backend/service/sabiane/delegate/SabianeQuestionnaireCreateSUTaskTest.java @@ -26,7 +26,7 @@ import java.util.stream.Stream; import static fr.insee.protools.backend.service.FlowableVariableNameConstants.VARNAME_CURRENT_PARTITION_ID; -import static fr.insee.protools.backend.service.FlowableVariableNameConstants.VARNAME_REM_SURVEY_UNIT; +import static fr.insee.protools.backend.service.FlowableVariableNameConstants.VARNAME_REM_INTERROGATION; import static fr.insee.protools.backend.service.utils.FlowableVariableUtils.getMissingVariableMessage; import static org.assertj.core.api.Assertions.assertThat; import static org.junit.jupiter.api.Assertions.*; @@ -87,10 +87,10 @@ void execute_should_throw_FlowableIllegalArgumentException_when_variables_notDef //Execute again exception = assertThrows(FlowableIllegalArgumentException.class, () -> sabianePilotageTask.execute(execution)); //Check the error - assertThat(exception.getMessage()).isEqualTo(getMissingVariableMessage(VARNAME_REM_SURVEY_UNIT)); + assertThat(exception.getMessage()).isEqualTo(getMissingVariableMessage(VARNAME_REM_INTERROGATION)); //Create 2nd variable - when(execution.getVariable(VARNAME_REM_SURVEY_UNIT, JsonNode.class)).thenReturn(ProtoolsTestUtils.asJsonNode(RemSUData.rem_su_1personne)); + when(execution.getVariable(VARNAME_REM_INTERROGATION, JsonNode.class)).thenReturn(ProtoolsTestUtils.asJsonNode(RemSUData.rem_su_1personne)); //Execute again assertDoesNotThrow(() -> sabianePilotageTask.execute(execution)); } @@ -110,7 +110,7 @@ void execute_should_throw_BadContext_when_contextIncorrect(String context_json) DelegateExecution execution = createMockedExecution(); //Variables lenient().when(execution.getVariable(VARNAME_CURRENT_PARTITION_ID, Long.class)).thenReturn(CtxExamples.ctx_partition1); - lenient().when(execution.getVariable(VARNAME_REM_SURVEY_UNIT, JsonNode.class)).thenReturn(ProtoolsTestUtils.asJsonNode(RemSUData.rem_su_1personne)); + lenient().when(execution.getVariable(VARNAME_REM_INTERROGATION, JsonNode.class)).thenReturn(ProtoolsTestUtils.asJsonNode(RemSUData.rem_su_1personne)); //Ctx ProtoolsTestUtils.initContexteMockFromString(protoolsContext, context_json); @@ -128,7 +128,7 @@ void execute_should_work_when_ctx_1part_logement(String inputCtx, String inputRe lenient().when(execution.getProcessInstanceId()).thenReturn(dumyId); lenient().when(execution.getVariable(VARNAME_CURRENT_PARTITION_ID, Long.class)).thenReturn(CtxExamples.ctx_partition1); JsonNode remSU = ProtoolsTestUtils.asJsonNode(inputRemSU); - lenient().when(execution.getVariable(VARNAME_REM_SURVEY_UNIT, JsonNode.class)).thenReturn(remSU); + lenient().when(execution.getVariable(VARNAME_REM_INTERROGATION, JsonNode.class)).thenReturn(remSU); //Ctx JsonNode ctxNode = initContexteMockWithString(inputCtx); From aff43b8343419b88d98d7ed533a7949fbe66a0b9 Mon Sep 17 00:00:00 2001 From: SNDIL - Marc Date: Wed, 14 Aug 2024 16:42:23 +0200 Subject: [PATCH 47/75] =?UTF-8?q?dev=20en=20cours=20sur=20les=20lectures?= =?UTF-8?q?=20REM=20pagin=C3=A9es?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../httpclients/pagination/PageResponse.java | 28 +++--- .../FlowableVariableNameConstants.java | 1 + .../platine_sabiane/QuestionnaireHelper.java | 8 +- .../QuestionnairePlatineSabianeService.java | 62 ++++++------ ...PlatinePilotageCreateContextTaskREST.java} | 12 +-- ...ineQuestionnaireCreateContextTaskREST.java | 36 +++++++ .../pilotage/PlatinePilotageService.java | 50 +++++----- .../PlatineQuestionnaireService.java | 9 +- .../backend/service/rem/RemService.java | 50 ++++++---- .../rem/delegate/v2/PaginationHelper.java | 82 ++++++++++++++++ ...artitionListOfInterroDefaultPaginated.java | 41 ++++++++ ...etPartitionListOfInterroPaginatedTask.java | 43 ++++++++ ...InterroWithoutWebAccountPaginatedTask.java | 43 ++++++++ .../RemGetPartitionListOfSUPaginatedTask.java | 97 ------------------- .../SabianeQuestionnaireService.java | 8 +- src/main/resources/application-dev.properties | 6 +- ...ineQuestionnaireCreateContextTaskTest.java | 15 +-- ...aneQuestionnaireCreateContextTaskTest.java | 15 +-- 18 files changed, 381 insertions(+), 225 deletions(-) rename src/main/java/fr/insee/protools/backend/service/platine/delegate/v2/{PlatinePilotageCreateContextTaskv2.java => PlatinePilotageCreateContextTaskREST.java} (73%) create mode 100644 src/main/java/fr/insee/protools/backend/service/platine/delegate/v2/PlatineQuestionnaireCreateContextTaskREST.java create mode 100644 src/main/java/fr/insee/protools/backend/service/rem/delegate/v2/PaginationHelper.java create mode 100644 src/main/java/fr/insee/protools/backend/service/rem/delegate/v2/RemGetPartitionListOfInterroDefaultPaginated.java create mode 100644 src/main/java/fr/insee/protools/backend/service/rem/delegate/v2/RemGetPartitionListOfInterroPaginatedTask.java create mode 100644 src/main/java/fr/insee/protools/backend/service/rem/delegate/v2/RemGetPartitionListOfInterroWithoutWebAccountPaginatedTask.java delete mode 100644 src/main/java/fr/insee/protools/backend/service/rem/delegate/v2/RemGetPartitionListOfSUPaginatedTask.java diff --git a/src/main/java/fr/insee/protools/backend/httpclients/pagination/PageResponse.java b/src/main/java/fr/insee/protools/backend/httpclients/pagination/PageResponse.java index 850e749d..ed2e9508 100644 --- a/src/main/java/fr/insee/protools/backend/httpclients/pagination/PageResponse.java +++ b/src/main/java/fr/insee/protools/backend/httpclients/pagination/PageResponse.java @@ -12,15 +12,19 @@ @AllArgsConstructor @ToString @JsonIgnoreProperties(ignoreUnknown=true) -public class PageResponse { - private int totalElements; - private int totalPages; - private int size; - @ToString.Exclude - private List content; - private long number; - private int numberOfElements; - private boolean first; - private boolean last; - private boolean empty; -} \ No newline at end of file +public class PageResponse { + private List content = new ArrayList<>(); + private Integer currentPage; + private Integer pageSize; + private Long totalElements; + private Integer pageCount; + + public Boolean isLastPage(){ + if(currentPage==null || pageCount==null){ + return true; + } + else return (currentPage>=pageCount); + } + +} + diff --git a/src/main/java/fr/insee/protools/backend/service/FlowableVariableNameConstants.java b/src/main/java/fr/insee/protools/backend/service/FlowableVariableNameConstants.java index eaf7a2b0..0d38c9fb 100644 --- a/src/main/java/fr/insee/protools/backend/service/FlowableVariableNameConstants.java +++ b/src/main/java/fr/insee/protools/backend/service/FlowableVariableNameConstants.java @@ -24,6 +24,7 @@ public class FlowableVariableNameConstants { public static final String VARNAME_REM_INTERRO_LIST_PAGEABLE_IS_LAST_PAGE ="rem_su_list_page_is_last"; public static final String VARNAME_REM_INTERRO_LIST_PAGEABLE_CURRENT_PAGE ="rem_interro_list_page_current"; + public static final String VARNAME_REM_PROTOOLS_INTERRO_LIST = "rem_protools_interrogation_list"; //Sugoi ID/PWD public static final String VARNAME_DIRECTORYACCESS_ID_CONTACT ="directory_access_id_contact"; diff --git a/src/main/java/fr/insee/protools/backend/service/common/platine_sabiane/QuestionnaireHelper.java b/src/main/java/fr/insee/protools/backend/service/common/platine_sabiane/QuestionnaireHelper.java index 7c36039a..ff165195 100644 --- a/src/main/java/fr/insee/protools/backend/service/common/platine_sabiane/QuestionnaireHelper.java +++ b/src/main/java/fr/insee/protools/backend/service/common/platine_sabiane/QuestionnaireHelper.java @@ -61,13 +61,7 @@ public static void createQuestionnaire(JsonNode contextRootNode, //Get the list of Questionnaire Models defined in Protools Context Set questionnaireModelIds = initQuestionnaireModels(questionnairePlatineSabianeService, questionnaireModelService, processInstanceId, contextRootNode); - CampaignDto campaignDto = CampaignDto.builder() - .id(contextRootNode.path(CTX_CAMPAGNE_ID).textValue()) - .label(contextRootNode.path(CTX_CAMPAGNE_LABEL).textValue()) - .metadata(metadataDto) - .questionnaireIds(questionnaireModelIds) - .build(); - questionnairePlatineSabianeService.postCampaign(campaignDto); + questionnairePlatineSabianeService.postContext(contextRootNode.path(CTX_CAMPAGNE_ID).textValue(),contextRootNode); } static void initRequiredNomenclatures(QuestionnairePlatineSabianeService questionnairePlatineSabianeService, NomenclatureService nomenclatureService, String processInstanceId, Iterator nomenclatureIterator) { diff --git a/src/main/java/fr/insee/protools/backend/service/common/platine_sabiane/QuestionnairePlatineSabianeService.java b/src/main/java/fr/insee/protools/backend/service/common/platine_sabiane/QuestionnairePlatineSabianeService.java index 07ff218f..51f28b5a 100644 --- a/src/main/java/fr/insee/protools/backend/service/common/platine_sabiane/QuestionnairePlatineSabianeService.java +++ b/src/main/java/fr/insee/protools/backend/service/common/platine_sabiane/QuestionnairePlatineSabianeService.java @@ -11,6 +11,7 @@ import fr.insee.protools.backend.httpclients.exception.runtime.HttpClientNullReturnBPMNError; import org.slf4j.event.Level; import org.springframework.http.HttpStatus; +import org.springframework.web.client.RestClient; import org.springframework.web.reactive.function.client.WebClient; import java.util.HashSet; @@ -18,23 +19,24 @@ import java.util.Set; import java.util.stream.Collectors; +import static fr.insee.protools.backend.httpclients.configuration.ApiConfigProperties.KNOWN_API.KNOWN_API_PLATINE_PILOTAGE; + public interface QuestionnairePlatineSabianeService { //Internal methods - WebClient webClient(); + RestClient restClient(); org.slf4j.Logger getLogger(); /** Create a new nomenclature **/ default void postNomenclature(String nomenclatureId, String nomenclatureLabel , JsonNode nomenclatureValue) { NomenclatureDto dto = new NomenclatureDto(nomenclatureId,nomenclatureLabel,nomenclatureValue); NomenclatureDto response = - webClient() + restClient() .post() .uri("/api/nomenclature") - .bodyValue(dto) + .body(dto) .retrieve() - .bodyToMono(NomenclatureDto.class) - .block(); + .body(NomenclatureDto.class); getLogger().info("postNomenclature: nomenclatureId={} - response={}",nomenclatureId,response); //TODO: gestion des erreurs (ex: 403...) } @@ -45,13 +47,12 @@ default void postQuestionnaireModel(String questionnaireId, String questionnaire new QuestionnaireModelCreateDto(questionnaireId,questionnaireLabel,questionnaireValue,requiredNomenclatures); QuestionnaireModelCreateDto response = - webClient() + restClient() .post() .uri("/api/questionnaire-models") - .bodyValue(dto) + .body(dto) .retrieve() - .bodyToMono(QuestionnaireModelCreateDto.class) - .block(); + .body(QuestionnaireModelCreateDto.class); getLogger().info("postQuestionnaireModel: questionnaireId={} - response={}",questionnaireId,response); //TODO: gestion des erreurs (ex: 403...) @@ -59,12 +60,11 @@ default void postQuestionnaireModel(String questionnaireId, String questionnaire /** Get the list of existing nomenclatures */ default Set getNomenclaturesId() { - List response = webClient() + List response = restClient() .get() .uri("/api/nomenclatures") .retrieve() - .bodyToMono(List.class) - .block(); + .body(List.class); getLogger().info("getNomenclaturesId: response= {}",response); return (response==null)?new HashSet<>():response.stream().collect(Collectors.toSet()); } @@ -74,12 +74,12 @@ default boolean questionnaireModelExists(String idQuestionnaireModel) { getLogger().info("questionnaireModelExists: idQuestionnaireModel={} ",idQuestionnaireModel); boolean modelExists = false; try{ - var response = webClient() + var response = restClient() .get() .uri(uriBuilder -> uriBuilder .path("/api/questionnaire/{id}") .build(idQuestionnaireModel)) - .retrieve().toBodilessEntity().block(); + .retrieve().toBodilessEntity(); if(response==null) { throw new HttpClientNullReturnBPMNError("Error while checking if questionnaireModel exists - null result"); } @@ -113,35 +113,33 @@ else if(response.getStatusCode().is4xxClientError()){ } /** Create the campaign **/ - default void postCampaign(CampaignDto campaignDto) { - WebClientHelper.logJson("postCampaign: ", campaignDto,getLogger(), Level.DEBUG); + default void postContext(String campaignId,JsonNode contextRootNode) { + getLogger().trace("postContext: campaignId={}",campaignId); //Http Status Codes : https://github.com/InseeFr/Queen-Back-Office/blob/3.5.36-rc/src/main/java/fr/insee/queen/api/controller/CampaignController.java // HttpStatus.BAD_REQUEST(400) if campaign already exists // HttpStatus.FORBIDDEN (403) if the questionnaire does not exist or is already associated (Request to change it to 409) // WARNING : 403 will also be returned if user does not have an authorized role try { - var response = webClient() + var response = restClient() .post() - .uri("/api/campaigns") - .bodyValue(campaignDto) + .uri("/context") + .body(contextRootNode) .retrieve() - .bodyToMono(String.class) - .block(); - getLogger().info("postCampaign: idCampaign={} - response={} ", campaignDto.getId(), response); + .body(String.class); + getLogger().info("postContext: idCampaign={} - response={} ", campaignId, response); } catch (HttpClient4xxBPMNError e){ if(e.getHttpStatusCodeError().equals(HttpStatus.FORBIDDEN)){ String msg= - "Error 403/FORBIDEN during Questionnaire postCampaign." + "Error 403/FORBIDEN during Questionnaire postContext." + " It can be caused by a missing permission or if a questionnaire model" - + " "+campaignDto.getQuestionnaireIds() +" is already assigned to another campaign." + " msg="+e.getMessage(); getLogger().error(msg); throw new HttpClient4xxBPMNError(msg,e.getHttpStatusCodeError()); } else if(e.getHttpStatusCodeError().equals(HttpStatus.BAD_REQUEST)){ - String msg="Error 400/BAD_REQUEST during Questionnaire postCampaign." + String msg="Error 400/BAD_REQUEST during Questionnaire postContext." + " One possible cause is that the campaign already exists " + " msg="+e.getMessage(); getLogger().error(msg); @@ -156,15 +154,14 @@ else if(e.getHttpStatusCodeError().equals(HttpStatus.BAD_REQUEST)){ default void postSurveyUnit(SurveyUnitResponseDto suDto, String idCampaign) { WebClientHelper.logJson("postSurveyUnit: idCampaign="+idCampaign, suDto,getLogger(),Level.DEBUG); try { - var response = webClient() + var response = restClient() .post() .uri(uriBuilder -> uriBuilder .path("/api/campaign/{id}/survey-unit") .build(idCampaign)) - .bodyValue(suDto) + .body(suDto) .retrieve() - .bodyToMono(String.class) - .block(); + .body(String.class); getLogger().info("postSurveyUnit: idCampaign={} - idSu={} - response={} ", idCampaign,suDto.getId(), response); } catch (HttpClient4xxBPMNError e){ @@ -183,15 +180,14 @@ default void postSurveyUnit(SurveyUnitResponseDto suDto, String idCampaign) { default void postSurveyUnits(String idCampaign, List interrogations) { WebClientHelper.logJson("postSurveyUnits: idCampaign=" + idCampaign, interrogations, getLogger(), Level.DEBUG); try { - var response = webClient() + var response = restClient() .post() .uri(uriBuilder -> uriBuilder .path("/api/campaign/{id}/survey-unit") .build(idCampaign)) - .bodyValue(interrogations) + .body(interrogations) .retrieve() - .bodyToMono(String.class) - .block(); + .body(String.class); getLogger().info("postSurveyUnits: idCampaign={} - response={} ", idCampaign, response); } catch (HttpClient4xxBPMNError e) { if (e.getHttpStatusCodeError().equals(HttpStatus.BAD_REQUEST)) { diff --git a/src/main/java/fr/insee/protools/backend/service/platine/delegate/v2/PlatinePilotageCreateContextTaskv2.java b/src/main/java/fr/insee/protools/backend/service/platine/delegate/v2/PlatinePilotageCreateContextTaskREST.java similarity index 73% rename from src/main/java/fr/insee/protools/backend/service/platine/delegate/v2/PlatinePilotageCreateContextTaskv2.java rename to src/main/java/fr/insee/protools/backend/service/platine/delegate/v2/PlatinePilotageCreateContextTaskREST.java index 6bf49dea..1f9d08ff 100644 --- a/src/main/java/fr/insee/protools/backend/service/platine/delegate/v2/PlatinePilotageCreateContextTaskv2.java +++ b/src/main/java/fr/insee/protools/backend/service/platine/delegate/v2/PlatinePilotageCreateContextTaskREST.java @@ -4,24 +4,18 @@ import fr.insee.protools.backend.service.DelegateContextVerifier; import fr.insee.protools.backend.service.context.ContextService; import fr.insee.protools.backend.service.platine.pilotage.PlatinePilotageService; -import fr.insee.protools.backend.service.platine.pilotage.metadata.*; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.EnumUtils; import org.flowable.engine.delegate.DelegateExecution; import org.flowable.engine.delegate.JavaDelegate; import org.springframework.stereotype.Component; -import java.util.Arrays; -import java.util.HashSet; -import java.util.Set; - import static fr.insee.protools.backend.service.context.ContextConstants.*; -import static fr.insee.protools.backend.service.platine.utils.PlatineHelper.computePilotagePartitionID; @Slf4j @RequiredArgsConstructor -public class PlatinePilotageCreateContextTaskv2 implements JavaDelegate, DelegateContextVerifier { +@Component +public class PlatinePilotageCreateContextTaskREST implements JavaDelegate, DelegateContextVerifier { private final ContextService protoolsContext; private final PlatinePilotageService platinePilotageService; @@ -33,7 +27,7 @@ public void execute(DelegateExecution execution) { String campainId = contextRootNode.path(CTX_CAMPAGNE_ID).asText(); checkContextOrThrow(log,execution.getProcessInstanceId(), contextRootNode); - platinePilotageService.postCreateCampaign(campainId,contextRootNode); + platinePilotageService.postContext(campainId,contextRootNode); log.info("ProcessInstanceId={} end",execution.getProcessInstanceId()); diff --git a/src/main/java/fr/insee/protools/backend/service/platine/delegate/v2/PlatineQuestionnaireCreateContextTaskREST.java b/src/main/java/fr/insee/protools/backend/service/platine/delegate/v2/PlatineQuestionnaireCreateContextTaskREST.java new file mode 100644 index 00000000..771b8273 --- /dev/null +++ b/src/main/java/fr/insee/protools/backend/service/platine/delegate/v2/PlatineQuestionnaireCreateContextTaskREST.java @@ -0,0 +1,36 @@ +package fr.insee.protools.backend.service.platine.delegate.v2; + +import com.fasterxml.jackson.databind.JsonNode; +import fr.insee.protools.backend.service.DelegateContextVerifier; +import fr.insee.protools.backend.service.context.ContextService; +import fr.insee.protools.backend.service.platine.pilotage.PlatinePilotageService; +import fr.insee.protools.backend.service.platine.questionnaire.PlatineQuestionnaireService; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.JavaDelegate; +import org.springframework.stereotype.Component; + +import static fr.insee.protools.backend.service.context.ContextConstants.CTX_CAMPAGNE_ID; + +@Slf4j +@RequiredArgsConstructor +@Component +public class PlatineQuestionnaireCreateContextTaskREST implements JavaDelegate, DelegateContextVerifier { + + private final ContextService protoolsContext; + private final PlatineQuestionnaireService platineQuestionnaireService; + + @Override + public void execute(DelegateExecution execution) { + log.info("ProcessInstanceId={} begin",execution.getProcessInstanceId()); + JsonNode contextRootNode = protoolsContext.getContextByProcessInstance(execution.getProcessInstanceId()); + String campainId = contextRootNode.path(CTX_CAMPAGNE_ID).asText(); + + checkContextOrThrow(log,execution.getProcessInstanceId(), contextRootNode); + platineQuestionnaireService.postContext(campainId,contextRootNode); + + log.info("ProcessInstanceId={} end",execution.getProcessInstanceId()); + + } +} \ No newline at end of file diff --git a/src/main/java/fr/insee/protools/backend/service/platine/pilotage/PlatinePilotageService.java b/src/main/java/fr/insee/protools/backend/service/platine/pilotage/PlatinePilotageService.java index 16466e70..8d7accfe 100644 --- a/src/main/java/fr/insee/protools/backend/service/platine/pilotage/PlatinePilotageService.java +++ b/src/main/java/fr/insee/protools/backend/service/platine/pilotage/PlatinePilotageService.java @@ -4,12 +4,14 @@ import fr.insee.protools.backend.dto.platine.pilotage.PlatinePilotageEligibleDto; import fr.insee.protools.backend.dto.platine.pilotage.contact.PlatineContactDto; import fr.insee.protools.backend.dto.platine.pilotage.query.QuestioningWebclientDto; +import fr.insee.protools.backend.httpclients.restclient.RestClientHelper; import fr.insee.protools.backend.service.platine.pilotage.metadata.MetadataDto; import fr.insee.protools.backend.httpclients.webclient.WebClientHelper; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.slf4j.event.Level; import org.springframework.stereotype.Service; +import org.springframework.web.client.RestClient; import java.util.List; @@ -21,38 +23,36 @@ @RequiredArgsConstructor public class PlatinePilotageService { - private final WebClientHelper webClientHelper; + private final RestClientHelper restClientHelper; public void putMetadata(String partitionId , MetadataDto dto) { log.debug("putMetadata : partitionId={} - dto.su.id={} ",partitionId,dto.getSurveyDto().getId()); logJson(String.format("putMetadata - partitionId=%s : ",partitionId),dto, log,Level.DEBUG); - var response = webClientHelper.getWebClient(KNOWN_API_PLATINE_PILOTAGE) + var response = restClientHelper.getRestClient(KNOWN_API_PLATINE_PILOTAGE) .put() .uri(uriBuilder -> uriBuilder .path("/api/metadata/{id}") .build(partitionId)) - .bodyValue(dto) + .body(dto) .retrieve() - .bodyToMono(String.class) - .block(); + .body(String.class); log.trace("putMetadata : partitionId={} - response={} ",partitionId,response); } public void putQuestionings(QuestioningWebclientDto dto) { log.debug("putQuestionings: idPartitioning={} - idSu={}",dto.getIdPartitioning(),dto.getSurveyUnit().getIdSu()); logJson("putMetadata ",dto,log,Level.TRACE); - var response = webClientHelper.getWebClient(KNOWN_API_PLATINE_PILOTAGE) + var response = restClientHelper.getRestClient(KNOWN_API_PLATINE_PILOTAGE) .put() .uri("/api/questionings") - .bodyValue(dto) + .body(dto) .retrieve() - .bodyToMono(String.class) - .block(); + .body(String.class); log.trace("putQuestionings - response={} ",response); } public PlatineContactDto getSUMainContact(Long idSU, String platinePartitionId){ log.debug("getSUMainContact: platinePartitionId={} - idSu={}",platinePartitionId,idSU); - PlatineContactDto response = webClientHelper.getWebClient(KNOWN_API_PLATINE_PILOTAGE) + PlatineContactDto response = restClientHelper.getRestClient(KNOWN_API_PLATINE_PILOTAGE) .get() .uri(uriBuilder -> uriBuilder .path("/api/main-contact") @@ -60,22 +60,20 @@ public PlatineContactDto getSUMainContact(Long idSU, String platinePartitionId){ .queryParam("survey-unit", idSU) .build()) .retrieve() - .bodyToMono(PlatineContactDto.class) - .block(); + .body(PlatineContactDto.class); logJson("getSUMainContact response : ",response,log,Level.TRACE); return response; } public Boolean isToFollowUp(Long idSU, String platinePartitionId){ log.debug("isToFollowUp: platinePartitionId={} - idSu={}",platinePartitionId,idSU); - PlatinePilotageEligibleDto response = webClientHelper.getWebClient(KNOWN_API_PLATINE_PILOTAGE) + PlatinePilotageEligibleDto response = restClientHelper.getRestClient(KNOWN_API_PLATINE_PILOTAGE) .get() .uri(uriBuilder -> uriBuilder .path("/api/partitionings/{idPartitioning}/survey-units/{idSu}/follow-up") .build(platinePartitionId,idSU)) .retrieve() - .bodyToMono(PlatinePilotageEligibleDto.class) - .block(); + .body(PlatinePilotageEligibleDto.class); Boolean result = Boolean.valueOf(response.getEligible()); logJson("isToFollowUp: result="+result+" - response : ",response,log,Level.TRACE); return result; @@ -85,25 +83,23 @@ public Boolean isToFollowUp(Long idSU, String platinePartitionId){ public void putQuestionings(String campaignId, List interrogations) { log.trace("putQuestionings: campaignId={}",campaignId); logJson("putMetadata ",interrogations,log,Level.TRACE); - var response = webClientHelper.getWebClient(KNOWN_API_PLATINE_PILOTAGE) + var response = restClientHelper.getRestClient(KNOWN_API_PLATINE_PILOTAGE) .put() .uri("/api/questionings") - .bodyValue(interrogations) + .body(interrogations) .retrieve() - .bodyToMono(String.class) - .block(); + .body(String.class); log.trace("putQuestionings: campaignId={} - response={} ",campaignId,response); } - public void postCreateCampaign(String campaignId,JsonNode contextRootNode) { - log.trace("postCreateCampaign: campaignId={}",campaignId); - var response = webClientHelper.getWebClient(KNOWN_API_PLATINE_PILOTAGE) + public void postContext(String campaignId,JsonNode contextRootNode) { + log.trace("postContext: campaignId={}",campaignId); + var response = restClientHelper.getRestClient(KNOWN_API_PLATINE_PILOTAGE) .post() - .uri("/api/campaign") - .bodyValue(contextRootNode) + .uri("/context") + .body(contextRootNode) .retrieve() - .bodyToMono(String.class) - .block(); - log.trace("postCreateCampaign: campaignId={} - response={} ",campaignId,response); + .body(String.class); + log.trace("postContext: campaignId={} - response={} ",campaignId,response); } } diff --git a/src/main/java/fr/insee/protools/backend/service/platine/questionnaire/PlatineQuestionnaireService.java b/src/main/java/fr/insee/protools/backend/service/platine/questionnaire/PlatineQuestionnaireService.java index 5e3f2f34..688cd48d 100644 --- a/src/main/java/fr/insee/protools/backend/service/platine/questionnaire/PlatineQuestionnaireService.java +++ b/src/main/java/fr/insee/protools/backend/service/platine/questionnaire/PlatineQuestionnaireService.java @@ -1,12 +1,13 @@ package fr.insee.protools.backend.service.platine.questionnaire; +import fr.insee.protools.backend.httpclients.restclient.RestClientHelper; import fr.insee.protools.backend.service.common.platine_sabiane.QuestionnairePlatineSabianeService; import fr.insee.protools.backend.httpclients.webclient.WebClientHelper; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.slf4j.Logger; import org.springframework.stereotype.Service; -import org.springframework.web.reactive.function.client.WebClient; +import org.springframework.web.client.RestClient; import static fr.insee.protools.backend.httpclients.configuration.ApiConfigProperties.KNOWN_API.KNOWN_API_PLATINE_QUESTIONNAIRE; @@ -15,11 +16,11 @@ @RequiredArgsConstructor public class PlatineQuestionnaireService implements QuestionnairePlatineSabianeService { - private final WebClientHelper webClientHelper; + private final RestClientHelper restClientHelper; @Override - public WebClient webClient() { - return webClientHelper.getWebClient(KNOWN_API_PLATINE_QUESTIONNAIRE); + public RestClient restClient() { + return restClientHelper.getRestClient(KNOWN_API_PLATINE_QUESTIONNAIRE); } @Override diff --git a/src/main/java/fr/insee/protools/backend/service/rem/RemService.java b/src/main/java/fr/insee/protools/backend/service/rem/RemService.java index 7f513acc..800d940f 100644 --- a/src/main/java/fr/insee/protools/backend/service/rem/RemService.java +++ b/src/main/java/fr/insee/protools/backend/service/rem/RemService.java @@ -26,8 +26,8 @@ public class RemService { private final RestClientHelper restClientHelper; - @Value("${fr.insee.protools.api.rem.su.page.size:5000}") - private int pageSizeGetSU; + @Value("${fr.insee.protools.api.rem.interrogation.page.size:5000}") + private int pageSizeGetInterro; public Long[] getSampleSuIds(Long partitionId) { log.debug("getSampleSuIds - partitionId={} ",partitionId); @@ -118,23 +118,37 @@ public SuIdMappingJson writeERASUList(long partitionId, List valu } - public PageResponse getPartitionAllSuPaginated(Long partitionId, long page) { - log.debug("partitionId={} - page={} - pageSizeGetSU={}",partitionId,page,pageSizeGetSU); - ParameterizedTypeReference> typeReference = new ParameterizedTypeReference<>() { - }; + public PageResponse getPartitionAllInterroPaginated(Long partitionId, long page, Boolean hasAccount) { + log.debug("partitionId={} - page={} - pageSizeGetInterro={} - hasAccount={}",partitionId,page,pageSizeGetInterro,hasAccount); + ParameterizedTypeReference> typeReference = new ParameterizedTypeReference<>() { }; try { - - PageResponse response = restClientHelper.getRestClient(KNOWN_API_REM) - .get() - .uri(uriBuilder -> uriBuilder - .path("survey-units/partitions/paginated/{partitionId}") - .queryParam("page", page) - .queryParam("size", pageSizeGetSU) - .queryParam("withExternals", true) - .build(partitionId)) - .retrieve() - .body(typeReference) ; - log.trace("partitionId={} - page={} - pageSizeGetSU={} - response={} ", partitionId,page,pageSizeGetSU, response.getContent().size()); + PageResponse response; + if(hasAccount!=null) { + response = restClientHelper.getRestClient(KNOWN_API_REM) + .get() + .uri(uriBuilder -> uriBuilder + .path("interrogations/ids") + .queryParam("page", page) + .queryParam("size", pageSizeGetInterro) + .queryParam("partition_id", partitionId) + .queryParam("hasAccount", false) + .build(partitionId)) + .retrieve() + .body(typeReference); + } + else { + response = restClientHelper.getRestClient(KNOWN_API_REM) + .get() + .uri(uriBuilder -> uriBuilder + .path("interrogations/ids") + .queryParam("page", page) + .queryParam("size", pageSizeGetInterro) + .queryParam("partition_id", partitionId) + .build(partitionId)) + .retrieve() + .body(typeReference); + } + log.trace("partitionId={} - page={} - pageSizeGetInterro={} - response={} ", partitionId,page,pageSizeGetInterro, response.getContent().size()); return response; } catch (HttpClient4xxBPMNError e){ diff --git a/src/main/java/fr/insee/protools/backend/service/rem/delegate/v2/PaginationHelper.java b/src/main/java/fr/insee/protools/backend/service/rem/delegate/v2/PaginationHelper.java new file mode 100644 index 00000000..a54f41ef --- /dev/null +++ b/src/main/java/fr/insee/protools/backend/service/rem/delegate/v2/PaginationHelper.java @@ -0,0 +1,82 @@ +package fr.insee.protools.backend.service.rem.delegate.v2; + +import com.fasterxml.jackson.databind.JsonNode; +import fr.insee.protools.backend.httpclients.pagination.PageResponse; +import fr.insee.protools.backend.service.exception.PageableAPIBPMNError; +import fr.insee.protools.backend.service.utils.FlowableVariableUtils; +import org.flowable.engine.delegate.DelegateExecution; + +import java.util.List; +import java.util.Map; + + +public interface PaginationHelper { + + org.slf4j.Logger getLogger(); + + /** + * Custom Treatment for the page + * + * @return a Map with variables to update on the process instance (so we can make a single setVariablesLocal in getAndTreat) + */ + Map treatPage(DelegateExecution execution, List contentList); + + /** + * Default way to read elements with a paginated API. + * getAndTreat It will read a page using IGetFromService. + * For this page it will call treatPage + * variables in the map returned by treatPage() will be added to the local variables of the execution + * It will update the varname_is_last_page and varname_current_page variables + * + * @param execution + * @param varname_current_page + * @param varname_is_last_page + * @param getService a functional interface to be used for the read + * @param getServiceParams the parameters for the functional interface call + */ + default void getAndTreat(DelegateExecution execution, String varname_current_page, String varname_is_last_page, IGetFromService getService, Object... getServiceParams) { + getLogger().info("ProcessInstanceId={} begin", execution.getProcessInstanceId()); + + Integer currentPage = FlowableVariableUtils.getVariableOrNull(execution, varname_current_page, Integer.class); + Boolean isLastPage = FlowableVariableUtils.getVariableOrNull(execution, varname_is_last_page, Boolean.class); + + Integer expectedPage; + if (currentPage == null) { + expectedPage = 0; + } else { + expectedPage = currentPage + 1; + } + + if (isLastPage == null) { + isLastPage = Boolean.FALSE; + } + + if (Boolean.TRUE.equals(isLastPage)) { + getLogger().warn("ProcessInstanceId={} : last page already reached", execution.getProcessInstanceId()); + } else { + + PageResponse pageResponse = getService.apply(expectedPage, getServiceParams); + + //Verify that we got the correct page with not null content + if (pageResponse.getCurrentPage() != expectedPage) { + throw new PageableAPIBPMNError(String.format("Error while reading interrogations from REM - expected page=%s got page=%s", expectedPage, pageResponse.getCurrentPage())); + } else if (pageResponse.getContent() == null) { + throw new PageableAPIBPMNError("Error while reading interrogations from REM - content is null"); + } + + //Treat the response + Map variables = treatPage(execution, pageResponse.getContent()); + + //Add pagination details to the variables we are going to insert + variables.put(varname_current_page, expectedPage); + variables.put(varname_is_last_page, pageResponse.isLastPage()); + execution.getParent().setVariablesLocal(variables); + getLogger().debug("ProcessInstanceId={} - readSize={} end", execution.getProcessInstanceId(), pageResponse.getContent().size()); + } + } + + @FunctionalInterface + interface IGetFromService { + PageResponse apply(Integer pageToRead, Object... params); + } +} diff --git a/src/main/java/fr/insee/protools/backend/service/rem/delegate/v2/RemGetPartitionListOfInterroDefaultPaginated.java b/src/main/java/fr/insee/protools/backend/service/rem/delegate/v2/RemGetPartitionListOfInterroDefaultPaginated.java new file mode 100644 index 00000000..ffdda0ef --- /dev/null +++ b/src/main/java/fr/insee/protools/backend/service/rem/delegate/v2/RemGetPartitionListOfInterroDefaultPaginated.java @@ -0,0 +1,41 @@ +package fr.insee.protools.backend.service.rem.delegate.v2; + +import com.fasterxml.jackson.databind.JsonNode; +import fr.insee.protools.backend.dto.internal.ProtoolsInterrogationDto; +import fr.insee.protools.backend.httpclients.pagination.PageResponse; +import fr.insee.protools.backend.service.DelegateContextVerifier; +import fr.insee.protools.backend.service.rem.RemService; +import fr.insee.protools.backend.service.utils.FlowableVariableUtils; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.JavaDelegate; +import org.slf4j.Logger; +import org.springframework.stereotype.Component; + +import java.util.List; +import java.util.Map; + +import static fr.insee.protools.backend.service.FlowableVariableNameConstants.*; + +@Slf4j +public abstract class RemGetPartitionListOfInterroDefaultPaginated implements JavaDelegate, DelegateContextVerifier, PaginationHelper { + + @Override + public Map treatPage(DelegateExecution execution, List contentList) { + + String jsonKeyId = "id"; + List protoolsInterrogationDtos = contentList.stream() + //TODO: remove as it should not occurs? + .filter(jsonNode -> { + boolean hasId = jsonNode.has(jsonKeyId) && !jsonNode.get(jsonKeyId).isNull(); + if (!hasId) { + log.warn("Skipping interrogation without id: {}", jsonNode); + } + return hasId; + }).map(jsonNode -> ProtoolsInterrogationDto.builder().idInterrogation(jsonNode.get(jsonKeyId).asText()).remInterrogation(jsonNode).build()).toList(); + + Map variables = Map.of(VARNAME_REM_PROTOOLS_INTERRO_LIST, protoolsInterrogationDtos); + return variables; + } +} \ No newline at end of file diff --git a/src/main/java/fr/insee/protools/backend/service/rem/delegate/v2/RemGetPartitionListOfInterroPaginatedTask.java b/src/main/java/fr/insee/protools/backend/service/rem/delegate/v2/RemGetPartitionListOfInterroPaginatedTask.java new file mode 100644 index 00000000..868afc36 --- /dev/null +++ b/src/main/java/fr/insee/protools/backend/service/rem/delegate/v2/RemGetPartitionListOfInterroPaginatedTask.java @@ -0,0 +1,43 @@ +package fr.insee.protools.backend.service.rem.delegate.v2; + +import com.fasterxml.jackson.databind.JsonNode; +import fr.insee.protools.backend.dto.internal.ProtoolsInterrogationDto; +import fr.insee.protools.backend.httpclients.pagination.PageResponse; +import fr.insee.protools.backend.service.DelegateContextVerifier; +import fr.insee.protools.backend.service.rem.RemService; +import fr.insee.protools.backend.service.utils.FlowableVariableUtils; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.JavaDelegate; +import org.slf4j.Logger; +import org.springframework.stereotype.Component; + +import java.util.List; +import java.util.Map; + +import static fr.insee.protools.backend.service.FlowableVariableNameConstants.*; + +@Slf4j +@Component +@RequiredArgsConstructor +public class RemGetPartitionListOfInterroPaginatedTask extends RemGetPartitionListOfInterroDefaultPaginated { + + RemService remService; + + private PageResponse readFunction(Integer pageToRead, Object... objects) { + Long partitionId = (Long) objects[0]; + return remService.getPartitionAllInterroPaginated(partitionId, pageToRead,null); + } + + @Override + public void execute(DelegateExecution execution) { + Long currentPartitionId = FlowableVariableUtils.getVariableOrThrow(execution, VARNAME_CURRENT_PARTITION_ID, Long.class); + getAndTreat(execution, VARNAME_REM_INTERRO_LIST_PAGEABLE_CURRENT_PAGE, VARNAME_REM_INTERRO_LIST_PAGEABLE_IS_LAST_PAGE, this::readFunction, currentPartitionId); + } + + @Override + public Logger getLogger() { + return log; + } +} \ No newline at end of file diff --git a/src/main/java/fr/insee/protools/backend/service/rem/delegate/v2/RemGetPartitionListOfInterroWithoutWebAccountPaginatedTask.java b/src/main/java/fr/insee/protools/backend/service/rem/delegate/v2/RemGetPartitionListOfInterroWithoutWebAccountPaginatedTask.java new file mode 100644 index 00000000..c682ce18 --- /dev/null +++ b/src/main/java/fr/insee/protools/backend/service/rem/delegate/v2/RemGetPartitionListOfInterroWithoutWebAccountPaginatedTask.java @@ -0,0 +1,43 @@ +package fr.insee.protools.backend.service.rem.delegate.v2; + +import com.fasterxml.jackson.databind.JsonNode; +import fr.insee.protools.backend.dto.internal.ProtoolsInterrogationDto; +import fr.insee.protools.backend.httpclients.pagination.PageResponse; +import fr.insee.protools.backend.service.DelegateContextVerifier; +import fr.insee.protools.backend.service.rem.RemService; +import fr.insee.protools.backend.service.utils.FlowableVariableUtils; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.JavaDelegate; +import org.slf4j.Logger; +import org.springframework.stereotype.Component; + +import java.util.List; +import java.util.Map; + +import static fr.insee.protools.backend.service.FlowableVariableNameConstants.*; + +@Slf4j +@Component +@RequiredArgsConstructor +public class RemGetPartitionListOfInterroWithoutWebAccountPaginatedTask extends RemGetPartitionListOfInterroDefaultPaginated { + + private final RemService remService; + + private PageResponse readFunction(Integer pageToRead, Object... objects) { + Long partitionId = (Long) objects[0]; + return remService.getPartitionAllInterroPaginated(partitionId, pageToRead,null); + } + + @Override + public void execute(DelegateExecution execution) { + Long currentPartitionId = FlowableVariableUtils.getVariableOrThrow(execution, VARNAME_CURRENT_PARTITION_ID, Long.class); + getAndTreat(execution, VARNAME_REM_INTERRO_LIST_PAGEABLE_CURRENT_PAGE, VARNAME_REM_INTERRO_LIST_PAGEABLE_IS_LAST_PAGE, this::readFunction, currentPartitionId); + } + + @Override + public Logger getLogger() { + return log; + } +} \ No newline at end of file diff --git a/src/main/java/fr/insee/protools/backend/service/rem/delegate/v2/RemGetPartitionListOfSUPaginatedTask.java b/src/main/java/fr/insee/protools/backend/service/rem/delegate/v2/RemGetPartitionListOfSUPaginatedTask.java deleted file mode 100644 index 3134c1ca..00000000 --- a/src/main/java/fr/insee/protools/backend/service/rem/delegate/v2/RemGetPartitionListOfSUPaginatedTask.java +++ /dev/null @@ -1,97 +0,0 @@ -package fr.insee.protools.backend.service.rem.delegate.v2; - -import com.fasterxml.jackson.databind.JsonNode; -import fr.insee.protools.backend.dto.internal.ProtoolsInterrogationDto; -import fr.insee.protools.backend.service.DelegateContextVerifier; -import fr.insee.protools.backend.service.exception.PageableAPIBPMNError; -import fr.insee.protools.backend.service.rem.RemService; -import fr.insee.protools.backend.service.utils.FlowableVariableUtils; -import fr.insee.protools.backend.httpclients.pagination.PageResponse; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.flowable.engine.delegate.DelegateExecution; -import org.flowable.engine.delegate.JavaDelegate; -import org.springframework.stereotype.Component; - -import java.util.List; -import java.util.Map; - -import static fr.insee.protools.backend.service.FlowableVariableNameConstants.*; - -@Slf4j -@Component -@RequiredArgsConstructor -public class RemGetPartitionListOfSUPaginatedTask implements JavaDelegate, DelegateContextVerifier { - - private final RemService remService; - - - @Override - public void execute(DelegateExecution execution) { - Long currentPartitionId = FlowableVariableUtils.getVariableOrThrow(execution, VARNAME_CURRENT_PARTITION_ID, Long.class); - log.info("ProcessInstanceId={} - partition={} begin", execution.getProcessInstanceId(), currentPartitionId); - //No need protools context ==> no checkContextOrThrow - - Long currentPage = FlowableVariableUtils.getVariableOrNull(execution, VARNAME_REM_INTERRO_LIST_PAGEABLE_CURRENT_PAGE, Long.class); - Boolean isLastPage = FlowableVariableUtils.getVariableOrNull(execution, VARNAME_REM_INTERRO_LIST_PAGEABLE_IS_LAST_PAGE, Boolean.class); - if (currentPage == null) { - currentPage = 0L; - } - else if(isLastPage == null) { - isLastPage = Boolean.FALSE; - } - else { - currentPage++; - } - - if (Boolean.TRUE.equals(isLastPage)) { - log.warn("ProcessInstanceId={} - partition={} : last page already reached", execution.getProcessInstanceId(), currentPartitionId); - } else { - PageResponse pageResponse = remService.getPartitionAllSuPaginated(currentPartitionId, currentPage); - int nbValRead = treatPage(execution, pageResponse, currentPage, - VARNAME_REM_INTERRO_LIST, VARNAME_REM_INTERRO_LIST_PAGEABLE_CURRENT_PAGE, VARNAME_REM_INTERRO_LIST_PAGEABLE_IS_LAST_PAGE) - .size(); - log.debug("ProcessInstanceId={} - partition={} - nbValRead={} end", execution.getProcessInstanceId(), currentPartitionId, nbValRead); - } - } - - - private static List treatPage(DelegateExecution execution, - PageResponse pageResponse, - Long expectedCurrentPage, - String varname_list, - String varname_current_page, - String varname_is_last_page) { - Boolean isLastPage = pageResponse.isLast(); - long responseCurrentPage = pageResponse.getNumber(); - if (responseCurrentPage != expectedCurrentPage) { - throw new PageableAPIBPMNError(String.format("Error while reading SU from REM- expected page=%s got page=%s", - expectedCurrentPage, responseCurrentPage)); - } - - String jsonKeyId="id"; - - List contentList = pageResponse.getContent(); - List protoolsInterrogationDtos = contentList.stream() - .filter(jsonNode -> { - boolean hasId = jsonNode.has(jsonKeyId) && !jsonNode.get(jsonKeyId).isNull(); - if (!hasId) { - log.warn("Skipping interrogation without id: {}", jsonNode); - } - return hasId; - }) - .map(jsonNode -> ProtoolsInterrogationDto.builder() - .idInterrogation(jsonNode.get(jsonKeyId).asText()) - .remInterrogation(jsonNode) - .build()) - .toList(); - - Map variables = Map.of( - varname_list, protoolsInterrogationDtos, - varname_current_page, expectedCurrentPage, - varname_is_last_page, isLastPage - ); - execution.getParent().setVariablesLocal(variables); - return contentList; - } -} \ No newline at end of file diff --git a/src/main/java/fr/insee/protools/backend/service/sabiane/questionnaire/SabianeQuestionnaireService.java b/src/main/java/fr/insee/protools/backend/service/sabiane/questionnaire/SabianeQuestionnaireService.java index 170553f5..dffb5804 100644 --- a/src/main/java/fr/insee/protools/backend/service/sabiane/questionnaire/SabianeQuestionnaireService.java +++ b/src/main/java/fr/insee/protools/backend/service/sabiane/questionnaire/SabianeQuestionnaireService.java @@ -1,11 +1,13 @@ package fr.insee.protools.backend.service.sabiane.questionnaire; +import fr.insee.protools.backend.httpclients.restclient.RestClientHelper; import fr.insee.protools.backend.service.common.platine_sabiane.QuestionnairePlatineSabianeService; import fr.insee.protools.backend.httpclients.webclient.WebClientHelper; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.slf4j.Logger; import org.springframework.stereotype.Service; +import org.springframework.web.client.RestClient; import org.springframework.web.reactive.function.client.WebClient; import static fr.insee.protools.backend.httpclients.configuration.ApiConfigProperties.KNOWN_API.KNOWN_API_SABIANE_QUESTIONNAIRE; @@ -15,11 +17,11 @@ @Slf4j @RequiredArgsConstructor public class SabianeQuestionnaireService implements QuestionnairePlatineSabianeService { - private final WebClientHelper webClientHelper; + private final RestClientHelper restClientHelper; @Override - public WebClient webClient() { - return webClientHelper.getWebClient(KNOWN_API_SABIANE_QUESTIONNAIRE); + public RestClient restClient() { + return restClientHelper.getRestClient(KNOWN_API_SABIANE_QUESTIONNAIRE); } @Override diff --git a/src/main/resources/application-dev.properties b/src/main/resources/application-dev.properties index 5a2edca4..577827a0 100644 --- a/src/main/resources/application-dev.properties +++ b/src/main/resources/application-dev.properties @@ -34,7 +34,7 @@ fr.insee.protools.token.provider.dmz-questionnaire-particuliers.client-secret= #CONF DES API #platine Pilotage fr.insee.protools.api.platine-pilotage.enabled=true -fr.insee.protools.api.platine-pilotage.url=https://api-pilotage-enquetes.developpement3.insee.fr +fr.insee.protools.api.platine-pilotage.url=https://http-https-echo.dev.kube.insee.fr/ fr.insee.protools.api.platine-pilotage.auth.client-id=${fr.insee.protools.keycloak.client.id} fr.insee.protools.api.platine-pilotage.auth.client-secret=${fr.insee.protools.token.provider.dmz-questionnaire-particuliers.client-secret} fr.insee.protools.api.platine-pilotage.auth.realm=questionnaire-particuliers @@ -42,7 +42,7 @@ fr.insee.protools.api.platine-pilotage.auth.url=${fr.insee.protools.keycloak-dmz #platine questionnaire fr.insee.protools.api.platine-questionnaire.enabled=true -fr.insee.protools.api.platine-questionnaire.url=https://api-questionnaire-enquetes.developpement3.insee.fr +fr.insee.protools.api.platine-questionnaire.url=https://http-https-echo.dev.kube.insee.fr/ fr.insee.protools.api.platine-questionnaire.auth.url=${fr.insee.protools.keycloak-dmz-auth-url} fr.insee.protools.api.platine-questionnaire.auth.realm=questionnaire-particuliers fr.insee.protools.api.platine-questionnaire.auth.client-id=${fr.insee.protools.keycloak.client.id} @@ -74,7 +74,7 @@ fr.insee.protools.api.rem.auth.client-id=${fr.insee.protools.keycloak.client.id} fr.insee.protools.api.rem.auth.client-secret=${fr.insee.protools.token.provider.interne-agents-insee-interne.client-secret} fr.insee.protools.api.rem.auth.realm=agents-insee-interne fr.insee.protools.api.rem.auth.url=${fr.insee.protools.keycloak-interne-auth-url} -fr.insee.protools.api.rem.su.page.size=4 +fr.insee.protools.api.rem.interrogation.page.size=4 #ERA fr.insee.protools.api.era.enabled=true diff --git a/src/test/java/fr/insee/protools/backend/service/platine/delegate/PlatineQuestionnaireCreateContextTaskTest.java b/src/test/java/fr/insee/protools/backend/service/platine/delegate/PlatineQuestionnaireCreateContextTaskTest.java index a0f8ccc9..cfa3242d 100644 --- a/src/test/java/fr/insee/protools/backend/service/platine/delegate/PlatineQuestionnaireCreateContextTaskTest.java +++ b/src/test/java/fr/insee/protools/backend/service/platine/delegate/PlatineQuestionnaireCreateContextTaskTest.java @@ -119,11 +119,14 @@ void execute_should_work_and_make_correct_calls() throws IOException { Set.of("L_DEPNAIS-1-1-0","L_PAYSNAIS-1-1-0","L_NATIONETR-1-1-0")); //Verify postCampaign - ArgumentCaptor acCampaignDto = ArgumentCaptor.forClass(CampaignDto.class); - verify(platineQuestionnaireService,times(1)).postCampaign(acCampaignDto.capture()); - List allValues = acCampaignDto.getAllValues(); - assertEquals(1, allValues.size(),"We should have exactly one campaign"); - MetadataValue expectedMetadataNode = ProtoolsTestUtils.asObject(ressourceFolder + "/expected_post_questionnaire_metadata.json", MetadataValue.class); - assertEquals(expectedMetadataNode,allValues.get(0).getMetadata(),"Erreur with generated Metadata"); + ArgumentCaptor acContext = ArgumentCaptor.forClass(JsonNode.class); + ArgumentCaptor acCampaignId = ArgumentCaptor.forClass(String.class); + verify(platineQuestionnaireService,times(1)).postContext(acCampaignId.capture(),acContext.capture()); + + List allCtxValues = acContext.getAllValues(); + assertEquals(1, allCtxValues.size(),"We should have exactly one campaign"); + + JsonNode expectedCtx = ProtoolsTestUtils.asJsonNode(platine_context_json); + assertEquals(expectedCtx,allCtxValues.get(0),"Error with the passed json context"); } } diff --git a/src/test/java/fr/insee/protools/backend/service/sabiane/delegate/SabianeQuestionnaireCreateContextTaskTest.java b/src/test/java/fr/insee/protools/backend/service/sabiane/delegate/SabianeQuestionnaireCreateContextTaskTest.java index 7774d633..0de791dd 100644 --- a/src/test/java/fr/insee/protools/backend/service/sabiane/delegate/SabianeQuestionnaireCreateContextTaskTest.java +++ b/src/test/java/fr/insee/protools/backend/service/sabiane/delegate/SabianeQuestionnaireCreateContextTaskTest.java @@ -129,11 +129,14 @@ void execute_should_work_and_make_correct_calls() throws IOException { } //Verify postCampaign - ArgumentCaptor acCampaignDto = ArgumentCaptor.forClass(CampaignDto.class); - verify(sabianeQuestionnaireService,times(1)).postCampaign(acCampaignDto.capture()); - List allValues = acCampaignDto.getAllValues(); - assertEquals(1, allValues.size(),"We should have exactly one campaign"); - MetadataValue expectedMetadataNode = ProtoolsTestUtils.asObject(ressourceFolder + "/expected_post_questionnaire_metadata.json", MetadataValue.class); - assertEquals(expectedMetadataNode,allValues.get(0).getMetadata(),"Erreur with generated Metadata"); + ArgumentCaptor acContext = ArgumentCaptor.forClass(JsonNode.class); + ArgumentCaptor acCampaignId = ArgumentCaptor.forClass(String.class); + verify(sabianeQuestionnaireService,times(1)).postContext(acCampaignId.capture(),acContext.capture()); + + List allCtxValues = acContext.getAllValues(); + assertEquals(1, allCtxValues.size(),"We should have exactly one campaign"); + + JsonNode expectedCtx = ProtoolsTestUtils.asJsonNode(sabiane_context_json); + assertEquals(expectedCtx,allCtxValues.get(0),"Error with the passed json context"); } } From 1d0f2bf44747d513b3ca32287134a4eed243fb5f Mon Sep 17 00:00:00 2001 From: SNDIL - Marc Date: Tue, 20 Aug 2024 17:29:00 +0200 Subject: [PATCH 48/75] dev en cours sur les El expressions (timer ; contiditions) --- .../PlatinePilotageCommunicationEventDto.java | 14 ++ .../restclient/RestClientHelper.java | 21 +++ .../FlowableVariableNameConstants.java | 13 +- .../service/context/ContextConstants.java | 4 + .../service/context/ContextServiceImpl.java | 26 ++-- .../resolvers/PartitionCtxResolver.java | 130 ++++++++++++++++-- .../exception/IncoherentBPMNContextError.java | 11 ++ ...ePilotageCreateCommunicationEventREST.java | 51 +++++++ .../pilotage/PlatinePilotageService.java | 16 ++- ...artitionListOfInterroDefaultPaginated.java | 41 ------ ...etPartitionListOfInterroPaginatedTask.java | 8 +- ...InterroWithoutWebAccountPaginatedTask.java | 20 ++- .../backend/service/utils/ContextUtils.java | 47 ++++++- .../service/utils/log/TimeLogUtils.java | 19 +++ src/main/resources/application-dev.properties | 4 +- 15 files changed, 353 insertions(+), 72 deletions(-) create mode 100644 src/main/java/fr/insee/protools/backend/dto/platine/pilotage/v2/PlatinePilotageCommunicationEventDto.java create mode 100644 src/main/java/fr/insee/protools/backend/service/exception/IncoherentBPMNContextError.java create mode 100644 src/main/java/fr/insee/protools/backend/service/platine/delegate/v2/PlatinePilotageCreateCommunicationEventREST.java delete mode 100644 src/main/java/fr/insee/protools/backend/service/rem/delegate/v2/RemGetPartitionListOfInterroDefaultPaginated.java create mode 100644 src/main/java/fr/insee/protools/backend/service/utils/log/TimeLogUtils.java diff --git a/src/main/java/fr/insee/protools/backend/dto/platine/pilotage/v2/PlatinePilotageCommunicationEventDto.java b/src/main/java/fr/insee/protools/backend/dto/platine/pilotage/v2/PlatinePilotageCommunicationEventDto.java new file mode 100644 index 00000000..05d8f86c --- /dev/null +++ b/src/main/java/fr/insee/protools/backend/dto/platine/pilotage/v2/PlatinePilotageCommunicationEventDto.java @@ -0,0 +1,14 @@ +package fr.insee.protools.backend.dto.platine.pilotage.v2; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; + +@Builder +@Data +public class PlatinePilotageCommunicationEventDto { + String interrogationId; + String communicationRequestId; + String communcationId; + String state; +} diff --git a/src/main/java/fr/insee/protools/backend/httpclients/restclient/RestClientHelper.java b/src/main/java/fr/insee/protools/backend/httpclients/restclient/RestClientHelper.java index b81dbb8c..49733c6c 100644 --- a/src/main/java/fr/insee/protools/backend/httpclients/restclient/RestClientHelper.java +++ b/src/main/java/fr/insee/protools/backend/httpclients/restclient/RestClientHelper.java @@ -14,6 +14,8 @@ import fr.insee.protools.backend.httpclients.exception.runtime.HttpClient5xxBPMNError; import io.netty.handler.logging.LogLevel; import lombok.extern.slf4j.Slf4j; +import org.slf4j.Logger; +import org.slf4j.event.Level; import org.springframework.http.HttpRequest; import org.springframework.http.HttpStatus; import org.springframework.http.HttpStatusCode; @@ -174,4 +176,23 @@ private static String analyseToken(String token) { } return result; } + + public static void logJson(String msg, Object dto, Logger logger, Level level) { + if (logger.isEnabledForLevel(level)) { + try { + String json = new ObjectMapper().writeValueAsString(dto); + String logLine = msg +" - " + json; + switch (level) { + case TRACE -> logger.trace(logLine); + case DEBUG -> logger.debug(logLine); + case INFO -> logger.info(logLine); + case WARN -> logger.warn(logLine); + case ERROR -> logger.error(logLine); + default -> logger.trace(logLine); + } + } catch (JsonProcessingException e) { + log.error("Could not parse json"); + } + } + } } diff --git a/src/main/java/fr/insee/protools/backend/service/FlowableVariableNameConstants.java b/src/main/java/fr/insee/protools/backend/service/FlowableVariableNameConstants.java index 0d38c9fb..e0c99ff9 100644 --- a/src/main/java/fr/insee/protools/backend/service/FlowableVariableNameConstants.java +++ b/src/main/java/fr/insee/protools/backend/service/FlowableVariableNameConstants.java @@ -21,7 +21,7 @@ public class FlowableVariableNameConstants { //To pass a list of REM interrogations content (JsonNode) public static final String VARNAME_REM_INTERRO_LIST ="rem_interrogation_list"; //REM PAGEABLE - public static final String VARNAME_REM_INTERRO_LIST_PAGEABLE_IS_LAST_PAGE ="rem_su_list_page_is_last"; + public static final String VARNAME_REM_INTERRO_LIST_PAGEABLE_IS_LAST_PAGE ="rem_interro_list_page_is_last"; public static final String VARNAME_REM_INTERRO_LIST_PAGEABLE_CURRENT_PAGE ="rem_interro_list_page_current"; public static final String VARNAME_REM_PROTOOLS_INTERRO_LIST = "rem_protools_interrogation_list"; @@ -44,5 +44,16 @@ public class FlowableVariableNameConstants { //each row is Tuple public static final String VARNAME_SU_CREATION_ITEM="su_creation_date_item"; + + //For communication + public static final String VARNAME_CURRENT_COMMUNICATION_ID="current_communication_id"; + public static final String VARNAME_COMMUNICATION_REQUEST_ID_FOR_INTERRO_ID_MAP="communication_request_id_by_interrogation_id"; + //List of the UUIDs of the communications that have already been scheduled + public static final String VARNAME_ALREADY_SCHEDULED_COMMUNICATION_ID_SET = "communication_already_scheduled_id_set"; + //List of the UUIDs of the communcation that are in error (echeance was too far past) + public static final String VARNAME_COMMUNICATION_ERROR_ID_SET = "communication_in_error_id_set"; + + + private FlowableVariableNameConstants(){} } diff --git a/src/main/java/fr/insee/protools/backend/service/context/ContextConstants.java b/src/main/java/fr/insee/protools/backend/service/context/ContextConstants.java index ad129b9e..f729c3e0 100644 --- a/src/main/java/fr/insee/protools/backend/service/context/ContextConstants.java +++ b/src/main/java/fr/insee/protools/backend/service/context/ContextConstants.java @@ -93,6 +93,9 @@ public final class ContextConstants { // Partitions Communications public static final String CTX_PARTITION_COMMUNICATIONS = "communications"; + public static final String CTX_PARTITION_COMMUNICATION_ID = "id"; + public static final String CTX_PARTITION_COMMUNICATION_ECHEANCE = "echeance"; + public static final String CTX_PARTITION_COMMUNICATION_MOYEN = "moyenCommunication"; public static final String CTX_PARTITION_COMMUNICATION_PHASE = "phaseCommunication"; public static final String CTX_PARTITION_COMMUNICATION_AVEC_QUESTIONNAIRE_PAPIER = "avecQuestionnairePapier"; @@ -105,6 +108,7 @@ public final class ContextConstants { public static final String CTX_PARTITION_COMMUNICATION_RELANCE_LIBRE_PARAGRAPHE3 = "relanceLibreMailParagraphe3"; public static final String CTX_PARTITION_COMMUNICATION_RELANCE_LIBRE_PARAGRAPHE4 = "relanceLibreMailParagraphe4"; public static final String CTX_PARTITION_COMMUNICATION_COMPLEMENT_CONNEXION = "complementConnexion"; + public static final String CTX_PARTITION_COMMUNICATION_TYPE = "typeCommunication"; diff --git a/src/main/java/fr/insee/protools/backend/service/context/ContextServiceImpl.java b/src/main/java/fr/insee/protools/backend/service/context/ContextServiceImpl.java index 7f3a5a7c..21c020fd 100644 --- a/src/main/java/fr/insee/protools/backend/service/context/ContextServiceImpl.java +++ b/src/main/java/fr/insee/protools/backend/service/context/ContextServiceImpl.java @@ -11,6 +11,7 @@ import fr.insee.protools.backend.service.context.exception.BadContextNotJSONBPMNError; import fr.insee.protools.backend.service.exception.ProcessDefinitionNotFoundException; import fr.insee.protools.backend.service.exception.TaskNotFoundException; +import fr.insee.protools.backend.service.utils.log.TimeLogUtils; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; @@ -36,9 +37,6 @@ import java.io.Serializable; import java.nio.charset.StandardCharsets; import java.time.Instant; -import java.time.LocalDateTime; -import java.time.ZoneId; -import java.time.format.DateTimeFormatter; import java.time.format.DateTimeParseException; import java.util.*; import java.util.concurrent.ConcurrentHashMap; @@ -168,12 +166,12 @@ private Pair, JsonNode> processContextFile(MultipartFile fil throw new BadContextIncorrectBPMNError(msg); } - List partitionIds = new ArrayList<>(); - HashMap> variablesByPartition= new HashMap<>(); + List partitionIds = new ArrayList<>(); + HashMap> variablesByPartition= new HashMap<>(); for (JsonNode partition : partitions) { Pair startEndDT = getCollectionStartAndEndFromPartition(partition); - Long partitionId = partition.path(CTX_PARTITION_ID).asLong(); + String partitionId = partition.path(CTX_PARTITION_ID).asText(); partitionIds.add(partitionId); HashMap partitionVariables = new HashMap<>(); @@ -188,7 +186,7 @@ private Pair, JsonNode> processContextFile(MultipartFile fil return Pair.of(variables, rootContext); } catch (IOException e) { - throw new BadContextIOException("Error while reading context content", e); + throw new BadContextIOException("Error while reading context content: "+e.getMessage(), e); } } @@ -201,21 +199,21 @@ private Optional getFileExtension(String filename) { //TODO : soit les json schema permettent de valider les dates, soit il faudra valider toutes les dates comme ça public static Pair getCollectionStartAndEndFromPartition(JsonNode partitionNode) { String start = partitionNode.get(CTX_PARTITION_DATE_DEBUT_COLLECTE).asText(); - String end = partitionNode.get(CTX_PARTITION_DATE_DEBUT_COLLECTE).asText(); + String end = partitionNode.get(CTX_PARTITION_DATE_FIN_COLLECTE).asText(); if(start==null || end==null){ throw new BadContextIncorrectBPMNError(String.format("%s and %s must be defined on every partition", CTX_PARTITION_DATE_DEBUT_COLLECTE, CTX_PARTITION_DATE_FIN_COLLECTE)); } try { - LocalDateTime collectionStart = LocalDateTime.parse(start, DateTimeFormatter.ISO_DATE_TIME); - LocalDateTime collectionEnd = LocalDateTime.parse(end, DateTimeFormatter.ISO_DATE_TIME); - log.info("partition_id={} - CollectionStartDate={} - CollectionEndDate={}", partitionNode.path(CTX_PARTITION_ID), collectionStart, collectionEnd); - return Pair.of(collectionStart.atZone(ZoneId.systemDefault()).toInstant(), - collectionEnd.atZone(ZoneId.systemDefault()).toInstant()); + Instant collectionStart = Instant.parse(start); + Instant collectionEnd = Instant.parse(end); + log.info("partition_id={} - CollectionStartDate={} - CollectionEndDate={}", partitionNode.path(CTX_PARTITION_ID), TimeLogUtils.format(collectionStart), TimeLogUtils.format(collectionEnd)); + return Pair.of(collectionStart, + collectionEnd); } catch (DateTimeParseException e) { - throw new BadContextIncorrectBPMNError(String.format("%s or %s cannot be casted to DateTime : %s", CTX_PARTITION_DATE_DEBUT_COLLECTE, CTX_PARTITION_DATE_FIN_COLLECTE, e.getMessage())); + throw new BadContextIncorrectBPMNError(String.format("%s or %s cannot be read as Instant : %s", CTX_PARTITION_DATE_DEBUT_COLLECTE, CTX_PARTITION_DATE_FIN_COLLECTE, e.getMessage())); } } diff --git a/src/main/java/fr/insee/protools/backend/service/context/resolvers/PartitionCtxResolver.java b/src/main/java/fr/insee/protools/backend/service/context/resolvers/PartitionCtxResolver.java index 5f3431af..7d009c76 100644 --- a/src/main/java/fr/insee/protools/backend/service/context/resolvers/PartitionCtxResolver.java +++ b/src/main/java/fr/insee/protools/backend/service/context/resolvers/PartitionCtxResolver.java @@ -1,16 +1,26 @@ package fr.insee.protools.backend.service.context.resolvers; +import com.fasterxml.jackson.databind.JsonNode; +import fr.insee.protools.backend.exception.ProtoolsBpmnError; +import fr.insee.protools.backend.service.context.ContextService; +import fr.insee.protools.backend.service.exception.IncoherentBPMNContextError; +import fr.insee.protools.backend.service.utils.FlowableVariableUtils; +import fr.insee.protools.backend.service.utils.log.TimeLogUtils; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.flowable.common.engine.api.FlowableException; import org.flowable.engine.impl.persistence.entity.ExecutionEntity; import org.springframework.stereotype.Component; import java.io.Serializable; -import java.time.Instant; -import java.util.HashMap; +import java.time.*; +import java.time.format.DateTimeFormatter; +import java.time.temporal.TemporalAmount; +import java.util.*; -import static fr.insee.protools.backend.service.FlowableVariableNameConstants.VARNAME_CONTEXT_PARTITION_VARIABLES_BY_ID; -import static fr.insee.protools.backend.service.context.ContextConstants.CTX_PARTITION_DATE_DEBUT_COLLECTE; -import static fr.insee.protools.backend.service.context.ContextConstants.CTX_PARTITION_DATE_FIN_COLLECTE; +import static fr.insee.protools.backend.service.FlowableVariableNameConstants.*; +import static fr.insee.protools.backend.service.context.ContextConstants.*; +import static fr.insee.protools.backend.service.utils.ContextUtils.*; /** * Used to make protools context variables available in BPMN expressions @@ -26,10 +36,20 @@ * Flowable doc : https://documentation.flowable.com/latest/develop/be/be-expressions#customization */ @Component +@RequiredArgsConstructor +@Slf4j public class PartitionCtxResolver { + private final ContextService protoolsContext; - private Serializable getVariableOfPartition(ExecutionEntity execution, Long partitionId, String key) { + //TODO: à faire valider par le métier + private final TemporalAmount maxSendCommunicationWindowHours = Duration.ofHours(24);; + + //Date in a far away future + private final static Instant farAwayInstant = LocalDate.parse("9999-12-31").atStartOfDay(ZoneId.of("Europe/Paris")).toInstant(); + + + private Serializable getVariableOfPartition(ExecutionEntity execution, String partitionId, String key) { HashMap> variablesByPartition = execution.getVariable(VARNAME_CONTEXT_PARTITION_VARIABLES_BY_ID, HashMap.class); HashMap partitionVariables = variablesByPartition.get(partitionId); if(partitionVariables==null) { @@ -38,13 +58,107 @@ private Serializable getVariableOfPartition(ExecutionEntity execution, Long part return partitionVariables.get(key); } - public Instant getCollectionStartDate(ExecutionEntity execution, Long partitionId) { + public Instant getCollectionStartDate(ExecutionEntity execution, String partitionId) { return (Instant) getVariableOfPartition(execution,partitionId,CTX_PARTITION_DATE_DEBUT_COLLECTE); } - public Instant getCollectionEndtDate(ExecutionEntity execution, Long partitionId) { + public Instant getCollectionEndDate(ExecutionEntity execution, String partitionId) { + //TODO : a supprimer ; Voir si on n'utilise pas le contexte json directement au lieu de variables initalisées au lancement + /*Instant s = (Instant) getVariableOfPartition(execution,partitionId,CTX_PARTITION_DATE_FIN_COLLECTE); + System.out.println("partitionId="+partitionId+" getCollectionEndDate="+s); + LocalDateTime ldt = LocalDateTime.ofInstant(s, ZoneOffset.systemDefault()); //2023-02-02T13:52:04.824071900 + System.out.println("partitionId="+partitionId+" getCollectionEndDate LOCAL="+ldt);*/ + return (Instant) getVariableOfPartition(execution,partitionId,CTX_PARTITION_DATE_FIN_COLLECTE); } + + public String getCommunicationType(ExecutionEntity execution, String partitionId, String communicationId) { + JsonNode contextRootNode = protoolsContext.getContextByProcessInstance(execution.getProcessInstanceId()); + JsonNode partitionNode = getPartitionNodeIfExists(contextRootNode, partitionId) + .orElseThrow(() -> new IncoherentBPMNContextError("Tried to get communication type on an unknown partition")); + + JsonNode communicationNode = getCommunicationFromPartition(partitionNode,communicationId).orElseThrow(()-> new IncoherentBPMNContextError("Tried to get communication type on an undefined communicationId="+communicationId)); + return communicationNode.path(CTX_PARTITION_COMMUNICATION_TYPE).asText(); + } + + + //TODO: documenter l'histoire des 24H + public Instant scheduleNextCommunication(ExecutionEntity execution, String partitionId) { + + Instant now = Instant.now(); + + //Context + JsonNode contextRootNode = protoolsContext.getContextByProcessInstance(execution.getProcessInstanceId()); + Set sentCommunicationIds = FlowableVariableUtils.getVariableOrNull(execution, VARNAME_ALREADY_SCHEDULED_COMMUNICATION_ID_SET, Set.class); + Set errorCommunicationIds = FlowableVariableUtils.getVariableOrNull(execution, VARNAME_COMMUNICATION_ERROR_ID_SET, Set.class); + + + if(sentCommunicationIds==null){ + sentCommunicationIds=new HashSet<>(); + } + if(errorCommunicationIds==null){ + errorCommunicationIds=new HashSet<>(); + } + JsonNode partitionNode = getPartitionNodeIfExists(contextRootNode, partitionId) + .orElseThrow(() -> new IncoherentBPMNContextError("Tried to schedule next communication of an undefined partition")); + + //if this partition is not defined; obviously there is something wrong + String end = partitionNode.get(CTX_PARTITION_DATE_FIN_COLLECTE).asText(); + Instant collectionEndCollecte = Instant.parse(end); + + if(collectionEndCollecte.isBefore(now)){ + log.error("ProcessInstanceId={} - partitionId={} - dateFinCollecte={} is in the past ==> Timer is set to a far away Instant ", + execution.getProcessInstanceId(), partitionId, TimeLogUtils.format(collectionEndCollecte)); + return farAwayInstant; + } + + List communicationNodes = getCommunicationsFromPartition(partitionNode); + Instant nextCommEcheance = null; + String nextCommId=null; + + + for (JsonNode communicationNode : communicationNodes){ + Instant echeance = Instant.parse(communicationNode.path(CTX_PARTITION_COMMUNICATION_ECHEANCE).asText()); + String communicationId=communicationNode.path(CTX_PARTITION_COMMUNICATION_ID).asText(); + + //null is an error in config so we ignore it; a + // and we also discard communications that have already been sent or that have been marked as in error + if(communicationId==null || sentCommunicationIds.contains(communicationId) || errorCommunicationIds.contains(communicationId)){ + continue; + } + + //verify that echeance of communication to be sent is not too old + if(echeance.plus(maxSendCommunicationWindowHours).isBefore(now)){ + log.warn("Partition id={} : Communication id={} has not been sent. Its echeance [ {} ] is too far past so it will not be sent", + partitionId,communicationId,TimeLogUtils.format(echeance)); + + errorCommunicationIds.add(communicationId); + execution.getRootProcessInstance().setVariableLocal(VARNAME_COMMUNICATION_ERROR_ID_SET,errorCommunicationIds); + } + + //Among the not treated communications we compute the one with the first echeance + else if(nextCommEcheance == null || nextCommEcheance.isAfter(echeance)){ + nextCommEcheance=echeance; + nextCommId=communicationNode.path(CTX_PARTITION_COMMUNICATION_ID).asText(); + } + } + + //If no communication left (all have already been treated) ==> far away future + if(nextCommId==null){ + nextCommEcheance = farAwayInstant; + } + else{ + sentCommunicationIds.add(nextCommId); + + execution.getParent().setVariableLocal(VARNAME_CURRENT_COMMUNICATION_ID,nextCommId); + execution.getRootProcessInstance().setVariableLocal(VARNAME_ALREADY_SCHEDULED_COMMUNICATION_ID_SET,sentCommunicationIds); + } + + //TODO: remove + System.out.println("part="+partitionId+" - nextCom="+TimeLogUtils.format(nextCommEcheance)); + return nextCommEcheance; + } + } \ No newline at end of file diff --git a/src/main/java/fr/insee/protools/backend/service/exception/IncoherentBPMNContextError.java b/src/main/java/fr/insee/protools/backend/service/exception/IncoherentBPMNContextError.java new file mode 100644 index 00000000..4ff6f8ff --- /dev/null +++ b/src/main/java/fr/insee/protools/backend/service/exception/IncoherentBPMNContextError.java @@ -0,0 +1,11 @@ +package fr.insee.protools.backend.service.exception; + +import fr.insee.protools.backend.exception.ProtoolsBpmnError; + +import static fr.insee.protools.backend.service.BPMNErrorCode.BPMNERROR_CODE_DEFAULT; + +public class IncoherentBPMNContextError extends ProtoolsBpmnError { + public IncoherentBPMNContextError(String message) { + super(BPMNERROR_CODE_DEFAULT, message); + } +} diff --git a/src/main/java/fr/insee/protools/backend/service/platine/delegate/v2/PlatinePilotageCreateCommunicationEventREST.java b/src/main/java/fr/insee/protools/backend/service/platine/delegate/v2/PlatinePilotageCreateCommunicationEventREST.java new file mode 100644 index 00000000..afc43389 --- /dev/null +++ b/src/main/java/fr/insee/protools/backend/service/platine/delegate/v2/PlatinePilotageCreateCommunicationEventREST.java @@ -0,0 +1,51 @@ +package fr.insee.protools.backend.service.platine.delegate.v2; + +import com.fasterxml.jackson.databind.JsonNode; +import fr.insee.protools.backend.dto.internal.ProtoolsInterrogationDto; +import fr.insee.protools.backend.dto.platine.pilotage.v2.PlatinePilotageCommunicationEventDto; +import fr.insee.protools.backend.service.DelegateContextVerifier; +import fr.insee.protools.backend.service.context.ContextService; +import fr.insee.protools.backend.service.platine.pilotage.PlatinePilotageService; +import fr.insee.protools.backend.service.utils.FlowableVariableUtils; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.JavaDelegate; +import org.springframework.stereotype.Component; + +import java.util.List; +import java.util.Map; + +import static fr.insee.protools.backend.service.FlowableVariableNameConstants.*; + +@Slf4j +@RequiredArgsConstructor +@Component +public class PlatinePilotageCreateCommunicationEventREST implements JavaDelegate, DelegateContextVerifier { + + private final PlatinePilotageService platinePilotageService; + + @Override + public void execute(DelegateExecution execution) { + log.info("ProcessInstanceId={} begin",execution.getProcessInstanceId()); + List contentList = FlowableVariableUtils.getVariableOrThrow(execution, VARNAME_REM_INTERRO_LIST, List.class); + Map communicationRequestIdByInterroIdMap = FlowableVariableUtils.getVariableOrThrow(execution, VARNAME_COMMUNICATION_REQUEST_ID_FOR_INTERRO_ID_MAP, Map.class); + String currentCommunicationId= FlowableVariableUtils.getVariableOrThrow(execution, VARNAME_CURRENT_COMMUNICATION_ID, String.class); + + //TODO: put it at a single place + String jsonKeyId = "id"; + String state="XXXXX"; + + List platinePilotageCommunicationEventList = contentList.stream() + .map(jsonNode -> { + String interroId = jsonNode.path(jsonKeyId).asText(); + String communicationRequestId=communicationRequestIdByInterroIdMap.get(interroId); + return PlatinePilotageCommunicationEventDto.builder().communcationId(currentCommunicationId).communicationRequestId(communicationRequestId).interrogationId(interroId).state(state).build(); + }).toList(); + + platinePilotageService.postCommunicationEvent(platinePilotageCommunicationEventList); + + log.info("ProcessInstanceId={} end",execution.getProcessInstanceId()); + + } +} \ No newline at end of file diff --git a/src/main/java/fr/insee/protools/backend/service/platine/pilotage/PlatinePilotageService.java b/src/main/java/fr/insee/protools/backend/service/platine/pilotage/PlatinePilotageService.java index 8d7accfe..c0fec61b 100644 --- a/src/main/java/fr/insee/protools/backend/service/platine/pilotage/PlatinePilotageService.java +++ b/src/main/java/fr/insee/protools/backend/service/platine/pilotage/PlatinePilotageService.java @@ -4,14 +4,13 @@ import fr.insee.protools.backend.dto.platine.pilotage.PlatinePilotageEligibleDto; import fr.insee.protools.backend.dto.platine.pilotage.contact.PlatineContactDto; import fr.insee.protools.backend.dto.platine.pilotage.query.QuestioningWebclientDto; +import fr.insee.protools.backend.dto.platine.pilotage.v2.PlatinePilotageCommunicationEventDto; import fr.insee.protools.backend.httpclients.restclient.RestClientHelper; import fr.insee.protools.backend.service.platine.pilotage.metadata.MetadataDto; -import fr.insee.protools.backend.httpclients.webclient.WebClientHelper; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.slf4j.event.Level; import org.springframework.stereotype.Service; -import org.springframework.web.client.RestClient; import java.util.List; @@ -102,4 +101,17 @@ public void postContext(String campaignId,JsonNode contextRootNode) { .body(String.class); log.trace("postContext: campaignId={} - response={} ",campaignId,response); } + + public void postCommunicationEvent(List platinePilotageCommunicationEventList) { + log.trace("postCommunicationEvent: "); + logJson("postCommunicationEvent ",platinePilotageCommunicationEventList,log,Level.TRACE); + + var response = restClientHelper.getRestClient(KNOWN_API_PLATINE_PILOTAGE) + .post() + .uri("/interrogations/communication-events") + .body(platinePilotageCommunicationEventList) + .retrieve() + .body(String.class); + log.trace("postCommunicationEvent: response={} ",response); + } } diff --git a/src/main/java/fr/insee/protools/backend/service/rem/delegate/v2/RemGetPartitionListOfInterroDefaultPaginated.java b/src/main/java/fr/insee/protools/backend/service/rem/delegate/v2/RemGetPartitionListOfInterroDefaultPaginated.java deleted file mode 100644 index ffdda0ef..00000000 --- a/src/main/java/fr/insee/protools/backend/service/rem/delegate/v2/RemGetPartitionListOfInterroDefaultPaginated.java +++ /dev/null @@ -1,41 +0,0 @@ -package fr.insee.protools.backend.service.rem.delegate.v2; - -import com.fasterxml.jackson.databind.JsonNode; -import fr.insee.protools.backend.dto.internal.ProtoolsInterrogationDto; -import fr.insee.protools.backend.httpclients.pagination.PageResponse; -import fr.insee.protools.backend.service.DelegateContextVerifier; -import fr.insee.protools.backend.service.rem.RemService; -import fr.insee.protools.backend.service.utils.FlowableVariableUtils; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.flowable.engine.delegate.DelegateExecution; -import org.flowable.engine.delegate.JavaDelegate; -import org.slf4j.Logger; -import org.springframework.stereotype.Component; - -import java.util.List; -import java.util.Map; - -import static fr.insee.protools.backend.service.FlowableVariableNameConstants.*; - -@Slf4j -public abstract class RemGetPartitionListOfInterroDefaultPaginated implements JavaDelegate, DelegateContextVerifier, PaginationHelper { - - @Override - public Map treatPage(DelegateExecution execution, List contentList) { - - String jsonKeyId = "id"; - List protoolsInterrogationDtos = contentList.stream() - //TODO: remove as it should not occurs? - .filter(jsonNode -> { - boolean hasId = jsonNode.has(jsonKeyId) && !jsonNode.get(jsonKeyId).isNull(); - if (!hasId) { - log.warn("Skipping interrogation without id: {}", jsonNode); - } - return hasId; - }).map(jsonNode -> ProtoolsInterrogationDto.builder().idInterrogation(jsonNode.get(jsonKeyId).asText()).remInterrogation(jsonNode).build()).toList(); - - Map variables = Map.of(VARNAME_REM_PROTOOLS_INTERRO_LIST, protoolsInterrogationDtos); - return variables; - } -} \ No newline at end of file diff --git a/src/main/java/fr/insee/protools/backend/service/rem/delegate/v2/RemGetPartitionListOfInterroPaginatedTask.java b/src/main/java/fr/insee/protools/backend/service/rem/delegate/v2/RemGetPartitionListOfInterroPaginatedTask.java index 868afc36..f4c8a40d 100644 --- a/src/main/java/fr/insee/protools/backend/service/rem/delegate/v2/RemGetPartitionListOfInterroPaginatedTask.java +++ b/src/main/java/fr/insee/protools/backend/service/rem/delegate/v2/RemGetPartitionListOfInterroPaginatedTask.java @@ -21,7 +21,7 @@ @Slf4j @Component @RequiredArgsConstructor -public class RemGetPartitionListOfInterroPaginatedTask extends RemGetPartitionListOfInterroDefaultPaginated { +public class RemGetPartitionListOfInterroPaginatedTask implements JavaDelegate, DelegateContextVerifier, PaginationHelper { RemService remService; @@ -40,4 +40,10 @@ public void execute(DelegateExecution execution) { public Logger getLogger() { return log; } + + @Override + public Map treatPage(DelegateExecution execution, List contentList) { + Map variables = Map.of(VARNAME_REM_INTERRO_LIST, contentList); + return variables; + } } \ No newline at end of file diff --git a/src/main/java/fr/insee/protools/backend/service/rem/delegate/v2/RemGetPartitionListOfInterroWithoutWebAccountPaginatedTask.java b/src/main/java/fr/insee/protools/backend/service/rem/delegate/v2/RemGetPartitionListOfInterroWithoutWebAccountPaginatedTask.java index c682ce18..64b63676 100644 --- a/src/main/java/fr/insee/protools/backend/service/rem/delegate/v2/RemGetPartitionListOfInterroWithoutWebAccountPaginatedTask.java +++ b/src/main/java/fr/insee/protools/backend/service/rem/delegate/v2/RemGetPartitionListOfInterroWithoutWebAccountPaginatedTask.java @@ -21,7 +21,7 @@ @Slf4j @Component @RequiredArgsConstructor -public class RemGetPartitionListOfInterroWithoutWebAccountPaginatedTask extends RemGetPartitionListOfInterroDefaultPaginated { +public class RemGetPartitionListOfInterroWithoutWebAccountPaginatedTask implements JavaDelegate, DelegateContextVerifier, PaginationHelper { private final RemService remService; @@ -40,4 +40,22 @@ public void execute(DelegateExecution execution) { public Logger getLogger() { return log; } + + @Override + public Map treatPage(DelegateExecution execution, List contentList) { + + String jsonKeyId = "id"; + List protoolsInterrogationDtos = contentList.stream() + //TODO: remove as it should not occurs? + .filter(jsonNode -> { + boolean hasId = jsonNode.has(jsonKeyId) && !jsonNode.get(jsonKeyId).isNull(); + if (!hasId) { + log.warn("Skipping interrogation without id: {}", jsonNode); + } + return hasId; + }).map(jsonNode -> ProtoolsInterrogationDto.builder().idInterrogation(jsonNode.get(jsonKeyId).asText()).remInterrogation(jsonNode).build()).toList(); + + Map variables = Map.of(VARNAME_REM_PROTOOLS_INTERRO_LIST, protoolsInterrogationDtos); + return variables; + } } \ No newline at end of file diff --git a/src/main/java/fr/insee/protools/backend/service/utils/ContextUtils.java b/src/main/java/fr/insee/protools/backend/service/utils/ContextUtils.java index bbf7b5b8..07096b7c 100644 --- a/src/main/java/fr/insee/protools/backend/service/utils/ContextUtils.java +++ b/src/main/java/fr/insee/protools/backend/service/utils/ContextUtils.java @@ -1,13 +1,20 @@ package fr.insee.protools.backend.service.utils; import com.fasterxml.jackson.databind.JsonNode; +import fr.insee.protools.backend.service.exception.IncoherentBPMNContextError; +import org.apache.commons.collections4.IteratorUtils; import org.flowable.common.engine.api.FlowableIllegalArgumentException; -import static fr.insee.protools.backend.service.context.ContextConstants.CTX_PARTITIONS; -import static fr.insee.protools.backend.service.context.ContextConstants.CTX_PARTITION_ID; +import java.util.ArrayList; +import java.util.List; +import java.util.Optional; +import java.util.stream.StreamSupport; + +import static fr.insee.protools.backend.service.context.ContextConstants.*; public class ContextUtils { + //TODO: supprimer?? //Search for the current partition in the contexte. public static JsonNode getCurrentPartitionNode(JsonNode contextRootNode, Long currentPartitionId) { JsonNode currentPartitionNode=null; @@ -23,5 +30,41 @@ public static JsonNode getCurrentPartitionNode(JsonNode contextRootNode, Long cu } return currentPartitionNode; } + + + public static Optional getPartitionNodeIfExists(JsonNode contextRootNode, String partitionId) { + JsonNode currentPartitionNode=null; + // Search for the correct partition based on it's ID + for (JsonNode subNode : contextRootNode.path(CTX_PARTITIONS)) { + if (subNode.has(CTX_PARTITION_ID) && subNode.get(CTX_PARTITION_ID).asText().equals(partitionId)) { + currentPartitionNode = subNode; + break; + } + } + return Optional.ofNullable(currentPartitionNode); + } + + public static Optional getCommunicationFromPartition(JsonNode partitionNode, String communicationId){ + var communicationsIterator = partitionNode.path(CTX_PARTITION_COMMUNICATIONS).elements(); + return StreamSupport.stream(((Iterable) () -> communicationsIterator).spliterator(), false) + .filter(node -> node.path(CTX_PARTITION_COMMUNICATION_ID).asText().equals(communicationId)) + .findFirst(); + } + + + public static List getCommunicationsFromPartition(JsonNode contextRootNode, String partitionId) { + Optional partitionNode = getPartitionNodeIfExists(contextRootNode, partitionId); + return partitionNode.map( + partNode -> { + var communicationIterator = partNode.path(CTX_PARTITION_COMMUNICATIONS).elements(); + return IteratorUtils.toList(communicationIterator); + }) + .orElse(new ArrayList<>()); + } + + public static List getCommunicationsFromPartition(JsonNode partitionNode) { + return IteratorUtils.toList(partitionNode.path(CTX_PARTITION_COMMUNICATIONS).elements()); + } + private ContextUtils(){} } diff --git a/src/main/java/fr/insee/protools/backend/service/utils/log/TimeLogUtils.java b/src/main/java/fr/insee/protools/backend/service/utils/log/TimeLogUtils.java new file mode 100644 index 00000000..d886745a --- /dev/null +++ b/src/main/java/fr/insee/protools/backend/service/utils/log/TimeLogUtils.java @@ -0,0 +1,19 @@ +package fr.insee.protools.backend.service.utils.log; +import java.time.Instant; +import java.time.ZoneId; +import java.time.format.DateTimeFormatter; + +public class TimeLogUtils { + + private TimeLogUtils() {} + private static final DateTimeFormatter formatter = DateTimeFormatter.ISO_OFFSET_DATE_TIME; + private static final ZoneId zone = ZoneId.systemDefault(); + + public static String format(Instant i){ + if(i==null) { + return "Empty"; + } + + return i.atZone(zone).format(formatter); + } +} diff --git a/src/main/resources/application-dev.properties b/src/main/resources/application-dev.properties index 577827a0..f118698d 100644 --- a/src/main/resources/application-dev.properties +++ b/src/main/resources/application-dev.properties @@ -34,7 +34,7 @@ fr.insee.protools.token.provider.dmz-questionnaire-particuliers.client-secret= #CONF DES API #platine Pilotage fr.insee.protools.api.platine-pilotage.enabled=true -fr.insee.protools.api.platine-pilotage.url=https://http-https-echo.dev.kube.insee.fr/ +fr.insee.protools.api.platine-pilotage.url=https://http-https-echo.dev.kube.insee.fr/pilotage/ fr.insee.protools.api.platine-pilotage.auth.client-id=${fr.insee.protools.keycloak.client.id} fr.insee.protools.api.platine-pilotage.auth.client-secret=${fr.insee.protools.token.provider.dmz-questionnaire-particuliers.client-secret} fr.insee.protools.api.platine-pilotage.auth.realm=questionnaire-particuliers @@ -42,7 +42,7 @@ fr.insee.protools.api.platine-pilotage.auth.url=${fr.insee.protools.keycloak-dmz #platine questionnaire fr.insee.protools.api.platine-questionnaire.enabled=true -fr.insee.protools.api.platine-questionnaire.url=https://http-https-echo.dev.kube.insee.fr/ +fr.insee.protools.api.platine-questionnaire.url=https://http-https-echo.dev.kube.insee.fr/questionnaire/ fr.insee.protools.api.platine-questionnaire.auth.url=${fr.insee.protools.keycloak-dmz-auth-url} fr.insee.protools.api.platine-questionnaire.auth.realm=questionnaire-particuliers fr.insee.protools.api.platine-questionnaire.auth.client-id=${fr.insee.protools.keycloak.client.id} From 65645efef400c81b63b9843864bab62e9e8ab215 Mon Sep 17 00:00:00 2001 From: "farid.ait-karra" Date: Wed, 21 Aug 2024 07:31:50 +0200 Subject: [PATCH 49/75] =?UTF-8?q?feat/implementation-mongo=20:=20-=20Ajout?= =?UTF-8?q?=20de=20la=20v=C3=A9rification=20de=20la=20fin=20de=20traitemen?= =?UTF-8?q?t=20du=20commandengine=20-=20test=201?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../backend/repository/IUniteEnquetee.java | 2 ++ .../backend/repository/UniteEnqueteeImpl.java | 12 ++++++++++ ...uestionnaireCreateSurveyUnitTaskAsync.java | 14 ++++++++++- .../service/scheduled/TaskService.java | 23 +++++++++++++++++++ 4 files changed, 50 insertions(+), 1 deletion(-) create mode 100644 src/main/java/fr/insee/protools/backend/service/scheduled/TaskService.java diff --git a/src/main/java/fr/insee/protools/backend/repository/IUniteEnquetee.java b/src/main/java/fr/insee/protools/backend/repository/IUniteEnquetee.java index 66a4cdc8..65a32439 100644 --- a/src/main/java/fr/insee/protools/backend/repository/IUniteEnquetee.java +++ b/src/main/java/fr/insee/protools/backend/repository/IUniteEnquetee.java @@ -13,4 +13,6 @@ public interface IUniteEnquetee { void addManyUniteEnquetee(List listeUe, String processInstanceId, String campaignId, String questionnaireId); void addManyUniteEnqueteeDeleteColonneClass(List listeUe); + + boolean isTerminated(); } \ No newline at end of file diff --git a/src/main/java/fr/insee/protools/backend/repository/UniteEnqueteeImpl.java b/src/main/java/fr/insee/protools/backend/repository/UniteEnqueteeImpl.java index a84c3d99..cbacdc40 100644 --- a/src/main/java/fr/insee/protools/backend/repository/UniteEnqueteeImpl.java +++ b/src/main/java/fr/insee/protools/backend/repository/UniteEnqueteeImpl.java @@ -12,6 +12,8 @@ import org.springframework.data.mongodb.core.convert.DefaultMongoTypeMapper; import org.springframework.data.mongodb.core.convert.MappingMongoConverter; import org.springframework.data.mongodb.core.mapping.MongoMappingContext; +import org.springframework.data.mongodb.core.query.Criteria; +import org.springframework.data.mongodb.core.query.Query; import org.springframework.stereotype.Repository; import java.util.HashMap; @@ -103,4 +105,14 @@ public void addManyUniteEnquetee(List listeUe, String processInstanceI mongoTemplate2.insert(bo, "commandes"); } + @Override + public boolean isTerminated() { + log.info("UniteEnqueteeImpl.isTerminated."); + boolean result=false; + Query query = new Query(); + query.addCriteria(Criteria.where("inProgress").is(true).and("done").is(true)); + mongoTemplate.find(query, String.class, "commandes"); + return result; + } + } \ No newline at end of file diff --git a/src/main/java/fr/insee/protools/backend/service/platine/delegate/PlatineQuestionnaireCreateSurveyUnitTaskAsync.java b/src/main/java/fr/insee/protools/backend/service/platine/delegate/PlatineQuestionnaireCreateSurveyUnitTaskAsync.java index b3ca6e04..81d2a611 100644 --- a/src/main/java/fr/insee/protools/backend/service/platine/delegate/PlatineQuestionnaireCreateSurveyUnitTaskAsync.java +++ b/src/main/java/fr/insee/protools/backend/service/platine/delegate/PlatineQuestionnaireCreateSurveyUnitTaskAsync.java @@ -6,10 +6,13 @@ import fr.insee.protools.backend.service.common.platine_sabiane.QuestionnaireHelper; import fr.insee.protools.backend.service.context.ContextService; import fr.insee.protools.backend.service.platine.questionnaire.PlatineQuestionnaireService; +import fr.insee.protools.backend.service.scheduled.TaskService; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.flowable.engine.delegate.DelegateExecution; import org.flowable.engine.delegate.JavaDelegate; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; import java.util.Set; @@ -24,6 +27,9 @@ public class PlatineQuestionnaireCreateSurveyUnitTaskAsync implements JavaDelega private final ContextService protoolsContext; private final PlatineQuestionnaireService platineQuestionnaireService; private final IUniteEnquetee iUniteEnquetee; + @Autowired + TaskService taskService; + @Override public void execute(DelegateExecution execution) { JsonNode contextRootNode = protoolsContext.getContextByProcessInstance(execution.getProcessInstanceId()); @@ -35,8 +41,14 @@ public void execute(DelegateExecution execution) { QuestionnaireHelper.createSUTaskPlatineAsync(execution,protoolsContext,iUniteEnquetee,platineQuestionnaireService); log.debug("ProcessInstanceId={} - campagne={} - end", execution.getProcessInstanceId(),contextRootNode.path(CTX_CAMPAGNE_CONTEXTE).asText()); + } - + @Scheduled(fixedDelay = 5000) + public void scheduledTask() throws InterruptedException { + // Logique de la tâche planifiée + log.info("Tâche planifiée exécutée..."); + System.out.println("Tâche planifiée exécutée..."); + taskService.isTerminated(); } @Override diff --git a/src/main/java/fr/insee/protools/backend/service/scheduled/TaskService.java b/src/main/java/fr/insee/protools/backend/service/scheduled/TaskService.java new file mode 100644 index 00000000..28bcc51b --- /dev/null +++ b/src/main/java/fr/insee/protools/backend/service/scheduled/TaskService.java @@ -0,0 +1,23 @@ +package fr.insee.protools.backend.service.scheduled; + +import fr.insee.protools.backend.repository.IUniteEnquetee; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +@Component +@Slf4j +public class TaskService { + + private final IUniteEnquetee iUniteEnquetee; + + public TaskService(IUniteEnquetee iUniteEnquetee) { + this.iUniteEnquetee = iUniteEnquetee; + } + + public void isTerminated() throws InterruptedException { + log.info("IUniteEnquetee.isTerminated"); + iUniteEnquetee.isTerminated(); + } + + +} \ No newline at end of file From 621cd77a78cc9f65dda108aaae23676810fbb4f1 Mon Sep 17 00:00:00 2001 From: SNDIL - Marc Date: Mon, 2 Sep 2024 15:32:51 +0200 Subject: [PATCH 50/75] en cours --- .../pilotage/PlatinePilotageGenderType.java | 1 - .../PlatinePilotageCommunicationEventDto.java | 3 +- .../FlowableVariableNameConstants.java | 13 +++--- .../resolvers/PartitionCtxResolver.java | 6 ++- ...tageCreateCommunicationEventTaskREST.java} | 26 ++++++++---- .../PlatinePilotageCreateContextTaskREST.java | 2 +- ...lotageCreateInterrogationListTaskREST.java | 2 +- ...ineQuestionnaireCreateContextTaskREST.java | 3 +- ...nnaireCreateInterrogationListTaskREST.java | 2 +- .../pilotage/PlatinePilotageService.java | 42 +++++++++++++++++++ .../backend/service/rem/RemService.java | 23 ++-------- ...etPartitionListOfInterroPaginatedTask.java | 4 +- ...InterroWithoutWebAccountPaginatedTask.java | 7 ++-- .../backend/service/utils/ContextUtils.java | 7 ++++ .../delegate}/PaginationHelper.java | 2 +- 15 files changed, 94 insertions(+), 49 deletions(-) rename src/main/java/fr/insee/protools/backend/service/platine/delegate/v2/{PlatinePilotageCreateCommunicationEventREST.java => pilotatage/PlatinePilotageCreateCommunicationEventTaskREST.java} (60%) rename src/main/java/fr/insee/protools/backend/service/platine/delegate/v2/{ => pilotatage}/PlatinePilotageCreateContextTaskREST.java (95%) rename src/main/java/fr/insee/protools/backend/service/platine/delegate/v2/{ => pilotatage}/PlatinePilotageCreateInterrogationListTaskREST.java (89%) rename src/main/java/fr/insee/protools/backend/service/platine/delegate/v2/{ => questionnaire}/PlatineQuestionnaireCreateContextTaskREST.java (90%) rename src/main/java/fr/insee/protools/backend/service/platine/delegate/v2/{ => questionnaire}/PlatineQuestionnaireCreateInterrogationListTaskREST.java (91%) rename src/main/java/fr/insee/protools/backend/service/{rem/delegate/v2 => utils/delegate}/PaginationHelper.java (98%) diff --git a/src/main/java/fr/insee/protools/backend/dto/platine/pilotage/PlatinePilotageGenderType.java b/src/main/java/fr/insee/protools/backend/dto/platine/pilotage/PlatinePilotageGenderType.java index 59c9e64e..009bbcdd 100644 --- a/src/main/java/fr/insee/protools/backend/dto/platine/pilotage/PlatinePilotageGenderType.java +++ b/src/main/java/fr/insee/protools/backend/dto/platine/pilotage/PlatinePilotageGenderType.java @@ -3,7 +3,6 @@ import lombok.Getter; @Getter -@SuppressWarnings("java:S115") //allow constants not in capital letters public enum PlatinePilotageGenderType { Female("1", "Female"), Male("2", "Male"),Undefined("3","Undefined") ; diff --git a/src/main/java/fr/insee/protools/backend/dto/platine/pilotage/v2/PlatinePilotageCommunicationEventDto.java b/src/main/java/fr/insee/protools/backend/dto/platine/pilotage/v2/PlatinePilotageCommunicationEventDto.java index 05d8f86c..5c5133b7 100644 --- a/src/main/java/fr/insee/protools/backend/dto/platine/pilotage/v2/PlatinePilotageCommunicationEventDto.java +++ b/src/main/java/fr/insee/protools/backend/dto/platine/pilotage/v2/PlatinePilotageCommunicationEventDto.java @@ -1,6 +1,5 @@ package fr.insee.protools.backend.dto.platine.pilotage.v2; -import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; @@ -10,5 +9,5 @@ public class PlatinePilotageCommunicationEventDto { String interrogationId; String communicationRequestId; String communcationId; - String state; + PlatinePilotageCommunicationEventType state; } diff --git a/src/main/java/fr/insee/protools/backend/service/FlowableVariableNameConstants.java b/src/main/java/fr/insee/protools/backend/service/FlowableVariableNameConstants.java index e0c99ff9..732dabfb 100644 --- a/src/main/java/fr/insee/protools/backend/service/FlowableVariableNameConstants.java +++ b/src/main/java/fr/insee/protools/backend/service/FlowableVariableNameConstants.java @@ -18,12 +18,6 @@ public class FlowableVariableNameConstants { public static final String VARNAME_REM_SURVEY_UNIT_IDENTIFIER ="rem_survey_unit_id"; //to pass a REM survey unit content (JsonNode) public static final String VARNAME_REM_INTERROGATION ="rem_interrogation"; - //To pass a list of REM interrogations content (JsonNode) - public static final String VARNAME_REM_INTERRO_LIST ="rem_interrogation_list"; - //REM PAGEABLE - public static final String VARNAME_REM_INTERRO_LIST_PAGEABLE_IS_LAST_PAGE ="rem_interro_list_page_is_last"; - public static final String VARNAME_REM_INTERRO_LIST_PAGEABLE_CURRENT_PAGE ="rem_interro_list_page_current"; - public static final String VARNAME_REM_PROTOOLS_INTERRO_LIST = "rem_protools_interrogation_list"; //Sugoi ID/PWD @@ -54,6 +48,13 @@ public class FlowableVariableNameConstants { public static final String VARNAME_COMMUNICATION_ERROR_ID_SET = "communication_in_error_id_set"; + //To pass a list of REM interrogations content (JsonNode) + public static final String VARNAME_REM_INTERRO_LIST ="rem_interrogation_list"; + //REM PAGEABLE + public static final String VARNAME_INTERRO_LIST_PAGEABLE_IS_LAST_PAGE ="interro_list_page_is_last"; + public static final String VARNAME_INTERRO_LIST_PAGEABLE_CURRENT_PAGE ="interro_list_page_current"; + + private FlowableVariableNameConstants(){} } diff --git a/src/main/java/fr/insee/protools/backend/service/context/resolvers/PartitionCtxResolver.java b/src/main/java/fr/insee/protools/backend/service/context/resolvers/PartitionCtxResolver.java index 7d009c76..891def28 100644 --- a/src/main/java/fr/insee/protools/backend/service/context/resolvers/PartitionCtxResolver.java +++ b/src/main/java/fr/insee/protools/backend/service/context/resolvers/PartitionCtxResolver.java @@ -4,6 +4,7 @@ import fr.insee.protools.backend.exception.ProtoolsBpmnError; import fr.insee.protools.backend.service.context.ContextService; import fr.insee.protools.backend.service.exception.IncoherentBPMNContextError; +import fr.insee.protools.backend.service.utils.ContextUtils; import fr.insee.protools.backend.service.utils.FlowableVariableUtils; import fr.insee.protools.backend.service.utils.log.TimeLogUtils; import lombok.RequiredArgsConstructor; @@ -74,17 +75,18 @@ public Instant getCollectionEndDate(ExecutionEntity execution, String partitionI } + @SuppressWarnings("unused") //used in BPMNS public String getCommunicationType(ExecutionEntity execution, String partitionId, String communicationId) { JsonNode contextRootNode = protoolsContext.getContextByProcessInstance(execution.getProcessInstanceId()); - JsonNode partitionNode = getPartitionNodeIfExists(contextRootNode, partitionId) + JsonNode communicationNode = ContextUtils.getCommunicationFromPartition(contextRootNode,partitionId,communicationId) .orElseThrow(() -> new IncoherentBPMNContextError("Tried to get communication type on an unknown partition")); - JsonNode communicationNode = getCommunicationFromPartition(partitionNode,communicationId).orElseThrow(()-> new IncoherentBPMNContextError("Tried to get communication type on an undefined communicationId="+communicationId)); return communicationNode.path(CTX_PARTITION_COMMUNICATION_TYPE).asText(); } //TODO: documenter l'histoire des 24H + @SuppressWarnings("unused") //Used in BPMN public Instant scheduleNextCommunication(ExecutionEntity execution, String partitionId) { Instant now = Instant.now(); diff --git a/src/main/java/fr/insee/protools/backend/service/platine/delegate/v2/PlatinePilotageCreateCommunicationEventREST.java b/src/main/java/fr/insee/protools/backend/service/platine/delegate/v2/pilotatage/PlatinePilotageCreateCommunicationEventTaskREST.java similarity index 60% rename from src/main/java/fr/insee/protools/backend/service/platine/delegate/v2/PlatinePilotageCreateCommunicationEventREST.java rename to src/main/java/fr/insee/protools/backend/service/platine/delegate/v2/pilotatage/PlatinePilotageCreateCommunicationEventTaskREST.java index afc43389..f1e2d36c 100644 --- a/src/main/java/fr/insee/protools/backend/service/platine/delegate/v2/PlatinePilotageCreateCommunicationEventREST.java +++ b/src/main/java/fr/insee/protools/backend/service/platine/delegate/v2/pilotatage/PlatinePilotageCreateCommunicationEventTaskREST.java @@ -1,7 +1,6 @@ -package fr.insee.protools.backend.service.platine.delegate.v2; +package fr.insee.protools.backend.service.platine.delegate.v2.pilotatage; import com.fasterxml.jackson.databind.JsonNode; -import fr.insee.protools.backend.dto.internal.ProtoolsInterrogationDto; import fr.insee.protools.backend.dto.platine.pilotage.v2.PlatinePilotageCommunicationEventDto; import fr.insee.protools.backend.service.DelegateContextVerifier; import fr.insee.protools.backend.service.context.ContextService; @@ -13,34 +12,45 @@ import org.flowable.engine.delegate.JavaDelegate; import org.springframework.stereotype.Component; +import javax.naming.Context; import java.util.List; import java.util.Map; +import static fr.insee.protools.backend.dto.platine.pilotage.v2.PlatinePilotageCommunicationEventType.COMMUNICATION_SENT; +import static fr.insee.protools.backend.dto.platine.pilotage.v2.PlatinePilotageCommunicationEventType.COMMUNICATION_STATE_SENT; import static fr.insee.protools.backend.service.FlowableVariableNameConstants.*; +import static fr.insee.protools.backend.service.utils.ContextUtils.getPartitionNodeIfExists; @Slf4j @RequiredArgsConstructor @Component -public class PlatinePilotageCreateCommunicationEventREST implements JavaDelegate, DelegateContextVerifier { +public class PlatinePilotageCreateCommunicationEventTaskREST implements JavaDelegate, DelegateContextVerifier { private final PlatinePilotageService platinePilotageService; + private final ContextService protoolsContext; @Override public void execute(DelegateExecution execution) { - log.info("ProcessInstanceId={} begin",execution.getProcessInstanceId()); + execution.getId() + String currentCommunicationId= FlowableVariableUtils.getVariableOrThrow(execution, VARNAME_CURRENT_COMMUNICATION_ID, String.class); + String currentPartitionId = FlowableVariableUtils.getVariableOrThrow(execution, VARNAME_CURRENT_PARTITION_ID, String.class); + + log.info("ProcessInstanceId={} currentPartitionId={} - currentCommunicationId{} - begin", + execution.getProcessInstanceId(),currentPartitionId, currentCommunicationId); List contentList = FlowableVariableUtils.getVariableOrThrow(execution, VARNAME_REM_INTERRO_LIST, List.class); Map communicationRequestIdByInterroIdMap = FlowableVariableUtils.getVariableOrThrow(execution, VARNAME_COMMUNICATION_REQUEST_ID_FOR_INTERRO_ID_MAP, Map.class); - String currentCommunicationId= FlowableVariableUtils.getVariableOrThrow(execution, VARNAME_CURRENT_COMMUNICATION_ID, String.class); - //TODO: put it at a single place + //TODO: put it at a single place ==> Maybe an helper to get the Id of an interro or of any json? String jsonKeyId = "id"; - String state="XXXXX"; List platinePilotageCommunicationEventList = contentList.stream() .map(jsonNode -> { String interroId = jsonNode.path(jsonKeyId).asText(); String communicationRequestId=communicationRequestIdByInterroIdMap.get(interroId); - return PlatinePilotageCommunicationEventDto.builder().communcationId(currentCommunicationId).communicationRequestId(communicationRequestId).interrogationId(interroId).state(state).build(); + return PlatinePilotageCommunicationEventDto.builder() + .communcationId(currentCommunicationId) + .communicationRequestId(communicationRequestId) + .interrogationId(interroId).state(COMMUNICATION_STATE_SENT).build(); }).toList(); platinePilotageService.postCommunicationEvent(platinePilotageCommunicationEventList); diff --git a/src/main/java/fr/insee/protools/backend/service/platine/delegate/v2/PlatinePilotageCreateContextTaskREST.java b/src/main/java/fr/insee/protools/backend/service/platine/delegate/v2/pilotatage/PlatinePilotageCreateContextTaskREST.java similarity index 95% rename from src/main/java/fr/insee/protools/backend/service/platine/delegate/v2/PlatinePilotageCreateContextTaskREST.java rename to src/main/java/fr/insee/protools/backend/service/platine/delegate/v2/pilotatage/PlatinePilotageCreateContextTaskREST.java index 1f9d08ff..516266b0 100644 --- a/src/main/java/fr/insee/protools/backend/service/platine/delegate/v2/PlatinePilotageCreateContextTaskREST.java +++ b/src/main/java/fr/insee/protools/backend/service/platine/delegate/v2/pilotatage/PlatinePilotageCreateContextTaskREST.java @@ -1,4 +1,4 @@ -package fr.insee.protools.backend.service.platine.delegate.v2; +package fr.insee.protools.backend.service.platine.delegate.v2.pilotatage; import com.fasterxml.jackson.databind.JsonNode; import fr.insee.protools.backend.service.DelegateContextVerifier; diff --git a/src/main/java/fr/insee/protools/backend/service/platine/delegate/v2/PlatinePilotageCreateInterrogationListTaskREST.java b/src/main/java/fr/insee/protools/backend/service/platine/delegate/v2/pilotatage/PlatinePilotageCreateInterrogationListTaskREST.java similarity index 89% rename from src/main/java/fr/insee/protools/backend/service/platine/delegate/v2/PlatinePilotageCreateInterrogationListTaskREST.java rename to src/main/java/fr/insee/protools/backend/service/platine/delegate/v2/pilotatage/PlatinePilotageCreateInterrogationListTaskREST.java index 64139069..0285a31f 100644 --- a/src/main/java/fr/insee/protools/backend/service/platine/delegate/v2/PlatinePilotageCreateInterrogationListTaskREST.java +++ b/src/main/java/fr/insee/protools/backend/service/platine/delegate/v2/pilotatage/PlatinePilotageCreateInterrogationListTaskREST.java @@ -1,4 +1,4 @@ -package fr.insee.protools.backend.service.platine.delegate.v2; +package fr.insee.protools.backend.service.platine.delegate.v2.pilotatage; import com.fasterxml.jackson.databind.JsonNode; import fr.insee.protools.backend.service.platine.pilotage.PlatinePilotageService; diff --git a/src/main/java/fr/insee/protools/backend/service/platine/delegate/v2/PlatineQuestionnaireCreateContextTaskREST.java b/src/main/java/fr/insee/protools/backend/service/platine/delegate/v2/questionnaire/PlatineQuestionnaireCreateContextTaskREST.java similarity index 90% rename from src/main/java/fr/insee/protools/backend/service/platine/delegate/v2/PlatineQuestionnaireCreateContextTaskREST.java rename to src/main/java/fr/insee/protools/backend/service/platine/delegate/v2/questionnaire/PlatineQuestionnaireCreateContextTaskREST.java index 771b8273..f780f656 100644 --- a/src/main/java/fr/insee/protools/backend/service/platine/delegate/v2/PlatineQuestionnaireCreateContextTaskREST.java +++ b/src/main/java/fr/insee/protools/backend/service/platine/delegate/v2/questionnaire/PlatineQuestionnaireCreateContextTaskREST.java @@ -1,9 +1,8 @@ -package fr.insee.protools.backend.service.platine.delegate.v2; +package fr.insee.protools.backend.service.platine.delegate.v2.questionnaire; import com.fasterxml.jackson.databind.JsonNode; import fr.insee.protools.backend.service.DelegateContextVerifier; import fr.insee.protools.backend.service.context.ContextService; -import fr.insee.protools.backend.service.platine.pilotage.PlatinePilotageService; import fr.insee.protools.backend.service.platine.questionnaire.PlatineQuestionnaireService; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; diff --git a/src/main/java/fr/insee/protools/backend/service/platine/delegate/v2/PlatineQuestionnaireCreateInterrogationListTaskREST.java b/src/main/java/fr/insee/protools/backend/service/platine/delegate/v2/questionnaire/PlatineQuestionnaireCreateInterrogationListTaskREST.java similarity index 91% rename from src/main/java/fr/insee/protools/backend/service/platine/delegate/v2/PlatineQuestionnaireCreateInterrogationListTaskREST.java rename to src/main/java/fr/insee/protools/backend/service/platine/delegate/v2/questionnaire/PlatineQuestionnaireCreateInterrogationListTaskREST.java index a2315927..107d9f2b 100644 --- a/src/main/java/fr/insee/protools/backend/service/platine/delegate/v2/PlatineQuestionnaireCreateInterrogationListTaskREST.java +++ b/src/main/java/fr/insee/protools/backend/service/platine/delegate/v2/questionnaire/PlatineQuestionnaireCreateInterrogationListTaskREST.java @@ -1,4 +1,4 @@ -package fr.insee.protools.backend.service.platine.delegate.v2; +package fr.insee.protools.backend.service.platine.delegate.v2.questionnaire; import com.fasterxml.jackson.databind.JsonNode; import fr.insee.protools.backend.service.platine.questionnaire.PlatineQuestionnaireService; diff --git a/src/main/java/fr/insee/protools/backend/service/platine/pilotage/PlatinePilotageService.java b/src/main/java/fr/insee/protools/backend/service/platine/pilotage/PlatinePilotageService.java index c0fec61b..3522c51e 100644 --- a/src/main/java/fr/insee/protools/backend/service/platine/pilotage/PlatinePilotageService.java +++ b/src/main/java/fr/insee/protools/backend/service/platine/pilotage/PlatinePilotageService.java @@ -5,15 +5,22 @@ import fr.insee.protools.backend.dto.platine.pilotage.contact.PlatineContactDto; import fr.insee.protools.backend.dto.platine.pilotage.query.QuestioningWebclientDto; import fr.insee.protools.backend.dto.platine.pilotage.v2.PlatinePilotageCommunicationEventDto; +import fr.insee.protools.backend.httpclients.exception.runtime.HttpClient4xxBPMNError; +import fr.insee.protools.backend.httpclients.pagination.PageResponse; import fr.insee.protools.backend.httpclients.restclient.RestClientHelper; import fr.insee.protools.backend.service.platine.pilotage.metadata.MetadataDto; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.slf4j.event.Level; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.core.ParameterizedTypeReference; +import org.springframework.http.HttpStatus; import org.springframework.stereotype.Service; import java.util.List; +import java.util.Optional; +import static fr.insee.protools.backend.httpclients.configuration.ApiConfigProperties.KNOWN_API.KNOWN_API_REM; import static fr.insee.protools.backend.httpclients.webclient.WebClientHelper.logJson; import static fr.insee.protools.backend.httpclients.configuration.ApiConfigProperties.KNOWN_API.KNOWN_API_PLATINE_PILOTAGE; @@ -23,6 +30,10 @@ public class PlatinePilotageService { private final RestClientHelper restClientHelper; + + @Value("${fr.insee.protools.api.platine-pilotage.interrogation.page.size:5000}") + private int pageSizeGetInterro; + public void putMetadata(String partitionId , MetadataDto dto) { log.debug("putMetadata : partitionId={} - dto.su.id={} ",partitionId,dto.getSurveyDto().getId()); logJson(String.format("putMetadata - partitionId=%s : ",partitionId),dto, log,Level.DEBUG); @@ -114,4 +125,35 @@ public void postCommunicationEvent(List pl .body(String.class); log.trace("postCommunicationEvent: response={} ",response); } + + public PageResponse getInterrogationToFollowUpPaginated(Long partitionId, long page, Optional isToFollowUp) { + log.debug("partitionId={} - page={} - pageSizeGetInterro={} - hasAccount={}",partitionId,page,pageSizeGetInterro,isToFollowUp); + ParameterizedTypeReference> typeReference = new ParameterizedTypeReference<>() { }; + try { + PageResponse response = restClientHelper.getRestClient(KNOWN_API_PLATINE_PILOTAGE) + .get() + .uri(uriBuilder -> uriBuilder + .path("interrogations") + .queryParam("page", page) + .queryParam("size", pageSizeGetInterro) + .queryParam("partition_id", partitionId) + .queryParamIfPresent("follow-up", isToFollowUp) + .build(partitionId)) + .retrieve() + .body(typeReference); + log.trace("partitionId={} - page={} - pageSizeGetInterro={} - response={} ", partitionId,page,pageSizeGetInterro, response.getContent().size()); + return response; + } + catch (HttpClient4xxBPMNError e){ + if(e.getHttpStatusCodeError().equals(HttpStatus.NOT_FOUND)){ + String msg= + "Error 404/NOT_FOUND during Platine Pilotage getInterrogationToFollowUpPaginated with partitionId="+partitionId + + " - msg="+e.getMessage(); + log.error(msg); + throw new HttpClient4xxBPMNError(msg,e.getHttpStatusCodeError()); + } + //Currently no remediation so just rethrow + throw e; + } + } } diff --git a/src/main/java/fr/insee/protools/backend/service/rem/RemService.java b/src/main/java/fr/insee/protools/backend/service/rem/RemService.java index 800d940f..0f34e068 100644 --- a/src/main/java/fr/insee/protools/backend/service/rem/RemService.java +++ b/src/main/java/fr/insee/protools/backend/service/rem/RemService.java @@ -17,6 +17,7 @@ import java.util.List; import java.util.Map; +import java.util.Optional; import static fr.insee.protools.backend.httpclients.configuration.ApiConfigProperties.KNOWN_API.KNOWN_API_REM; @@ -118,36 +119,20 @@ public SuIdMappingJson writeERASUList(long partitionId, List valu } - public PageResponse getPartitionAllInterroPaginated(Long partitionId, long page, Boolean hasAccount) { + public PageResponse getPartitionAllInterroPaginated(String partitionId, long page) { log.debug("partitionId={} - page={} - pageSizeGetInterro={} - hasAccount={}",partitionId,page,pageSizeGetInterro,hasAccount); ParameterizedTypeReference> typeReference = new ParameterizedTypeReference<>() { }; try { - PageResponse response; - if(hasAccount!=null) { - response = restClientHelper.getRestClient(KNOWN_API_REM) + PageResponse response = restClientHelper.getRestClient(KNOWN_API_REM) .get() .uri(uriBuilder -> uriBuilder - .path("interrogations/ids") + .path("interrogations") .queryParam("page", page) .queryParam("size", pageSizeGetInterro) .queryParam("partition_id", partitionId) - .queryParam("hasAccount", false) .build(partitionId)) .retrieve() .body(typeReference); - } - else { - response = restClientHelper.getRestClient(KNOWN_API_REM) - .get() - .uri(uriBuilder -> uriBuilder - .path("interrogations/ids") - .queryParam("page", page) - .queryParam("size", pageSizeGetInterro) - .queryParam("partition_id", partitionId) - .build(partitionId)) - .retrieve() - .body(typeReference); - } log.trace("partitionId={} - page={} - pageSizeGetInterro={} - response={} ", partitionId,page,pageSizeGetInterro, response.getContent().size()); return response; } diff --git a/src/main/java/fr/insee/protools/backend/service/rem/delegate/v2/RemGetPartitionListOfInterroPaginatedTask.java b/src/main/java/fr/insee/protools/backend/service/rem/delegate/v2/RemGetPartitionListOfInterroPaginatedTask.java index f4c8a40d..8d4cd42c 100644 --- a/src/main/java/fr/insee/protools/backend/service/rem/delegate/v2/RemGetPartitionListOfInterroPaginatedTask.java +++ b/src/main/java/fr/insee/protools/backend/service/rem/delegate/v2/RemGetPartitionListOfInterroPaginatedTask.java @@ -1,11 +1,11 @@ package fr.insee.protools.backend.service.rem.delegate.v2; import com.fasterxml.jackson.databind.JsonNode; -import fr.insee.protools.backend.dto.internal.ProtoolsInterrogationDto; import fr.insee.protools.backend.httpclients.pagination.PageResponse; import fr.insee.protools.backend.service.DelegateContextVerifier; import fr.insee.protools.backend.service.rem.RemService; import fr.insee.protools.backend.service.utils.FlowableVariableUtils; +import fr.insee.protools.backend.service.utils.delegate.PaginationHelper; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.flowable.engine.delegate.DelegateExecution; @@ -33,7 +33,7 @@ private PageResponse readFunction(Integer pageToRead, Object... objects) { @Override public void execute(DelegateExecution execution) { Long currentPartitionId = FlowableVariableUtils.getVariableOrThrow(execution, VARNAME_CURRENT_PARTITION_ID, Long.class); - getAndTreat(execution, VARNAME_REM_INTERRO_LIST_PAGEABLE_CURRENT_PAGE, VARNAME_REM_INTERRO_LIST_PAGEABLE_IS_LAST_PAGE, this::readFunction, currentPartitionId); + getAndTreat(execution, VARNAME_INTERRO_LIST_PAGEABLE_CURRENT_PAGE, VARNAME_INTERRO_LIST_PAGEABLE_IS_LAST_PAGE, this::readFunction, currentPartitionId); } @Override diff --git a/src/main/java/fr/insee/protools/backend/service/rem/delegate/v2/RemGetPartitionListOfInterroWithoutWebAccountPaginatedTask.java b/src/main/java/fr/insee/protools/backend/service/rem/delegate/v2/RemGetPartitionListOfInterroWithoutWebAccountPaginatedTask.java index 64b63676..800f036a 100644 --- a/src/main/java/fr/insee/protools/backend/service/rem/delegate/v2/RemGetPartitionListOfInterroWithoutWebAccountPaginatedTask.java +++ b/src/main/java/fr/insee/protools/backend/service/rem/delegate/v2/RemGetPartitionListOfInterroWithoutWebAccountPaginatedTask.java @@ -6,6 +6,7 @@ import fr.insee.protools.backend.service.DelegateContextVerifier; import fr.insee.protools.backend.service.rem.RemService; import fr.insee.protools.backend.service.utils.FlowableVariableUtils; +import fr.insee.protools.backend.service.utils.delegate.PaginationHelper; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.flowable.engine.delegate.DelegateExecution; @@ -21,19 +22,19 @@ @Slf4j @Component @RequiredArgsConstructor -public class RemGetPartitionListOfInterroWithoutWebAccountPaginatedTask implements JavaDelegate, DelegateContextVerifier, PaginationHelper { +public class RemGetPartitionListOfInterroWithoutWebAccountPaginatedTask implements JavaDelegate, DelegateContextVerifier, PaginationHelper { private final RemService remService; private PageResponse readFunction(Integer pageToRead, Object... objects) { Long partitionId = (Long) objects[0]; - return remService.getPartitionAllInterroPaginated(partitionId, pageToRead,null); + return remService.getPartitionAllInterroPaginated(partitionId, pageToRead,false); } @Override public void execute(DelegateExecution execution) { Long currentPartitionId = FlowableVariableUtils.getVariableOrThrow(execution, VARNAME_CURRENT_PARTITION_ID, Long.class); - getAndTreat(execution, VARNAME_REM_INTERRO_LIST_PAGEABLE_CURRENT_PAGE, VARNAME_REM_INTERRO_LIST_PAGEABLE_IS_LAST_PAGE, this::readFunction, currentPartitionId); + getAndTreat(execution, VARNAME_INTERRO_LIST_PAGEABLE_CURRENT_PAGE, VARNAME_INTERRO_LIST_PAGEABLE_IS_LAST_PAGE, this::readFunction, currentPartitionId); } @Override diff --git a/src/main/java/fr/insee/protools/backend/service/utils/ContextUtils.java b/src/main/java/fr/insee/protools/backend/service/utils/ContextUtils.java index 07096b7c..f20a9d50 100644 --- a/src/main/java/fr/insee/protools/backend/service/utils/ContextUtils.java +++ b/src/main/java/fr/insee/protools/backend/service/utils/ContextUtils.java @@ -12,6 +12,7 @@ import static fr.insee.protools.backend.service.context.ContextConstants.*; +//TODO : à déplacer dans ContextService?? public class ContextUtils { //TODO: supprimer?? @@ -44,6 +45,12 @@ public static Optional getPartitionNodeIfExists(JsonNode contextRootNo return Optional.ofNullable(currentPartitionNode); } + public static Optional getCommunicationFromPartition(JsonNode contextRootNode,String partitionId, String communicationId){ + return getPartitionNodeIfExists(contextRootNode,partitionId) + .map(partitionNode -> getCommunicationFromPartition(partitionNode,communicationId)) + .orElse(Optional.empty()); + } + public static Optional getCommunicationFromPartition(JsonNode partitionNode, String communicationId){ var communicationsIterator = partitionNode.path(CTX_PARTITION_COMMUNICATIONS).elements(); return StreamSupport.stream(((Iterable) () -> communicationsIterator).spliterator(), false) diff --git a/src/main/java/fr/insee/protools/backend/service/rem/delegate/v2/PaginationHelper.java b/src/main/java/fr/insee/protools/backend/service/utils/delegate/PaginationHelper.java similarity index 98% rename from src/main/java/fr/insee/protools/backend/service/rem/delegate/v2/PaginationHelper.java rename to src/main/java/fr/insee/protools/backend/service/utils/delegate/PaginationHelper.java index a54f41ef..8cf8b6a0 100644 --- a/src/main/java/fr/insee/protools/backend/service/rem/delegate/v2/PaginationHelper.java +++ b/src/main/java/fr/insee/protools/backend/service/utils/delegate/PaginationHelper.java @@ -1,4 +1,4 @@ -package fr.insee.protools.backend.service.rem.delegate.v2; +package fr.insee.protools.backend.service.utils.delegate; import com.fasterxml.jackson.databind.JsonNode; import fr.insee.protools.backend.httpclients.pagination.PageResponse; From 8fb9d932e5970073f20184b5f77ef3cbf9e166df Mon Sep 17 00:00:00 2001 From: SNDIL - Marc Date: Mon, 2 Sep 2024 15:35:30 +0200 Subject: [PATCH 51/75] en cours --- .../PlatinePilotageCreateCommunicationEventTaskREST.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/main/java/fr/insee/protools/backend/service/platine/delegate/v2/pilotatage/PlatinePilotageCreateCommunicationEventTaskREST.java b/src/main/java/fr/insee/protools/backend/service/platine/delegate/v2/pilotatage/PlatinePilotageCreateCommunicationEventTaskREST.java index f1e2d36c..445228eb 100644 --- a/src/main/java/fr/insee/protools/backend/service/platine/delegate/v2/pilotatage/PlatinePilotageCreateCommunicationEventTaskREST.java +++ b/src/main/java/fr/insee/protools/backend/service/platine/delegate/v2/pilotatage/PlatinePilotageCreateCommunicationEventTaskREST.java @@ -16,7 +16,6 @@ import java.util.List; import java.util.Map; -import static fr.insee.protools.backend.dto.platine.pilotage.v2.PlatinePilotageCommunicationEventType.COMMUNICATION_SENT; import static fr.insee.protools.backend.dto.platine.pilotage.v2.PlatinePilotageCommunicationEventType.COMMUNICATION_STATE_SENT; import static fr.insee.protools.backend.service.FlowableVariableNameConstants.*; import static fr.insee.protools.backend.service.utils.ContextUtils.getPartitionNodeIfExists; @@ -31,7 +30,6 @@ public class PlatinePilotageCreateCommunicationEventTaskREST implements JavaDele @Override public void execute(DelegateExecution execution) { - execution.getId() String currentCommunicationId= FlowableVariableUtils.getVariableOrThrow(execution, VARNAME_CURRENT_COMMUNICATION_ID, String.class); String currentPartitionId = FlowableVariableUtils.getVariableOrThrow(execution, VARNAME_CURRENT_PARTITION_ID, String.class); From c0b481a55a25914aa8581d60dce1a59d0d809008 Mon Sep 17 00:00:00 2001 From: SNDIL - Marc Date: Thu, 5 Sep 2024 08:39:44 +0200 Subject: [PATCH 52/75] json schema : en cours --- src/main/resources/context_schema.json | 1185 ++++++++++++++++++++++++ 1 file changed, 1185 insertions(+) create mode 100644 src/main/resources/context_schema.json diff --git a/src/main/resources/context_schema.json b/src/main/resources/context_schema.json new file mode 100644 index 00000000..f6180a79 --- /dev/null +++ b/src/main/resources/context_schema.json @@ -0,0 +1,1185 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "https://example.com/product.schema.json", + "title": "Contexte de processus", + "description": "Le contexte d'un processus", + "type": "object", + "required": [ + "id", + "labelCourt", + "label", + "contexte", + "metadonnees", + "partitions" + ], + "properties": { + "id": { + "description": "Identifiant de la campagne", + "type": "string", + "format": "uuid" + }, + "labelCourt": { + "description": "Nom technique de la campagne. Ex: PRO2024X03", + "type": "string" + }, + "label": { + "description": "Intitulé de la campagne", + "type": "string" + }, + "contexte": { + "description": "Indique s'il s'agit d'une campagne ménage ou entreprise", + "type": "string", + "enum": [ + "menage", + "entreprise" + ] + }, + "metadonnees": { + "type": "object", + "properties": { + "serieId": { + "description": "Identifiant métier de la série.", + "type": "string" + }, + "serieLabelCourt": { + "type": "string" + }, + "serieLabelLong": { + "type": "string" + }, + "periodicite": { + "description": "Périodicité de XXX. X: pluriannuelle; A: annuelle ; S: semestrielle ; T: trimestrielle; B: bi-mensuelle; M: mensuelle", + "enum": ["X", "A", "S", "T", "B", "M"], + "type": "string" + }, + "periode": { + "$ref": "#/$defs/periode" + }, + "annee": { + "description": "Année de la campagne", + "$ref": "#/$defs/annee4digit" + }, + "operationId": { + "description": "XXXX", + "type": "string" + }, + "operationLabelCourt": { + "description": "Label court de l'opération", + "type": "string" + }, + "operationLabelLong": { + "description": "Label long de l'opération", + "type": "string" + }, + "objectifsCourts": { + "description": "Objectifs de l'enquête (court)", + "type": "string" + }, + "objectifsLongs": { + "description": "Objectifs de l'enquête (long)", + "type": "string" + }, + "cnisUrl": { + "description": "URL de l'enquête sur le site du CNIS (Conseil national de l'information statistique)", + "type": "string" + }, + "diffusionUrl": { + "description": "XXXX", + "type": "string" + }, + "noticeUrl": { + "description": "XXXX", + "type": "string" + }, + "specimenUrl": { + "description": "XXXX", + "type": "string" + }, + "numeroVisa": { + "description": "Numéro de VISA de l'enquête", + "type": "string" + }, + "anneeVisa": { + "description": "Année du VISA", + "$ref": "#/$defs/annee4digit" + + }, + "caractereObligatoire": { + "description": "Caractère obligatoire de l'enquête", + "type": "boolean" + }, + "interetGeneral": { + "description": "L'enquête est elle d'intêret général", + "type": "boolean" + }, + "qualiteStatistique": { + "description": "XXXX", + "type": "boolean" + }, + "testNonLabellise": { + "description": "XXXX", + "type": "boolean" + }, + "parutionJo": { + "description": "XXXX", + "type": "boolean" + }, + "dateParutionJo": { + "type": "string", + "format": "date" + }, + "portailMesEnquetesOperation": { + "description": "XXXX", + "type": "boolean" + }, + "proprietaireId": { + "description": "XXXX (visiblement ca part dans les metadonnees proprietaire de platine)", + "type": "string" + }, + "proprietaireLabel": { + "description": "XXXX (visiblement ca part dans les metadonnees proprietaire de platine)", + "type": "string" + }, + "imageLogos": { + "description": "XXXX", + "type": "string" + }, + "ministereTutelle": { + "description": "Ministère de tutelle pour cette enquête", + "type": "string" + }, + "commanditaire": { + "description": "Commanditaire de cette enquête", + "type": "string" + }, + "responsableOperationnel": { + "description": "XXXX", + "type": "string" + }, + "mailResponsableOperationnel": { + "description": "XXXX", + "type": "string" + }, + "responsableTraitement": { + "description": "XXXX", + "type": "string" + }, + "responsableTraitementIdenti": { + "type": "string" + }, + "responsableTraitementIdentiFem": { + "description": "XXXX", + "type": "boolean" + }, + "urlResponsableTraitement": { + "description": "XXXX", + "type": "string" + }, + "prestataire": { + "description": "L'equête est elle réalisée par un prestataire", + "type": "boolean" + }, + "nomPrestataire": { + "description": "Nom du prestataire", + "type": "string" + }, + "urlPrestataire": { + "description": "URL du prestataire", + "type": "string" + }, + "logoPartenaire": { + "description": "Logo du partenaire", + "type": "string" + }, + "serviceCollecteurSignataireFonction": { + "description": "XXX", + "type": "string" + }, + "serviceCollecteurSignataireNom": { + "description": "XXX", + "type": "string" + }, + "imageLogoSignataire": { + "description": "XXX", + "type": "string" + }, + "assistanceTel": { + "description": "Numéro de téléphone pour l'assitance", + "type": "string" + }, + "assistanceMail": { + "description": "Moyen pour envoyer un mail à l'assistance", + "type": "string" + }, + "assistanceAdresseL1": { + "description": "Ligne 1 de l'adresse postale du service responsables de l'enquête", + "type": "string" + }, + "assistanceAdresseL2": { + "description": "Ligne 2 de l'adresse postale du service responsables de l'enquête", + "type": "string" + }, + "assistanceAdresseL3": { + "description": "Ligne 3 de l'adresse postale du service responsables de l'enquête", + "type": "string" + }, + "assistanceAdresseL4": { + "description": "Ligne 4 de l'adresse postale du service responsables de l'enquête", + "type": "string" + }, + "assistanceAdresseL5": { + "description": "Ligne 5 de l'adresse postale du service responsables de l'enquête", + "type": "string" + }, + "adresseRetourQL1": { + "description": "XXX", + "type": "string" + }, + "adresseRetourQL2": { + "description": "XXX", + "type": "string" + }, + "adresseRetourQL3": { + "description": "XXX", + "type": "string" + }, + "adresseRetourQL4": { + "description": "XXX", + "type": "string" + }, + "adresseRetourQL5": { + "description": "XXX", + "type": "string" + }, + "adresseRetourQL6": { + "description": "XXX", + "type": "string" + }, + "adresseRetourQL7": { + "description": "XXX", + "type": "string" + }, + "representantLegal": { + "description": "XXX", + "type": "boolean" + }, + "mineur": { + "description": "XXX", + "type": "boolean" + }, + "mineurDroit": { + "description": "XXX", + "type": "string" + }, + "dpd": { + "description:": "XXX délégué à la protection des données", + "type": "boolean" + }, + "mailDPD": { + "description:": "Courriel permettant de contacter le DPD", + "type": "string" + }, + "appariement": { + "description": "XXX", + "type": "boolean" + }, + "sourceAdmin": { + "description": "XXX", + "type": "string" + }, + "archivage": { + "description": "XXX", + "type": "boolean" + }, + "dureeConservation": { + "description": "Durée de conservation (textuelle)", + "type": "string" + }, + "dureeConservationIdenti": { + "description": "XXX", + "type": "string" + }, + "urlEnquete": { + "description": "XXX", + "type": "string" + }, + "incitationARepondre": { + "description": "XXX", + "type": "string" + }, + "mailBoiteRetour": { + "description": "XXX", + "type": "string" + }, + "themeMieuxConnaitreMail": { + "description": "Adresse de contact pour XXX", + "type": "string" + }, + "ville": { + "description": "XXX", + "type": "string" + }, + "complementOpportunite": { + "description": "XXX", + "type": "string" + }, + "paragrapheDonneesPersonnelles": { + "description": "XXX", + "type": "boolean" + }, + "messageOffline": { + "description": "XXX", + "type": "string" + }, + "messageInfoOffline": { + "type": "string" + }, + "configurationVerificationMail": { + "description": "XXX", + "type": "boolean" + }, + "imageResultat": { + "description": "XXX", + "type": "string" + }, + "paragrapheResultat": { + "description": "XXX", + "type": "string" + }, + "urlInformationEnquete": { + "description": "XXX", + "type": "string" + }, + "dureeConservationDonneesConnexion": { + "description": "XXX", + "type": "string" + }, + "urlAQuoiServentVosReponses": { + "description": "XXX", + "type": "string" + }, + "texteUrlAQuoiServentVosReponses": { + "description": "XXX", + "type": "string" + }, + "paragrapheAQuoiServentVosReponses": { + "description": "XXX", + "type": "string" + }, + "frequenceExtraction": { + "description": "XXX : Visiblement une expression de type cron ; préciser le format", + "type": "string" + }, + "cheminLivraisonDonnees": { + "description": "XXX", + "type": "string" + }, + "chiffrement": { + "description": "XXX", + "type": "string" + }, + "livraisonDifferentielle": { + "description": "XXX", + "type": "boolean" + }, + "formatLivraisonDonnees": { + "description": "XXX: ENUM?? String??", + "type": "string" + }, + "mailBoiteFonctionnelle": { + "description": "XXX", + "type": "string" + }, + "referents": { + "description": "XXX Référents sabiane; peuvent être principaux (sinon considérés comme secondaires) ", + "type": "array", + "items": { + "type": "object", + "properties": { + "nom": { + "type": "string" + }, + "prenom": { + "type": "string" + }, + "telephone": { + "type": "string" + }, + "principal": { + "type": "boolean" + } + }, + "required": [ + "nom", + "prenom", + "telephone", + "principal" + ] + } + }, + "champGeographiqueEnquete": { + "description": "Champ géographique de l'enquête. Ex: France entière", + "type": "string" + }, + "champStatistiqueEnquete": { + "description": "Champ statistique de l'enquête. Ex: Tous les majeurs du ménage", + "type": "string" + }, + "urlLoiStatistique": { + "description": "URL légifrance de la loi relative aux statistiques", + "type": "string" + }, + "urlLoiRGPD": { + "description": "URL du règlement européen relatif au RGPD", + "type": "string" + }, + "urlLoiInformatique": { + "description": "URL légifrance de la loi relative à l'informatique, aux fichiers et aux libertés", + "type": "string" + } + }, + "required": [ + "serieId", + "serieLabelCourt", + "serieLabelLong", + "periodicite", + "periode", + "annee", + "operationId", + "operationLabelCourt", + "operationLabelLong", + "objectifsCourts", + "objectifsLongs", + "cnisUrl", + "diffusionUrl", + "noticeUrl", + "specimenUrl", + "numeroVisa", + "anneeVisa", + "caractereObligatoire", + "interetGeneral", + "qualiteStatistique", + "testNonLabellise", + "parutionJo", + "dateParutionJo", + "portailMesEnquetesOperation", + "proprietaireId", + "proprietaireLabel", + "imageLogos", + "ministereTutelle", + "commanditaire", + "responsableOperationnel", + "mailResponsableOperationnel", + "responsableTraitement", + "responsableTraitementIdenti", + "responsableTraitementIdentiFem", + "urlResponsableTraitement", + "prestataire", + "nomPrestataire", + "urlPrestataire", + "logoPartenaire", + "serviceCollecteurSignataireFonction", + "serviceCollecteurSignataireNom", + "imageLogoSignataire", + "assistanceTel", + "assistanceMail", + "assistanceAdresseL1", + "assistanceAdresseL2", + "assistanceAdresseL3", + "assistanceAdresseL4", + "assistanceAdresseL5", + "adresseRetourQL1", + "adresseRetourQL2", + "adresseRetourQL3", + "adresseRetourQL4", + "adresseRetourQL5", + "adresseRetourQL6", + "adresseRetourQL7", + "representantLegal", + "mineur", + "mineurDroit", + "dpd", + "mailDPD", + "appariement", + "sourceAdmin", + "archivage", + "dureeConservation", + "dureeConservationIdenti", + "urlEnquete", + "incitationARepondre", + "mailBoiteRetour", + "themeMieuxConnaitreMail", + "ville", + "complementOpportunite", + "paragrapheDonneesPersonnelles", + "messageOffline", + "messageInfoOffline", + "configurationVerificationMail", + "imageResultat", + "paragrapheResultat", + "urlInformationEnquete", + "dureeConservationDonneesConnexion", + "urlAQuoiServentVosReponses", + "texteUrlAQuoiServentVosReponses", + "paragrapheAQuoiServentVosReponses", + "frequenceExtraction", + "cheminLivraisonDonnees", + "chiffrement", + "livraisonDifferentielle", + "formatLivraisonDonnees", + "mailBoiteFonctionnelle", + "referents", + "champGeographiqueEnquete", + "champStatistiqueEnquete", + "urlLoiStatistique", + "urlLoiRGPD", + "urlLoiInformatique" + ] + }, + "lots": { + "type": "array", + "items": { + "type": "object", + "properties": { + "id": { + "description": "Identifiant technique du lot", + "type": "string", + "format": "uuid" + }, + "label": { + "description": "Description courte du lot", + "type": "string" + }, + "lotsEnLien": { + "description": "Lots précédants et suivants pour les remises en collecte", + "type": "array", + "items": { + "type": "object", + "properties": { + "id": { + "description": "Identifiant technique du lot lié", + "type": "string", + "format": "uuid" + }, + "lien": { + "description": "XXXX : Lien entre le lot lié et le lot décrit. Ex: precedent ==> le lot en lien precede le lot actuel ", + "type": "string", + "enum": ["precedent", "suivant"] + }, + "regleRemiseCollecte": { + "description": "XXXX", + "type": "string" + } + }, + "required": [ + "id", + "lien", + "regleRemiseCollecte" + ] + } + }, + "typeEchantillon": { + "description": "Type d'échantillon ", + "enum": ["logement", "individu"] + }, + "modesCollecte": { + "description": "Modes de collecte de l'échantillon CAPI=XXX...", + "type": "array", + "uniqueItems": true, + "minItems": 1, + "items": { + "enum": [ + "CATI", + "CAPI", + "CAWI", + "PAPI" + ] + } + }, + "dateDebutVisibiliteGestionnaire": { + "description": "Date de visibilité du lot dans XXX pour XXX", + "type": "string", + "format": "date-time" + }, + "dateDebutVisibiliteEnqueteur": { + "description": "Date de visibilité du lot dans Sabiane pour les enquêteurs XXX", + "type": "string", + "format": "date-time" + }, + "dateDebutReperage": { + "description": "XXX", + "type": "string", + "format": "date-time" + }, + "dateDebutCollecte": { + "description": "Date de début de la collecte", + "type": "string", + "format": "date-time" + }, + "dateFinCollecte": { + "description": "Date de fin de la collecte", + "type": "string", + "format": "date-time" + }, + "dateFinTraitementGestionnaire": { + "description": "XXX", + "type": "string", + "format": "date-time" + }, + "dateFinTraitementReprise": { + "description": "XXX", + "type": "string", + "format": "date-time" + }, + "dateRetour": { + "description": "XXX", + "type": "string", + "format": "date-time" + }, + "questionnaireModeles": { + "description": "XXX Liste des modèles de questionnaires possibles pour les interrogations de ce lot", + "type": "array", + "minItems": 1, + "items": { + "type": "string" + } + }, + "moduleCommentaire": { + "description": "XXX", + "type": "boolean" + }, + "svi": { + "description": "XXX", + "type": "boolean" + }, + "codeEnquete": { + "description": "XXX", + "type": "string" + }, + "rangInterrogation": { + "description": "XXX", + "type": "string", + "enum": ["entrant", "intermediaire", "sortant"] + }, + "reperage": { + "description": "XXX", + "type": "string", + "enum": ["aucun", "faf_logement", "faf_individu", "telephone"] + }, + "essaisContact": { + "description": "XXX", + "type": "string" + }, + "bilanContact": { + "description": "XXX", + "type": "string" + }, + "sitesGestion": { + "description": "XXX: Sites de gestion opale XXX. doit on mettre un minItems?? potentiellement oui si sitesGestion n'est pas obligatoire", + "type": "array", + "items": { + "type": "object", + "properties": { + "idSite": { + "description": "XXX: Identifiant du site de gestion opale", + "type": "string" + }, + "assistanceMail": { + "description": "Adresse de contact pour l'assistance", + "type": "string" + }, + "assistanceTel": { + "description": "Numéro de téléphone de contact pour l'assitance", + "type": "string" + }, + "envoiCourrier": { + "description": "XXX", + "type": "boolean" + } + }, + "required": [ + "idSite", + "assistanceMail", + "assistanceTel", + "envoiCourrier" + ] + } + }, + "dureeQuestionnaire": { + "description": "Indication sur la durée du questionnaire", + "type": "string" + }, + "pasAccesInternet": { + "description": "XXX", + "type": "boolean" + }, + "numeroSequence": { + "description": "XXX", + "type": "string" + }, + "themeSequence": { + "description": "XXX", + "type": "string" + }, + "documentsPourRepondre": { + "description": "XXX", + "type": "string" + }, + "partieDeroulementEnquete": { + "description": "XXX", + "type": "boolean" + }, + "deroulementEnquete": { + "description": "XXX", + "type": "string" + }, + "imageDeroulementEnquete": { + "description": "XXX", + "type": "string" + }, + "periodePrecedenteInterrogation": { + "description": "XXX", + "type": "string" + }, + "relanceNonRepondantsWeb": { + "description": "XXX", + "type": "string" + }, + "utilisationInfo": { + "description": "XXX", + "type": "string" + }, + "utilisationInfoExemple": { + "description": "XXX", + "type": "string" + }, + "postEnquete": { + "description": "XXX", + "type": "boolean" + }, + "postEnqueteParagraphe": { + "description": "XXX", + "type": "string" + }, + "rapprochement": { + "description": "XXX", + "type": "boolean" + }, + "courrierConsigneWeb1": { + "description": "XXX", + "type": "string" + }, + "courrierConsigneWeb2": { + "description": "XXX", + "type": "string" + }, + "imageCommentRepondre": { + "description": "XXX", + "type": "string" + }, + "imageCommentRepondreSansMDP": { + "description": "XXX", + "type": "string" + }, + "imageRepondreInternet": { + "description": "XXX", + "type": "string" + }, + "papierNombre": { + "description": "XXX", + "type": "string" + }, + "papierConsigne": { + "description": "XXX", + "type": "string" + }, + "papierNombreQuest": { + "description": "XXX", + "type": "string" + }, + "consigne1": { + "description": "XXX", + "type": "string" + }, + "consigne2": { + "description": "XXX", + "type": "string" + }, + "consigne3": { + "description": "XXX", + "type": "string" + }, + "imageQrCode": { + "description": "XXX", + "type": "string" + }, + "repriseManuelle": { + "description": "XXX", + "type": "boolean" + }, + "quiRepondPageDeGarde1": { + "description": "XXX: Qui répond pour sabiane", + "type": "string" + }, + "quiRepondPageDeGarde2": { + "description": "XXX: Qui répond pour sabiane", + "type": "string" + }, + "quiRepondPageDeGarde3": { + "description": "XXX: Qui répond pour sabiane", + "type": "string" + }, + "quiRepondCommunication": { + "description": "XXX: ", + "type": "string" + }, + "quiRepondCommunication1": { + "description": "XXX: ", + "type": "string" + }, + "quiRepondCommunication2": { + "description": "XXX: ", + "type": "string" + }, + "quiRepondCommunication3": { + "description": "XXX: ", + "type": "string" + }, + "relanceQuiSollicite": { + "description": "XXX: ", + "type": "string" + }, + "communications": { + "description": "Configuration des communications du lot", + "type": "array", + "items": { + "type": "object", + "properties": { + "id": { + "description": "Identifiant technique de la communication", + "type": "string", + "format": "uuid" + }, + "label": { + "description": "Label pour la communication", + "type": "string" + }, + "echeance": { + "description": "Horodatage de l'échéance d'envoi de la communication", + "type": "string", + "format": "date-time" + }, + "moyenCommunication": { + "description": "Moyen de communication à utiliser", + "type": "string", + "enum": ["courrier", "mail"] + }, + "typeCommunication": { + "description": "Type de communication. XXX: ya il autre chose qu'ouverture et relance???", + "type": "string", + "enum": ["ouverture", "relance"] + }, + "modeleCommunication": { + "description": "XXX:", + "type": "string" + }, + "questionnairePapier": { + "description": "XXX:", + "type": "boolean" + }, + "objetMail": { + "description": "XXX: Pour une communication par mail : Objet du mail", + "type": "string" + }, + "dateEdition": { + "description": "XXX:", + "type": "string" + }, + "moisEditionOuverture": { + "description": "XXX:", + "type": "string" + }, + "moisEditionOuvertureTelephone": { + "description": "XXX:", + "type": "string" + }, + "relanceLibreParagraphe1": { + "description": "XXX:", + "type": "string" + }, + "relanceLibreParagraphe2": { + "description": "XXX:", + "type": "string" + }, + "relanceLibreParagraphe3": { + "description": "XXX:", + "type": "string" + }, + "relanceLibreParagraphe4": { + "description": "XXX:", + "type": "string" + }, + "complementConnexion": { + "description": "XXX:", + "type": "string" + }, + "typeQuestionnaire": { + "description": "XXX: Chaine affichée sur les courriers", + "type": "string" + }, + "idOperationEditique": { + "description": "XXX: (ca semble important ce truc)", + "type": "string" + }, + "partieNomFichierLibreZip": { + "description": "XXX:", + "type": "string" + }, + "bat": { + "description": "XXX:", + "type": "boolean" + }, + "rnvp": { + "description": "XXX: Restructuration, normalisation et validation postale", + "type": "boolean" + }, + "accuseReception": { + "description": "Indique si l'envoi se fait avec accusé de réception", + "type": "boolean" + }, + "introMail": { + "description": "XXX:", + "type": "string" + } + }, + "required": [ + "id", + "label", + "echeance", + "moyenCommunication", + "typeCommunication", + "modeleCommunication", + "questionnairePapier", + "objetMail", + "dateEdition", + "moisEditionOuverture", + "moisEditionOuvertureTelephone", + "relanceLibreParagraphe1", + "relanceLibreParagraphe2", + "relanceLibreParagraphe3", + "relanceLibreParagraphe4", + "complementConnexion", + "typeQuestionnaire", + "idOperationEditique", + "partieNomFichierLibreZip", + "bat", + "rnvp", + "accuseReception", + "introMail" + ] + } + } + }, + "required": [ + "id", + "label", + "lotsEnLien", + "typeEchantillon", + "modeCollecte", + "dateDebutVisibiliteGestionnaire", + "dateDebutVisibiliteEnqueteur", + "dateDebutReperage", + "dateDebutCollecte", + "dateFinCollecte", + "dateFinTraitementGestionnaire", + "dateFinTraitementReprise", + "dateRetour", + "questionnaireModel", + "moduleCommentaire", + "svi", + "codeEnquete", + "rangInterrogation", + "reperage", + "essaisContact", + "bilanContact", + "sitesGestion", + "dureeQuestionnaire", + "pasAccesInternet", + "numeroSequence", + "themeSequence", + "documentsPourRepondre", + "partieDeroulementEnquete", + "deroulementEnquete", + "imageDeroulementEnquete", + "periodePrecedenteInterrogation", + "relanceNonRepondantsWeb", + "utilisationInfo", + "utilisationInfoExemple", + "postEnquete", + "postEnqueteParagraphe", + "rapprochement", + "courrierConsigneWeb1", + "courrierConsigneWeb2", + "imageCommentRepondre", + "imageCommentRepondreSansMDP", + "imageRepondreInternet", + "papierNombre", + "papierConsigne", + "papierNombreQuest", + "consigne1", + "consigne2", + "consigne3", + "imageQrCode", + "repriseManuelle", + "quiRepondPageDeGarde1", + "quiRepondPageDeGarde2", + "quiRepondPageDeGarde3", + "quiRepondCommunication", + "quiRepondCommunication1", + "quiRepondCommunication2", + "quiRepondCommunication3", + "relanceQuiSollicite", + "communications" + ] + } + } + }, + "$defs": { + "annee4digit": { + "type": "integer", + "minimum": 1000, + "maximum": 9999 + }, + "periode": { + "description": "XXX. A00: annuelle; X00-X99: pluriannuelle; S01-02: 1er et 2nd semestre; T1-4: 1er-4e trimestre; M01-M12: Mois de l'année; B01-B06: Bimestre dans l'année ", + "type": "string", + "enum": [ + "A00", + "X00", + "X01", + "X02", + "X03", + "X04", + "X05", + "X06", + "X07", + "X08", + "X09", + "X10", + "X11", + "X12", + "X13", + "X14", + "X15", + "X16", + "X17", + "X18", + "X19", + "X20", + "X21", + "X22", + "X23", + "X24", + "X25", + "X26", + "X27", + "X28", + "X29", + "X30", + "X31", + "X32", + "X33", + "X34", + "X35", + "X36", + "X37", + "X38", + "X39", + "X40", + "X41", + "X42", + "X43", + "X44", + "X45", + "X46", + "X47", + "X48", + "X49", + "X50", + "X51", + "X52", + "X53", + "X54", + "X55", + "X56", + "X57", + "X58", + "X59", + "X60", + "X61", + "X62", + "X63", + "X64", + "X65", + "X66", + "X67", + "X68", + "X69", + "X70", + "X71", + "X72", + "X73", + "X74", + "X75", + "X76", + "X77", + "X78", + "X79", + "X80", + "X81", + "X82", + "X83", + "X84", + "X85", + "X86", + "X87", + "X88", + "X89", + "X90", + "X91", + "X92", + "X93", + "X94", + "X95", + "X96", + "X97", + "X98", + "X99", + "S01", + "S02", + "T01", + "T02", + "T03", + "T04", + "M01", + "M02", + "M03", + "M04", + "M05", + "M06", + "M07", + "M08", + "M09", + "M10", + "M11", + "M12", + "B01", + "B02", + "B03", + "B04", + "B05", + "B06" + ] + } + } +} From 3b4072fbc478d480a7805eb1a5d40c8a586c5fd2 Mon Sep 17 00:00:00 2001 From: SNDIL - Marc Date: Thu, 5 Sep 2024 10:18:33 +0200 Subject: [PATCH 53/75] json schema : en cours --- src/main/resources/context_schema.json | 184 +++++++++++++++++++------ 1 file changed, 141 insertions(+), 43 deletions(-) diff --git a/src/main/resources/context_schema.json b/src/main/resources/context_schema.json index f6180a79..1284ca91 100644 --- a/src/main/resources/context_schema.json +++ b/src/main/resources/context_schema.json @@ -10,7 +10,9 @@ "label", "contexte", "metadonnees", - "partitions" + "lots", + "questionnairesModeles", + "nomenclatures" ], "properties": { "id": { @@ -49,7 +51,14 @@ }, "periodicite": { "description": "Périodicité de XXX. X: pluriannuelle; A: annuelle ; S: semestrielle ; T: trimestrielle; B: bi-mensuelle; M: mensuelle", - "enum": ["X", "A", "S", "T", "B", "M"], + "enum": [ + "X", + "A", + "S", + "T", + "B", + "M" + ], "type": "string" }, "periode": { @@ -102,7 +111,6 @@ "anneeVisa": { "description": "Année du VISA", "$ref": "#/$defs/annee4digit" - }, "caractereObligatoire": { "description": "Caractère obligatoire de l'enquête", @@ -383,7 +391,7 @@ "type": "boolean" }, "formatLivraisonDonnees": { - "description": "XXX: ENUM?? String??", + "description": "Format de livraison des données par le produit traiter", "type": "string" }, "mailBoiteFonctionnelle": { @@ -394,28 +402,28 @@ "description": "XXX Référents sabiane; peuvent être principaux (sinon considérés comme secondaires) ", "type": "array", "items": { - "type": "object", - "properties": { - "nom": { - "type": "string" - }, - "prenom": { - "type": "string" - }, - "telephone": { - "type": "string" - }, - "principal": { - "type": "boolean" - } + "type": "object", + "properties": { + "nom": { + "type": "string" }, - "required": [ - "nom", - "prenom", - "telephone", - "principal" - ] - } + "prenom": { + "type": "string" + }, + "telephone": { + "type": "string" + }, + "principal": { + "type": "boolean" + } + }, + "required": [ + "nom", + "prenom", + "telephone", + "principal" + ] + } }, "champGeographiqueEnquete": { "description": "Champ géographique de l'enquête. Ex: France entière", @@ -564,7 +572,10 @@ "lien": { "description": "XXXX : Lien entre le lot lié et le lot décrit. Ex: precedent ==> le lot en lien precede le lot actuel ", "type": "string", - "enum": ["precedent", "suivant"] + "enum": [ + "precedent", + "suivant" + ] }, "regleRemiseCollecte": { "description": "XXXX", @@ -580,7 +591,10 @@ }, "typeEchantillon": { "description": "Type d'échantillon ", - "enum": ["logement", "individu"] + "enum": [ + "logement", + "individu" + ] }, "modesCollecte": { "description": "Modes de collecte de l'échantillon CAPI=XXX...", @@ -588,12 +602,7 @@ "uniqueItems": true, "minItems": 1, "items": { - "enum": [ - "CATI", - "CAPI", - "CAWI", - "PAPI" - ] + "$ref": "#/$defs/modesDeCollecte" } }, "dateDebutVisibiliteGestionnaire": { @@ -636,13 +645,13 @@ "type": "string", "format": "date-time" }, - "questionnaireModeles": { - "description": "XXX Liste des modèles de questionnaires possibles pour les interrogations de ce lot", + "questionnairesModeles": { + "description": "XXX Liste des identifiants des modèles de questionnaires possibles pour les interrogations de ce lot. Ils doivent tous être décrits dans questionnairesModeles", "type": "array", "minItems": 1, "items": { - "type": "string" - } + "type": "string" + } }, "moduleCommentaire": { "description": "XXX", @@ -659,12 +668,21 @@ "rangInterrogation": { "description": "XXX", "type": "string", - "enum": ["entrant", "intermediaire", "sortant"] + "enum": [ + "entrant", + "intermediaire", + "sortant" + ] }, "reperage": { "description": "XXX", "type": "string", - "enum": ["aucun", "faf_logement", "faf_individu", "telephone"] + "enum": [ + "aucun", + "faf_logement", + "faf_individu", + "telephone" + ] }, "essaisContact": { "description": "XXX", @@ -872,12 +890,18 @@ "moyenCommunication": { "description": "Moyen de communication à utiliser", "type": "string", - "enum": ["courrier", "mail"] + "enum": [ + "courrier", + "mail" + ] }, "typeCommunication": { "description": "Type de communication. XXX: ya il autre chose qu'ouverture et relance???", "type": "string", - "enum": ["ouverture", "relance"] + "enum": [ + "ouverture", + "relance" + ] }, "modeleCommunication": { "description": "XXX:", @@ -985,7 +1009,7 @@ "label", "lotsEnLien", "typeEchantillon", - "modeCollecte", + "modesCollecte", "dateDebutVisibiliteGestionnaire", "dateDebutVisibiliteEnqueteur", "dateDebutReperage", @@ -994,7 +1018,7 @@ "dateFinTraitementGestionnaire", "dateFinTraitementReprise", "dateRetour", - "questionnaireModel", + "questionnairesModeles", "moduleCommentaire", "svi", "codeEnquete", @@ -1042,6 +1066,71 @@ "communications" ] } + }, + "questionnairesModeles": { + "description": "Tous les modèles de questionnaires dont les id sont référencés dans les lots de ce contexte sont décrits ici", + "type": "array", + "items": { + "type": "object", + "properties": { + "id": { + "description": "Identifiant du modèle de questionnaire", + "type": "string" + }, + "modeCollecte": { + "description": "Mode de collecte de l'échantillon CAPI=XXX...", + "$ref": "#/$defs/modesDeCollecte" + }, + "cheminRepertoire": { + "description": "XXX:(à modifier pour mettre une URL??) : Chemin du répertoire où le modèle de questionnaire est déposé sur gitlab", + "type": "string" + }, + "label": { + "description": "Un label pour le modèle", + "type": "string" + }, + "nomenclatureReferencees": { + "description": "Liste des identifiants des nomenclatures référencées par le modèle de questionnaire", + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "required": [ + "id", + "modeCollecte", + "cheminRepertoire", + "label", + "nomenclaturesReferencees" + ] + }, + "nomenclatures": { + "description": "Toutes les nommenclatures référencées par au moins un modèle de questionnaire sont décrites ici", + "type": "array", + "items": { + "type": "object", + "properties": { + "id": { + "description": "Identifiant de la nomenclature", + "type": "string" + }, + "cheminRepertoire": { + "description": "XXX:(à modifier pour mettre une URL??) : Chemin du répertoire où la nomenclature est déposée sur gitlab", + "type": "string" + }, + "label": { + "description": "Un label pour la nomenclature", + "type": "string" + } + }, + "required": [ + "id", + "cheminRepertoire", + "label" + ] + } } }, "$defs": { @@ -1050,6 +1139,15 @@ "minimum": 1000, "maximum": 9999 }, + "modesDeCollecte": { + "type": "string", + "enum": [ + "CATI", + "CAPI", + "CAWI", + "PAPI" + ] + }, "periode": { "description": "XXX. A00: annuelle; X00-X99: pluriannuelle; S01-02: 1er et 2nd semestre; T1-4: 1er-4e trimestre; M01-M12: Mois de l'année; B01-B06: Bimestre dans l'année ", "type": "string", From 5168e5799a198d195390b17f8abc7bca2f4cc763 Mon Sep 17 00:00:00 2001 From: SNDIL - Marc Date: Mon, 9 Sep 2024 16:38:21 +0200 Subject: [PATCH 54/75] json schema : en cours --- .../ProtoolsProcessControllerAdvice.java | 4 +- .../backend/controller/StarterController.java | 11 +- .../service/utils/ContextUtils.java | 30 ++ .../backend/dto/era/CensusJsonDto.java | 28 -- .../protools/backend/dto/era/GenderType.java | 37 -- .../internal/ProtoolsInterrogationDto.java | 1 - .../platine/pilotage/PlatineAddressDto.java | 24 -- .../PlatinePilotageCommunicationEventDto.java | 2 +- ...PlatinePilotageCommunicationEventType.java | 14 + .../pilotage/PlatinePilotageEligibleDto.java | 9 - .../pilotage/PlatinePilotageGenderType.java | 16 - .../pilotage/contact/PlatineContactDto.java | 23 -- .../query/ContactAccreditationDto.java | 22 -- .../query/QuestioningWebclientDto.java | 18 - .../PlatineQuestioningSurveyUnitDto.java | 17 - .../MetadataConstants.java | 27 -- .../NomenclatureDto.java | 14 - .../QuestionnaireModelCreateDto.java | 19 - .../campaign/CampaignDto.java | 23 -- .../campaign/MetadataValue.java | 15 - .../campaign/MetadataValueItem.java | 16 - .../campaign/MetadataVariables.java | 17 - .../surveyunit/SurveyUnitResponseDto.java | 19 - .../dto/rem/AdditionalInformationDto.java | 15 - .../protools/backend/dto/rem/EmailDto.java | 16 - .../backend/dto/rem/LocationHelpDto.java | 23 -- .../backend/dto/rem/OtherIdentifierDto.java | 26 -- .../protools/backend/dto/rem/PersonDto.java | 31 -- .../backend/dto/rem/PhoneNumberDto.java | 16 - .../backend/dto/rem/REMAddressDto.java | 28 -- .../backend/dto/rem/REMPhoneSource.java | 5 - .../backend/dto/rem/REMSurveyUnitDto.java | 36 -- .../protools/backend/dto/rem/SampleDto.java | 18 - .../backend/dto/rem/SuIdMappingJson.java | 18 - .../backend/dto/rem/SuIdMappingRecord.java | 5 - .../dto/rem_tmp/InterrogationAccountDto.java | 166 ++++++++ .../dto/sabiane/pilotage/AddressDto.java | 57 --- .../sabiane/pilotage/CampaignContextDto.java | 23 -- .../pilotage/ContactAttemptConfiguration.java | 47 --- .../pilotage/ContactOutcomeConfiguration.java | 47 --- .../pilotage/IdentificationConfiguration.java | 49 --- .../dto/sabiane/pilotage/PhoneNumber.java | 10 - .../dto/sabiane/pilotage/ReferentDto.java | 17 - .../sabiane/pilotage/SabianePersonDto.java | 29 -- .../pilotage/SabianePhoneNumberDto.java | 18 - .../dto/sabiane/pilotage/SabianeTitle.java | 15 - .../pilotage/SampleIdentifiersDto.java | 26 -- .../backend/dto/sabiane/pilotage/Source.java | 5 - .../dto/sabiane/pilotage/StateDto.java | 16 - .../dto/sabiane/pilotage/StateType.java | 51 --- .../pilotage/SurveyUnitContextDto.java | 25 -- .../pilotage/VisibilityContextDto.java | 51 --- .../backend/flowable/types/ListLong.java | 8 +- .../FlowcontrolIsSUToFollowUp.java | 52 --- .../webclient/KeycloakHeadersFilter.java | 43 --- .../webclient/WebClientHelper.java | 309 --------------- .../restclient/RestClientHelper.java | 60 ++- ...RestClientKeycloakHeadersInitializer.java} | 16 +- .../configuration/APIProperties.java | 2 +- .../configuration/ApiConfigProperties.java | 12 +- .../exception/ApiNotConfiguredBPMNError.java | 2 +- .../KeycloakTokenConfigBPMNError.java | 2 +- ...KeycloakTokenConfigUncheckedBPMNError.java | 2 +- .../runtime/HttpClient4xxBPMNError.java | 2 +- .../runtime/HttpClient5xxBPMNError.java | 2 +- .../HttpClientNetworkExceptionBPMNError.java | 2 +- .../HttpClientNullReturnBPMNError.java | 2 +- .../HttpClientRequestExceptionBPMNError.java | 2 +- .../keycloak/KeycloakResponse.java | 2 +- .../keycloak/KeycloakService.java | 7 +- .../keycloak/Token.java | 2 +- .../pagination/PageResponse.java | 3 +- .../service/DelegateContextVerifier.java | 17 + .../FlowableVariableNameConstants.java | 9 +- .../platine_sabiane/QuestionnaireHelper.java | 330 ---------------- .../QuestionnairePlatineSabianeService.java | 203 ---------- .../service/context/ContextService.java | 14 +- .../service/context/ContextServiceImpl.java | 237 ++++++------ .../exception/BadContexMissingBPMNError.java | 10 + .../BadContextJSONValidationBPMNError.java | 15 + .../resolvers/PartitionCtxResolver.java | 95 ++--- .../era/EraGetSUForPeriodAndGenderTask.java | 91 ----- .../backend/service/era/EraService.java | 44 --- ...huggahCreateCommunicationsContextTask.java | 173 --------- .../MeshuggahSendCommunicationsForSUTask.java | 150 -------- ...SendOpeningMailCommunicationForSUTask.java | 118 ------ .../service/meshuggah/MeshuggahService.java | 82 +--- .../service/meshuggah/MeshuggahUtils.java | 154 -------- .../MeshuggahCreateContextTaskREST.java | 34 ++ ...unicationForInterrogationListTaskREST.java | 18 +- ...enclatureFromStaticWebsiteServiceImpl.java | 46 --- .../nomenclature/NomenclatureService.java | 13 - .../PlatinePilotageCreateContextTask.java | 223 ----------- ...nePilotageCreateInterrogationListTask.java | 202 ---------- .../PlatinePilotageCreateSurveyUnitTask.java | 29 -- .../PlatinePilotageGetSUContactTask.java | 59 --- .../PlatinePilotageGetSUIsToFollowUpTask.java | 57 --- ...PlatineQuestionnaireCreateContextTask.java | 109 ------ ...stionnaireCreateInterrogationListTask.java | 36 -- ...tineQuestionnaireCreateSurveyUnitTask.java | 35 -- ...otageCreateCommunicationEventTaskREST.java | 11 +- .../PlatinePilotageCreateContextTaskREST.java | 8 +- ...lotageCreateInterrogationListTaskREST.java | 9 +- ...tOfInterroToFollowUpPaginatedTaskREST.java | 51 +++ ...ineQuestionnaireCreateContextTaskREST.java | 6 +- ...nnaireCreateInterrogationListTaskREST.java | 9 +- .../pilotage/PlatinePilotageService.java | 159 -------- .../pilotage/metadata/CampaignDto.java | 14 - .../pilotage/metadata/MetadataDto.java | 26 -- .../platine/pilotage/metadata/OwnerDto.java | 15 - .../pilotage/metadata/PartitioningDto.java | 17 - .../platine/pilotage/metadata/PeriodEnum.java | 145 ------- .../pilotage/metadata/PeriodicityEnum.java | 26 -- .../platine/pilotage/metadata/SourceDto.java | 15 - .../platine/pilotage/metadata/SupportDto.java | 20 - .../platine/pilotage/metadata/SurveyDto.java | 26 -- .../PlatineQuestionnaireService.java | 30 -- .../service/PlatinePilotageService.java | 99 +++++ .../service/PlatineQuestionnaireService.java | 45 +++ .../service/platine/utils/PlatineHelper.java | 43 --- ...aireModelFromStaticWebsiteServiceImpl.java | 47 --- .../QuestionnaireModelService.java | 14 - .../backend/service/rem/RemDtoUtils.java | 113 ------ .../backend/service/rem/RemService.java | 184 ++++----- ...ExtractContactIdentifierFromREMSUTask.java | 47 --- ...etPartitionListOfInterroPaginatedTask.java | 10 +- .../RemGetPartitionListOfSuIdTask.java | 35 -- .../service/rem/delegate/RemGetSUTask.java | 38 -- .../RemPostResmiseEnCollecteTaskREST.java | 35 ++ .../RemPutContactPlatineTaskREST.java | 35 ++ .../rem/delegate/RemWriteEraSUListTask.java | 54 --- ...InterroWithoutWebAccountPaginatedTask.java | 62 --- .../service/sabiane/SabianeIdHelper.java | 15 - .../SabianePilotageCreateContextTask.java | 278 -------------- .../delegate/SabianePilotageCreateSUTask.java | 359 ------------------ ...SabianeQuestionnaireCreateContextTask.java | 86 ----- .../SabianeQuestionnaireCreateSUTask.java | 36 -- .../pilotage/SabianePilotageService.java | 53 --- .../SabianeQuestionnaireService.java | 33 -- .../sugoi/SugoiCreateUserListTask.java | 102 ----- .../service/sugoi/SugoiCreateUserTask.java | 93 ----- .../backend/service/sugoi/SugoiService.java | 22 +- .../{v2 => delegate}/CleanPasswordsTask.java | 5 +- .../{ => delegate}/CleanUserPasswordTask.java | 4 +- .../LogCredentialsTask.java} | 7 +- ...SugoiREMCreateMissingAccountListTask.java} | 42 +- .../traiterXXXX/TraiterXXXService.java | 47 +++ .../TraiterXXXCreateContextTaskREST.java | 34 ++ ...TraiterXXXGetRemiseEnCollecteTaskREST.java | 36 ++ .../backend/service/utils/ContextUtils.java | 77 ---- .../DefaultCallServiceInterroListTask.java | 19 +- .../utils/delegate/PaginationHelper.java | 2 +- .../proto_platine_pagination_v1.bpmn | 302 +++++++++++++++ .../backend/StarterApplicationTests.java | 8 + .../controller/StarterControllerTest.java | 5 +- .../flowable/engine/SimpleProcessTest.java | 0 .../integration/EraREMProcessTest.java | 23 +- .../restclient/RestClientHelperTest.java | 21 +- .../webclient/KeycloakServiceTest.java | 10 +- .../webclient/RestClientHelperTest.java} | 101 ++--- .../service/context/ContextServiceTest.java | 0 ...ahCreateCommunicationsContextTaskTest.java | 8 +- .../meshuggah/MeshuggahCtxExamples.java | 0 ...OpeningMailCommunicationForSUTaskTest.java | 12 +- .../PlatinePilotageCreateContextTaskTest.java | 8 +- ...atinePilotageCreateSurveyUnitTaskTest.java | 20 +- .../PlatinePilotageGetSUContactTaskTest.java | 14 +- ...ineQuestionnaireCreateContextTaskTest.java | 9 +- ...QuestionnaireCreateSurveyUnitTaskTest.java | 11 +- ...tinePilotageCreateContextTaskRESTTest.java | 72 ++++ .../platine/utils/PlatineHelperTest.java | 7 +- .../backend/service/rem/RemDtoUtilsTest.java | 4 +- ...actContactIdentifierFromREMSUTaskTest.java | 0 .../RemGetPartitionListOfSuIdTaskTest.java | 8 +- .../rem/delegate/RemGetSUTaskTest.java | 2 +- .../delegate/RemWriteEraSUListTaskTest.java | 12 +- .../service/sabiane/SabianeIdHelperTest.java | 0 .../sabiane/delegate/SabianeCtxExamples.java | 0 .../SabianePilotageCreateContextTaskTest.java | 0 .../SabianePilotageCreateSUTaskTest.java | 10 +- ...aneQuestionnaireCreateContextTaskTest.java | 7 +- .../SabianeQuestionnaireCreateSUTaskTest.java | 6 +- .../sugoi/SugoiCreateUserTaskTest.java | 0 .../service/utils/ContextUtilsTest.java | 9 +- .../utils/FlowableVariableUtilsTest.java | 0 .../service/utils/data/CtxExamples.java | 2 +- .../backend/service/utils/data/RemSUData.java | 0 .../utils/password/PasswordServiceTest.java | 0 .../protools/backend/ProtoolsTestUtils.java | 2 +- .../service/PlatinePilotageServiceTest.java | 52 +++ .../service/utils/TestWithContext.java | 17 +- .../backend/utils/data/CtxExamples.java | 21 + 192 files changed, 1753 insertions(+), 6258 deletions(-) create mode 100644 src/main/java/fr/insee/protools/backend/deprecated/service/utils/ContextUtils.java delete mode 100644 src/main/java/fr/insee/protools/backend/dto/era/CensusJsonDto.java delete mode 100644 src/main/java/fr/insee/protools/backend/dto/era/GenderType.java delete mode 100644 src/main/java/fr/insee/protools/backend/dto/platine/pilotage/PlatineAddressDto.java rename src/main/java/fr/insee/protools/backend/dto/platine/pilotage/{v2 => }/PlatinePilotageCommunicationEventDto.java (81%) create mode 100644 src/main/java/fr/insee/protools/backend/dto/platine/pilotage/PlatinePilotageCommunicationEventType.java delete mode 100644 src/main/java/fr/insee/protools/backend/dto/platine/pilotage/PlatinePilotageEligibleDto.java delete mode 100644 src/main/java/fr/insee/protools/backend/dto/platine/pilotage/PlatinePilotageGenderType.java delete mode 100644 src/main/java/fr/insee/protools/backend/dto/platine/pilotage/contact/PlatineContactDto.java delete mode 100644 src/main/java/fr/insee/protools/backend/dto/platine/pilotage/query/ContactAccreditationDto.java delete mode 100644 src/main/java/fr/insee/protools/backend/dto/platine/pilotage/query/QuestioningWebclientDto.java delete mode 100644 src/main/java/fr/insee/protools/backend/dto/platine/pilotage/questioning/PlatineQuestioningSurveyUnitDto.java delete mode 100644 src/main/java/fr/insee/protools/backend/dto/platine_sabiane_questionnaire/MetadataConstants.java delete mode 100644 src/main/java/fr/insee/protools/backend/dto/platine_sabiane_questionnaire/NomenclatureDto.java delete mode 100644 src/main/java/fr/insee/protools/backend/dto/platine_sabiane_questionnaire/QuestionnaireModelCreateDto.java delete mode 100644 src/main/java/fr/insee/protools/backend/dto/platine_sabiane_questionnaire/campaign/CampaignDto.java delete mode 100644 src/main/java/fr/insee/protools/backend/dto/platine_sabiane_questionnaire/campaign/MetadataValue.java delete mode 100644 src/main/java/fr/insee/protools/backend/dto/platine_sabiane_questionnaire/campaign/MetadataValueItem.java delete mode 100644 src/main/java/fr/insee/protools/backend/dto/platine_sabiane_questionnaire/campaign/MetadataVariables.java delete mode 100644 src/main/java/fr/insee/protools/backend/dto/platine_sabiane_questionnaire/surveyunit/SurveyUnitResponseDto.java delete mode 100644 src/main/java/fr/insee/protools/backend/dto/rem/AdditionalInformationDto.java delete mode 100644 src/main/java/fr/insee/protools/backend/dto/rem/EmailDto.java delete mode 100644 src/main/java/fr/insee/protools/backend/dto/rem/LocationHelpDto.java delete mode 100644 src/main/java/fr/insee/protools/backend/dto/rem/OtherIdentifierDto.java delete mode 100644 src/main/java/fr/insee/protools/backend/dto/rem/PersonDto.java delete mode 100644 src/main/java/fr/insee/protools/backend/dto/rem/PhoneNumberDto.java delete mode 100644 src/main/java/fr/insee/protools/backend/dto/rem/REMAddressDto.java delete mode 100644 src/main/java/fr/insee/protools/backend/dto/rem/REMPhoneSource.java delete mode 100644 src/main/java/fr/insee/protools/backend/dto/rem/REMSurveyUnitDto.java delete mode 100644 src/main/java/fr/insee/protools/backend/dto/rem/SampleDto.java delete mode 100644 src/main/java/fr/insee/protools/backend/dto/rem/SuIdMappingJson.java delete mode 100644 src/main/java/fr/insee/protools/backend/dto/rem/SuIdMappingRecord.java create mode 100644 src/main/java/fr/insee/protools/backend/dto/rem_tmp/InterrogationAccountDto.java delete mode 100644 src/main/java/fr/insee/protools/backend/dto/sabiane/pilotage/AddressDto.java delete mode 100644 src/main/java/fr/insee/protools/backend/dto/sabiane/pilotage/CampaignContextDto.java delete mode 100644 src/main/java/fr/insee/protools/backend/dto/sabiane/pilotage/ContactAttemptConfiguration.java delete mode 100644 src/main/java/fr/insee/protools/backend/dto/sabiane/pilotage/ContactOutcomeConfiguration.java delete mode 100644 src/main/java/fr/insee/protools/backend/dto/sabiane/pilotage/IdentificationConfiguration.java delete mode 100644 src/main/java/fr/insee/protools/backend/dto/sabiane/pilotage/PhoneNumber.java delete mode 100644 src/main/java/fr/insee/protools/backend/dto/sabiane/pilotage/ReferentDto.java delete mode 100644 src/main/java/fr/insee/protools/backend/dto/sabiane/pilotage/SabianePersonDto.java delete mode 100644 src/main/java/fr/insee/protools/backend/dto/sabiane/pilotage/SabianePhoneNumberDto.java delete mode 100644 src/main/java/fr/insee/protools/backend/dto/sabiane/pilotage/SabianeTitle.java delete mode 100644 src/main/java/fr/insee/protools/backend/dto/sabiane/pilotage/SampleIdentifiersDto.java delete mode 100644 src/main/java/fr/insee/protools/backend/dto/sabiane/pilotage/Source.java delete mode 100644 src/main/java/fr/insee/protools/backend/dto/sabiane/pilotage/StateDto.java delete mode 100644 src/main/java/fr/insee/protools/backend/dto/sabiane/pilotage/StateType.java delete mode 100644 src/main/java/fr/insee/protools/backend/dto/sabiane/pilotage/SurveyUnitContextDto.java delete mode 100644 src/main/java/fr/insee/protools/backend/dto/sabiane/pilotage/VisibilityContextDto.java delete mode 100644 src/main/java/fr/insee/protools/backend/flowcontrol/FlowcontrolIsSUToFollowUp.java delete mode 100644 src/main/java/fr/insee/protools/backend/httpclients/webclient/KeycloakHeadersFilter.java delete mode 100644 src/main/java/fr/insee/protools/backend/httpclients/webclient/WebClientHelper.java rename src/main/java/fr/insee/protools/backend/{httpclients => }/restclient/RestClientHelper.java (80%) rename src/main/java/fr/insee/protools/backend/{httpclients/restclient/RestClientKeycloakHeadersInterceptor.java => restclient/RestClientKeycloakHeadersInitializer.java} (67%) rename src/main/java/fr/insee/protools/backend/{httpclients => restclient}/configuration/APIProperties.java (96%) rename src/main/java/fr/insee/protools/backend/{httpclients => restclient}/configuration/ApiConfigProperties.java (88%) rename src/main/java/fr/insee/protools/backend/{httpclients => restclient}/exception/ApiNotConfiguredBPMNError.java (85%) rename src/main/java/fr/insee/protools/backend/{httpclients => restclient}/exception/KeycloakTokenConfigBPMNError.java (85%) rename src/main/java/fr/insee/protools/backend/{httpclients => restclient}/exception/KeycloakTokenConfigUncheckedBPMNError.java (86%) rename src/main/java/fr/insee/protools/backend/{httpclients => restclient}/exception/runtime/HttpClient4xxBPMNError.java (90%) rename src/main/java/fr/insee/protools/backend/{httpclients => restclient}/exception/runtime/HttpClient5xxBPMNError.java (83%) rename src/main/java/fr/insee/protools/backend/{httpclients => restclient}/exception/runtime/HttpClientNetworkExceptionBPMNError.java (94%) rename src/main/java/fr/insee/protools/backend/{httpclients => restclient}/exception/runtime/HttpClientNullReturnBPMNError.java (83%) rename src/main/java/fr/insee/protools/backend/{httpclients => restclient}/exception/runtime/HttpClientRequestExceptionBPMNError.java (94%) rename src/main/java/fr/insee/protools/backend/{httpclients => restclient}/keycloak/KeycloakResponse.java (88%) rename src/main/java/fr/insee/protools/backend/{httpclients => restclient}/keycloak/KeycloakService.java (95%) rename src/main/java/fr/insee/protools/backend/{httpclients => restclient}/keycloak/Token.java (81%) rename src/main/java/fr/insee/protools/backend/{httpclients => restclient}/pagination/PageResponse.java (88%) delete mode 100644 src/main/java/fr/insee/protools/backend/service/common/platine_sabiane/QuestionnaireHelper.java delete mode 100644 src/main/java/fr/insee/protools/backend/service/common/platine_sabiane/QuestionnairePlatineSabianeService.java create mode 100644 src/main/java/fr/insee/protools/backend/service/context/exception/BadContexMissingBPMNError.java create mode 100644 src/main/java/fr/insee/protools/backend/service/context/exception/BadContextJSONValidationBPMNError.java delete mode 100644 src/main/java/fr/insee/protools/backend/service/era/EraGetSUForPeriodAndGenderTask.java delete mode 100644 src/main/java/fr/insee/protools/backend/service/era/EraService.java delete mode 100644 src/main/java/fr/insee/protools/backend/service/meshuggah/MeshuggahCreateCommunicationsContextTask.java delete mode 100644 src/main/java/fr/insee/protools/backend/service/meshuggah/MeshuggahSendCommunicationsForSUTask.java delete mode 100644 src/main/java/fr/insee/protools/backend/service/meshuggah/MeshuggahSendOpeningMailCommunicationForSUTask.java delete mode 100644 src/main/java/fr/insee/protools/backend/service/meshuggah/MeshuggahUtils.java create mode 100644 src/main/java/fr/insee/protools/backend/service/meshuggah/delegate/MeshuggahCreateContextTaskREST.java rename src/main/java/fr/insee/protools/backend/service/meshuggah/{v2 => delegate}/MeshuggahSendCommunicationForInterrogationListTaskREST.java (50%) delete mode 100644 src/main/java/fr/insee/protools/backend/service/nomenclature/NomenclatureFromStaticWebsiteServiceImpl.java delete mode 100644 src/main/java/fr/insee/protools/backend/service/nomenclature/NomenclatureService.java delete mode 100644 src/main/java/fr/insee/protools/backend/service/platine/delegate/PlatinePilotageCreateContextTask.java delete mode 100644 src/main/java/fr/insee/protools/backend/service/platine/delegate/PlatinePilotageCreateInterrogationListTask.java delete mode 100644 src/main/java/fr/insee/protools/backend/service/platine/delegate/PlatinePilotageCreateSurveyUnitTask.java delete mode 100644 src/main/java/fr/insee/protools/backend/service/platine/delegate/PlatinePilotageGetSUContactTask.java delete mode 100644 src/main/java/fr/insee/protools/backend/service/platine/delegate/PlatinePilotageGetSUIsToFollowUpTask.java delete mode 100644 src/main/java/fr/insee/protools/backend/service/platine/delegate/PlatineQuestionnaireCreateContextTask.java delete mode 100644 src/main/java/fr/insee/protools/backend/service/platine/delegate/PlatineQuestionnaireCreateInterrogationListTask.java delete mode 100644 src/main/java/fr/insee/protools/backend/service/platine/delegate/PlatineQuestionnaireCreateSurveyUnitTask.java rename src/main/java/fr/insee/protools/backend/service/platine/delegate/{v2 => }/pilotatage/PlatinePilotageCreateCommunicationEventTaskREST.java (82%) rename src/main/java/fr/insee/protools/backend/service/platine/delegate/{v2 => }/pilotatage/PlatinePilotageCreateContextTaskREST.java (80%) rename src/main/java/fr/insee/protools/backend/service/platine/delegate/{v2 => }/pilotatage/PlatinePilotageCreateInterrogationListTaskREST.java (51%) create mode 100644 src/main/java/fr/insee/protools/backend/service/platine/delegate/pilotatage/PlatinePilotageGetListOfInterroToFollowUpPaginatedTaskREST.java rename src/main/java/fr/insee/protools/backend/service/platine/delegate/{v2 => }/questionnaire/PlatineQuestionnaireCreateContextTaskREST.java (81%) rename src/main/java/fr/insee/protools/backend/service/platine/delegate/{v2 => }/questionnaire/PlatineQuestionnaireCreateInterrogationListTaskREST.java (57%) delete mode 100644 src/main/java/fr/insee/protools/backend/service/platine/pilotage/PlatinePilotageService.java delete mode 100644 src/main/java/fr/insee/protools/backend/service/platine/pilotage/metadata/CampaignDto.java delete mode 100644 src/main/java/fr/insee/protools/backend/service/platine/pilotage/metadata/MetadataDto.java delete mode 100644 src/main/java/fr/insee/protools/backend/service/platine/pilotage/metadata/OwnerDto.java delete mode 100644 src/main/java/fr/insee/protools/backend/service/platine/pilotage/metadata/PartitioningDto.java delete mode 100644 src/main/java/fr/insee/protools/backend/service/platine/pilotage/metadata/PeriodEnum.java delete mode 100644 src/main/java/fr/insee/protools/backend/service/platine/pilotage/metadata/PeriodicityEnum.java delete mode 100644 src/main/java/fr/insee/protools/backend/service/platine/pilotage/metadata/SourceDto.java delete mode 100644 src/main/java/fr/insee/protools/backend/service/platine/pilotage/metadata/SupportDto.java delete mode 100644 src/main/java/fr/insee/protools/backend/service/platine/pilotage/metadata/SurveyDto.java delete mode 100644 src/main/java/fr/insee/protools/backend/service/platine/questionnaire/PlatineQuestionnaireService.java create mode 100644 src/main/java/fr/insee/protools/backend/service/platine/service/PlatinePilotageService.java create mode 100644 src/main/java/fr/insee/protools/backend/service/platine/service/PlatineQuestionnaireService.java delete mode 100644 src/main/java/fr/insee/protools/backend/service/platine/utils/PlatineHelper.java delete mode 100644 src/main/java/fr/insee/protools/backend/service/questionnaire_model/QuestionnaireModelFromStaticWebsiteServiceImpl.java delete mode 100644 src/main/java/fr/insee/protools/backend/service/questionnaire_model/QuestionnaireModelService.java delete mode 100644 src/main/java/fr/insee/protools/backend/service/rem/RemDtoUtils.java delete mode 100644 src/main/java/fr/insee/protools/backend/service/rem/delegate/ExtractContactIdentifierFromREMSUTask.java rename src/main/java/fr/insee/protools/backend/service/rem/delegate/{v2 => }/RemGetPartitionListOfInterroPaginatedTask.java (82%) delete mode 100644 src/main/java/fr/insee/protools/backend/service/rem/delegate/RemGetPartitionListOfSuIdTask.java delete mode 100644 src/main/java/fr/insee/protools/backend/service/rem/delegate/RemGetSUTask.java create mode 100644 src/main/java/fr/insee/protools/backend/service/rem/delegate/RemPostResmiseEnCollecteTaskREST.java create mode 100644 src/main/java/fr/insee/protools/backend/service/rem/delegate/RemPutContactPlatineTaskREST.java delete mode 100644 src/main/java/fr/insee/protools/backend/service/rem/delegate/RemWriteEraSUListTask.java delete mode 100644 src/main/java/fr/insee/protools/backend/service/rem/delegate/v2/RemGetPartitionListOfInterroWithoutWebAccountPaginatedTask.java delete mode 100644 src/main/java/fr/insee/protools/backend/service/sabiane/SabianeIdHelper.java delete mode 100644 src/main/java/fr/insee/protools/backend/service/sabiane/delegate/SabianePilotageCreateContextTask.java delete mode 100644 src/main/java/fr/insee/protools/backend/service/sabiane/delegate/SabianePilotageCreateSUTask.java delete mode 100644 src/main/java/fr/insee/protools/backend/service/sabiane/delegate/SabianeQuestionnaireCreateContextTask.java delete mode 100644 src/main/java/fr/insee/protools/backend/service/sabiane/delegate/SabianeQuestionnaireCreateSUTask.java delete mode 100644 src/main/java/fr/insee/protools/backend/service/sabiane/pilotage/SabianePilotageService.java delete mode 100644 src/main/java/fr/insee/protools/backend/service/sabiane/questionnaire/SabianeQuestionnaireService.java delete mode 100644 src/main/java/fr/insee/protools/backend/service/sugoi/SugoiCreateUserListTask.java delete mode 100644 src/main/java/fr/insee/protools/backend/service/sugoi/SugoiCreateUserTask.java rename src/main/java/fr/insee/protools/backend/service/sugoi/{v2 => delegate}/CleanPasswordsTask.java (88%) rename src/main/java/fr/insee/protools/backend/service/sugoi/{ => delegate}/CleanUserPasswordTask.java (93%) rename src/main/java/fr/insee/protools/backend/service/sugoi/{LogTask.java => delegate/LogCredentialsTask.java} (85%) rename src/main/java/fr/insee/protools/backend/service/sugoi/{v2/SugoiREMCreateUserListTask.java => delegate/SugoiREMCreateMissingAccountListTask.java} (68%) create mode 100644 src/main/java/fr/insee/protools/backend/service/traiterXXXX/TraiterXXXService.java create mode 100644 src/main/java/fr/insee/protools/backend/service/traiterXXXX/delegate/TraiterXXXCreateContextTaskREST.java create mode 100644 src/main/java/fr/insee/protools/backend/service/traiterXXXX/delegate/TraiterXXXGetRemiseEnCollecteTaskREST.java delete mode 100644 src/main/java/fr/insee/protools/backend/service/utils/ContextUtils.java create mode 100644 src/main/resources/processes/proto_platine_pagination_v1.bpmn create mode 100644 src/test/backup/java/fr/insee/protools/backend/StarterApplicationTests.java rename src/test/{ => backup}/java/fr/insee/protools/backend/controller/StarterControllerTest.java (94%) rename src/test/{ => backup}/java/fr/insee/protools/backend/flowable/engine/SimpleProcessTest.java (100%) rename src/test/{ => backup}/java/fr/insee/protools/backend/integration/EraREMProcessTest.java (85%) rename src/test/{java/fr/insee/protools/backend/httpclients => backup/java/fr/insee/protools/backend/restclient}/restclient/RestClientHelperTest.java (90%) rename src/test/{java/fr/insee/protools/backend/httpclients => backup/java/fr/insee/protools/backend/restclient}/webclient/KeycloakServiceTest.java (95%) rename src/test/{java/fr/insee/protools/backend/httpclients/webclient/WebClientHelperTest.java => backup/java/fr/insee/protools/backend/restclient/webclient/RestClientHelperTest.java} (73%) rename src/test/{ => backup}/java/fr/insee/protools/backend/service/context/ContextServiceTest.java (100%) rename src/test/{ => backup}/java/fr/insee/protools/backend/service/meshuggah/MeshuggahCreateCommunicationsContextTaskTest.java (97%) rename src/test/{ => backup}/java/fr/insee/protools/backend/service/meshuggah/MeshuggahCtxExamples.java (100%) rename src/test/{ => backup}/java/fr/insee/protools/backend/service/meshuggah/MeshuggahSendOpeningMailCommunicationForSUTaskTest.java (94%) rename src/test/{ => backup}/java/fr/insee/protools/backend/service/platine/delegate/PlatinePilotageCreateContextTaskTest.java (90%) rename src/test/{ => backup}/java/fr/insee/protools/backend/service/platine/delegate/PlatinePilotageCreateSurveyUnitTaskTest.java (91%) rename src/test/{ => backup}/java/fr/insee/protools/backend/service/platine/delegate/PlatinePilotageGetSUContactTaskTest.java (92%) rename src/test/{ => backup}/java/fr/insee/protools/backend/service/platine/delegate/PlatineQuestionnaireCreateContextTaskTest.java (93%) rename src/test/{ => backup}/java/fr/insee/protools/backend/service/platine/delegate/PlatineQuestionnaireCreateSurveyUnitTaskTest.java (93%) create mode 100644 src/test/backup/java/fr/insee/protools/backend/service/platine/delegate/pilotatage/PlatinePilotageCreateContextTaskRESTTest.java rename src/test/{ => backup}/java/fr/insee/protools/backend/service/platine/utils/PlatineHelperTest.java (76%) rename src/test/{ => backup}/java/fr/insee/protools/backend/service/rem/RemDtoUtilsTest.java (99%) rename src/test/{ => backup}/java/fr/insee/protools/backend/service/rem/delegate/ExtractContactIdentifierFromREMSUTaskTest.java (100%) rename src/test/{ => backup}/java/fr/insee/protools/backend/service/rem/delegate/RemGetPartitionListOfSuIdTaskTest.java (95%) rename src/test/{ => backup}/java/fr/insee/protools/backend/service/rem/delegate/RemGetSUTaskTest.java (97%) rename src/test/{ => backup}/java/fr/insee/protools/backend/service/rem/delegate/RemWriteEraSUListTaskTest.java (94%) rename src/test/{ => backup}/java/fr/insee/protools/backend/service/sabiane/SabianeIdHelperTest.java (100%) rename src/test/{ => backup}/java/fr/insee/protools/backend/service/sabiane/delegate/SabianeCtxExamples.java (100%) rename src/test/{ => backup}/java/fr/insee/protools/backend/service/sabiane/delegate/SabianePilotageCreateContextTaskTest.java (100%) rename src/test/{ => backup}/java/fr/insee/protools/backend/service/sabiane/delegate/SabianePilotageCreateSUTaskTest.java (99%) rename src/test/{ => backup}/java/fr/insee/protools/backend/service/sabiane/delegate/SabianeQuestionnaireCreateContextTaskTest.java (94%) rename src/test/{ => backup}/java/fr/insee/protools/backend/service/sabiane/delegate/SabianeQuestionnaireCreateSUTaskTest.java (97%) rename src/test/{ => backup}/java/fr/insee/protools/backend/service/sugoi/SugoiCreateUserTaskTest.java (100%) rename src/test/{ => backup}/java/fr/insee/protools/backend/service/utils/ContextUtilsTest.java (93%) rename src/test/{ => backup}/java/fr/insee/protools/backend/service/utils/FlowableVariableUtilsTest.java (100%) rename src/test/{ => backup}/java/fr/insee/protools/backend/service/utils/data/CtxExamples.java (98%) rename src/test/{ => backup}/java/fr/insee/protools/backend/service/utils/data/RemSUData.java (100%) rename src/test/{ => backup}/java/fr/insee/protools/backend/service/utils/password/PasswordServiceTest.java (100%) create mode 100644 src/test/java/fr/insee/protools/backend/service/platine/service/PlatinePilotageServiceTest.java create mode 100644 src/test/java/fr/insee/protools/backend/utils/data/CtxExamples.java diff --git a/src/main/java/fr/insee/protools/backend/controller/ProtoolsProcessControllerAdvice.java b/src/main/java/fr/insee/protools/backend/controller/ProtoolsProcessControllerAdvice.java index d6da3805..085c1726 100644 --- a/src/main/java/fr/insee/protools/backend/controller/ProtoolsProcessControllerAdvice.java +++ b/src/main/java/fr/insee/protools/backend/controller/ProtoolsProcessControllerAdvice.java @@ -1,11 +1,11 @@ package fr.insee.protools.backend.controller; +import fr.insee.protools.backend.restclient.exception.runtime.HttpClient4xxBPMNError; +import fr.insee.protools.backend.restclient.exception.runtime.HttpClient5xxBPMNError; import fr.insee.protools.backend.service.context.exception.BadContextIOException; import fr.insee.protools.backend.service.context.exception.BadContextIncorrectBPMNError; import fr.insee.protools.backend.service.context.exception.BadContextNotJSONBPMNError; import fr.insee.protools.backend.service.exception.*; -import fr.insee.protools.backend.httpclients.exception.runtime.HttpClient4xxBPMNError; -import fr.insee.protools.backend.httpclients.exception.runtime.HttpClient5xxBPMNError; import lombok.extern.slf4j.Slf4j; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; diff --git a/src/main/java/fr/insee/protools/backend/controller/StarterController.java b/src/main/java/fr/insee/protools/backend/controller/StarterController.java index 4f25bafb..07671d58 100644 --- a/src/main/java/fr/insee/protools/backend/controller/StarterController.java +++ b/src/main/java/fr/insee/protools/backend/controller/StarterController.java @@ -1,7 +1,8 @@ package fr.insee.protools.backend.controller; import com.fasterxml.jackson.databind.JsonNode; -import fr.insee.protools.backend.httpclients.webclient.WebClientHelper; +import fr.insee.protools.backend.restclient.RestClientHelper; +import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.info.BuildProperties; import org.springframework.core.io.ClassPathResource; @@ -17,13 +18,13 @@ @RequestMapping("/starter") @RestController +@RequiredArgsConstructor public class StarterController { @Autowired(required = false) private Optional buildProperties; - @Autowired - private WebClientHelper webClientHelper; + private final RestClientHelper restClientHelper; @GetMapping("/healthcheck") public ResponseEntity healthcheck(){ @@ -59,7 +60,7 @@ public ResponseEntity healthcheckadmin(){ @GetMapping("/token_details_by_api") public ResponseEntity tokensDetailsByAPI(){ StringBuilder result = new StringBuilder("List of tokens roles : "); - for(var x : webClientHelper.getTokenDetailsByAPI().entrySet()){ + for(var x : restClientHelper.getTokenDetailsByAPI().entrySet()){ result.append("\n").append(x.getKey()).append(" : ").append(x.getValue()); } return ResponseEntity.ok(result.toString()); @@ -67,7 +68,7 @@ public ResponseEntity tokensDetailsByAPI(){ @GetMapping("/api_configuration") public ResponseEntity apiConfiguration(){ - return ResponseEntity.ok(webClientHelper.getAPIConfigDetails()); + return ResponseEntity.ok(restClientHelper.getAPIConfigDetails()); } @GetMapping(value="/changelog" , produces = MediaType.TEXT_PLAIN_VALUE) diff --git a/src/main/java/fr/insee/protools/backend/deprecated/service/utils/ContextUtils.java b/src/main/java/fr/insee/protools/backend/deprecated/service/utils/ContextUtils.java new file mode 100644 index 00000000..621de018 --- /dev/null +++ b/src/main/java/fr/insee/protools/backend/deprecated/service/utils/ContextUtils.java @@ -0,0 +1,30 @@ +package fr.insee.protools.backend.deprecated.service.utils; + +import com.fasterxml.jackson.databind.JsonNode; +import org.flowable.common.engine.api.FlowableIllegalArgumentException; + +import static fr.insee.protools.backend.service.context.ContextConstants.CTX_PARTITIONS; +import static fr.insee.protools.backend.service.context.ContextConstants.CTX_PARTITION_ID; + +//TODO : à déplacer dans ContextService?? A supprimer intégralement +public class ContextUtils { + + //TODO: supprimer?? + //Search for the current partition in the contexte. + public static JsonNode getCurrentPartitionNode(JsonNode contextRootNode, String currentPartitionId) { + JsonNode currentPartitionNode=null; + // Search for the correct partition based on it's ID + for (JsonNode subNode : contextRootNode.path(CTX_PARTITIONS)) { + if (subNode.has(CTX_PARTITION_ID) && subNode.get(CTX_PARTITION_ID).asText().equals(currentPartitionId)) { + currentPartitionNode = subNode; + break; + } + } + if (currentPartitionNode == null) { + throw new FlowableIllegalArgumentException(String.format("Partition id=[%s] not found in contexte", currentPartitionId)); + } + return currentPartitionNode; + } + + private ContextUtils(){} +} diff --git a/src/main/java/fr/insee/protools/backend/dto/era/CensusJsonDto.java b/src/main/java/fr/insee/protools/backend/dto/era/CensusJsonDto.java deleted file mode 100644 index db583670..00000000 --- a/src/main/java/fr/insee/protools/backend/dto/era/CensusJsonDto.java +++ /dev/null @@ -1,28 +0,0 @@ -package fr.insee.protools.backend.dto.era; - -import com.fasterxml.jackson.databind.node.BaseJsonNode; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -import java.io.Serializable; - -@Data -@Builder -@AllArgsConstructor -@NoArgsConstructor -public class CensusJsonDto implements Serializable { - private Long id; - private String numvoiloc; - private String bisterloc; - private String typevoiloc; - private String nomvoiloc; - private String resloc; - private String car; - private String cpostloc; - private Long idinternaute; - private String mail; - private String identifiantCompte; - private BaseJsonNode externals; -} diff --git a/src/main/java/fr/insee/protools/backend/dto/era/GenderType.java b/src/main/java/fr/insee/protools/backend/dto/era/GenderType.java deleted file mode 100644 index 2b79f8da..00000000 --- a/src/main/java/fr/insee/protools/backend/dto/era/GenderType.java +++ /dev/null @@ -1,37 +0,0 @@ -package fr.insee.protools.backend.dto.era; - -import lombok.Getter; - -@Getter -public enum GenderType { - MALE("1", "hommes"), FEMALE("2", "femmes"); - - private final String value; - private final String label; - - GenderType(String value, String label) { - this.value = value; - this.label = label; - } - - public static GenderType fromValue(int value) { - return switch (value) { - case 1 -> MALE; - case 2 -> FEMALE; - default -> throw new IllegalStateException("Unexpected value for ERA gender: " + value); - }; - } - - public static GenderType fromLabel(String label) { - return switch (label) { - case "hommes" -> MALE; - case "femmes" -> FEMALE; - default -> throw new IllegalStateException("Unexpected value for ERA gender label: " + label); - }; - } - - public static String getAllValidLabels() { - return MALE.label + "," + FEMALE.label; - } - -} diff --git a/src/main/java/fr/insee/protools/backend/dto/internal/ProtoolsInterrogationDto.java b/src/main/java/fr/insee/protools/backend/dto/internal/ProtoolsInterrogationDto.java index eb38672f..c33deb7f 100644 --- a/src/main/java/fr/insee/protools/backend/dto/internal/ProtoolsInterrogationDto.java +++ b/src/main/java/fr/insee/protools/backend/dto/internal/ProtoolsInterrogationDto.java @@ -1,7 +1,6 @@ package fr.insee.protools.backend.dto.internal; import com.fasterxml.jackson.databind.JsonNode; -import fr.insee.protools.backend.dto.rem.REMSurveyUnitDto; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; diff --git a/src/main/java/fr/insee/protools/backend/dto/platine/pilotage/PlatineAddressDto.java b/src/main/java/fr/insee/protools/backend/dto/platine/pilotage/PlatineAddressDto.java deleted file mode 100644 index 76a385f7..00000000 --- a/src/main/java/fr/insee/protools/backend/dto/platine/pilotage/PlatineAddressDto.java +++ /dev/null @@ -1,24 +0,0 @@ -package fr.insee.protools.backend.dto.platine.pilotage; - -import lombok.Getter; -import lombok.Setter; - -@Getter -@Setter -//Note: Mutualise the two Identical Adresses DTO used by platine (contact/questionning) -public class PlatineAddressDto { - - private String streetNumber; - private String repetitionIndex; - private String streetType; - private String streetName; - private String addressSupplement; - private String cityName; - private String zipCode; - private String cedexCode; - private String cedexName; - private String specialDistribution; - private String countryCode; - private String countryName; - -} diff --git a/src/main/java/fr/insee/protools/backend/dto/platine/pilotage/v2/PlatinePilotageCommunicationEventDto.java b/src/main/java/fr/insee/protools/backend/dto/platine/pilotage/PlatinePilotageCommunicationEventDto.java similarity index 81% rename from src/main/java/fr/insee/protools/backend/dto/platine/pilotage/v2/PlatinePilotageCommunicationEventDto.java rename to src/main/java/fr/insee/protools/backend/dto/platine/pilotage/PlatinePilotageCommunicationEventDto.java index 5c5133b7..c107094b 100644 --- a/src/main/java/fr/insee/protools/backend/dto/platine/pilotage/v2/PlatinePilotageCommunicationEventDto.java +++ b/src/main/java/fr/insee/protools/backend/dto/platine/pilotage/PlatinePilotageCommunicationEventDto.java @@ -1,4 +1,4 @@ -package fr.insee.protools.backend.dto.platine.pilotage.v2; +package fr.insee.protools.backend.dto.platine.pilotage; import lombok.Builder; import lombok.Data; diff --git a/src/main/java/fr/insee/protools/backend/dto/platine/pilotage/PlatinePilotageCommunicationEventType.java b/src/main/java/fr/insee/protools/backend/dto/platine/pilotage/PlatinePilotageCommunicationEventType.java new file mode 100644 index 00000000..1867c7ca --- /dev/null +++ b/src/main/java/fr/insee/protools/backend/dto/platine/pilotage/PlatinePilotageCommunicationEventType.java @@ -0,0 +1,14 @@ +package fr.insee.protools.backend.dto.platine.pilotage; + +import lombok.Getter; + +@Getter +public enum PlatinePilotageCommunicationEventType { + COMMUNICATION_STATE_SENT("SENT"); + + public final String label; + + private PlatinePilotageCommunicationEventType(String label) { + this.label = label; + } +} diff --git a/src/main/java/fr/insee/protools/backend/dto/platine/pilotage/PlatinePilotageEligibleDto.java b/src/main/java/fr/insee/protools/backend/dto/platine/pilotage/PlatinePilotageEligibleDto.java deleted file mode 100644 index 8a9696c0..00000000 --- a/src/main/java/fr/insee/protools/backend/dto/platine/pilotage/PlatinePilotageEligibleDto.java +++ /dev/null @@ -1,9 +0,0 @@ -package fr.insee.protools.backend.dto.platine.pilotage; - -import lombok.Data; - -@Data -public class PlatinePilotageEligibleDto { - - private String eligible; -} diff --git a/src/main/java/fr/insee/protools/backend/dto/platine/pilotage/PlatinePilotageGenderType.java b/src/main/java/fr/insee/protools/backend/dto/platine/pilotage/PlatinePilotageGenderType.java deleted file mode 100644 index 009bbcdd..00000000 --- a/src/main/java/fr/insee/protools/backend/dto/platine/pilotage/PlatinePilotageGenderType.java +++ /dev/null @@ -1,16 +0,0 @@ -package fr.insee.protools.backend.dto.platine.pilotage; - -import lombok.Getter; - -@Getter -public enum PlatinePilotageGenderType { - Female("1", "Female"), Male("2", "Male"),Undefined("3","Undefined") ; - - private final String value; - private final String label; - - PlatinePilotageGenderType(String value, String label) { - this.value = value; - this.label = label; - } -} diff --git a/src/main/java/fr/insee/protools/backend/dto/platine/pilotage/contact/PlatineContactDto.java b/src/main/java/fr/insee/protools/backend/dto/platine/pilotage/contact/PlatineContactDto.java deleted file mode 100644 index f183a937..00000000 --- a/src/main/java/fr/insee/protools/backend/dto/platine/pilotage/contact/PlatineContactDto.java +++ /dev/null @@ -1,23 +0,0 @@ -package fr.insee.protools.backend.dto.platine.pilotage.contact; - -import fr.insee.protools.backend.dto.platine.pilotage.PlatineAddressDto; -import fr.insee.protools.backend.dto.platine.pilotage.PlatinePilotageGenderType; -import lombok.*; - -@Getter -@Setter -@Builder -@AllArgsConstructor @NoArgsConstructor -public class PlatineContactDto { - - private String identifier; - private String externalId; - private PlatinePilotageGenderType civility; - private String lastName; - private String firstName; - private String function; - private String email; - private String phone; - private PlatineAddressDto address; - -} \ No newline at end of file diff --git a/src/main/java/fr/insee/protools/backend/dto/platine/pilotage/query/ContactAccreditationDto.java b/src/main/java/fr/insee/protools/backend/dto/platine/pilotage/query/ContactAccreditationDto.java deleted file mode 100644 index 95750c92..00000000 --- a/src/main/java/fr/insee/protools/backend/dto/platine/pilotage/query/ContactAccreditationDto.java +++ /dev/null @@ -1,22 +0,0 @@ -package fr.insee.protools.backend.dto.platine.pilotage.query; - -import fr.insee.protools.backend.dto.platine.pilotage.PlatineAddressDto; -import lombok.Builder; -import lombok.Data; - -@Data -@Builder -public class ContactAccreditationDto { - - private String identifier; - private String externalId; - private boolean isMain; - private String civility; - private String lastName; - private String firstName; - private String function; - private String email; - private String phone; - private PlatineAddressDto address; - -} diff --git a/src/main/java/fr/insee/protools/backend/dto/platine/pilotage/query/QuestioningWebclientDto.java b/src/main/java/fr/insee/protools/backend/dto/platine/pilotage/query/QuestioningWebclientDto.java deleted file mode 100644 index 6f2cb0fb..00000000 --- a/src/main/java/fr/insee/protools/backend/dto/platine/pilotage/query/QuestioningWebclientDto.java +++ /dev/null @@ -1,18 +0,0 @@ -package fr.insee.protools.backend.dto.platine.pilotage.query; - -import fr.insee.protools.backend.dto.platine.pilotage.questioning.PlatineQuestioningSurveyUnitDto; -import lombok.Builder; -import lombok.Data; - -import java.util.List; - -@Data -@Builder -public class QuestioningWebclientDto { - - private String idPartitioning; - private String modelName; - private PlatineQuestioningSurveyUnitDto surveyUnit; - private List contacts; - -} diff --git a/src/main/java/fr/insee/protools/backend/dto/platine/pilotage/questioning/PlatineQuestioningSurveyUnitDto.java b/src/main/java/fr/insee/protools/backend/dto/platine/pilotage/questioning/PlatineQuestioningSurveyUnitDto.java deleted file mode 100644 index 88e80fc1..00000000 --- a/src/main/java/fr/insee/protools/backend/dto/platine/pilotage/questioning/PlatineQuestioningSurveyUnitDto.java +++ /dev/null @@ -1,17 +0,0 @@ -package fr.insee.protools.backend.dto.platine.pilotage.questioning; - -import fr.insee.protools.backend.dto.platine.pilotage.PlatineAddressDto; -import lombok.Builder; -import lombok.Getter; -import lombok.Setter; - -@Getter -@Setter -@Builder -public class PlatineQuestioningSurveyUnitDto { - - private String idSu; - private String identificationCode; - private String identificationName; - private PlatineAddressDto address; -} diff --git a/src/main/java/fr/insee/protools/backend/dto/platine_sabiane_questionnaire/MetadataConstants.java b/src/main/java/fr/insee/protools/backend/dto/platine_sabiane_questionnaire/MetadataConstants.java deleted file mode 100644 index 958e05e3..00000000 --- a/src/main/java/fr/insee/protools/backend/dto/platine_sabiane_questionnaire/MetadataConstants.java +++ /dev/null @@ -1,27 +0,0 @@ -package fr.insee.protools.backend.dto.platine_sabiane_questionnaire; - -/** - * Class defining names of the meta data to pass to the questionnaire - * suppress warning on var names so it can match with the values - */ -@java.lang.SuppressWarnings("squid:S115") -public class MetadataConstants { - - public static final String Enq_LibelleEnquete="Enq_LibelleEnquete"; - public static final String Enq_ObjectifsCourts="Enq_ObjectifsCourts"; - public static final String Enq_CaractereObligatoire="Enq_CaractereObligatoire"; - public static final String Enq_NumeroVisa="Enq_NumeroVisa"; - public static final String Enq_MinistereTutelle="Enq_MinistereTutelle"; - public static final String Enq_ParutionJo="Enq_ParutionJo"; - public static final String Enq_DateParutionJo="Enq_DateParutionJo"; - public static final String Enq_RespOperationnel="Enq_RespOperationnel"; - public static final String Enq_RespTraitement="Enq_RespTraitement"; - public static final String Enq_AnneeVisa="Enq_AnneeVisa"; - public static final String Enq_QualiteStatistique="Enq_QualiteStatistique"; - public static final String Enq_TestNonLabellise="Enq_TestNonLabellise"; - public static final String Loi_statistique="Loi_statistique"; - public static final String Loi_rgpd="Loi_rgpd"; - public static final String Loi_informatique="Loi_informatique"; - - private MetadataConstants(){} -} diff --git a/src/main/java/fr/insee/protools/backend/dto/platine_sabiane_questionnaire/NomenclatureDto.java b/src/main/java/fr/insee/protools/backend/dto/platine_sabiane_questionnaire/NomenclatureDto.java deleted file mode 100644 index b5c6fa8e..00000000 --- a/src/main/java/fr/insee/protools/backend/dto/platine_sabiane_questionnaire/NomenclatureDto.java +++ /dev/null @@ -1,14 +0,0 @@ -package fr.insee.protools.backend.dto.platine_sabiane_questionnaire; - -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.databind.JsonNode; -import lombok.AllArgsConstructor; -import lombok.Data; - -@Data @AllArgsConstructor -@JsonInclude(JsonInclude.Include.NON_NULL) -public class NomenclatureDto { - private String id; - private String label; - private JsonNode value; -} diff --git a/src/main/java/fr/insee/protools/backend/dto/platine_sabiane_questionnaire/QuestionnaireModelCreateDto.java b/src/main/java/fr/insee/protools/backend/dto/platine_sabiane_questionnaire/QuestionnaireModelCreateDto.java deleted file mode 100644 index 67c9ccf2..00000000 --- a/src/main/java/fr/insee/protools/backend/dto/platine_sabiane_questionnaire/QuestionnaireModelCreateDto.java +++ /dev/null @@ -1,19 +0,0 @@ -package fr.insee.protools.backend.dto.platine_sabiane_questionnaire; - -import com.fasterxml.jackson.databind.JsonNode; -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; - -import java.util.Set; - -@Data -@AllArgsConstructor -@NoArgsConstructor -public class QuestionnaireModelCreateDto { - - private String idQuestionnaireModel; - private String label; - private JsonNode value; - private Set requiredNomenclatureIds; -} \ No newline at end of file diff --git a/src/main/java/fr/insee/protools/backend/dto/platine_sabiane_questionnaire/campaign/CampaignDto.java b/src/main/java/fr/insee/protools/backend/dto/platine_sabiane_questionnaire/campaign/CampaignDto.java deleted file mode 100644 index bfd0e3fe..00000000 --- a/src/main/java/fr/insee/protools/backend/dto/platine_sabiane_questionnaire/campaign/CampaignDto.java +++ /dev/null @@ -1,23 +0,0 @@ -package fr.insee.protools.backend.dto.platine_sabiane_questionnaire.campaign; - -import com.fasterxml.jackson.annotation.JsonInclude; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; - -import java.util.Set; - -@Builder -@AllArgsConstructor -@Data -@JsonInclude(JsonInclude.Include.NON_NULL) -public class CampaignDto { - String id; - String label; - Set questionnaireIds; - MetadataValue metadata; - - - - -} \ No newline at end of file diff --git a/src/main/java/fr/insee/protools/backend/dto/platine_sabiane_questionnaire/campaign/MetadataValue.java b/src/main/java/fr/insee/protools/backend/dto/platine_sabiane_questionnaire/campaign/MetadataValue.java deleted file mode 100644 index 0beac878..00000000 --- a/src/main/java/fr/insee/protools/backend/dto/platine_sabiane_questionnaire/campaign/MetadataValue.java +++ /dev/null @@ -1,15 +0,0 @@ -package fr.insee.protools.backend.dto.platine_sabiane_questionnaire.campaign; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -@Builder -@Data -@AllArgsConstructor -@NoArgsConstructor -public -class MetadataValue { - MetadataVariables value; -} \ No newline at end of file diff --git a/src/main/java/fr/insee/protools/backend/dto/platine_sabiane_questionnaire/campaign/MetadataValueItem.java b/src/main/java/fr/insee/protools/backend/dto/platine_sabiane_questionnaire/campaign/MetadataValueItem.java deleted file mode 100644 index d92a0c27..00000000 --- a/src/main/java/fr/insee/protools/backend/dto/platine_sabiane_questionnaire/campaign/MetadataValueItem.java +++ /dev/null @@ -1,16 +0,0 @@ -package fr.insee.protools.backend.dto.platine_sabiane_questionnaire.campaign; - -import lombok.Data; -import lombok.NoArgsConstructor; - -@Data -@NoArgsConstructor -public class MetadataValueItem{ - String name; - Object value; - - public MetadataValueItem(String name, Object value) { - this.name = name; - this.value = value; - } -} \ No newline at end of file diff --git a/src/main/java/fr/insee/protools/backend/dto/platine_sabiane_questionnaire/campaign/MetadataVariables.java b/src/main/java/fr/insee/protools/backend/dto/platine_sabiane_questionnaire/campaign/MetadataVariables.java deleted file mode 100644 index 2059ffff..00000000 --- a/src/main/java/fr/insee/protools/backend/dto/platine_sabiane_questionnaire/campaign/MetadataVariables.java +++ /dev/null @@ -1,17 +0,0 @@ -package fr.insee.protools.backend.dto.platine_sabiane_questionnaire.campaign; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -import java.util.List; - -@Builder -@Data -@NoArgsConstructor@AllArgsConstructor -public -class MetadataVariables{ - List variables; - String inseeContext; -} \ No newline at end of file diff --git a/src/main/java/fr/insee/protools/backend/dto/platine_sabiane_questionnaire/surveyunit/SurveyUnitResponseDto.java b/src/main/java/fr/insee/protools/backend/dto/platine_sabiane_questionnaire/surveyunit/SurveyUnitResponseDto.java deleted file mode 100644 index ba4dad45..00000000 --- a/src/main/java/fr/insee/protools/backend/dto/platine_sabiane_questionnaire/surveyunit/SurveyUnitResponseDto.java +++ /dev/null @@ -1,19 +0,0 @@ -package fr.insee.protools.backend.dto.platine_sabiane_questionnaire.surveyunit; - - -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.databind.JsonNode; -import lombok.Builder; -import lombok.Data; - -@Builder -@Data -@JsonInclude(JsonInclude.Include.NON_NULL) -public class SurveyUnitResponseDto { - String id; - String questionnaireId; - private JsonNode personalization; - private JsonNode data; - private JsonNode comment; -// private JsonNode stateData; -} \ No newline at end of file diff --git a/src/main/java/fr/insee/protools/backend/dto/rem/AdditionalInformationDto.java b/src/main/java/fr/insee/protools/backend/dto/rem/AdditionalInformationDto.java deleted file mode 100644 index 9599987d..00000000 --- a/src/main/java/fr/insee/protools/backend/dto/rem/AdditionalInformationDto.java +++ /dev/null @@ -1,15 +0,0 @@ -package fr.insee.protools.backend.dto.rem; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -@Builder -@Data -@NoArgsConstructor @AllArgsConstructor -public class AdditionalInformationDto { - - private String key; - private String value; -} \ No newline at end of file diff --git a/src/main/java/fr/insee/protools/backend/dto/rem/EmailDto.java b/src/main/java/fr/insee/protools/backend/dto/rem/EmailDto.java deleted file mode 100644 index 02a58cd5..00000000 --- a/src/main/java/fr/insee/protools/backend/dto/rem/EmailDto.java +++ /dev/null @@ -1,16 +0,0 @@ -package fr.insee.protools.backend.dto.rem; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -@Builder -@Data -@NoArgsConstructor -@AllArgsConstructor -public class EmailDto { - - private Boolean favorite; - private String mailAddress; -} \ No newline at end of file diff --git a/src/main/java/fr/insee/protools/backend/dto/rem/LocationHelpDto.java b/src/main/java/fr/insee/protools/backend/dto/rem/LocationHelpDto.java deleted file mode 100644 index 029bcb03..00000000 --- a/src/main/java/fr/insee/protools/backend/dto/rem/LocationHelpDto.java +++ /dev/null @@ -1,23 +0,0 @@ -package fr.insee.protools.backend.dto.rem; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -@Builder -@Data -@NoArgsConstructor -@AllArgsConstructor -public class LocationHelpDto { - - private String cityCode; - private String building; - private String floor; - private String staircase; - private String door; - private String iris; - private String sector; - private Boolean elevator; - private Boolean cityPriorityDistrict; -} \ No newline at end of file diff --git a/src/main/java/fr/insee/protools/backend/dto/rem/OtherIdentifierDto.java b/src/main/java/fr/insee/protools/backend/dto/rem/OtherIdentifierDto.java deleted file mode 100644 index d2a77507..00000000 --- a/src/main/java/fr/insee/protools/backend/dto/rem/OtherIdentifierDto.java +++ /dev/null @@ -1,26 +0,0 @@ -package fr.insee.protools.backend.dto.rem; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -@Builder -@Data -@AllArgsConstructor -@NoArgsConstructor -public class OtherIdentifierDto { - - private String numfa; - private String rges; - private String ssech; - private String cle; - private String le; - private String ec; - private String bs; - private String nograp; - private String nolog; - private String noi; - private String nole; - private String autre; -} diff --git a/src/main/java/fr/insee/protools/backend/dto/rem/PersonDto.java b/src/main/java/fr/insee/protools/backend/dto/rem/PersonDto.java deleted file mode 100644 index c3d8ac90..00000000 --- a/src/main/java/fr/insee/protools/backend/dto/rem/PersonDto.java +++ /dev/null @@ -1,31 +0,0 @@ -package fr.insee.protools.backend.dto.rem; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -import java.util.List; - -@Builder -@Data -@NoArgsConstructor -@AllArgsConstructor -public class PersonDto { - - private Integer index; - private String externalId; - private String function; - private String gender; - private String firstName; - private String lastName; - private String birthName; - private String dateOfBirth; - private Boolean surveyed; - private Boolean main; - private Boolean coDeclarant; - private List phoneNumbers; - private List emails; - //private REMAddressDto address; //Will be used for buisness; not for household - -} \ No newline at end of file diff --git a/src/main/java/fr/insee/protools/backend/dto/rem/PhoneNumberDto.java b/src/main/java/fr/insee/protools/backend/dto/rem/PhoneNumberDto.java deleted file mode 100644 index 5b60e41b..00000000 --- a/src/main/java/fr/insee/protools/backend/dto/rem/PhoneNumberDto.java +++ /dev/null @@ -1,16 +0,0 @@ -package fr.insee.protools.backend.dto.rem; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -@Builder -@Data -@NoArgsConstructor -@AllArgsConstructor -public class PhoneNumberDto { - private REMPhoneSource source; - private Boolean favorite; - private String number; -} \ No newline at end of file diff --git a/src/main/java/fr/insee/protools/backend/dto/rem/REMAddressDto.java b/src/main/java/fr/insee/protools/backend/dto/rem/REMAddressDto.java deleted file mode 100644 index 534266ae..00000000 --- a/src/main/java/fr/insee/protools/backend/dto/rem/REMAddressDto.java +++ /dev/null @@ -1,28 +0,0 @@ -package fr.insee.protools.backend.dto.rem; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -@Builder -@Data -@NoArgsConstructor -@AllArgsConstructor -public class REMAddressDto { - - private String streetNumber; - private String repetitionIndex; - private String streetType; - private String streetName; - private String addressSupplement; - private String cityName; - private String zipCode; - private String cedexCode; - private String cedexName; - private String specialDistribution; - private String countryCode; - private String countryName; - - private LocationHelpDto locationHelp; -} \ No newline at end of file diff --git a/src/main/java/fr/insee/protools/backend/dto/rem/REMPhoneSource.java b/src/main/java/fr/insee/protools/backend/dto/rem/REMPhoneSource.java deleted file mode 100644 index 2a2d7eda..00000000 --- a/src/main/java/fr/insee/protools/backend/dto/rem/REMPhoneSource.java +++ /dev/null @@ -1,5 +0,0 @@ -package fr.insee.protools.backend.dto.rem; - -public enum REMPhoneSource { - OTHER, INITIAL, INTERVIEWER, DIRECTORY -} \ No newline at end of file diff --git a/src/main/java/fr/insee/protools/backend/dto/rem/REMSurveyUnitDto.java b/src/main/java/fr/insee/protools/backend/dto/rem/REMSurveyUnitDto.java deleted file mode 100644 index e1a733b2..00000000 --- a/src/main/java/fr/insee/protools/backend/dto/rem/REMSurveyUnitDto.java +++ /dev/null @@ -1,36 +0,0 @@ -package fr.insee.protools.backend.dto.rem; - -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; -import lombok.*; - -import java.util.List; - -@Builder -@Data -@NoArgsConstructor -@AllArgsConstructor -public class REMSurveyUnitDto { - - private Long repositoryId; - - private String externalId; - - private String externalName; - - private REMAddressDto address; - - private List persons; - private OtherIdentifierDto otherIdentifier; - - private List additionalInformations; - - @Getter(AccessLevel.NONE) - private JsonNode externals; - - public JsonNode getExternals() { - if(externals==null || externals.isNull()) - externals= new ObjectMapper().createObjectNode(); - return this.externals; - } -} \ No newline at end of file diff --git a/src/main/java/fr/insee/protools/backend/dto/rem/SampleDto.java b/src/main/java/fr/insee/protools/backend/dto/rem/SampleDto.java deleted file mode 100644 index 3649cad7..00000000 --- a/src/main/java/fr/insee/protools/backend/dto/rem/SampleDto.java +++ /dev/null @@ -1,18 +0,0 @@ -package fr.insee.protools.backend.dto.rem; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -@Builder -@Data -@NoArgsConstructor -@AllArgsConstructor -public class SampleDto { - - private Long id; - - private String label; - -} \ No newline at end of file diff --git a/src/main/java/fr/insee/protools/backend/dto/rem/SuIdMappingJson.java b/src/main/java/fr/insee/protools/backend/dto/rem/SuIdMappingJson.java deleted file mode 100644 index 5c21efae..00000000 --- a/src/main/java/fr/insee/protools/backend/dto/rem/SuIdMappingJson.java +++ /dev/null @@ -1,18 +0,0 @@ -package fr.insee.protools.backend.dto.rem; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -import java.util.List; - -@Data -@NoArgsConstructor -@AllArgsConstructor -@Builder -public class SuIdMappingJson { - private long partitionId; - private List data; - private int count; -} diff --git a/src/main/java/fr/insee/protools/backend/dto/rem/SuIdMappingRecord.java b/src/main/java/fr/insee/protools/backend/dto/rem/SuIdMappingRecord.java deleted file mode 100644 index cd7b0129..00000000 --- a/src/main/java/fr/insee/protools/backend/dto/rem/SuIdMappingRecord.java +++ /dev/null @@ -1,5 +0,0 @@ -package fr.insee.protools.backend.dto.rem; - -public record SuIdMappingRecord(Long repositoryId, String externalId) { - -} diff --git a/src/main/java/fr/insee/protools/backend/dto/rem_tmp/InterrogationAccountDto.java b/src/main/java/fr/insee/protools/backend/dto/rem_tmp/InterrogationAccountDto.java new file mode 100644 index 00000000..448e18ff --- /dev/null +++ b/src/main/java/fr/insee/protools/backend/dto/rem_tmp/InterrogationAccountDto.java @@ -0,0 +1,166 @@ +package fr.insee.protools.backend.dto.rem_tmp; + +import java.util.Objects; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonTypeName; +import java.util.UUID; + +import jakarta.validation.Valid; + + +import jakarta.annotation.Generated; + +/** + * InterrogationAccountDto + */ + +@JsonTypeName("InterrogationAccount") +@Generated(value = "org.openapitools.codegen.languages.SpringCodegen", date = "2024-08-30T10:25:29.966974800+02:00[Europe/Paris]", comments = "Generator version: 7.8.0") +public class InterrogationAccountDto { + + private UUID interrogationId; + + private String account; + + public InterrogationAccountDto interrogationId(UUID interrogationId) { + this.interrogationId = interrogationId; + return this; + } + + /** + * Get interrogationId + * @return interrogationId + */ + @Valid + @JsonProperty("interrogationId") + public UUID getInterrogationId() { + return interrogationId; + } + + public void setInterrogationId(UUID interrogationId) { + this.interrogationId = interrogationId; + } + + public InterrogationAccountDto account(String account) { + this.account = account; + return this; + } + + /** + * Get account + * @return account + */ + + @JsonProperty("account") + public String getAccount() { + return account; + } + + public void setAccount(String account) { + this.account = account; + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + InterrogationAccountDto interrogationAccount = (InterrogationAccountDto) o; + return Objects.equals(this.interrogationId, interrogationAccount.interrogationId) && + Objects.equals(this.account, interrogationAccount.account); + } + + @Override + public int hashCode() { + return Objects.hash(interrogationId, account); + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("class InterrogationAccountDto {\n"); + sb.append(" interrogationId: ").append(toIndentedString(interrogationId)).append("\n"); + sb.append(" account: ").append(toIndentedString(account)).append("\n"); + sb.append("}"); + return sb.toString(); + } + + /** + * Convert the given object to string with each line indented by 4 spaces + * (except the first line). + */ + private String toIndentedString(Object o) { + if (o == null) { + return "null"; + } + return o.toString().replace("\n", "\n "); + } + + public static class Builder { + + private InterrogationAccountDto instance; + + public Builder() { + this(new InterrogationAccountDto()); + } + + protected Builder(InterrogationAccountDto instance) { + this.instance = instance; + } + + protected Builder copyOf(InterrogationAccountDto value) { + this.instance.setInterrogationId(value.interrogationId); + this.instance.setAccount(value.account); + return this; + } + + public Builder interrogationId(UUID interrogationId) { + this.instance.interrogationId(interrogationId); + return this; + } + + public Builder account(String account) { + this.instance.account(account); + return this; + } + + /** + * returns a built InterrogationAccountDto instance. + * + * The builder is not reusable (NullPointerException) + */ + public InterrogationAccountDto build() { + try { + return this.instance; + } finally { + // ensure that this.instance is not reused + this.instance = null; + } + } + + @Override + public String toString() { + return getClass() + "=(" + instance + ")"; + } + } + + /** + * Create a builder with no initialized field (except for the default values). + */ + public static Builder builder() { + return new Builder(); + } + + /** + * Create a builder with a shallow copy of this instance. + */ + public Builder toBuilder() { + Builder builder = new Builder(); + return builder.copyOf(this); + } + +} + diff --git a/src/main/java/fr/insee/protools/backend/dto/sabiane/pilotage/AddressDto.java b/src/main/java/fr/insee/protools/backend/dto/sabiane/pilotage/AddressDto.java deleted file mode 100644 index cd330d1c..00000000 --- a/src/main/java/fr/insee/protools/backend/dto/sabiane/pilotage/AddressDto.java +++ /dev/null @@ -1,57 +0,0 @@ -package fr.insee.protools.backend.dto.sabiane.pilotage; - -import com.fasterxml.jackson.annotation.JsonInclude; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -@Data -@AllArgsConstructor -@Builder -@NoArgsConstructor -@JsonInclude(JsonInclude.Include.NON_NULL) -public class AddressDto { - - /** - * First line of the AdressDto - */ - private String l1; - - /** - * Second line of the AdressDto - */ - private String l2; - - /** - * Third line of the AdressDto - */ - private String l3; - - /** - * Fourth line of the AdressDto - */ - private String l4; - - /** - * Fifth line of the AdressDto - */ - private String l5; - - /** - * Sixtth line of the AdressDto - */ - private String l6; - - /** - * Seventh line of the AdressDto - */ - private String l7; - - private Boolean elevator; - private String building; - private String floor; - private String door; - private String staircase; - private Boolean cityPriorityDistrict; -} \ No newline at end of file diff --git a/src/main/java/fr/insee/protools/backend/dto/sabiane/pilotage/CampaignContextDto.java b/src/main/java/fr/insee/protools/backend/dto/sabiane/pilotage/CampaignContextDto.java deleted file mode 100644 index dbc66489..00000000 --- a/src/main/java/fr/insee/protools/backend/dto/sabiane/pilotage/CampaignContextDto.java +++ /dev/null @@ -1,23 +0,0 @@ -package fr.insee.protools.backend.dto.sabiane.pilotage; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -import java.util.List; - -@Data -@AllArgsConstructor -@Builder -@NoArgsConstructor -public class CampaignContextDto { - private String campaign; - private String campaignLabel; - private List visibilities; - private List referents; - private String email; - private IdentificationConfiguration identificationConfiguration; - private ContactOutcomeConfiguration contactOutcomeConfiguration; - private ContactAttemptConfiguration contactAttemptConfiguration; -} \ No newline at end of file diff --git a/src/main/java/fr/insee/protools/backend/dto/sabiane/pilotage/ContactAttemptConfiguration.java b/src/main/java/fr/insee/protools/backend/dto/sabiane/pilotage/ContactAttemptConfiguration.java deleted file mode 100644 index 904aa294..00000000 --- a/src/main/java/fr/insee/protools/backend/dto/sabiane/pilotage/ContactAttemptConfiguration.java +++ /dev/null @@ -1,47 +0,0 @@ -package fr.insee.protools.backend.dto.sabiane.pilotage; - -public enum ContactAttemptConfiguration { - F2F("faf"), TEL("tel"); - - /** - * label of the ContactAttemptConfiguration - */ - private final String label; - - /** - * Defaut constructor for a ContactAttemptConfiguration - * - * @param label - */ - ContactAttemptConfiguration(String label) { - this.label = label; - } - - /** - * Get the label for a ContactAttemptConfiguration - * - * @return label - */ - public String getLabel() { - return label; - } - - public static ContactAttemptConfiguration valueOfLabel(String label) { - for (ContactAttemptConfiguration e : values()) { - if (e.label.equalsIgnoreCase(label)) { - return e; - } - } - throw new IllegalArgumentException("No enum constant with value="+label+ " for class " + ContactAttemptConfiguration.class.getCanonicalName()); - } - public static String[] labels(){ - String[] results = new String[values().length]; - int i=0; - for (var e : values()) { - results[i]=e.label; - i++; - } - return results; - } - -} \ No newline at end of file diff --git a/src/main/java/fr/insee/protools/backend/dto/sabiane/pilotage/ContactOutcomeConfiguration.java b/src/main/java/fr/insee/protools/backend/dto/sabiane/pilotage/ContactOutcomeConfiguration.java deleted file mode 100644 index 2d00cb44..00000000 --- a/src/main/java/fr/insee/protools/backend/dto/sabiane/pilotage/ContactOutcomeConfiguration.java +++ /dev/null @@ -1,47 +0,0 @@ -package fr.insee.protools.backend.dto.sabiane.pilotage; - -public enum ContactOutcomeConfiguration { - F2F("faf"), TEL("tel"); - - /** - * label of the ContactOutcomeConfiguration - */ - private final String label; - - /** - * Defaut constructor for a ContactOutcomeConfiguration - * - * @param label - */ - ContactOutcomeConfiguration(String label) { - this.label = label; - } - - /** - * Get the label for a ContactOutcomeConfiguration - * - * @return label - */ - public String getLabel() { - return label; - } - - public static ContactOutcomeConfiguration valueOfLabel(String label) { - for (ContactOutcomeConfiguration e : values()) { - if (e.label.equalsIgnoreCase(label)) { - return e; - } - } - throw new IllegalArgumentException("No enum constant with value="+label+ " for class " + ContactOutcomeConfiguration.class.getCanonicalName()); - } - - public static String[] labels(){ - String[] results = new String[values().length]; - int i=0; - for (var e : values()) { - results[i]=e.label; - i++; - } - return results; - } -} \ No newline at end of file diff --git a/src/main/java/fr/insee/protools/backend/dto/sabiane/pilotage/IdentificationConfiguration.java b/src/main/java/fr/insee/protools/backend/dto/sabiane/pilotage/IdentificationConfiguration.java deleted file mode 100644 index a8a10735..00000000 --- a/src/main/java/fr/insee/protools/backend/dto/sabiane/pilotage/IdentificationConfiguration.java +++ /dev/null @@ -1,49 +0,0 @@ -package fr.insee.protools.backend.dto.sabiane.pilotage; - -public enum IdentificationConfiguration { - //"Identification - Access - Situation - Category - Occupant" - IASCO("faf_logement"), - NOIDENT("aucun"); - - /** - * label of the IdentificationConfiguration - */ - private final String label; - - /** - * Defaut constructor for a IdentificationConfiguration - * - * @param label - */ - IdentificationConfiguration(String label) { - this.label = label; - } - - /** - * Get the label for a IdentificationConfiguration - * - * @return label - */ - public String getLabel() { - return label; - } - - public static IdentificationConfiguration valueOfLabel(String label) { - for (IdentificationConfiguration e : values()) { - if (e.label.equalsIgnoreCase(label)) { - return e; - } - } - throw new IllegalArgumentException("No enum constant with value="+label+ " for class " + IdentificationConfiguration.class.getCanonicalName()); - } - - public static String[] labels(){ - String[] results = new String[values().length]; - int i=0; - for (var e : values()) { - results[i]=e.label; - i++; - } - return results; - } -} \ No newline at end of file diff --git a/src/main/java/fr/insee/protools/backend/dto/sabiane/pilotage/PhoneNumber.java b/src/main/java/fr/insee/protools/backend/dto/sabiane/pilotage/PhoneNumber.java deleted file mode 100644 index 16d354b6..00000000 --- a/src/main/java/fr/insee/protools/backend/dto/sabiane/pilotage/PhoneNumber.java +++ /dev/null @@ -1,10 +0,0 @@ -package fr.insee.protools.backend.dto.sabiane.pilotage; - - -public class PhoneNumber { - - Source source; - boolean favorite; - String number; - -} \ No newline at end of file diff --git a/src/main/java/fr/insee/protools/backend/dto/sabiane/pilotage/ReferentDto.java b/src/main/java/fr/insee/protools/backend/dto/sabiane/pilotage/ReferentDto.java deleted file mode 100644 index 91a96adc..00000000 --- a/src/main/java/fr/insee/protools/backend/dto/sabiane/pilotage/ReferentDto.java +++ /dev/null @@ -1,17 +0,0 @@ -package fr.insee.protools.backend.dto.sabiane.pilotage; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -@Data -@Builder -@AllArgsConstructor -@NoArgsConstructor -public class ReferentDto { - private String firstName; - private String lastName; - private String phoneNumber; - private String role; -} \ No newline at end of file diff --git a/src/main/java/fr/insee/protools/backend/dto/sabiane/pilotage/SabianePersonDto.java b/src/main/java/fr/insee/protools/backend/dto/sabiane/pilotage/SabianePersonDto.java deleted file mode 100644 index fe0948e6..00000000 --- a/src/main/java/fr/insee/protools/backend/dto/sabiane/pilotage/SabianePersonDto.java +++ /dev/null @@ -1,29 +0,0 @@ -package fr.insee.protools.backend.dto.sabiane.pilotage; - -import com.fasterxml.jackson.annotation.JsonInclude; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -import java.util.List; - -@JsonInclude(JsonInclude.Include.NON_NULL) -@Data -@AllArgsConstructor -@Builder -@NoArgsConstructor -public class SabianePersonDto { - private Long id; - private SabianeTitle title; - private String firstName; - private String lastName; - private String email; - private Long birthdate; - - private Boolean favoriteEmail; - private Boolean privileged; - private List phoneNumbers; - - -} diff --git a/src/main/java/fr/insee/protools/backend/dto/sabiane/pilotage/SabianePhoneNumberDto.java b/src/main/java/fr/insee/protools/backend/dto/sabiane/pilotage/SabianePhoneNumberDto.java deleted file mode 100644 index 4c64641f..00000000 --- a/src/main/java/fr/insee/protools/backend/dto/sabiane/pilotage/SabianePhoneNumberDto.java +++ /dev/null @@ -1,18 +0,0 @@ -package fr.insee.protools.backend.dto.sabiane.pilotage; - - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -@Data -@AllArgsConstructor -@Builder -@NoArgsConstructor -public class SabianePhoneNumberDto { - - private Source source; - private boolean favorite; - private String number; -} \ No newline at end of file diff --git a/src/main/java/fr/insee/protools/backend/dto/sabiane/pilotage/SabianeTitle.java b/src/main/java/fr/insee/protools/backend/dto/sabiane/pilotage/SabianeTitle.java deleted file mode 100644 index 4f3d5233..00000000 --- a/src/main/java/fr/insee/protools/backend/dto/sabiane/pilotage/SabianeTitle.java +++ /dev/null @@ -1,15 +0,0 @@ -package fr.insee.protools.backend.dto.sabiane.pilotage; - -import lombok.Getter; - -@Getter -public enum SabianeTitle { - MISTER("M","Mister"), MISS("MME","MISS"); - - private final String frenchCivility; - private final String sabianeTitle; - SabianeTitle(String frenchCivility, String sabianeTitle) { - this.frenchCivility = frenchCivility; - this.sabianeTitle = sabianeTitle; - } -} \ No newline at end of file diff --git a/src/main/java/fr/insee/protools/backend/dto/sabiane/pilotage/SampleIdentifiersDto.java b/src/main/java/fr/insee/protools/backend/dto/sabiane/pilotage/SampleIdentifiersDto.java deleted file mode 100644 index 7e5a196e..00000000 --- a/src/main/java/fr/insee/protools/backend/dto/sabiane/pilotage/SampleIdentifiersDto.java +++ /dev/null @@ -1,26 +0,0 @@ -package fr.insee.protools.backend.dto.sabiane.pilotage; - - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -@Data -@NoArgsConstructor -@AllArgsConstructor -@Builder -public class SampleIdentifiersDto { - private Integer bs; - private String ec; - private Integer le; - private Integer noi; - private Integer numfa; - private Integer rges; - private Long ssech; - private Integer nolog; - private Integer nole; - private String autre; - private String nograp; - -} \ No newline at end of file diff --git a/src/main/java/fr/insee/protools/backend/dto/sabiane/pilotage/Source.java b/src/main/java/fr/insee/protools/backend/dto/sabiane/pilotage/Source.java deleted file mode 100644 index 36eb27ab..00000000 --- a/src/main/java/fr/insee/protools/backend/dto/sabiane/pilotage/Source.java +++ /dev/null @@ -1,5 +0,0 @@ -package fr.insee.protools.backend.dto.sabiane.pilotage; - -public enum Source { - FISCAL, DIRECTORY, INTERVIEWER -} \ No newline at end of file diff --git a/src/main/java/fr/insee/protools/backend/dto/sabiane/pilotage/StateDto.java b/src/main/java/fr/insee/protools/backend/dto/sabiane/pilotage/StateDto.java deleted file mode 100644 index c20db44d..00000000 --- a/src/main/java/fr/insee/protools/backend/dto/sabiane/pilotage/StateDto.java +++ /dev/null @@ -1,16 +0,0 @@ -package fr.insee.protools.backend.dto.sabiane.pilotage; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -@Data -@NoArgsConstructor -@AllArgsConstructor -@Builder -public class StateDto { - - private Long date; - private StateType type; -} \ No newline at end of file diff --git a/src/main/java/fr/insee/protools/backend/dto/sabiane/pilotage/StateType.java b/src/main/java/fr/insee/protools/backend/dto/sabiane/pilotage/StateType.java deleted file mode 100644 index 8ba34dc2..00000000 --- a/src/main/java/fr/insee/protools/backend/dto/sabiane/pilotage/StateType.java +++ /dev/null @@ -1,51 +0,0 @@ -package fr.insee.protools.backend.dto.sabiane.pilotage; - -import lombok.NoArgsConstructor; - -/** - * The possible types of a State entity - * @author scorcaud - * - */ -@NoArgsConstructor -public enum StateType { - - NVM("Not visible to management"), - NNS("Not Assigned, not started"), - ANV("Assigned Not visible to interviewer"), - VIN("Visible to the interviewer and not clickable"), - VIC("Visible to the interviewer and clickable"), - PRC("Preparing contact"), - AOC("At least one contact made"), - APS("Appointment scheduled"), - INS("Interview started"), - WFT("Waiting for transmission"), - WFS("Waiting for synchronization"), - TBR("To be reviewed"), - FIN("Finalized"), - CLO("Closed"), - NVA("Not Available to All"); - - /** - * label of the State type - */ - private String label; - - /** - * Defaut constructor for a StateType - * - * @param label - */ - StateType(String label) { - this.label = label; - } - - /** - * Get the label for a StateType - * - * @return label - */ - public String getLabel() { - return label; - } -} \ No newline at end of file diff --git a/src/main/java/fr/insee/protools/backend/dto/sabiane/pilotage/SurveyUnitContextDto.java b/src/main/java/fr/insee/protools/backend/dto/sabiane/pilotage/SurveyUnitContextDto.java deleted file mode 100644 index 9a309a3b..00000000 --- a/src/main/java/fr/insee/protools/backend/dto/sabiane/pilotage/SurveyUnitContextDto.java +++ /dev/null @@ -1,25 +0,0 @@ -package fr.insee.protools.backend.dto.sabiane.pilotage; - -import java.util.List; - -import com.fasterxml.jackson.annotation.JsonInclude; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -@Data -@AllArgsConstructor -@Builder -@NoArgsConstructor -@JsonInclude(JsonInclude.Include.NON_NULL) -public class SurveyUnitContextDto { - private String id; - private List persons; - private AddressDto address; - private String organizationUnitId; - private Boolean priority; - private String campaign; - private SampleIdentifiersDto sampleIdentifiers; - private List states; -} \ No newline at end of file diff --git a/src/main/java/fr/insee/protools/backend/dto/sabiane/pilotage/VisibilityContextDto.java b/src/main/java/fr/insee/protools/backend/dto/sabiane/pilotage/VisibilityContextDto.java deleted file mode 100644 index 8536dba5..00000000 --- a/src/main/java/fr/insee/protools/backend/dto/sabiane/pilotage/VisibilityContextDto.java +++ /dev/null @@ -1,51 +0,0 @@ -package fr.insee.protools.backend.dto.sabiane.pilotage; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -@AllArgsConstructor -@Data -@Builder -@NoArgsConstructor -public class VisibilityContextDto { - - - /** - * Organizational unit of the visibility - */ - private String organizationalUnit; - - /** - * Collection start date of the visibility - */ - private Long collectionStartDate; - - /** - * Collection end date of the visibility - */ - private Long collectionEndDate; - - /** - * Identification phase start date of the visibility - */ - private Long identificationPhaseStartDate; - - /** - * interviewer start date of the visibility - */ - private Long interviewerStartDate; - - /** - * Manager start date of the visibility - */ - private Long managementStartDate; - - /** - * End date of the visibility - */ - private Long endDate; - - -} \ No newline at end of file diff --git a/src/main/java/fr/insee/protools/backend/flowable/types/ListLong.java b/src/main/java/fr/insee/protools/backend/flowable/types/ListLong.java index 0b9a6f79..8fca4067 100644 --- a/src/main/java/fr/insee/protools/backend/flowable/types/ListLong.java +++ b/src/main/java/fr/insee/protools/backend/flowable/types/ListLong.java @@ -1,13 +1,13 @@ package fr.insee.protools.backend.flowable.types; -import java.util.Arrays; -import java.util.List; -import java.util.stream.Collectors; - import org.flowable.common.engine.api.FlowableIllegalArgumentException; import org.flowable.variable.api.types.ValueFields; import org.flowable.variable.api.types.VariableType; +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + public class ListLong implements VariableType { diff --git a/src/main/java/fr/insee/protools/backend/flowcontrol/FlowcontrolIsSUToFollowUp.java b/src/main/java/fr/insee/protools/backend/flowcontrol/FlowcontrolIsSUToFollowUp.java deleted file mode 100644 index e33efc96..00000000 --- a/src/main/java/fr/insee/protools/backend/flowcontrol/FlowcontrolIsSUToFollowUp.java +++ /dev/null @@ -1,52 +0,0 @@ -package fr.insee.protools.backend.flowcontrol; - -import com.fasterxml.jackson.databind.JsonNode; -import fr.insee.protools.backend.service.DelegateContextVerifier; -import fr.insee.protools.backend.service.context.ContextService; -import fr.insee.protools.backend.service.utils.FlowableVariableUtils; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.tuple.Triple; -import org.flowable.engine.delegate.DelegateExecution; -import org.flowable.engine.delegate.JavaDelegate; -import org.springframework.stereotype.Service; - -import java.time.Instant; - -import static fr.insee.protools.backend.service.FlowableVariableNameConstants.*; - -@Service -@Slf4j -@RequiredArgsConstructor -public class FlowcontrolIsSUToFollowUp implements JavaDelegate, DelegateContextVerifier { - - private final ContextService protoolsContext; - - @Override - public void execute(DelegateExecution execution) { - Boolean isToFollowUp = false; - - JsonNode contextRootNode = protoolsContext.getContextByProcessInstance(execution.getProcessInstanceId()); - checkContextOrThrow(log, execution.getProcessInstanceId(), contextRootNode); - - Long currentPartitionId = FlowableVariableUtils.getVariableOrThrow(execution, VARNAME_CURRENT_PARTITION_ID, Long.class); - // checkContextOrThrow(log,execution.getProcessInstanceId(), contextRootNode); - - Triple suItem = FlowableVariableUtils.getVariableOrThrow(execution, VARNAME_SU_CREATION_ITEM, Triple.class); - log.info("ProcessInstanceId={} - suItem={} begin", execution.getProcessInstanceId(), suItem); - - Instant openingInstant = suItem.getLeft(); - //TODO : à enlever ; mettre de la conf (période ou date fixe) sur la partition et récupérer la conf de la partition - Instant dateRelance = openingInstant.plusSeconds(3 * 60l); - - if (openingInstant != null && dateRelance.isBefore(Instant.now())) { - isToFollowUp = true; - } - execution.getParent().setVariableLocal(VARNAME_SU_IS_TO_FOLLOWUP, isToFollowUp); - - //Extract SU id and partition id as it will be used in following tasks - execution.getParent().setVariableLocal(VARNAME_REM_SURVEY_UNIT_IDENTIFIER, suItem.getRight()); - execution.getParent().setVariableLocal(VARNAME_CURRENT_PARTITION_ID, suItem.getMiddle()); - log.info("ProcessInstanceId={} - suItem={} - isToFollowUp={} end", execution.getProcessInstanceId(), suItem, isToFollowUp); - } -} diff --git a/src/main/java/fr/insee/protools/backend/httpclients/webclient/KeycloakHeadersFilter.java b/src/main/java/fr/insee/protools/backend/httpclients/webclient/KeycloakHeadersFilter.java deleted file mode 100644 index bac670a1..00000000 --- a/src/main/java/fr/insee/protools/backend/httpclients/webclient/KeycloakHeadersFilter.java +++ /dev/null @@ -1,43 +0,0 @@ -package fr.insee.protools.backend.httpclients.webclient; - - -import fr.insee.protools.backend.httpclients.keycloak.KeycloakService; -import fr.insee.protools.backend.httpclients.configuration.APIProperties; -import fr.insee.protools.backend.httpclients.exception.KeycloakTokenConfigBPMNError; -import fr.insee.protools.backend.httpclients.exception.KeycloakTokenConfigUncheckedBPMNError; -import org.springframework.http.MediaType; -import org.springframework.web.reactive.function.client.ClientRequest; -import org.springframework.web.reactive.function.client.ClientResponse; -import org.springframework.web.reactive.function.client.ExchangeFilterFunction; -import org.springframework.web.reactive.function.client.ExchangeFunction; -import reactor.core.publisher.Mono; - -/** - * Class in charge of adding the correct bearer token for API calls - * It will retrieve a fresh token if needed using our KeycloakService - */ -class KeycloakHeadersFilter implements ExchangeFilterFunction { - - KeycloakService keycloakService; - //Configuration of the connexion to the auth server - private APIProperties.AuthProperties authProperties; - - public KeycloakHeadersFilter(KeycloakService keycloakService, APIProperties.AuthProperties authProperties) { - this.keycloakService = keycloakService; - this.authProperties = authProperties; - } - - @Override - public Mono filter(ClientRequest request, ExchangeFunction next) { - return next.exchange(ClientRequest.from(request) - .headers(headers -> { - try { - headers.setBearerAuth(keycloakService.getToken(authProperties)); - } catch (KeycloakTokenConfigBPMNError e) { - throw new KeycloakTokenConfigUncheckedBPMNError(e); - } - headers.setContentType(MediaType.APPLICATION_JSON); - }) - .build()); - } -} diff --git a/src/main/java/fr/insee/protools/backend/httpclients/webclient/WebClientHelper.java b/src/main/java/fr/insee/protools/backend/httpclients/webclient/WebClientHelper.java deleted file mode 100644 index 0943340f..00000000 --- a/src/main/java/fr/insee/protools/backend/httpclients/webclient/WebClientHelper.java +++ /dev/null @@ -1,309 +0,0 @@ -package fr.insee.protools.backend.httpclients.webclient; - -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.node.ArrayNode; -import com.fasterxml.jackson.databind.node.ObjectNode; -import fr.insee.protools.backend.httpclients.keycloak.KeycloakService; -import fr.insee.protools.backend.httpclients.configuration.APIProperties; -import fr.insee.protools.backend.httpclients.configuration.ApiConfigProperties; -import fr.insee.protools.backend.httpclients.exception.ApiNotConfiguredBPMNError; -import fr.insee.protools.backend.httpclients.exception.KeycloakTokenConfigBPMNError; -import fr.insee.protools.backend.httpclients.exception.runtime.HttpClient4xxBPMNError; -import fr.insee.protools.backend.httpclients.exception.runtime.HttpClient5xxBPMNError; -import fr.insee.protools.backend.httpclients.exception.runtime.HttpClientNetworkExceptionBPMNError; -import fr.insee.protools.backend.httpclients.exception.runtime.HttpClientRequestExceptionBPMNError; -import io.netty.channel.ConnectTimeoutException; -import io.netty.handler.logging.LogLevel; -import lombok.extern.slf4j.Slf4j; -import org.slf4j.Logger; -import org.slf4j.event.Level; -import org.springframework.http.HttpStatus; -import org.springframework.http.HttpStatusCode; -import org.springframework.http.client.reactive.ReactorClientHttpConnector; -import org.springframework.lang.Nullable; -import org.springframework.stereotype.Component; -import org.springframework.web.reactive.function.client.ClientResponse; -import org.springframework.web.reactive.function.client.WebClient; -import org.springframework.web.reactive.function.client.WebClientRequestException; -import reactor.core.publisher.Mono; -import reactor.netty.http.client.HttpClient; -import reactor.netty.http.client.PrematureCloseException; -import reactor.netty.transport.logging.AdvancedByteBufFormat; - -import java.lang.reflect.Field; -import java.net.SocketException; -import java.net.UnknownHostException; -import java.nio.channels.UnresolvedAddressException; -import java.util.*; - -/** - * Helper class for WebClient - */ -@Component -@Slf4j -public class WebClientHelper { - - private static final int DEFAULT_FILE_BUFFER_SIZE = 100 * 1024*1024; - private static final int DEFAULT_API_BUFFER_SIZE = 100 * 1024*1024; - private final KeycloakService keycloakService; - private final ApiConfigProperties apiConfigProperties; - - //TODO : a mutualiser entre les deux clients - private final EnumMap initializedClients = new EnumMap<>(ApiConfigProperties.KNOWN_API.class); - - public WebClientHelper(KeycloakService keycloakService, ApiConfigProperties apiConfigProperties) { - this.keycloakService = keycloakService; - this.apiConfigProperties = apiConfigProperties; - } - - //I cannot have a single builder and store it in a private variable because every call to .filter(...) append a new filter to the builder - private WebClient.Builder getBuilder() { - return WebClient.builder() - .defaultStatusHandler(HttpStatusCode::isError, clientResponse -> - { - String initialRequestDescription = extractClientResponseRequestDescriptionPrivateFiledUsingReflexion(clientResponse); - Mono result; - String errorMsg = String.format("request=[%s] - statusCode=[%s]", - initialRequestDescription,clientResponse.statusCode()); - if (clientResponse.statusCode() == HttpStatus.UNAUTHORIZED) { - //Keycloak error? - errorMsg = "HttpStatus.UNAUTHORIZED. WWW-Authenticate=[" + String.join("", clientResponse.headers().header("WWW-Authenticate") + "]"); - } - - String finalErrorMsg = errorMsg; - result = clientResponse.bodyToMono(String.class).defaultIfEmpty("No error message provided by API") - .flatMap(error -> { - if (clientResponse.statusCode().is4xxClientError()) { - return Mono.error(new HttpClient4xxBPMNError(finalErrorMsg + " - " + error, clientResponse.statusCode())); - } else { - return Mono.error(new HttpClient5xxBPMNError(finalErrorMsg + " - " + error)); - } - }); - return result; - } - ) - .filter((request, next) -> - next.exchange(request) - .onErrorResume(WebClientRequestException.class, ex -> { - //TODO : here i can access the method and URI ; could be usefull to log ?? - if(containsCauseOfType(ex, - List.of(SocketException.class,UnresolvedAddressException.class,PrematureCloseException.class, - ConnectTimeoutException.class, UnknownHostException.class))){ - return Mono.error(new HttpClientNetworkExceptionBPMNError(ex)); - } - return Mono.error(new HttpClientRequestExceptionBPMNError(ex)); - }) - ) - //To allow up to 20Mb - .codecs(configurer -> configurer.defaultCodecs().maxInMemorySize(DEFAULT_API_BUFFER_SIZE)) - .clientConnector( - new ReactorClientHttpConnector( - HttpClient.create() - //Handles a proxy conf passed on system properties - .proxyWithSystemProperties() - //enable logging of request/responses - //configurable in properties as if it was this class logers - .wiretap(this.getClass().getCanonicalName(), LogLevel.DEBUG, AdvancedByteBufFormat.TEXTUAL))); - } - - public static void logJson(String msg, Object dto, Logger logger, Level level) { - if (logger.isEnabledForLevel(level)) { - try { - String json = new ObjectMapper().writeValueAsString(dto); - String logLine = msg +" - " + json; - switch (level) { - case TRACE -> logger.trace(logLine); - case DEBUG -> logger.debug(logLine); - case INFO -> logger.info(logLine); - case WARN -> logger.warn(logLine); - case ERROR -> logger.error(logLine); - default -> logger.trace(logLine); - } - } catch (JsonProcessingException e) { - log.error("Could not parse json"); - } - } - } - - /** - * init a new WebClient proxy aware (default one ignore system proxy) - */ - public WebClient getWebClient() { - return getBuilder() - .build(); - } - - /** - * init a new WebClient proxy aware (default one ignore system proxy) - * with increased buffer size to 20Mo - * - * @return a Webclient - */ - public WebClient getWebClientForFile() { - return getWebClientForFile(DEFAULT_FILE_BUFFER_SIZE); - } - - public static int getDefaultFileBufferSize() { return DEFAULT_FILE_BUFFER_SIZE; } - - /** - * init a new WebClient proxy aware (default one ignore system proxy) - * with increased buffer size to - * - * @return a Webclient - */ - public WebClient getWebClientForFile(int byteCount) { - return getBuilder() - .codecs(configurer -> configurer.defaultCodecs().maxInMemorySize(byteCount)) - .build(); - } - - /** - * Get a webclient preconfigured for proxy and able to get the JWT token required for authentification - * - * @param api the client will connect to this api - * @return preconfigured WebClient for the api - */ - public WebClient getWebClient(ApiConfigProperties.KNOWN_API api) { - APIProperties apiProperties = apiConfigProperties.getAPIProperties(api); - if (apiProperties == null) { - throw new ApiNotConfiguredBPMNError(String.format("API %s is not configured in properties", api)); - } else if (Boolean.FALSE.equals(apiProperties.getEnabled())) { - throw new ApiNotConfiguredBPMNError(String.format("API %s is disabled in properties", api)); - } - return initializedClients.computeIfAbsent(api, - knownApi -> - getBuilder() - .filter(new KeycloakHeadersFilter(keycloakService, apiProperties.getAuth())) - .baseUrl(apiProperties.getUrl()) - .build()); - } - - - public Map getTokenDetailsByAPI(){ - Map result = new HashMap<>(); - for (var api :ApiConfigProperties.KNOWN_API.values() ) { - try { - APIProperties apiProperties = apiConfigProperties.getAPIProperties(api); - if (apiProperties == null) { - throw new ApiNotConfiguredBPMNError(String.format("API %s is not configured in properties", api)); - } else if (Boolean.FALSE.equals(apiProperties.getEnabled())) { - throw new ApiNotConfiguredBPMNError(String.format("API %s is disabled in properties", api)); - } - var token = keycloakService.getToken(apiProperties.getAuth()); - if(token !=null && !token.isBlank()) { - String details = analyseToken(token); - result.put(api.name(),details); - - } - } catch (KeycloakTokenConfigBPMNError | ApiNotConfiguredBPMNError e) { - result.put(api.name(),e.getMessage()); - } - catch (Exception e){ - result.put(api.name(),"Internal error with token"); - } - } - return result; - } - - /** - * @return A json with the configuration of the APIs handled by protools - */ - public JsonNode getAPIConfigDetails(){ - ObjectMapper objectMapper = new ObjectMapper(); - ArrayNode rootNode = objectMapper.createArrayNode(); - for (var api :ApiConfigProperties.KNOWN_API.values() ) { - APIProperties apiProperties = apiConfigProperties.getAPIProperties(api); - ObjectNode apiNode = objectMapper.valueToTree(apiProperties); - apiNode.put("name",api.name()); - rootNode.add(apiNode); - } - return rootNode; - } - - //analyse a single token to retrieve roles - private static String analyseToken(String token) { - String result; - String[] chunks = token.split("\\."); - if(chunks.length<2){ - return "Token size is incorrect. It should contain at least one dot"; - } - Base64.Decoder decoder = Base64.getUrlDecoder(); - String payload = new String(decoder.decode(chunks[1])); - ObjectMapper objectMapper = new ObjectMapper(); - try { - JsonNode tokenPayloadNode = objectMapper.readTree(payload); - String roles = tokenPayloadNode.path("realm_access").path("roles").toString(); - if(roles==null || roles.isBlank()){ - result="No Role found in token"; - } - else{ - result= roles; - } - } catch (JsonProcessingException e) { - result=payload; - } - return result; - } - - /** - * Hack function to access the requestDescription private filed - * will only work if clientResponse is an instance od DefaultClientResponse which has this field - * this hack is mandatory to know the original call while handling an error - * @param clientResponse the object to treat. - * @return the original call made or an error message if it is not possible - */ - private static String extractClientResponseRequestDescriptionPrivateFiledUsingReflexion(ClientResponse clientResponse){ - try { - Field privateField = clientResponse.getClass().getDeclaredField("requestDescription"); - // Set the accessibility as true - privateField.setAccessible(true); - // Store the value of private field in variable - return (String)privateField.get(clientResponse); - } catch (Exception e) { - log.error("Internal error while trying to extract the requestDescription from ClientResponse"); - return "Initial request cannot be retrieved"; - } - } - - /** - * special version of NestedRuntimeException.contains accepting a list of types : - * Check whether the Ex exception contains an exception of the given list of types: - * either it is of the given class itself or it contains a nested cause of one of these types. - * @param ex : The exception - * @param exTypes : The searched types - * @return true if a matching exception type has been found - */ - @SuppressWarnings("java:S3776") - protected static boolean containsCauseOfType(Exception ex, @Nullable List> exTypes) { - if (exTypes == null || exTypes.isEmpty()) { - return false; - } else { - if (exTypes.stream().anyMatch(exType -> exType.isInstance(ex))) { - return true; - } - - //Current exception is not of the configured types ; check parents - Throwable cause = ex.getCause(); - if (cause == ex) { - return false; - } else { - while (cause != null) { - Throwable finalCause = cause; //to be used in lambda - if (exTypes.stream().anyMatch(exType -> exType.isInstance(finalCause))) { - return true; - } - - if (cause.getCause() == cause) { - break; - } - - cause = cause.getCause(); - } - - return false; - } - } - } -} diff --git a/src/main/java/fr/insee/protools/backend/httpclients/restclient/RestClientHelper.java b/src/main/java/fr/insee/protools/backend/restclient/RestClientHelper.java similarity index 80% rename from src/main/java/fr/insee/protools/backend/httpclients/restclient/RestClientHelper.java rename to src/main/java/fr/insee/protools/backend/restclient/RestClientHelper.java index 49733c6c..a04d1e8f 100644 --- a/src/main/java/fr/insee/protools/backend/httpclients/restclient/RestClientHelper.java +++ b/src/main/java/fr/insee/protools/backend/restclient/RestClientHelper.java @@ -1,18 +1,19 @@ -package fr.insee.protools.backend.httpclients.restclient; +package fr.insee.protools.backend.restclient; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.node.ArrayNode; import com.fasterxml.jackson.databind.node.ObjectNode; -import fr.insee.protools.backend.httpclients.keycloak.KeycloakService; -import fr.insee.protools.backend.httpclients.configuration.APIProperties; -import fr.insee.protools.backend.httpclients.configuration.ApiConfigProperties; -import fr.insee.protools.backend.httpclients.exception.ApiNotConfiguredBPMNError; -import fr.insee.protools.backend.httpclients.exception.KeycloakTokenConfigBPMNError; -import fr.insee.protools.backend.httpclients.exception.runtime.HttpClient4xxBPMNError; -import fr.insee.protools.backend.httpclients.exception.runtime.HttpClient5xxBPMNError; +import fr.insee.protools.backend.restclient.configuration.APIProperties; +import fr.insee.protools.backend.restclient.configuration.ApiConfigProperties; +import fr.insee.protools.backend.restclient.exception.ApiNotConfiguredBPMNError; +import fr.insee.protools.backend.restclient.exception.KeycloakTokenConfigBPMNError; +import fr.insee.protools.backend.restclient.exception.runtime.HttpClient4xxBPMNError; +import fr.insee.protools.backend.restclient.exception.runtime.HttpClient5xxBPMNError; +import fr.insee.protools.backend.restclient.keycloak.KeycloakService; import io.netty.handler.logging.LogLevel; +import lombok.NoArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.slf4j.Logger; import org.slf4j.event.Level; @@ -21,9 +22,11 @@ import org.springframework.http.HttpStatusCode; import org.springframework.http.client.ClientHttpResponse; import org.springframework.http.client.ReactorNettyClientRequestFactory; +import org.springframework.lang.Nullable; import org.springframework.stereotype.Component; import org.springframework.util.StreamUtils; import org.springframework.web.client.RestClient; +import org.springframework.web.reactive.function.client.WebClient; import reactor.netty.http.client.HttpClient; import reactor.netty.transport.logging.AdvancedByteBufFormat; @@ -195,4 +198,45 @@ public static void logJson(String msg, Object dto, Logger logger, Level level) { } } } + + + /** + * special version of NestedRuntimeException.contains accepting a list of types : + * Check whether the Ex exception contains an exception of the given list of types: + * either it is of the given class itself or it contains a nested cause of one of these types. + * @param ex : The exception + * @param exTypes : The searched types + * @return true if a matching exception type has been found + */ + @SuppressWarnings("java:S3776") + public static boolean containsCauseOfType(Exception ex, @Nullable List> exTypes) { + if (exTypes == null || exTypes.isEmpty()) { + return false; + } else { + if (exTypes.stream().anyMatch(exType -> exType.isInstance(ex))) { + return true; + } + + //Current exception is not of the configured types ; check parents + Throwable cause = ex.getCause(); + if (cause == ex) { + return false; + } else { + while (cause != null) { + Throwable finalCause = cause; //to be used in lambda + if (exTypes.stream().anyMatch(exType -> exType.isInstance(finalCause))) { + return true; + } + + if (cause.getCause() == cause) { + break; + } + + cause = cause.getCause(); + } + + return false; + } + } + } } diff --git a/src/main/java/fr/insee/protools/backend/httpclients/restclient/RestClientKeycloakHeadersInterceptor.java b/src/main/java/fr/insee/protools/backend/restclient/RestClientKeycloakHeadersInitializer.java similarity index 67% rename from src/main/java/fr/insee/protools/backend/httpclients/restclient/RestClientKeycloakHeadersInterceptor.java rename to src/main/java/fr/insee/protools/backend/restclient/RestClientKeycloakHeadersInitializer.java index a542a593..d6e62fe4 100644 --- a/src/main/java/fr/insee/protools/backend/httpclients/restclient/RestClientKeycloakHeadersInterceptor.java +++ b/src/main/java/fr/insee/protools/backend/restclient/RestClientKeycloakHeadersInitializer.java @@ -1,15 +1,13 @@ -package fr.insee.protools.backend.httpclients.restclient; +package fr.insee.protools.backend.restclient; -import fr.insee.protools.backend.httpclients.keycloak.KeycloakService; -import fr.insee.protools.backend.httpclients.configuration.APIProperties; -import fr.insee.protools.backend.httpclients.exception.KeycloakTokenConfigBPMNError; -import fr.insee.protools.backend.httpclients.exception.KeycloakTokenConfigUncheckedBPMNError; -import org.springframework.http.HttpRequest; +import fr.insee.protools.backend.restclient.configuration.APIProperties; +import fr.insee.protools.backend.restclient.exception.KeycloakTokenConfigBPMNError; +import fr.insee.protools.backend.restclient.exception.KeycloakTokenConfigUncheckedBPMNError; +import fr.insee.protools.backend.restclient.keycloak.KeycloakService; import org.springframework.http.MediaType; -import org.springframework.http.client.*; - -import java.io.IOException; +import org.springframework.http.client.ClientHttpRequest; +import org.springframework.http.client.ClientHttpRequestInitializer; /** * Class in charge of adding the correct bearer token for API calls diff --git a/src/main/java/fr/insee/protools/backend/httpclients/configuration/APIProperties.java b/src/main/java/fr/insee/protools/backend/restclient/configuration/APIProperties.java similarity index 96% rename from src/main/java/fr/insee/protools/backend/httpclients/configuration/APIProperties.java rename to src/main/java/fr/insee/protools/backend/restclient/configuration/APIProperties.java index 05ec12e5..ae079920 100644 --- a/src/main/java/fr/insee/protools/backend/httpclients/configuration/APIProperties.java +++ b/src/main/java/fr/insee/protools/backend/restclient/configuration/APIProperties.java @@ -1,4 +1,4 @@ -package fr.insee.protools.backend.httpclients.configuration; +package fr.insee.protools.backend.restclient.configuration; import com.fasterxml.jackson.annotation.JsonIgnore; import jakarta.validation.Valid; diff --git a/src/main/java/fr/insee/protools/backend/httpclients/configuration/ApiConfigProperties.java b/src/main/java/fr/insee/protools/backend/restclient/configuration/ApiConfigProperties.java similarity index 88% rename from src/main/java/fr/insee/protools/backend/httpclients/configuration/ApiConfigProperties.java rename to src/main/java/fr/insee/protools/backend/restclient/configuration/ApiConfigProperties.java index 958aba28..4b8ce460 100644 --- a/src/main/java/fr/insee/protools/backend/httpclients/configuration/ApiConfigProperties.java +++ b/src/main/java/fr/insee/protools/backend/restclient/configuration/ApiConfigProperties.java @@ -1,4 +1,4 @@ -package fr.insee.protools.backend.httpclients.configuration; +package fr.insee.protools.backend.restclient.configuration; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.context.annotation.Bean; @@ -16,7 +16,8 @@ public enum KNOWN_API { KNOWN_API_SABIANE_QUESTIONNAIRE, KNOWN_API_REM, KNOWN_API_MESHUGGAH, - KNOWN_API_SUGOI + KNOWN_API_SUGOI, + KNOWN_API_TRAITERXXX } public APIProperties getAPIProperties(KNOWN_API api){ @@ -29,6 +30,7 @@ public APIProperties getAPIProperties(KNOWN_API api){ case KNOWN_API_REM -> remApiProperties(); case KNOWN_API_MESHUGGAH -> meshuggahApiProperties(); case KNOWN_API_SUGOI -> sugoiApiProperties(); + case KNOWN_API_TRAITERXXX -> traiterXXXApiProperties(); }; } @@ -81,4 +83,10 @@ public APIProperties sugoiApiProperties() { return new APIProperties(); } + @Bean("traiterXXXApiProperties") + @ConfigurationProperties("fr.insee.protools.api.traiterxxx") + public APIProperties traiterXXXApiProperties() { + return new APIProperties(); + } + } diff --git a/src/main/java/fr/insee/protools/backend/httpclients/exception/ApiNotConfiguredBPMNError.java b/src/main/java/fr/insee/protools/backend/restclient/exception/ApiNotConfiguredBPMNError.java similarity index 85% rename from src/main/java/fr/insee/protools/backend/httpclients/exception/ApiNotConfiguredBPMNError.java rename to src/main/java/fr/insee/protools/backend/restclient/exception/ApiNotConfiguredBPMNError.java index 388a5277..c164c6c6 100644 --- a/src/main/java/fr/insee/protools/backend/httpclients/exception/ApiNotConfiguredBPMNError.java +++ b/src/main/java/fr/insee/protools/backend/restclient/exception/ApiNotConfiguredBPMNError.java @@ -1,4 +1,4 @@ -package fr.insee.protools.backend.httpclients.exception; +package fr.insee.protools.backend.restclient.exception; import fr.insee.protools.backend.exception.ProtoolsBpmnError; diff --git a/src/main/java/fr/insee/protools/backend/httpclients/exception/KeycloakTokenConfigBPMNError.java b/src/main/java/fr/insee/protools/backend/restclient/exception/KeycloakTokenConfigBPMNError.java similarity index 85% rename from src/main/java/fr/insee/protools/backend/httpclients/exception/KeycloakTokenConfigBPMNError.java rename to src/main/java/fr/insee/protools/backend/restclient/exception/KeycloakTokenConfigBPMNError.java index 19c44ae3..596bfd77 100644 --- a/src/main/java/fr/insee/protools/backend/httpclients/exception/KeycloakTokenConfigBPMNError.java +++ b/src/main/java/fr/insee/protools/backend/restclient/exception/KeycloakTokenConfigBPMNError.java @@ -1,4 +1,4 @@ -package fr.insee.protools.backend.httpclients.exception; +package fr.insee.protools.backend.restclient.exception; import fr.insee.protools.backend.exception.ProtoolsBpmnError; diff --git a/src/main/java/fr/insee/protools/backend/httpclients/exception/KeycloakTokenConfigUncheckedBPMNError.java b/src/main/java/fr/insee/protools/backend/restclient/exception/KeycloakTokenConfigUncheckedBPMNError.java similarity index 86% rename from src/main/java/fr/insee/protools/backend/httpclients/exception/KeycloakTokenConfigUncheckedBPMNError.java rename to src/main/java/fr/insee/protools/backend/restclient/exception/KeycloakTokenConfigUncheckedBPMNError.java index f91c4742..6360006a 100644 --- a/src/main/java/fr/insee/protools/backend/httpclients/exception/KeycloakTokenConfigUncheckedBPMNError.java +++ b/src/main/java/fr/insee/protools/backend/restclient/exception/KeycloakTokenConfigUncheckedBPMNError.java @@ -1,4 +1,4 @@ -package fr.insee.protools.backend.httpclients.exception; +package fr.insee.protools.backend.restclient.exception; import fr.insee.protools.backend.exception.ProtoolsBpmnError; diff --git a/src/main/java/fr/insee/protools/backend/httpclients/exception/runtime/HttpClient4xxBPMNError.java b/src/main/java/fr/insee/protools/backend/restclient/exception/runtime/HttpClient4xxBPMNError.java similarity index 90% rename from src/main/java/fr/insee/protools/backend/httpclients/exception/runtime/HttpClient4xxBPMNError.java rename to src/main/java/fr/insee/protools/backend/restclient/exception/runtime/HttpClient4xxBPMNError.java index dc829d07..2fa65498 100644 --- a/src/main/java/fr/insee/protools/backend/httpclients/exception/runtime/HttpClient4xxBPMNError.java +++ b/src/main/java/fr/insee/protools/backend/restclient/exception/runtime/HttpClient4xxBPMNError.java @@ -1,4 +1,4 @@ -package fr.insee.protools.backend.httpclients.exception.runtime; +package fr.insee.protools.backend.restclient.exception.runtime; import fr.insee.protools.backend.exception.ProtoolsBpmnError; import org.springframework.http.HttpStatusCode; diff --git a/src/main/java/fr/insee/protools/backend/httpclients/exception/runtime/HttpClient5xxBPMNError.java b/src/main/java/fr/insee/protools/backend/restclient/exception/runtime/HttpClient5xxBPMNError.java similarity index 83% rename from src/main/java/fr/insee/protools/backend/httpclients/exception/runtime/HttpClient5xxBPMNError.java rename to src/main/java/fr/insee/protools/backend/restclient/exception/runtime/HttpClient5xxBPMNError.java index 8223dd77..4827862b 100644 --- a/src/main/java/fr/insee/protools/backend/httpclients/exception/runtime/HttpClient5xxBPMNError.java +++ b/src/main/java/fr/insee/protools/backend/restclient/exception/runtime/HttpClient5xxBPMNError.java @@ -1,4 +1,4 @@ -package fr.insee.protools.backend.httpclients.exception.runtime; +package fr.insee.protools.backend.restclient.exception.runtime; import fr.insee.protools.backend.exception.ProtoolsBpmnError; diff --git a/src/main/java/fr/insee/protools/backend/httpclients/exception/runtime/HttpClientNetworkExceptionBPMNError.java b/src/main/java/fr/insee/protools/backend/restclient/exception/runtime/HttpClientNetworkExceptionBPMNError.java similarity index 94% rename from src/main/java/fr/insee/protools/backend/httpclients/exception/runtime/HttpClientNetworkExceptionBPMNError.java rename to src/main/java/fr/insee/protools/backend/restclient/exception/runtime/HttpClientNetworkExceptionBPMNError.java index c82e6683..209cf4e4 100644 --- a/src/main/java/fr/insee/protools/backend/httpclients/exception/runtime/HttpClientNetworkExceptionBPMNError.java +++ b/src/main/java/fr/insee/protools/backend/restclient/exception/runtime/HttpClientNetworkExceptionBPMNError.java @@ -1,4 +1,4 @@ -package fr.insee.protools.backend.httpclients.exception.runtime; +package fr.insee.protools.backend.restclient.exception.runtime; import fr.insee.protools.backend.exception.ProtoolsBpmnError; import lombok.extern.slf4j.Slf4j; diff --git a/src/main/java/fr/insee/protools/backend/httpclients/exception/runtime/HttpClientNullReturnBPMNError.java b/src/main/java/fr/insee/protools/backend/restclient/exception/runtime/HttpClientNullReturnBPMNError.java similarity index 83% rename from src/main/java/fr/insee/protools/backend/httpclients/exception/runtime/HttpClientNullReturnBPMNError.java rename to src/main/java/fr/insee/protools/backend/restclient/exception/runtime/HttpClientNullReturnBPMNError.java index 5a11d540..314b3a8b 100644 --- a/src/main/java/fr/insee/protools/backend/httpclients/exception/runtime/HttpClientNullReturnBPMNError.java +++ b/src/main/java/fr/insee/protools/backend/restclient/exception/runtime/HttpClientNullReturnBPMNError.java @@ -1,4 +1,4 @@ -package fr.insee.protools.backend.httpclients.exception.runtime; +package fr.insee.protools.backend.restclient.exception.runtime; import fr.insee.protools.backend.exception.ProtoolsBpmnError; diff --git a/src/main/java/fr/insee/protools/backend/httpclients/exception/runtime/HttpClientRequestExceptionBPMNError.java b/src/main/java/fr/insee/protools/backend/restclient/exception/runtime/HttpClientRequestExceptionBPMNError.java similarity index 94% rename from src/main/java/fr/insee/protools/backend/httpclients/exception/runtime/HttpClientRequestExceptionBPMNError.java rename to src/main/java/fr/insee/protools/backend/restclient/exception/runtime/HttpClientRequestExceptionBPMNError.java index 291a0ca8..2b38e2ce 100644 --- a/src/main/java/fr/insee/protools/backend/httpclients/exception/runtime/HttpClientRequestExceptionBPMNError.java +++ b/src/main/java/fr/insee/protools/backend/restclient/exception/runtime/HttpClientRequestExceptionBPMNError.java @@ -1,4 +1,4 @@ -package fr.insee.protools.backend.httpclients.exception.runtime; +package fr.insee.protools.backend.restclient.exception.runtime; import fr.insee.protools.backend.exception.ProtoolsBpmnError; import lombok.extern.slf4j.Slf4j; diff --git a/src/main/java/fr/insee/protools/backend/httpclients/keycloak/KeycloakResponse.java b/src/main/java/fr/insee/protools/backend/restclient/keycloak/KeycloakResponse.java similarity index 88% rename from src/main/java/fr/insee/protools/backend/httpclients/keycloak/KeycloakResponse.java rename to src/main/java/fr/insee/protools/backend/restclient/keycloak/KeycloakResponse.java index 7cd1e03c..626979f6 100644 --- a/src/main/java/fr/insee/protools/backend/httpclients/keycloak/KeycloakResponse.java +++ b/src/main/java/fr/insee/protools/backend/restclient/keycloak/KeycloakResponse.java @@ -1,4 +1,4 @@ -package fr.insee.protools.backend.httpclients.keycloak; +package fr.insee.protools.backend.restclient.keycloak; import com.fasterxml.jackson.annotation.JsonProperty; import lombok.Data; diff --git a/src/main/java/fr/insee/protools/backend/httpclients/keycloak/KeycloakService.java b/src/main/java/fr/insee/protools/backend/restclient/keycloak/KeycloakService.java similarity index 95% rename from src/main/java/fr/insee/protools/backend/httpclients/keycloak/KeycloakService.java rename to src/main/java/fr/insee/protools/backend/restclient/keycloak/KeycloakService.java index 9a1f3b75..08139a61 100644 --- a/src/main/java/fr/insee/protools/backend/httpclients/keycloak/KeycloakService.java +++ b/src/main/java/fr/insee/protools/backend/restclient/keycloak/KeycloakService.java @@ -1,7 +1,7 @@ -package fr.insee.protools.backend.httpclients.keycloak; +package fr.insee.protools.backend.restclient.keycloak; -import fr.insee.protools.backend.httpclients.configuration.APIProperties; -import fr.insee.protools.backend.httpclients.exception.KeycloakTokenConfigBPMNError; +import fr.insee.protools.backend.restclient.configuration.APIProperties; +import fr.insee.protools.backend.restclient.exception.KeycloakTokenConfigBPMNError; import io.netty.handler.logging.LogLevel; import jakarta.annotation.PostConstruct; import lombok.Data; @@ -9,7 +9,6 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.core.env.Environment; import org.springframework.http.HttpHeaders; -import org.springframework.http.HttpStatusCode; import org.springframework.http.MediaType; import org.springframework.http.client.ReactorNettyClientRequestFactory; import org.springframework.stereotype.Service; diff --git a/src/main/java/fr/insee/protools/backend/httpclients/keycloak/Token.java b/src/main/java/fr/insee/protools/backend/restclient/keycloak/Token.java similarity index 81% rename from src/main/java/fr/insee/protools/backend/httpclients/keycloak/Token.java rename to src/main/java/fr/insee/protools/backend/restclient/keycloak/Token.java index 205d42c0..5dd846d9 100644 --- a/src/main/java/fr/insee/protools/backend/httpclients/keycloak/Token.java +++ b/src/main/java/fr/insee/protools/backend/restclient/keycloak/Token.java @@ -1,4 +1,4 @@ -package fr.insee.protools.backend.httpclients.keycloak; +package fr.insee.protools.backend.restclient.keycloak; class Token { public final String value; diff --git a/src/main/java/fr/insee/protools/backend/httpclients/pagination/PageResponse.java b/src/main/java/fr/insee/protools/backend/restclient/pagination/PageResponse.java similarity index 88% rename from src/main/java/fr/insee/protools/backend/httpclients/pagination/PageResponse.java rename to src/main/java/fr/insee/protools/backend/restclient/pagination/PageResponse.java index ed2e9508..795e50ea 100644 --- a/src/main/java/fr/insee/protools/backend/httpclients/pagination/PageResponse.java +++ b/src/main/java/fr/insee/protools/backend/restclient/pagination/PageResponse.java @@ -1,4 +1,4 @@ -package fr.insee.protools.backend.httpclients.pagination; +package fr.insee.protools.backend.restclient.pagination; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import lombok.*; @@ -13,6 +13,7 @@ @ToString @JsonIgnoreProperties(ignoreUnknown=true) public class PageResponse { + @Builder.Default private List content = new ArrayList<>(); private Integer currentPage; private Integer pageSize; diff --git a/src/main/java/fr/insee/protools/backend/service/DelegateContextVerifier.java b/src/main/java/fr/insee/protools/backend/service/DelegateContextVerifier.java index 02a379c9..2e2c9ad9 100644 --- a/src/main/java/fr/insee/protools/backend/service/DelegateContextVerifier.java +++ b/src/main/java/fr/insee/protools/backend/service/DelegateContextVerifier.java @@ -1,6 +1,7 @@ package fr.insee.protools.backend.service; import com.fasterxml.jackson.databind.JsonNode; +import fr.insee.protools.backend.dto.ContexteProcessus; import fr.insee.protools.backend.service.context.exception.BadContextIncorrectBPMNError; import org.slf4j.Logger; @@ -15,6 +16,9 @@ public interface DelegateContextVerifier { default Set getContextErrors(JsonNode contextRootNode) {return Set.of();} + default Set getContextErrors(ContexteProcessus context) {return Set.of();} + + static String computeMissingMessage(String missingElement, Class classUsingThisElement){ return String.format("Class=%s : Missing Context element name=%s ", classUsingThisElement.getSimpleName(),missingElement); } @@ -54,6 +58,19 @@ default void checkContextOrThrow(Logger log,String processInstanceId, JsonNode c throw new BadContextIncorrectBPMNError(String.format("ProcessInstanceId=%s - context is incorrect missingNodes=%s", processInstanceId,errors)); } } + + default void checkContextOrThrow(Logger log,String processInstanceId, ContexteProcessus context) { + if(context==null) + throw new BadContextIncorrectBPMNError(String.format("ProcessInstanceId=%s - context is missing", processInstanceId)); + + var errors = getContextErrors(context); + if(!errors.isEmpty()){ + for (var msg: errors) { + log.error(msg); + } + throw new BadContextIncorrectBPMNError(String.format("ProcessInstanceId=%s - context is incorrect missingNodes=%s", processInstanceId,errors)); + } + } } diff --git a/src/main/java/fr/insee/protools/backend/service/FlowableVariableNameConstants.java b/src/main/java/fr/insee/protools/backend/service/FlowableVariableNameConstants.java index 732dabfb..21a90ace 100644 --- a/src/main/java/fr/insee/protools/backend/service/FlowableVariableNameConstants.java +++ b/src/main/java/fr/insee/protools/backend/service/FlowableVariableNameConstants.java @@ -8,8 +8,6 @@ public class FlowableVariableNameConstants { //TODO : renommer toutes ces variables pour remplacer les - par des _ (comme ca ca sera utilisable dans les resolvers) //Protools context public static final String VARNAME_CONTEXT="context"; - public static final String VARNAME_CONTEXT_PARTITION_ID_LIST="contexte_partition_id_list"; - public static final String VARNAME_CONTEXT_PARTITION_VARIABLES_BY_ID="contexte_partition_variables_by_partitionid"; //To treat partitions one by one (Long) public static final String VARNAME_CURRENT_PARTITION_ID="current_partition_id"; //to pass a list of REM interrogation ids (List) @@ -55,6 +53,13 @@ public class FlowableVariableNameConstants { public static final String VARNAME_INTERRO_LIST_PAGEABLE_CURRENT_PAGE ="interro_list_page_current"; + //Contacts + public static final String VARNAME_PLATINE_CONTACT_LIST ="platine_contact_list"; + + //Remise en collecte + public static final String VARNAME_INTERRO_REMISE_EN_COLLECTE_LIST ="interro_remise_en_collecte_list"; + + private FlowableVariableNameConstants(){} } diff --git a/src/main/java/fr/insee/protools/backend/service/common/platine_sabiane/QuestionnaireHelper.java b/src/main/java/fr/insee/protools/backend/service/common/platine_sabiane/QuestionnaireHelper.java deleted file mode 100644 index ff165195..00000000 --- a/src/main/java/fr/insee/protools/backend/service/common/platine_sabiane/QuestionnaireHelper.java +++ /dev/null @@ -1,330 +0,0 @@ -package fr.insee.protools.backend.service.common.platine_sabiane; - -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.node.ArrayNode; -import fr.insee.protools.backend.dto.internal.ProtoolsInterrogationDto; -import fr.insee.protools.backend.service.DelegateContextVerifier; -import fr.insee.protools.backend.dto.platine_sabiane_questionnaire.campaign.CampaignDto; -import fr.insee.protools.backend.dto.platine_sabiane_questionnaire.campaign.MetadataValue; -import fr.insee.protools.backend.dto.platine_sabiane_questionnaire.surveyunit.SurveyUnitResponseDto; -import fr.insee.protools.backend.service.context.ContextService; -import fr.insee.protools.backend.service.exception.JsonParsingBPMNError; -import fr.insee.protools.backend.service.nomenclature.NomenclatureService; -import fr.insee.protools.backend.service.platine.questionnaire.PlatineQuestionnaireService; -import fr.insee.protools.backend.service.platine.utils.PlatineHelper; -import fr.insee.protools.backend.service.questionnaire_model.QuestionnaireModelService; -import fr.insee.protools.backend.dto.rem.REMSurveyUnitDto; -import fr.insee.protools.backend.service.sabiane.SabianeIdHelper; -import fr.insee.protools.backend.service.utils.FlowableVariableUtils; -import lombok.extern.slf4j.Slf4j; -import org.flowable.engine.delegate.DelegateExecution; - -import java.util.HashSet; -import java.util.Iterator; -import java.util.List; -import java.util.Set; - -import static com.fasterxml.jackson.databind.DeserializationFeature.FAIL_ON_MISSING_CREATOR_PROPERTIES; -import static com.fasterxml.jackson.databind.DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES; -import static fr.insee.protools.backend.service.FlowableVariableNameConstants.*; -import static fr.insee.protools.backend.service.context.ContextConstants.*; -import static fr.insee.protools.backend.service.utils.ContextUtils.getCurrentPartitionNode; - -@Slf4j -public class QuestionnaireHelper { - - private static final ObjectMapper objectMapper = - new ObjectMapper() - .configure(FAIL_ON_UNKNOWN_PROPERTIES, false) - .configure(FAIL_ON_MISSING_CREATOR_PROPERTIES, true); - - private QuestionnaireHelper() { - } - - public static void createQuestionnaire(JsonNode contextRootNode, - QuestionnairePlatineSabianeService questionnairePlatineSabianeService, - NomenclatureService nomenclatureService, - QuestionnaireModelService questionnaireModelService, - String processInstanceId, - MetadataValue metadataDto - ) { - //Get the list of nomenclatures defined in Protools Context - //Create them if needed - var nomenclatureIterator = contextRootNode.path(CTX_NOMENCLATURES).elements(); - if (!nomenclatureIterator.hasNext()) { - log.info("ProcessInstanceId={} - does not declare any nomenclature", processInstanceId); - } else { - initRequiredNomenclatures(questionnairePlatineSabianeService, nomenclatureService, processInstanceId, nomenclatureIterator); - } - - //Get the list of Questionnaire Models defined in Protools Context - Set questionnaireModelIds = initQuestionnaireModels(questionnairePlatineSabianeService, questionnaireModelService, processInstanceId, contextRootNode); - questionnairePlatineSabianeService.postContext(contextRootNode.path(CTX_CAMPAGNE_ID).textValue(),contextRootNode); - } - - static void initRequiredNomenclatures(QuestionnairePlatineSabianeService questionnairePlatineSabianeService, NomenclatureService nomenclatureService, String processInstanceId, Iterator nomenclatureIterator) { - //Get the list of existing nomenclatures on platine - Set existingNomenclatures = questionnairePlatineSabianeService.getNomenclaturesId(); - - //Create the nomenclatures not existing yet on platine - while (nomenclatureIterator.hasNext()) { - var node = nomenclatureIterator.next(); - String nomenclatureId = node.get(CTX_NOMENCLATURE_ID).asText(); - String nomenclatureCheminRepertoire = node.path(CTX_NOMENCLATURE_CHEMIN_REPERTOIRE).asText(); - String nomenclatureLabel = node.get(CTX_NOMENCLATURE_LABEL).asText(); - //check if platine know this nomenclature - if (existingNomenclatures.contains(nomenclatureId)) { - log.info("ProcessInstanceId={} - nomenclature ID={} already exists in collect platform ", processInstanceId, nomenclatureId); - } else { - //Retrieve the nomenclature from remote source - String nomenclatureValueStr = nomenclatureService.getNomenclatureContent(nomenclatureId, nomenclatureCheminRepertoire); - JsonNode nomenclatureValue; - try { - nomenclatureValue = objectMapper.readTree(nomenclatureValueStr); - } catch (JsonProcessingException e) { - throw new JsonParsingBPMNError("Error while parsing the json retrieved for nomenclatureId=" + nomenclatureId, e); - } - - //Write this nomenclature to platine/sabiane - questionnairePlatineSabianeService.postNomenclature(nomenclatureId, nomenclatureLabel, nomenclatureValue); - //TODO : handles the exceptions here? - log.info("ProcessInstanceId={} - nomenclature ID={} created in remote collect platform", processInstanceId, nomenclatureId); - } - } - } - - /** - * For every questionnaireModel defined in context : check if it exists in platine/sabiane questionnaire. - * If it does not exists : retrieve it from questionnaireModelService and create it in platine/sabiane - * - * @param questionnairePlatineSabianeService : the service object used to access Sabiane Or Platine - * @param questionnaireModelService : The service object used to retrieve questionnaire models (ex: from gitlab) - * @param processInstanceId : used in logs - * @param contextRootNode : the protools context - * @return the set of questionnaireModel ids - */ - public static Set initQuestionnaireModels(QuestionnairePlatineSabianeService questionnairePlatineSabianeService, QuestionnaireModelService questionnaireModelService, String processInstanceId, JsonNode contextRootNode) { - var questionnaireModelIterator = contextRootNode.path(CTX_QUESTIONNAIRE_MODELS).elements(); - Set questionnaireModelIds = new HashSet<>(); //Used to build the CampaignDto later - while (questionnaireModelIterator.hasNext()) { - var node = questionnaireModelIterator.next(); - String questionnaireId = node.get(CTX_QUESTIONNAIRE_MODEL_ID).asText(); - String questionnaireCheminRepertoire = node.get(CTX_QUESTIONNAIRE_MODEL_CHEMIN_REPERTOIRE).asText(); - String questionnaireLabel = node.get(CTX_QUESTIONNAIRE_MODEL_LABEL).asText(); - questionnaireModelIds.add(questionnaireId); - - //check if platine/sabiane know this questionnaire - if (questionnairePlatineSabianeService.questionnaireModelExists(questionnaireId)) { - log.info("getProcessInstanceId={} - questionnaireId ID={} already exists", processInstanceId, questionnaireId); - } else { - //Get the questionnaire model from remote source - String questionnaireValueStr = questionnaireModelService.getQuestionnaireModel(questionnaireId, questionnaireCheminRepertoire); - - JsonNode questionnaireValue; - try { - questionnaireValue = objectMapper.readTree(questionnaireValueStr); - } catch (JsonProcessingException e) { - throw new JsonParsingBPMNError("Error while parsing the json retrieved for Model questionnaireId=" + questionnaireId, e); - } - //get the list of nomenclatures needed by this Questionnaire Model - JsonNode nomenclaturesArrayNode = node.get(CTX_QUESTIONNAIRE_MODEL_REQUIRED_NOMENCLATURES); - Set requiredNomenclatures = new HashSet<>(nomenclaturesArrayNode.size()); - nomenclaturesArrayNode.forEach(jsonNode -> requiredNomenclatures.add(jsonNode.asText())); - - //TODO : should we check context coherence here and verify that we dont have any unknown nomenclature? - //Write this questionnaire model to platine/sabiane - questionnairePlatineSabianeService.postQuestionnaireModel(questionnaireId, questionnaireLabel, questionnaireValue, requiredNomenclatures); - //TODO : handles the exceptions here? - } - } - return questionnaireModelIds; - } - - @SuppressWarnings("java:S3776") //disable the warning about cognitive complexity as it is long but simple - public static Set getCreateCtxContextErrors(JsonNode contextRootNode) { - if (contextRootNode == null) { - return Set.of(String.format("Class=%s : Context is missing ", QuestionnaireHelper.class.getSimpleName())); - } - - Set requiredNodes = - Set.of(CTX_CAMPAGNE_ID, CTX_CAMPAGNE_LABEL, CTX_NOMENCLATURES, CTX_QUESTIONNAIRE_MODELS, CTX_METADONNEES); - Set missingNodes = new HashSet<>(DelegateContextVerifier.computeMissingChildrenMessages(requiredNodes, contextRootNode, QuestionnaireHelper.class)); - - if (contextRootNode.get(CTX_NOMENCLATURES) != null) { - //Check on nomenclatures - var nomenclatureIterator = contextRootNode.path(CTX_NOMENCLATURES).elements(); - int i = 0; - while (nomenclatureIterator.hasNext()) { - i++; - var nomenclatureNode = nomenclatureIterator.next(); - if (nomenclatureNode.get(CTX_NOMENCLATURE_ID) == null || nomenclatureNode.get(CTX_NOMENCLATURE_ID).asText().isEmpty()) { - missingNodes.add(missingCTXMessage(CTX_NOMENCLATURES, i, CTX_NOMENCLATURE_ID)); - } - if (nomenclatureNode.get(CTX_NOMENCLATURE_LABEL) == null || nomenclatureNode.get(CTX_NOMENCLATURE_LABEL).asText().isEmpty()) { - missingNodes.add(missingCTXMessage(CTX_NOMENCLATURES, i, CTX_NOMENCLATURE_LABEL)); - } - if (nomenclatureNode.get(CTX_NOMENCLATURE_CHEMIN_REPERTOIRE) == null || nomenclatureNode.get(CTX_NOMENCLATURE_CHEMIN_REPERTOIRE).asText().isEmpty()) { - missingNodes.add(missingCTXMessage(CTX_NOMENCLATURES, i, CTX_NOMENCLATURE_CHEMIN_REPERTOIRE)); - } - } - - } - - if (contextRootNode.get(CTX_QUESTIONNAIRE_MODELS) != null) { - //Check on questionnaire models - var questionnaireModelsIterator = contextRootNode.get(CTX_QUESTIONNAIRE_MODELS).elements(); - int i = 0; - while (questionnaireModelsIterator.hasNext()) { - i++; - var nomenclatureNode = questionnaireModelsIterator.next(); - if (nomenclatureNode.get(CTX_QUESTIONNAIRE_MODEL_ID) == null || nomenclatureNode.get(CTX_QUESTIONNAIRE_MODEL_ID).asText().isEmpty()) { - missingNodes.add(missingCTXMessage(CTX_QUESTIONNAIRE_MODELS, i, CTX_QUESTIONNAIRE_MODEL_ID)); - } - if (nomenclatureNode.get(CTX_QUESTIONNAIRE_MODEL_LABEL) == null || nomenclatureNode.get(CTX_QUESTIONNAIRE_MODEL_LABEL).asText().isEmpty()) { - missingNodes.add(missingCTXMessage(CTX_QUESTIONNAIRE_MODELS, i, CTX_QUESTIONNAIRE_MODEL_LABEL)); - } - if (nomenclatureNode.get(CTX_QUESTIONNAIRE_MODEL_CHEMIN_REPERTOIRE) == null || nomenclatureNode.get(CTX_QUESTIONNAIRE_MODEL_CHEMIN_REPERTOIRE).asText().isEmpty()) { - missingNodes.add(missingCTXMessage(CTX_QUESTIONNAIRE_MODELS, i, CTX_QUESTIONNAIRE_MODEL_CHEMIN_REPERTOIRE)); - } - } - } - return missingNodes; - } - - private static String missingCTXMessage(String parent, int index, String child) { - return DelegateContextVerifier.computeMissingMessage(String.format("%s[%s].%s", parent, index, child), QuestionnaireHelper.class); - } - - private static SurveyUnitResponseDto computeDtoPlatine(JsonNode remSUNode, JsonNode currentPartitionNode) { - REMSurveyUnitDto remSurveyUnitDto = PlatineHelper.parseRemSUNode(objectMapper, remSUNode); - String id = remSurveyUnitDto.getRepositoryId().toString(); - String nameKey = "name"; - String valueKey = "value"; - - ArrayNode personalizationNode = objectMapper.createArrayNode(); - personalizationNode.add(objectMapper.createObjectNode() - .put(nameKey, "whoAnswers1") - .put(valueKey, currentPartitionNode.path(CTX_PARTITION_QUIREPOND1).asText())); - personalizationNode.add(objectMapper.createObjectNode() - .put(nameKey, "whoAnswers2") - .put(valueKey, currentPartitionNode.path(CTX_PARTITION_QUIREPOND2).asText())); - personalizationNode.add(objectMapper.createObjectNode() - .put(nameKey, "whoAnswers3") - .put(valueKey, currentPartitionNode.path(CTX_PARTITION_QUIREPOND3).asText())); - - return SurveyUnitResponseDto.builder() - .id(id) //Platine - .questionnaireId(currentPartitionNode.path(CTX_PARTITION_QUESTIONNAIRE_MODEL).asText()) - .data(remSurveyUnitDto.getExternals()) - .personalization(personalizationNode) - .comment(objectMapper.createObjectNode()) - //.stateData(objectMapper.createObjectNode()) - .build(); - } - - private static SurveyUnitResponseDto computeDtoSabiane(JsonNode remSUNode, JsonNode currentPartitionNode) { - REMSurveyUnitDto remSurveyUnitDto = PlatineHelper.parseRemSUNode(objectMapper, remSUNode); - String id = SabianeIdHelper.computeSabianeID(currentPartitionNode.path(CTX_PARTITION_ID).asText(),remSurveyUnitDto.getRepositoryId().toString()); - - return SurveyUnitResponseDto.builder() - .id(id)//Sabiane uses identified of the form IdPartition P idREM - .questionnaireId(currentPartitionNode.path(CTX_PARTITION_QUESTIONNAIRE_MODEL).asText()) - .data(remSurveyUnitDto.getExternals()) - .personalization(objectMapper.createObjectNode())//No personalization for sabiane - .comment(objectMapper.createObjectNode()) - //.stateData(objectMapper.createObjectNode()) - .build(); - } - - /** - * Create a SU in Sabiane Questionnaire - * @param execution - * @param protoolsContext - * @param service - */ - public static void createSUTaskSabiane(DelegateExecution execution, ContextService protoolsContext, QuestionnairePlatineSabianeService service) { - JsonNode contextRootNode = protoolsContext.getContextByProcessInstance(execution.getProcessInstanceId()); - - Long currentPartitionId = FlowableVariableUtils.getVariableOrThrow(execution, VARNAME_CURRENT_PARTITION_ID, Long.class); - JsonNode remSUNode = FlowableVariableUtils.getVariableOrThrow(execution, VARNAME_REM_INTERROGATION, JsonNode.class); - JsonNode currentPartitionNode = getCurrentPartitionNode(contextRootNode, currentPartitionId); - - //Create the DTO object - SurveyUnitResponseDto dto = QuestionnaireHelper.computeDtoSabiane(remSUNode, currentPartitionNode); - - log.info("ProcessInstanceId={} - currentPartitionId={} - remSU.id={}", - execution.getProcessInstanceId(), currentPartitionId, dto.getId()); - - //Call service - service.postSurveyUnit(dto, contextRootNode.path(CTX_CAMPAGNE_ID).asText()); - - log.debug("ProcessInstanceId={} end", execution.getProcessInstanceId()); - } - - - /** - * Get the context errors for an SU creation in Platine - * @param contextRootNode : the context to verify - * @return a Set with the errors - */ - public static Set getCreateSUContextErrorsPlatine(JsonNode contextRootNode){ - Set requiredPartition = - Set.of(CTX_PARTITION_ID,CTX_PARTITION_QUESTIONNAIRE_MODEL,CTX_PARTITION_QUIREPOND1,CTX_PARTITION_QUIREPOND2,CTX_PARTITION_QUIREPOND3); - return getCreateSUContextErrorsCommonPlatineSabiane(contextRootNode,requiredPartition); - } - - /** - * Get the context errors for an SU creation in Sabiane - * @param contextRootNode : the context to verify - * @return a Set with the errors - */ - public static Set getCreateSUContextErrorsSabiane(JsonNode contextRootNode){ - Set requiredPartition = - Set.of(CTX_PARTITION_ID,CTX_PARTITION_QUESTIONNAIRE_MODEL); - return getCreateSUContextErrorsCommonPlatineSabiane(contextRootNode,requiredPartition); - } - - private static Set getCreateSUContextErrorsCommonPlatineSabiane(JsonNode contextRootNode, Set requiredPartition){ - if(contextRootNode==null){ - return Set.of("Context is missing"); - } - Set results=new HashSet<>(); - Set requiredNodes = - Set.of( - //Global & Campaign - CTX_PARTITIONS, CTX_QUESTIONNAIRE_MODELS - ); - - results.addAll(DelegateContextVerifier.computeMissingChildrenMessages(requiredNodes,contextRootNode,QuestionnaireHelper.class)); - //Maybe one day we will have partitions for platine and partitions for sabiane and we will only validate the platine ones - //Partitions - var partitionIterator =contextRootNode.path(CTX_PARTITIONS).elements(); - while (partitionIterator.hasNext()) { - var partitionNode = partitionIterator.next(); - results.addAll(DelegateContextVerifier.computeMissingChildrenMessages(requiredPartition,partitionNode,QuestionnaireHelper.class)); - } - return results; - } - - public static void createInterrogationsTaskPlatine(DelegateExecution execution, ContextService protoolsContext, PlatineQuestionnaireService service) { - JsonNode contextRootNode = protoolsContext.getContextByProcessInstance(execution.getProcessInstanceId()); - - Long currentPartitionId = FlowableVariableUtils.getVariableOrThrow(execution, VARNAME_CURRENT_PARTITION_ID, Long.class); - List interrogationList = FlowableVariableUtils.getVariableOrThrow(execution, VARNAME_REM_INTERRO_LIST, List.class); - JsonNode currentPartitionNode = getCurrentPartitionNode(contextRootNode, currentPartitionId); - - for (ProtoolsInterrogationDto protoolsInterrogationDto : interrogationList){ - //Create the DTO object - SurveyUnitResponseDto dto = QuestionnaireHelper.computeDtoPlatine(protoolsInterrogationDto.getRemInterrogation(), currentPartitionNode); - - log.debug("ProcessInstanceId={} - currentPartitionId={} - id={}", - execution.getProcessInstanceId(), currentPartitionId, dto.getId()); - //Call service - service.postSurveyUnit(dto, contextRootNode.path(CTX_CAMPAGNE_ID).asText()); - } - - log.info("ProcessInstanceId={} end", execution.getProcessInstanceId()); - } -} diff --git a/src/main/java/fr/insee/protools/backend/service/common/platine_sabiane/QuestionnairePlatineSabianeService.java b/src/main/java/fr/insee/protools/backend/service/common/platine_sabiane/QuestionnairePlatineSabianeService.java deleted file mode 100644 index 51f28b5a..00000000 --- a/src/main/java/fr/insee/protools/backend/service/common/platine_sabiane/QuestionnairePlatineSabianeService.java +++ /dev/null @@ -1,203 +0,0 @@ -package fr.insee.protools.backend.service.common.platine_sabiane; - -import com.fasterxml.jackson.databind.JsonNode; -import fr.insee.protools.backend.dto.platine_sabiane_questionnaire.NomenclatureDto; -import fr.insee.protools.backend.dto.platine_sabiane_questionnaire.QuestionnaireModelCreateDto; -import fr.insee.protools.backend.dto.platine_sabiane_questionnaire.campaign.CampaignDto; -import fr.insee.protools.backend.dto.platine_sabiane_questionnaire.surveyunit.SurveyUnitResponseDto; -import fr.insee.protools.backend.httpclients.webclient.WebClientHelper; -import fr.insee.protools.backend.httpclients.exception.runtime.HttpClient4xxBPMNError; -import fr.insee.protools.backend.httpclients.exception.runtime.HttpClient5xxBPMNError; -import fr.insee.protools.backend.httpclients.exception.runtime.HttpClientNullReturnBPMNError; -import org.slf4j.event.Level; -import org.springframework.http.HttpStatus; -import org.springframework.web.client.RestClient; -import org.springframework.web.reactive.function.client.WebClient; - -import java.util.HashSet; -import java.util.List; -import java.util.Set; -import java.util.stream.Collectors; - -import static fr.insee.protools.backend.httpclients.configuration.ApiConfigProperties.KNOWN_API.KNOWN_API_PLATINE_PILOTAGE; - -public interface QuestionnairePlatineSabianeService { - - //Internal methods - RestClient restClient(); - org.slf4j.Logger getLogger(); - - /** Create a new nomenclature **/ - default void postNomenclature(String nomenclatureId, String nomenclatureLabel , JsonNode nomenclatureValue) { - NomenclatureDto dto = new NomenclatureDto(nomenclatureId,nomenclatureLabel,nomenclatureValue); - NomenclatureDto response = - restClient() - .post() - .uri("/api/nomenclature") - .body(dto) - .retrieve() - .body(NomenclatureDto.class); - getLogger().info("postNomenclature: nomenclatureId={} - response={}",nomenclatureId,response); - //TODO: gestion des erreurs (ex: 403...) - } - - /** Create a new questionnaireModel **/ - default void postQuestionnaireModel(String questionnaireId, String questionnaireLabel, JsonNode questionnaireValue, Set requiredNomenclatures) { - QuestionnaireModelCreateDto dto = - new QuestionnaireModelCreateDto(questionnaireId,questionnaireLabel,questionnaireValue,requiredNomenclatures); - - QuestionnaireModelCreateDto response = - restClient() - .post() - .uri("/api/questionnaire-models") - .body(dto) - .retrieve() - .body(QuestionnaireModelCreateDto.class); - getLogger().info("postQuestionnaireModel: questionnaireId={} - response={}",questionnaireId,response); - //TODO: gestion des erreurs (ex: 403...) - - } - - /** Get the list of existing nomenclatures */ - default Set getNomenclaturesId() { - List response = restClient() - .get() - .uri("/api/nomenclatures") - .retrieve() - .body(List.class); - getLogger().info("getNomenclaturesId: response= {}",response); - return (response==null)?new HashSet<>():response.stream().collect(Collectors.toSet()); - } - - /** Checks if the questionnaireModel exists **/ - default boolean questionnaireModelExists(String idQuestionnaireModel) { - getLogger().info("questionnaireModelExists: idQuestionnaireModel={} ",idQuestionnaireModel); - boolean modelExists = false; - try{ - var response = restClient() - .get() - .uri(uriBuilder -> uriBuilder - .path("/api/questionnaire/{id}") - .build(idQuestionnaireModel)) - .retrieve().toBodilessEntity(); - if(response==null) { - throw new HttpClientNullReturnBPMNError("Error while checking if questionnaireModel exists - null result"); - } - - if(response.getStatusCode().is2xxSuccessful()) { - modelExists = true; - } - else if(response.getStatusCode().is4xxClientError()){ - if(response.getStatusCode()==HttpStatus.NOT_FOUND){ - modelExists=false; - } - else{ - throw new HttpClient4xxBPMNError("Error while checking if questionnaireModel exists ", response.getStatusCode()); - } - } - else{ - throw new HttpClient5xxBPMNError("Error while checking if questionnaireModel exists "); - } - getLogger().debug("response code={}",response.getStatusCode()); - } - catch (HttpClient4xxBPMNError e){ - if(e.getHttpStatusCodeError().equals(HttpStatus.NOT_FOUND)){ - modelExists=false; - } - else { - throw e; - } - } - getLogger().info("questionnaireModelExists: idQuestionnaireModel={} - modelExists={}",idQuestionnaireModel,modelExists); - return modelExists; - } - - /** Create the campaign **/ - default void postContext(String campaignId,JsonNode contextRootNode) { - getLogger().trace("postContext: campaignId={}",campaignId); - //Http Status Codes : https://github.com/InseeFr/Queen-Back-Office/blob/3.5.36-rc/src/main/java/fr/insee/queen/api/controller/CampaignController.java - // HttpStatus.BAD_REQUEST(400) if campaign already exists - // HttpStatus.FORBIDDEN (403) if the questionnaire does not exist or is already associated (Request to change it to 409) - // WARNING : 403 will also be returned if user does not have an authorized role - try { - var response = restClient() - .post() - .uri("/context") - .body(contextRootNode) - .retrieve() - .body(String.class); - getLogger().info("postContext: idCampaign={} - response={} ", campaignId, response); - } - catch (HttpClient4xxBPMNError e){ - if(e.getHttpStatusCodeError().equals(HttpStatus.FORBIDDEN)){ - String msg= - "Error 403/FORBIDEN during Questionnaire postContext." - + " It can be caused by a missing permission or if a questionnaire model" - +" is already assigned to another campaign." - + " msg="+e.getMessage(); - getLogger().error(msg); - throw new HttpClient4xxBPMNError(msg,e.getHttpStatusCodeError()); - } - else if(e.getHttpStatusCodeError().equals(HttpStatus.BAD_REQUEST)){ - String msg="Error 400/BAD_REQUEST during Questionnaire postContext." - + " One possible cause is that the campaign already exists " - + " msg="+e.getMessage(); - getLogger().error(msg); - throw new HttpClient4xxBPMNError(msg,e.getHttpStatusCodeError()); - } - //Currently no remediation so just rethrow - throw e; - } - } - - /** Create a survey Unit **/ - default void postSurveyUnit(SurveyUnitResponseDto suDto, String idCampaign) { - WebClientHelper.logJson("postSurveyUnit: idCampaign="+idCampaign, suDto,getLogger(),Level.DEBUG); - try { - var response = restClient() - .post() - .uri(uriBuilder -> uriBuilder - .path("/api/campaign/{id}/survey-unit") - .build(idCampaign)) - .body(suDto) - .retrieve() - .body(String.class); - getLogger().info("postSurveyUnit: idCampaign={} - idSu={} - response={} ", idCampaign,suDto.getId(), response); - } - catch (HttpClient4xxBPMNError e){ - if(e.getHttpStatusCodeError().equals(HttpStatus.BAD_REQUEST)){ - String msg="Error 400/BAD_REQUEST during Questionnaire postSurveyUnit." - + " msg="+e.getMessage(); - getLogger().error(msg); - throw new HttpClient4xxBPMNError(msg,e.getHttpStatusCodeError()); - } - //Currently no remediation so just rethrow - throw e; - } - } - - //V2 - default void postSurveyUnits(String idCampaign, List interrogations) { - WebClientHelper.logJson("postSurveyUnits: idCampaign=" + idCampaign, interrogations, getLogger(), Level.DEBUG); - try { - var response = restClient() - .post() - .uri(uriBuilder -> uriBuilder - .path("/api/campaign/{id}/survey-unit") - .build(idCampaign)) - .body(interrogations) - .retrieve() - .body(String.class); - getLogger().info("postSurveyUnits: idCampaign={} - response={} ", idCampaign, response); - } catch (HttpClient4xxBPMNError e) { - if (e.getHttpStatusCodeError().equals(HttpStatus.BAD_REQUEST)) { - String msg = "Error 400/BAD_REQUEST during Questionnaire postSurveyUnits." - + " msg=" + e.getMessage(); - getLogger().error(msg); - throw new HttpClient4xxBPMNError(msg, e.getHttpStatusCodeError()); - } - //Currently no remediation so just rethrow - throw e; - } - } -} diff --git a/src/main/java/fr/insee/protools/backend/service/context/ContextService.java b/src/main/java/fr/insee/protools/backend/service/context/ContextService.java index f13d0003..315ea025 100644 --- a/src/main/java/fr/insee/protools/backend/service/context/ContextService.java +++ b/src/main/java/fr/insee/protools/backend/service/context/ContextService.java @@ -1,6 +1,7 @@ package fr.insee.protools.backend.service.context; import com.fasterxml.jackson.databind.JsonNode; +import fr.insee.protools.backend.dto.ContexteProcessus; import org.springframework.web.multipart.MultipartFile; public interface ContextService { @@ -24,12 +25,21 @@ public interface ContextService { String processContextFileAndCreateProcessInstance(MultipartFile file, String processDefinitionId, String businessKey); /** - * Retrieve Protools Context from of a given processInstance ID + * Retrieve Protools Context as JsonNode from of a given processInstance ID * * @param processInstanceId * @return the Json context of the process associated with process Instance * @throws */ - JsonNode getContextByProcessInstance(String processInstanceId) ; + JsonNode getContextJsonNodeByProcessInstance(String processInstanceId); + + /** + * Retrieve Protools Context as DTO from of a given processInstance ID + * + * @param processInstanceId + * @return the Dto context of the process associated with process Instance + * @throws + */ + ContexteProcessus getContextDtoByProcessInstance(String processInstanceId); } diff --git a/src/main/java/fr/insee/protools/backend/service/context/ContextServiceImpl.java b/src/main/java/fr/insee/protools/backend/service/context/ContextServiceImpl.java index 21c020fd..be1c6aa2 100644 --- a/src/main/java/fr/insee/protools/backend/service/context/ContextServiceImpl.java +++ b/src/main/java/fr/insee/protools/backend/service/context/ContextServiceImpl.java @@ -4,11 +4,13 @@ import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.ObjectReader; +import com.networknt.schema.JsonSchema; +import com.networknt.schema.JsonSchemaFactory; +import com.networknt.schema.SpecVersion; +import com.networknt.schema.ValidationMessage; +import fr.insee.protools.backend.dto.ContexteProcessus; import fr.insee.protools.backend.service.DelegateContextVerifier; -import fr.insee.protools.backend.service.context.exception.BadContextDateTimeParseBPMNError; -import fr.insee.protools.backend.service.context.exception.BadContextIOException; -import fr.insee.protools.backend.service.context.exception.BadContextIncorrectBPMNError; -import fr.insee.protools.backend.service.context.exception.BadContextNotJSONBPMNError; +import fr.insee.protools.backend.service.context.exception.*; import fr.insee.protools.backend.service.exception.ProcessDefinitionNotFoundException; import fr.insee.protools.backend.service.exception.TaskNotFoundException; import fr.insee.protools.backend.service.utils.log.TimeLogUtils; @@ -34,14 +36,13 @@ import org.springframework.web.multipart.MultipartFile; import java.io.IOException; -import java.io.Serializable; import java.nio.charset.StandardCharsets; import java.time.Instant; import java.time.format.DateTimeParseException; import java.util.*; import java.util.concurrent.ConcurrentHashMap; -import static fr.insee.protools.backend.service.FlowableVariableNameConstants.*; +import static fr.insee.protools.backend.service.FlowableVariableNameConstants.VARNAME_CONTEXT; import static fr.insee.protools.backend.service.context.ContextConstants.*; @Service @@ -49,15 +50,57 @@ @RequiredArgsConstructor public class ContextServiceImpl implements ContextService { + private static final ObjectReader defaultReader = new ObjectMapper().reader(); // maybe with configs + //Key : processInstanceID + //Value: Pair + private static final Map contextCache = new ConcurrentHashMap<>(); + //TODO: Peut être que ca va sortir dans une dépendance externe + private static final String SCHEMA_VALIDATION_FILE = "schema/contexte-processus.json"; private final RuntimeService runtimeService; private final TaskService taskService; private final RepositoryService repositoryService; private final ApplicationContext springApplicationContext; + JsonSchema contextJsonSchema = JsonSchemaFactory + .getInstance(SpecVersion.VersionFlag.V202012) + .getSchema(getClass().getResourceAsStream(SCHEMA_VALIDATION_FILE)); - private static final ObjectMapper mapper = new ObjectMapper(); - private static final ObjectReader defaultReader = mapper.reader(); // maybe with configs + //TODO : soit les json schema permettent de valider les dates, soit il faudra valider toutes les dates comme ça + public static Pair getCollectionStartAndEndFromPartition(JsonNode partitionNode) { + String start = partitionNode.get(CTX_PARTITION_DATE_DEBUT_COLLECTE).asText(); + String end = partitionNode.get(CTX_PARTITION_DATE_FIN_COLLECTE).asText(); + + if (start == null || end == null) { + throw new BadContextIncorrectBPMNError(String.format("%s and %s must be defined on every partition", CTX_PARTITION_DATE_DEBUT_COLLECTE, CTX_PARTITION_DATE_FIN_COLLECTE)); + } + + try { + Instant collectionStart = Instant.parse(start); + Instant collectionEnd = Instant.parse(end); + log.info("partition_id={} - CollectionStartDate={} - CollectionEndDate={}", partitionNode.path(CTX_PARTITION_ID), TimeLogUtils.format(collectionStart), TimeLogUtils.format(collectionEnd)); + return Pair.of(collectionStart, + collectionEnd); - private static final Map contextCache = new ConcurrentHashMap<>(); + } catch (DateTimeParseException e) { + throw new BadContextIncorrectBPMNError(String.format("%s or %s cannot be read as Instant : %s", CTX_PARTITION_DATE_DEBUT_COLLECTE, CTX_PARTITION_DATE_FIN_COLLECTE, e.getMessage())); + } + } + + public static Instant getInstantFromPartition(JsonNode partitionNode, String subnode) throws BadContextDateTimeParseBPMNError { + JsonNode instantNode = partitionNode.get(subnode); + if (instantNode == null) { + throw new BadContextDateTimeParseBPMNError(String.format("node %s of partition %s does not exists", subnode, partitionNode.path(CTX_PARTITION_ID).asText())); + } + String valueTxt = partitionNode.path(subnode).asText(); + if (valueTxt.isBlank()) { + throw new BadContextDateTimeParseBPMNError(String.format("node %s of partition %s is blank", subnode, partitionNode.path(CTX_PARTITION_ID).asText())); + } + + try { + return Instant.parse(valueTxt); + } catch (DateTimeParseException e) { + throw new BadContextDateTimeParseBPMNError(String.format("node %s of partition %s having value [%s] cannot be parsed : %s", subnode, partitionNode.path(CTX_PARTITION_ID).asText(), valueTxt, e.getMessage())); + } + } @Override public void processContextFileAndCompleteTask(MultipartFile file, String taskId) { @@ -73,11 +116,14 @@ public void processContextFileAndCompleteTask(MultipartFile file, String taskId) } //check context - Pair, JsonNode> contextPair = processContextFile(file, task.getProcessDefinitionId()); + ContextPair contextPair = processContextFile(file, task.getProcessDefinitionId()); //Store context in cache - contextCache.put(task.getProcessInstanceId(), contextPair.getValue()); - // Complete task and store context within process variables - taskService.complete(taskId, contextPair.getKey()); + contextCache.put(task.getProcessInstanceId(), contextPair); + + // Complete task and store context raw json as string within process variables + Map variables = new HashMap<>(); + variables.put(VARNAME_CONTEXT, contextPair.contextAsString); + taskService.complete(taskId, variables); } @Override @@ -89,17 +135,21 @@ public String processContextFileAndCreateProcessInstance(MultipartFile file, Str try { //check context - Pair, JsonNode> contextPair = processContextFile(file, processDefinitionId); + ContextPair contextPair = processContextFile(file, processDefinitionId); //Create process instance ProcessInstance processInstance; + Map variables = new HashMap<>(); + variables.put(VARNAME_CONTEXT, contextPair.contextAsString); + if (StringUtils.isBlank(businessKey)) { - processInstance = runtimeService.startProcessInstanceByKey(processDefinitionId, contextPair.getKey()); + processInstance = runtimeService.startProcessInstanceByKey(processDefinitionId, variables); } else { - processInstance = runtimeService.startProcessInstanceByKey(processDefinitionId, businessKey, contextPair.getKey()); + processInstance = runtimeService.startProcessInstanceByKey(processDefinitionId, businessKey, variables); } log.info("Created new process instance with processDefinitionId={} - ProcessInstanceId={}", processDefinitionId, processInstance.getProcessInstanceId()); //Store context in cache - contextCache.put(processInstance.getProcessInstanceId(), contextPair.getValue()); + contextCache.put(processInstance.getProcessInstanceId(), contextPair); + return processInstance.getProcessInstanceId(); } catch (FlowableObjectNotFoundException e) { log.error("processDefinitionId={} is unknown", processDefinitionId); @@ -107,32 +157,63 @@ public String processContextFileAndCreateProcessInstance(MultipartFile file, Str } } + @Override + public JsonNode getContextJsonNodeByProcessInstance(String processInstanceId) { + try { + return defaultReader.readTree(getContextByProcessInstance(processInstanceId).contextAsString); + } catch (JsonProcessingException e) { + throw new BadContextIncorrectBPMNError(String.format("Context retrieved from engine cannot be parsed for processInstanceId=[%s] ", processInstanceId)); + } + } @Override - public JsonNode getContextByProcessInstance(String processInstanceId) { + public ContexteProcessus getContextDtoByProcessInstance(String processInstanceId) { + return getContextByProcessInstance(processInstanceId).contextSchema(); + } + + private ContextPair getContextByProcessInstance(String processInstanceId) { ProcessInstance processInstance = runtimeService.createProcessInstanceQuery().processInstanceId(processInstanceId).singleResult(); if (processInstance == null) { throw new FlowableObjectNotFoundException("Could not find a process instance with id '" + processInstanceId + "'.", ProcessInstance.class); } - JsonNode result = contextCache.get(processInstanceId); + + ContextPair result = contextCache.get(processInstanceId); //If value does not exist in cache yet : Retrieve it and update cache if (result == null) { String contextStr = runtimeService.getVariable(processInstanceId, VARNAME_CONTEXT, String.class); - if(contextStr == null || contextStr.isBlank()){ - throw new BadContextIncorrectBPMNError(String.format("Context retrieved from engine is null or empty processInstanceId=[%s] ", processInstanceId)); + if (contextStr == null || contextStr.isBlank()) { + throw new BadContexMissingBPMNError(String.format("Context retrieved from engine is null or empty processInstanceId=[%s] ", processInstanceId)); } - try { - result = defaultReader.readTree(contextStr); - } catch (JsonProcessingException e) { - throw new BadContextIncorrectBPMNError(String.format("Context retrieved from engine could not be parsed for processInstanceId=[%s] - Exception : %s", processInstanceId, e.getMessage())); + ContexteProcessus schema = defaultReader.readValue(contextStr, ContexteProcessus.class); + result = new ContextPair(contextStr, schema); + contextCache.put(processInstanceId, result); + } catch (IOException e) { + throw new BadContextIncorrectBPMNError(String.format("Context cannot be parsed for processInstanceId=[%s] ", processInstanceId)); } - contextCache.put(processInstanceId, result); } return result; } - private Pair, JsonNode> processContextFile(MultipartFile file, String processDefinitionKey) { + private ContexteProcessus jsonReadAndSchemaValidation(JsonNode rootContext) { + //Validate that the Json is valid regarding the json-schema + Set jsonValidationErrors = contextJsonSchema.validate(rootContext); + if (!jsonValidationErrors.isEmpty()) { + String message = String.format("Uploaded context is not correct according to the json-schema. Errors: %s", + jsonValidationErrors); + log.warn(message); + throw new BadContextNotJSONBPMNError(message); + } else { + try { + return defaultReader.treeToValue(rootContext, ContexteProcessus.class); + } catch (IllegalArgumentException | JsonProcessingException e) { + log.warn("Uploaded context cannot be parsed correctly {}", e.getMessage()); + throw new BadContextNotJSONBPMNError("Uploaded context cannot be parsed correctly"); + } + } + } + + private ContextPair processContextFile(MultipartFile file, String processDefinitionKey) { //Validate file name (JSON) var fileExtension = getFileExtension(file.getOriginalFilename()); if (fileExtension.isEmpty()) { @@ -146,47 +227,17 @@ private Pair, JsonNode> processContextFile(MultipartFile fil log.debug("Context File content : " + content); JsonNode rootContext = defaultReader.readTree(content); + ContexteProcessus contexte = jsonReadAndSchemaValidation(rootContext); + Set contextErrors = isContextOKForBPMN(processDefinitionKey, rootContext); if (!contextErrors.isEmpty()) { throw new BadContextIncorrectBPMNError(contextErrors.toString()); } - log.info("idCampaign="+rootContext.path(CTX_CAMPAGNE_ID).textValue()); - - //Variables to store for this process - Map variables = new HashMap<>(); - //Store the raw json as string - variables.put(VARNAME_CONTEXT, content); - - // Extraction of campaign TIMER START/END dates - // Do extraction of important BPMN Variables in separates functions - JsonNode partitions = rootContext.path(CTX_PARTITIONS); - if (partitions.isMissingNode()) { - String msg = String.format("Missing %s in context", CTX_PARTITIONS); - log.error(msg); - throw new BadContextIncorrectBPMNError(msg); - } - - List partitionIds = new ArrayList<>(); - HashMap> variablesByPartition= new HashMap<>(); - - for (JsonNode partition : partitions) { - Pair startEndDT = getCollectionStartAndEndFromPartition(partition); - String partitionId = partition.path(CTX_PARTITION_ID).asText(); - partitionIds.add(partitionId); + log.info("idCampaign={}", contexte.getId()); - HashMap partitionVariables = new HashMap<>(); - partitionVariables.put(CTX_PARTITION_DATE_DEBUT_COLLECTE,startEndDT.getKey() ); - partitionVariables.put(CTX_PARTITION_DATE_FIN_COLLECTE,startEndDT.getValue() ); - - variablesByPartition.put(partitionId,partitionVariables); - } - - variables.put(VARNAME_CONTEXT_PARTITION_ID_LIST, partitionIds); - variables.put(VARNAME_CONTEXT_PARTITION_VARIABLES_BY_ID, variablesByPartition); - - return Pair.of(variables, rootContext); - } catch (IOException e) { - throw new BadContextIOException("Error while reading context content: "+e.getMessage(), e); + return new ContextPair(content, contexte); + } catch (IOException | IllegalArgumentException e) { + throw new BadContextIOException("Error while reading context content: " + e.getMessage(), e); } } @@ -196,79 +247,42 @@ private Optional getFileExtension(String filename) { .map(f -> f.substring(filename.lastIndexOf(".") + 1)); } - //TODO : soit les json schema permettent de valider les dates, soit il faudra valider toutes les dates comme ça - public static Pair getCollectionStartAndEndFromPartition(JsonNode partitionNode) { - String start = partitionNode.get(CTX_PARTITION_DATE_DEBUT_COLLECTE).asText(); - String end = partitionNode.get(CTX_PARTITION_DATE_FIN_COLLECTE).asText(); - - if(start==null || end==null){ - throw new BadContextIncorrectBPMNError(String.format("%s and %s must be defined on every partition", CTX_PARTITION_DATE_DEBUT_COLLECTE, CTX_PARTITION_DATE_FIN_COLLECTE)); - } - - try { - Instant collectionStart = Instant.parse(start); - Instant collectionEnd = Instant.parse(end); - log.info("partition_id={} - CollectionStartDate={} - CollectionEndDate={}", partitionNode.path(CTX_PARTITION_ID), TimeLogUtils.format(collectionStart), TimeLogUtils.format(collectionEnd)); - return Pair.of(collectionStart, - collectionEnd); - - } catch (DateTimeParseException e) { - throw new BadContextIncorrectBPMNError(String.format("%s or %s cannot be read as Instant : %s", CTX_PARTITION_DATE_DEBUT_COLLECTE, CTX_PARTITION_DATE_FIN_COLLECTE, e.getMessage())); - } - } - - public static Instant getInstantFromPartition(JsonNode partitionNode, String subnode) throws BadContextDateTimeParseBPMNError { - JsonNode instantNode = partitionNode.get(subnode); - if (instantNode == null) { - throw new BadContextDateTimeParseBPMNError(String.format("node %s of partition %s does not exists", subnode, partitionNode.path(CTX_PARTITION_ID).asText())); - } - String valueTxt = partitionNode.path(subnode).asText(); - if (valueTxt.isBlank()) { - throw new BadContextDateTimeParseBPMNError(String.format("node %s of partition %s is blank", subnode, partitionNode.path(CTX_PARTITION_ID).asText())); - } - - try { - return Instant.parse(valueTxt); - } catch (DateTimeParseException e) { - throw new BadContextDateTimeParseBPMNError(String.format("node %s of partition %s having value [%s] cannot be parsed : %s", subnode, partitionNode.path(CTX_PARTITION_ID).asText(), valueTxt, e.getMessage())); - } - } - /** * Check if protoolsContextRootNode allows every Task implementing {@link fr.insee.protools.backend.service.DelegateContextVerifier#getContextErrors DelegateContextVerifier} interface to run correctly - * @param processDefinitionKey The process (BPMN) identifier + * + * @param processDefinitionKey The process (BPMN) identifier * @param protoolsContextRootNode The context to check * @return A list of the problems found * @throws FlowableObjectNotFoundException if no process definition (BPMN) matches processDefinitionKey */ public Set isContextOKForBPMN(String processDefinitionKey, JsonNode protoolsContextRootNode) { //At least, the campaign ID should be defined so we can write it on process variables to be used un groovy scripts - Set errors=DelegateContextVerifier.computeMissingChildrenMessages(Set.of(CTX_CAMPAGNE_ID),protoolsContextRootNode,getClass()); + Set errors = DelegateContextVerifier.computeMissingChildrenMessages(Set.of(CTX_CAMPAGNE_ID), protoolsContextRootNode, getClass()); ProcessDefinitionQuery processDefinitionQuery = repositoryService.createProcessDefinitionQuery(); processDefinitionQuery.processDefinitionKey(processDefinitionKey); processDefinitionQuery.latestVersion(); ProcessDefinition definition = processDefinitionQuery.singleResult(); - if(definition==null){ + if (definition == null) { throw new FlowableObjectNotFoundException("Cannot find process definition with key " + processDefinitionKey, ProcessDefinition.class); } BpmnModel model = repositoryService.getBpmnModel(definition.getId()); - if(model==null){ + if (model == null) { throw new FlowableObjectNotFoundException("Cannot find process BPMN model definition with key " + processDefinitionKey, ProcessDefinition.class); } org.flowable.bpmn.model.Process processModel = model.getProcessById(processDefinitionKey); - if(processModel==null){ + if (processModel == null) { throw new FlowableObjectNotFoundException("Cannot find process Model with key " + processDefinitionKey, ProcessDefinition.class); } processModel.getFlowElements().stream() .filter(flowElement -> (flowElement instanceof ServiceTask || flowElement instanceof SubProcess)) - .forEach(flowElement -> errors.addAll(analyseProcess(flowElement,protoolsContextRootNode))); + .forEach(flowElement -> errors.addAll(analyseProcess(flowElement, protoolsContextRootNode))); return errors; } - private Set analyseProcess(FlowElement flowElement, JsonNode protoolsContextRootNode){ + private Set analyseProcess(FlowElement flowElement, JsonNode protoolsContextRootNode) { if (flowElement instanceof ServiceTask serviceTask) { if (serviceTask.getImplementationType().equals("delegateExpression")) { String delegateExpression = serviceTask.getImplementation().replace("${", "").replace("}", ""); @@ -277,15 +291,18 @@ private Set analyseProcess(FlowElement flowElement, JsonNode protoolsCon if (bean instanceof DelegateContextVerifier beanDelegateCtxVerifier) { return beanDelegateCtxVerifier.getContextErrors(protoolsContextRootNode); } + } catch (NoSuchBeanDefinitionException e) { } - catch (NoSuchBeanDefinitionException e){} } } else if (flowElement instanceof SubProcess subProcessFlowElement) { Set errors = new HashSet<>(); subProcessFlowElement.getFlowElements().stream() - .forEach(subFlowElement -> errors.addAll(analyseProcess(subFlowElement,protoolsContextRootNode))); + .forEach(subFlowElement -> errors.addAll(analyseProcess(subFlowElement, protoolsContextRootNode))); return errors; } return Set.of(); } + + private record ContextPair(String contextAsString, ContexteProcessus contextSchema) { + } } diff --git a/src/main/java/fr/insee/protools/backend/service/context/exception/BadContexMissingBPMNError.java b/src/main/java/fr/insee/protools/backend/service/context/exception/BadContexMissingBPMNError.java new file mode 100644 index 00000000..51c8d225 --- /dev/null +++ b/src/main/java/fr/insee/protools/backend/service/context/exception/BadContexMissingBPMNError.java @@ -0,0 +1,10 @@ +package fr.insee.protools.backend.service.context.exception; + +import static fr.insee.protools.backend.service.BPMNErrorCode.BPMNERROR_CODE_DEFAULT; + +@SuppressWarnings("squid:S110") +public class BadContexMissingBPMNError extends BadContexteBPMNError { + public BadContexMissingBPMNError(String message) { + super(BPMNERROR_CODE_DEFAULT, message); + } +} diff --git a/src/main/java/fr/insee/protools/backend/service/context/exception/BadContextJSONValidationBPMNError.java b/src/main/java/fr/insee/protools/backend/service/context/exception/BadContextJSONValidationBPMNError.java new file mode 100644 index 00000000..df32c46d --- /dev/null +++ b/src/main/java/fr/insee/protools/backend/service/context/exception/BadContextJSONValidationBPMNError.java @@ -0,0 +1,15 @@ +package fr.insee.protools.backend.service.context.exception; + +import fr.insee.protools.backend.exception.ProtoolsBpmnError; + +import static fr.insee.protools.backend.service.BPMNErrorCode.BPMNERROR_CODE_DEFAULT; + +/** + * Runtime exception indicating the context json is not correct according to the json-schema + */ +public class BadContextJSONValidationBPMNError extends ProtoolsBpmnError { + + public BadContextJSONValidationBPMNError(String message) { + super(BPMNERROR_CODE_DEFAULT, message); + } +} diff --git a/src/main/java/fr/insee/protools/backend/service/context/resolvers/PartitionCtxResolver.java b/src/main/java/fr/insee/protools/backend/service/context/resolvers/PartitionCtxResolver.java index 891def28..2ec5c7b0 100644 --- a/src/main/java/fr/insee/protools/backend/service/context/resolvers/PartitionCtxResolver.java +++ b/src/main/java/fr/insee/protools/backend/service/context/resolvers/PartitionCtxResolver.java @@ -1,27 +1,26 @@ package fr.insee.protools.backend.service.context.resolvers; -import com.fasterxml.jackson.databind.JsonNode; -import fr.insee.protools.backend.exception.ProtoolsBpmnError; +import fr.insee.protools.backend.dto.Communication; +import fr.insee.protools.backend.dto.Lot; import fr.insee.protools.backend.service.context.ContextService; import fr.insee.protools.backend.service.exception.IncoherentBPMNContextError; -import fr.insee.protools.backend.service.utils.ContextUtils; import fr.insee.protools.backend.service.utils.FlowableVariableUtils; import fr.insee.protools.backend.service.utils.log.TimeLogUtils; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.flowable.common.engine.api.FlowableException; import org.flowable.engine.impl.persistence.entity.ExecutionEntity; import org.springframework.stereotype.Component; -import java.io.Serializable; -import java.time.*; -import java.time.format.DateTimeFormatter; +import java.time.Duration; +import java.time.Instant; +import java.time.LocalDate; +import java.time.ZoneId; import java.time.temporal.TemporalAmount; -import java.util.*; +import java.util.HashSet; +import java.util.Optional; +import java.util.Set; import static fr.insee.protools.backend.service.FlowableVariableNameConstants.*; -import static fr.insee.protools.backend.service.context.ContextConstants.*; -import static fr.insee.protools.backend.service.utils.ContextUtils.*; /** * Used to make protools context variables available in BPMN expressions @@ -50,38 +49,35 @@ public class PartitionCtxResolver { private final static Instant farAwayInstant = LocalDate.parse("9999-12-31").atStartOfDay(ZoneId.of("Europe/Paris")).toInstant(); - private Serializable getVariableOfPartition(ExecutionEntity execution, String partitionId, String key) { - HashMap> variablesByPartition = execution.getVariable(VARNAME_CONTEXT_PARTITION_VARIABLES_BY_ID, HashMap.class); - HashMap partitionVariables = variablesByPartition.get(partitionId); - if(partitionVariables==null) { - throw new FlowableException("Could not get variable "+VARNAME_CONTEXT_PARTITION_VARIABLES_BY_ID+ " of partitionId="+partitionId); - } - return partitionVariables.get(key); + private Optional getPartition(ExecutionEntity execution, String partitionId){ + var context = protoolsContext.getContextDtoByProcessInstance(execution.getProcessInstanceId()); + return context.getLots().stream() + .filter(x -> x.getId().toString().equalsIgnoreCase(partitionId)) + .findAny(); } public Instant getCollectionStartDate(ExecutionEntity execution, String partitionId) { - return (Instant) getVariableOfPartition(execution,partitionId,CTX_PARTITION_DATE_DEBUT_COLLECTE); + return getPartition(execution,partitionId) + .orElseThrow(() -> new IncoherentBPMNContextError("Tried to get Collection Start date on undefined partition")) + .getDateDebutCollecte(); } public Instant getCollectionEndDate(ExecutionEntity execution, String partitionId) { - //TODO : a supprimer ; Voir si on n'utilise pas le contexte json directement au lieu de variables initalisées au lancement - /*Instant s = (Instant) getVariableOfPartition(execution,partitionId,CTX_PARTITION_DATE_FIN_COLLECTE); - System.out.println("partitionId="+partitionId+" getCollectionEndDate="+s); - LocalDateTime ldt = LocalDateTime.ofInstant(s, ZoneOffset.systemDefault()); //2023-02-02T13:52:04.824071900 - System.out.println("partitionId="+partitionId+" getCollectionEndDate LOCAL="+ldt);*/ - - return (Instant) getVariableOfPartition(execution,partitionId,CTX_PARTITION_DATE_FIN_COLLECTE); - + return getPartition(execution,partitionId) + .orElseThrow(() -> new IncoherentBPMNContextError("Tried to get Collection Start date on undefined partition")) + .getDateDebutCollecte(); } @SuppressWarnings("unused") //used in BPMNS public String getCommunicationType(ExecutionEntity execution, String partitionId, String communicationId) { - JsonNode contextRootNode = protoolsContext.getContextByProcessInstance(execution.getProcessInstanceId()); - JsonNode communicationNode = ContextUtils.getCommunicationFromPartition(contextRootNode,partitionId,communicationId) - .orElseThrow(() -> new IncoherentBPMNContextError("Tried to get communication type on an unknown partition")); - - return communicationNode.path(CTX_PARTITION_COMMUNICATION_TYPE).asText(); + return getPartition(execution,partitionId) + .orElseThrow(() -> new IncoherentBPMNContextError("Tried to get communication type on an unknown partition : "+partitionId)) + .getCommunications().stream() + .filter(x -> x.getId().toString().equalsIgnoreCase(communicationId)) + .findAny() + .orElseThrow(() -> new IncoherentBPMNContextError("Tried to get communication type on an unknown communication : "+communicationId)) + .getTypeCommunication().toString(); } @@ -92,7 +88,9 @@ public Instant scheduleNextCommunication(ExecutionEntity execution, String parti Instant now = Instant.now(); //Context - JsonNode contextRootNode = protoolsContext.getContextByProcessInstance(execution.getProcessInstanceId()); + Lot partition = getPartition(execution,partitionId) + .orElseThrow(() -> new IncoherentBPMNContextError("Tried to get schedule next communication on an unknown partition : "+partitionId)); + Set sentCommunicationIds = FlowableVariableUtils.getVariableOrNull(execution, VARNAME_ALREADY_SCHEDULED_COMMUNICATION_ID_SET, Set.class); Set errorCommunicationIds = FlowableVariableUtils.getVariableOrNull(execution, VARNAME_COMMUNICATION_ERROR_ID_SET, Set.class); @@ -103,47 +101,38 @@ public Instant scheduleNextCommunication(ExecutionEntity execution, String parti if(errorCommunicationIds==null){ errorCommunicationIds=new HashSet<>(); } - JsonNode partitionNode = getPartitionNodeIfExists(contextRootNode, partitionId) - .orElseThrow(() -> new IncoherentBPMNContextError("Tried to schedule next communication of an undefined partition")); - - //if this partition is not defined; obviously there is something wrong - String end = partitionNode.get(CTX_PARTITION_DATE_FIN_COLLECTE).asText(); - Instant collectionEndCollecte = Instant.parse(end); - if(collectionEndCollecte.isBefore(now)){ + //Collection End if after current time + if(partition.getDateFinCollecte().isBefore(now)){ log.error("ProcessInstanceId={} - partitionId={} - dateFinCollecte={} is in the past ==> Timer is set to a far away Instant ", - execution.getProcessInstanceId(), partitionId, TimeLogUtils.format(collectionEndCollecte)); + execution.getProcessInstanceId(), partitionId, TimeLogUtils.format(partition.getDateFinCollecte())); return farAwayInstant; } - List communicationNodes = getCommunicationsFromPartition(partitionNode); Instant nextCommEcheance = null; String nextCommId=null; + for (Communication communication: partition.getCommunications()){ - for (JsonNode communicationNode : communicationNodes){ - Instant echeance = Instant.parse(communicationNode.path(CTX_PARTITION_COMMUNICATION_ECHEANCE).asText()); - String communicationId=communicationNode.path(CTX_PARTITION_COMMUNICATION_ID).asText(); - - //null is an error in config so we ignore it; a + //null is an error in config so we ignore it; // and we also discard communications that have already been sent or that have been marked as in error - if(communicationId==null || sentCommunicationIds.contains(communicationId) || errorCommunicationIds.contains(communicationId)){ + if(communication==null || communication.getEcheance()==null || sentCommunicationIds.contains(communication.getId().toString()) || errorCommunicationIds.contains(communication.getId().toString())){ continue; } //verify that echeance of communication to be sent is not too old - if(echeance.plus(maxSendCommunicationWindowHours).isBefore(now)){ + if(communication.getEcheance().plus(maxSendCommunicationWindowHours).isBefore(now)){ log.warn("Partition id={} : Communication id={} has not been sent. Its echeance [ {} ] is too far past so it will not be sent", - partitionId,communicationId,TimeLogUtils.format(echeance)); + partitionId,communication.getId(),TimeLogUtils.format(communication.getEcheance())); - errorCommunicationIds.add(communicationId); + errorCommunicationIds.add(communication.getId().toString()); execution.getRootProcessInstance().setVariableLocal(VARNAME_COMMUNICATION_ERROR_ID_SET,errorCommunicationIds); } //Among the not treated communications we compute the one with the first echeance - else if(nextCommEcheance == null || nextCommEcheance.isAfter(echeance)){ - nextCommEcheance=echeance; - nextCommId=communicationNode.path(CTX_PARTITION_COMMUNICATION_ID).asText(); + else if(nextCommEcheance == null || nextCommEcheance.isAfter(communication.getEcheance())){ + nextCommEcheance=communication.getEcheance(); + nextCommId=communication.getId().toString(); } } diff --git a/src/main/java/fr/insee/protools/backend/service/era/EraGetSUForPeriodAndGenderTask.java b/src/main/java/fr/insee/protools/backend/service/era/EraGetSUForPeriodAndGenderTask.java deleted file mode 100644 index ac375078..00000000 --- a/src/main/java/fr/insee/protools/backend/service/era/EraGetSUForPeriodAndGenderTask.java +++ /dev/null @@ -1,91 +0,0 @@ -package fr.insee.protools.backend.service.era; - -import com.fasterxml.jackson.databind.JsonNode; -import fr.insee.protools.backend.dto.era.CensusJsonDto; -import fr.insee.protools.backend.dto.era.GenderType; -import fr.insee.protools.backend.service.DelegateContextVerifier; -import fr.insee.protools.backend.service.context.ContextService; -import fr.insee.protools.backend.service.utils.FlowableVariableUtils; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.flowable.engine.delegate.DelegateExecution; -import org.flowable.engine.delegate.JavaDelegate; -import org.springframework.stereotype.Component; - -import java.time.LocalDate; -import java.util.HashSet; -import java.util.List; -import java.util.Set; - -import static fr.insee.protools.backend.service.FlowableVariableNameConstants.*; -import static fr.insee.protools.backend.service.context.ContextConstants.CTX_PARTITIONS; -import static fr.insee.protools.backend.service.context.ContextConstants.CTX_PARTITION_ERA_SEXE; -import static fr.insee.protools.backend.service.utils.ContextUtils.getCurrentPartitionNode; - -@Component -@Slf4j -@RequiredArgsConstructor -public class EraGetSUForPeriodAndGenderTask implements JavaDelegate, DelegateContextVerifier { - - private final ContextService protoolsContext; - private final EraService eraService; - private final ContextService contextService; - - @Override - public void execute(DelegateExecution execution) { - JsonNode contextRootNode = protoolsContext.getContextByProcessInstance(execution.getProcessInstanceId()); - checkContextOrThrow(log, execution.getProcessInstanceId(), contextRootNode); - - LocalDate startDate = FlowableVariableUtils.getVariableOrThrow(execution, VARNAME_ERA_QUERY_START_DATE, LocalDate.class); - LocalDate endDate = FlowableVariableUtils.getVariableOrThrow(execution, VARNAME_ERA_QUERY_END_DATE, LocalDate.class); - Long currentPartitionId = FlowableVariableUtils.getVariableOrThrow(execution, VARNAME_CURRENT_PARTITION_ID, Long.class); - - //Get current partition from contexte to get it's defined sexe - JsonNode currentPartitionNode = getCurrentPartitionNode(contextRootNode, currentPartitionId); - GenderType sexe = GenderType.fromLabel(currentPartitionNode.path(CTX_PARTITION_ERA_SEXE).asText()); - log.info("ProcessInstanceId={} - currentPartitionId={} - startDate={} - endDate={} - sexe={} begin" - ,execution.getProcessInstanceId(), currentPartitionId,startDate,endDate,sexe); - - List response = eraService.getSUForPeriodAndSex(startDate, endDate, sexe); - execution.setVariableLocal(VARNAME_ERA_RESPONSE, response); - - log.info("ProcessInstanceId={} response.size={} end" - ,execution.getProcessInstanceId(), response.size()); - } - - @Override - public Set getContextErrors(JsonNode contextRootNode) { - if (contextRootNode == null) { - return Set.of("Context is missing"); - } - Set results = new HashSet<>(); - Set requiredNodes = - Set.of( - //Global & Campaign - CTX_PARTITIONS - ); - Set requiredPartition = - Set.of(CTX_PARTITION_ERA_SEXE); - results.addAll(DelegateContextVerifier.computeMissingChildrenMessages(requiredNodes, contextRootNode, getClass())); - var partitionIterator = contextRootNode.path(CTX_PARTITIONS).elements(); - - //Partitions - while (partitionIterator.hasNext()) { - var partitionNode = partitionIterator.next(); - var missingChildren = DelegateContextVerifier.computeMissingChildrenMessages(requiredPartition, partitionNode, getClass()); - if (!missingChildren.isEmpty()) { - results.addAll(missingChildren); - continue; - } - - //We will use the custom label - String genderType = partitionNode.path(CTX_PARTITION_ERA_SEXE).asText(); - try { - GenderType.fromLabel(genderType); - } catch (IllegalStateException i) { - results.add(DelegateContextVerifier.computeIncorrectEnumMessage(CTX_PARTITION_ERA_SEXE, genderType, GenderType.getAllValidLabels(), getClass())); - } - } - return results; - } -} \ No newline at end of file diff --git a/src/main/java/fr/insee/protools/backend/service/era/EraService.java b/src/main/java/fr/insee/protools/backend/service/era/EraService.java deleted file mode 100644 index 9d69451b..00000000 --- a/src/main/java/fr/insee/protools/backend/service/era/EraService.java +++ /dev/null @@ -1,44 +0,0 @@ -package fr.insee.protools.backend.service.era; - -import fr.insee.protools.backend.dto.era.CensusJsonDto; -import fr.insee.protools.backend.dto.era.GenderType; -import fr.insee.protools.backend.httpclients.webclient.WebClientHelper; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.core.ParameterizedTypeReference; -import org.springframework.stereotype.Service; - -import java.time.LocalDate; -import java.time.format.DateTimeFormatter; -import java.util.List; - -import static fr.insee.protools.backend.httpclients.configuration.ApiConfigProperties.KNOWN_API.KNOWN_API_ERA; - -@Service -@Slf4j -@RequiredArgsConstructor -public class EraService { - private static final DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); - private final WebClientHelper webClientHelper; - - public List getSUForPeriodAndSex(LocalDate startDate, LocalDate endDate, GenderType gender) { - log.info("getSUForPeriodAndSex - gender={} from {} to {}", gender, startDate, endDate); - ParameterizedTypeReference> typeReference = new ParameterizedTypeReference>() { - }; - - List response = webClientHelper.getWebClient(KNOWN_API_ERA) - .get() - .uri(uriBuilder -> uriBuilder - .path("/census-extraction/census-respondents-by-period-and-gender") - .queryParam("startDate", startDate.format(dateFormatter)) - .queryParam("endDate", endDate.format(dateFormatter)) - .queryParam("gender", gender) - .build()) - .retrieve() - .bodyToMono(typeReference) - .block(); - log.trace("getSUForPeriodAndSex - response={} ", response); - log.info("getSUForPeriodAndSex: end"); - return response; - } -} diff --git a/src/main/java/fr/insee/protools/backend/service/meshuggah/MeshuggahCreateCommunicationsContextTask.java b/src/main/java/fr/insee/protools/backend/service/meshuggah/MeshuggahCreateCommunicationsContextTask.java deleted file mode 100644 index f38e24d6..00000000 --- a/src/main/java/fr/insee/protools/backend/service/meshuggah/MeshuggahCreateCommunicationsContextTask.java +++ /dev/null @@ -1,173 +0,0 @@ -package fr.insee.protools.backend.service.meshuggah; - -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.node.ObjectNode; -import fr.insee.protools.backend.dto.meshuggah.MeshuggahComDetails; -import fr.insee.protools.backend.service.DelegateContextVerifier; -import fr.insee.protools.backend.service.context.ContextService; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.EnumUtils; -import org.flowable.engine.delegate.DelegateExecution; -import org.flowable.engine.delegate.JavaDelegate; -import org.springframework.stereotype.Component; - -import java.util.Arrays; -import java.util.HashSet; -import java.util.Set; -import java.util.stream.Collectors; -import java.util.stream.Stream; - -import static fr.insee.protools.backend.service.context.ContextConstants.*; - -@Component -@Slf4j -@RequiredArgsConstructor -public class MeshuggahCreateCommunicationsContextTask implements JavaDelegate, DelegateContextVerifier { - - private final ContextService protoolsContext; - private final MeshuggahService meshuggahService; - - private static final ObjectMapper objectMapper = new ObjectMapper(); - - @Override - public void execute(DelegateExecution execution) { - //Contexte - JsonNode contextRootNode = protoolsContext.getContextByProcessInstance(execution.getProcessInstanceId()); - checkContextOrThrow(log,execution.getProcessInstanceId(), contextRootNode); - String campainId = contextRootNode.path(CTX_CAMPAGNE_ID).asText(); - - log.info("ProcessInstanceId={} - campainId={} begin",execution.getProcessInstanceId(), campainId); - treatPartitions(campainId,contextRootNode); - log.info("ProcessInstanceId={} - campainId={} end",execution.getProcessInstanceId(), campainId); - } - - - private void treatPartitions(String campainId, JsonNode contextRootNode){ - //Partitions - var partitionIterator =contextRootNode.path(CTX_PARTITIONS).elements(); - while (partitionIterator.hasNext()) { - var partitionNode = partitionIterator.next(); - Long partitionId = partitionNode.path(CTX_PARTITION_ID).asLong(); - treatPartition(campainId,partitionId,contextRootNode,partitionNode); - } - } - - private void treatPartition(String campainId, Long partitionId,JsonNode contextRootNode,JsonNode partitionNode){ - log.trace("treatPartition partitionId={}",partitionId); - //Treat every communication of this partition - var communicationsIterator =partitionNode.path(CTX_PARTITION_COMMUNICATIONS).elements(); - while (communicationsIterator.hasNext()) { - var communicationNode = communicationsIterator.next(); - JsonNode body = initBody(contextRootNode,communicationNode); - MeshuggahComDetails meshuggahComDetails = MeshuggahUtils.computeMeshuggahComDetails(campainId,partitionId,communicationNode); - meshuggahService.postCreateCommunication(meshuggahComDetails, body); - } - } - - - - private static JsonNode initBody(JsonNode contextRootNode, JsonNode communicationNode){ - - //Meta données - String logoPrestataire = contextRootNode.path(CTX_METADONNEES).path(CTX_META_LOGO_PRESTATAIRE).asText(); - String mailRespOperationnel = contextRootNode.path(CTX_METADONNEES).path(CTX_META_MAIL_RESP_OPERATIONNEL).asText(); - boolean isPrestataire = contextRootNode.path(CTX_METADONNEES).path(CTX_META_PRESTATAIRE).asBoolean(); - String responsableOperationnel = contextRootNode.path(CTX_METADONNEES).path(CTX_META_RESPONSABLE_OPERATIONNEL).asText(); - String responsableTraitement = contextRootNode.path(CTX_METADONNEES).path(CTX_META_RESPONSABLE_TRAITEMENT).asText(); - String srvcCollSignFunc = contextRootNode.path(CTX_METADONNEES).path(CTX_META_SRVC_COL_SIGN_FONCTION).asText(); - String srvcCollSignNom = contextRootNode.path(CTX_METADONNEES).path(CTX_META_SRVC_COL_SIGN_NOM).asText(); - String themeMieuxConnaitreMail = contextRootNode.path(CTX_METADONNEES).path(CTX_META_THEME_MIEUX_CONNAITRE_MAIL).asText(); - String urlEnq = contextRootNode.path(CTX_METADONNEES).path(CTX_META_URL_ENQUETE).asText(); - String boiteMailRetour = contextRootNode.path(CTX_METADONNEES).path(CTX_META_MAIL_BOITE_RETOUR).asText(); - - ObjectNode body = objectMapper.createObjectNode(); - body.put("Enq_ComplementConnexion",communicationNode.path(CTX_PARTITION_COMMUNICATION_COMPLEMENT_CONNEXION).asText()); - body.put("Enq_LogoPrestataire",logoPrestataire); - body.put("Enq_MailRespOperationnel",mailRespOperationnel); - body.put("Enq_Prestataire",isPrestataire?"oui":"non"); - body.put("Enq_RelanceLibreMailParagraphe1",communicationNode.path(CTX_PARTITION_COMMUNICATION_RELANCE_LIBRE_PARAGRAPHE1).asText()); - body.put("Enq_RelanceLibreMailParagraphe2",communicationNode.path(CTX_PARTITION_COMMUNICATION_RELANCE_LIBRE_PARAGRAPHE2).asText()); - body.put("Enq_RelanceLibreMailParagraphe3",communicationNode.path(CTX_PARTITION_COMMUNICATION_RELANCE_LIBRE_PARAGRAPHE3).asText()); - body.put("Enq_RelanceLibreMailParagraphe4",communicationNode.path(CTX_PARTITION_COMMUNICATION_RELANCE_LIBRE_PARAGRAPHE4).asText()); - body.put("Enq_RespOperationnel",responsableOperationnel); - body.put("Enq_RespTraitement",responsableTraitement); - body.put("Enq_ServiceCollecteurSignataireFonction",srvcCollSignFunc); - body.put("Enq_ServiceCollecteurSignataireNom",srvcCollSignNom); - body.put("Enq_ThemeMieuxConnaitreMail",themeMieuxConnaitreMail); - body.put("Enq_UrlEnquete",urlEnq); - body.put("Mail_BoiteRetour",boiteMailRetour); - body.put("Mail_Objet",communicationNode.path(CTX_PARTITION_COMMUNICATION_OBJET_MAIL).asText()); - - return body; - } - - - - @Override - public Set getContextErrors(JsonNode contextRootNode) { - if (contextRootNode == null) { - return Set.of("Context is missing"); - } - Set results = new HashSet<>(); - Set requiredNodes = - Set.of( - //Global & Campaign - CTX_CAMPAGNE_ID,CTX_METADONNEES,CTX_PARTITIONS - ); - Set requiredPartition = - Set.of(CTX_PARTITION_ID,CTX_PARTITION_COMMUNICATIONS); - - Set requiredMetadonnees = - Set.of(CTX_META_LOGO_PRESTATAIRE,CTX_META_MAIL_RESP_OPERATIONNEL,CTX_META_PRESTATAIRE,CTX_META_RESPONSABLE_OPERATIONNEL,CTX_META_RESPONSABLE_TRAITEMENT, - CTX_META_SRVC_COL_SIGN_FONCTION,CTX_META_SRVC_COL_SIGN_NOM,CTX_META_THEME_MIEUX_CONNAITRE_MAIL,CTX_META_URL_ENQUETE,CTX_META_MAIL_BOITE_RETOUR - ); - Set requiredCommunication = - Stream.of(CTX_PARTITION_COMMUNICATION_COMPLEMENT_CONNEXION, - CTX_PARTITION_COMMUNICATION_RELANCE_LIBRE_PARAGRAPHE1, - CTX_PARTITION_COMMUNICATION_RELANCE_LIBRE_PARAGRAPHE2, - CTX_PARTITION_COMMUNICATION_RELANCE_LIBRE_PARAGRAPHE3, - CTX_PARTITION_COMMUNICATION_RELANCE_LIBRE_PARAGRAPHE4, - CTX_PARTITION_COMMUNICATION_OBJET_MAIL - ).collect(Collectors.toSet()); - requiredCommunication.addAll(MeshuggahUtils.getCommunicationRequiredFields()); - - results.addAll(DelegateContextVerifier.computeMissingChildrenMessages(requiredNodes, contextRootNode, getClass())); - results.addAll(DelegateContextVerifier.computeMissingChildrenMessages(requiredMetadonnees,contextRootNode.path(CTX_METADONNEES),getClass())); - - //Partitions - var partitionIterator = contextRootNode.path(CTX_PARTITIONS).elements(); - while (partitionIterator.hasNext()) { - var partitionNode = partitionIterator.next(); - var missingChildren = DelegateContextVerifier.computeMissingChildrenMessages(requiredPartition, partitionNode, getClass()); - if (!missingChildren.isEmpty()) { - results.addAll(missingChildren); - continue; - } - - //Communications of the partition - var communicationIterator = partitionNode.path(CTX_PARTITION_COMMUNICATIONS).elements(); - while (communicationIterator.hasNext()) { - var communicationNode = communicationIterator.next(); - var missingChildrenCom = DelegateContextVerifier.computeMissingChildrenMessages(requiredCommunication, communicationNode, getClass()); - if (!missingChildrenCom.isEmpty()) { - results.addAll(missingChildrenCom); - } - //Verify medium enum - String medium = communicationNode.path(CTX_PARTITION_COMMUNICATION_MOYEN).asText(); - if(! EnumUtils.isValidEnumIgnoreCase(MeshuggahUtils.MediumEnum.class, medium)){ - results.add(DelegateContextVerifier.computeIncorrectEnumMessage(CTX_PARTITION_COMMUNICATION_MOYEN,medium, Arrays.toString(MeshuggahUtils.MediumEnum.values()),getClass())); - } - - //Verify phase enum - String phase = communicationNode.path(CTX_PARTITION_COMMUNICATION_PHASE).asText(); - if(! EnumUtils.isValidEnumIgnoreCase(MeshuggahUtils.PhaseEnum.class, phase)){ - results.add(DelegateContextVerifier.computeIncorrectEnumMessage(CTX_PARTITION_COMMUNICATION_PHASE,phase, Arrays.toString(MeshuggahUtils.PhaseEnum.values()),getClass())); - } - } - } - return results; - } - -} \ No newline at end of file diff --git a/src/main/java/fr/insee/protools/backend/service/meshuggah/MeshuggahSendCommunicationsForSUTask.java b/src/main/java/fr/insee/protools/backend/service/meshuggah/MeshuggahSendCommunicationsForSUTask.java deleted file mode 100644 index fcb74603..00000000 --- a/src/main/java/fr/insee/protools/backend/service/meshuggah/MeshuggahSendCommunicationsForSUTask.java +++ /dev/null @@ -1,150 +0,0 @@ -package fr.insee.protools.backend.service.meshuggah; - -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; - -@Component -@Slf4j -public class MeshuggahSendCommunicationsForSUTask -// implements JavaDelegate, DelegateContextVerifier -{ -// -// @Autowired ContextService protoolsContext; -// @Autowired MeshuggahService meshuggahService; -// -// private static final ObjectMapper objectMapper = new ObjectMapper(); -// -// static final Pattern echenancePattern = Pattern.compile("^\s*(?:J|j)\\+([0-9]+)\s*$"); -// -// -// @Override -// public void execute(DelegateExecution execution) { -// //Contexte -// JsonNode contextRootNode = protoolsContext.getContextByProcessInstance(execution.getProcessInstanceId()); -// checkContextOrThrow(log,execution.getProcessInstanceId(), contextRootNode); -// String campainId = contextRootNode.path(CTX_CAMPAGNE_ID).asText(); -// -// //Variables -// JsonNode contactNode = FlowableVariableUtils.getVariableOrThrow(execution,VARNAME_PLATINE_CONTACT, JsonNode.class); -// -// //each row is Tuple -// Triple suItem = FlowableVariableUtils.getVariableOrThrow(execution, VARNAME_SU_CREATION_ITEM, Triple.class); -// Instant creationInstant = suItem.getLeft(); -// Long partitionId = suItem.getMiddle(); -// Long remSUId = suItem.getRight(); -// -// log.info("ProcessInstanceId={} - campainId={} begin",execution.getProcessInstanceId(), campainId); -// -// -// //Get partition from contexte -// JsonNode partitionNode = getCurrentPartitionNode(contextRootNode, partitionId); -// -// treatCommunications(partitionNode,creationInstant,remSUId); -// -// -// -// -// PlatineContactDto platineContactDto; -// try { -// platineContactDto=objectMapper.treeToValue(contactNode,PlatineContactDto.class); -// } catch (JsonProcessingException e) { -// throw new IncorrectPlatineContactError("Error while parsing the json retrieved for platine contact : " + contactNode,contactNode, e); -// } -// -// -// //TODO : Currently only send OPENING -// JsonNode communicationNode = MeshuggahUtils.getCommunication(partitionNode,"mail","ouverture"); -// //TODO : hack avec le mail de marc -// platineContactDto.setEmail("marc.berger@insee.fr"); -// JsonNode body = initBody(platineContactDto); -// MeshuggahComDetails meshuggahComDetails = MeshuggahUtils.computeMeshuggahComDetails(campainId,currentPartitionId,communicationNode); -// meshuggahService.postSendCommunication(meshuggahComDetails, body); -// -// log.info("ProcessInstanceId={} - campainId={} end",execution.getProcessInstanceId(), campainId); -// } -// -// private void treatCommunications(JsonNode partitionNode, Instant creationInstant, Long remSUId) { -// -// LocalDate createDate = LocalDate.ofInstant(creationInstant, ZoneId.systemDefault()); -// LocalDate currentDay = LocalDate.now(); -// -// //Partitions -// //Treat every communication of this partition -// var communicationsIterator =partitionNode.path(CTX_PARTITION_COMMUNICATIONS).elements(); -// while (communicationsIterator.hasNext()) { -// var communicationNode = communicationsIterator.next(); -// var echeancesIterator = communicationNode.path(CTX_PARTITION_COMMUNICATION_ECHEANCES).elements(); -// while (communicationsIterator.hasNext()) { -// String echeanceStr = echeancesIterator.next().asText(); -// // create matcher for pattern p and given string -// Matcher matcher = echenancePattern.matcher(echeanceStr); -// // if an occurrence if a pattern was found in a given string... -// if (matcher.find()) { -// Integer nbOfDays = Integer.parseInt(matcher.group(1)); -// //Compute echeance by adding days to creation date -// LocalDate echeanceDate = createDate.plusDays(nbOfDays); -// -// //If echeanceDate is before or equals to today -// if(echeanceDate.compareTo(currentDay)<=0) { -// JsonNode body = initBody(contextRootNode,communicationNode); -// MeshuggahComDetails meshuggahComDetails = MeshuggahUtils.computeMeshuggahComDetails(campainId,partitionId,communicationNode); -// meshuggahService.postCreateCommunication(meshuggahComDetails, body); -// } -// } -// -// -// } -// -// } -// -// private static JsonNode initBody(PlatineContactDto platine_contact){ -// ObjectNode body = objectMapper.createObjectNode(); -// body.put("email",platine_contact.getEmail()); -// body.put("Ue_CalcIdentifiant",platine_contact.getIdentifier()); -// return body; -// } -// -// -// -// -// @Override -// public Set getContextErrors(JsonNode contextRootNode) { -// if (contextRootNode == null) { -// return Set.of("Context is missing"); -// } -// Set results = new HashSet<>(); -// Set requiredNodes = -// Set.of( -// //Global & Campaign -// CTX_CAMPAGNE_ID,CTX_PARTITIONS -// ); -// Set requiredPartition = -// Set.of(CTX_PARTITION_ID,CTX_PARTITION_COMMUNICATIONS); -// -// Set requiredCommunication = MeshuggahUtils.getCommunicationRequiredFields(); -// results.addAll(DelegateContextVerifier.computeMissingChildrenMessages(requiredNodes, contextRootNode, getClass())); -// -// //Partitions -// var partitionIterator = contextRootNode.path(CTX_PARTITIONS).elements(); -// while (partitionIterator.hasNext()) { -// var partitionNode = partitionIterator.next(); -// var missingChildren = DelegateContextVerifier.computeMissingChildrenMessages(requiredPartition, partitionNode, getClass()); -// if (!missingChildren.isEmpty()) { -// results.addAll(missingChildren); -// continue; -// } -// -// //Communications of the partition -// var communicationIterator = partitionNode.path(CTX_PARTITION_COMMUNICATIONS).elements(); -// while (communicationIterator.hasNext()) { -// var communicationNode = partitionIterator.next(); -// var missingChildrenCom = DelegateContextVerifier.computeMissingChildrenMessages(requiredCommunication, communicationNode, getClass()); -// if (!missingChildrenCom.isEmpty()) { -// results.addAll(missingChildrenCom); -// } -// } -// } -// return results; -// } -} - diff --git a/src/main/java/fr/insee/protools/backend/service/meshuggah/MeshuggahSendOpeningMailCommunicationForSUTask.java b/src/main/java/fr/insee/protools/backend/service/meshuggah/MeshuggahSendOpeningMailCommunicationForSUTask.java deleted file mode 100644 index 7cff6a37..00000000 --- a/src/main/java/fr/insee/protools/backend/service/meshuggah/MeshuggahSendOpeningMailCommunicationForSUTask.java +++ /dev/null @@ -1,118 +0,0 @@ -package fr.insee.protools.backend.service.meshuggah; - -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.node.ObjectNode; -import fr.insee.protools.backend.dto.meshuggah.MeshuggahComDetails; -import fr.insee.protools.backend.dto.platine.pilotage.contact.PlatineContactDto; -import fr.insee.protools.backend.service.DelegateContextVerifier; -import fr.insee.protools.backend.service.context.ContextService; -import fr.insee.protools.backend.service.exception.IncorrectPlatineContactError; -import fr.insee.protools.backend.service.utils.FlowableVariableUtils; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.flowable.engine.delegate.DelegateExecution; -import org.flowable.engine.delegate.JavaDelegate; -import org.springframework.stereotype.Component; - -import java.util.HashSet; -import java.util.Set; - -import static fr.insee.protools.backend.service.FlowableVariableNameConstants.VARNAME_CURRENT_PARTITION_ID; -import static fr.insee.protools.backend.service.FlowableVariableNameConstants.VARNAME_PLATINE_CONTACT; -import static fr.insee.protools.backend.service.context.ContextConstants.*; -import static fr.insee.protools.backend.service.utils.ContextUtils.getCurrentPartitionNode; - -@Component -@Slf4j -@RequiredArgsConstructor -public class MeshuggahSendOpeningMailCommunicationForSUTask implements JavaDelegate, DelegateContextVerifier { - - private static final ObjectMapper objectMapper = new ObjectMapper(); - private final ContextService protoolsContext; - private final MeshuggahService meshuggahService; - - private static JsonNode initBody(PlatineContactDto platineContact) { - ObjectNode body = objectMapper.createObjectNode(); - body.put("email", platineContact.getEmail()); - body.put("Ue_CalcIdentifiant", platineContact.getIdentifier()); - return body; - } - - @Override - public void execute(DelegateExecution execution) { - //Contexte - JsonNode contextRootNode = protoolsContext.getContextByProcessInstance(execution.getProcessInstanceId()); - checkContextOrThrow(log, execution.getProcessInstanceId(), contextRootNode); - String campainId = contextRootNode.path(CTX_CAMPAGNE_ID).asText(); - - //Variables - Long currentPartitionId = FlowableVariableUtils.getVariableOrThrow(execution, VARNAME_CURRENT_PARTITION_ID, Long.class); - JsonNode contactNode = FlowableVariableUtils.getVariableOrThrow(execution, VARNAME_PLATINE_CONTACT, JsonNode.class); - - MeshuggahUtils.MediumEnum medium = MeshuggahUtils.MediumEnum.MAIL; - MeshuggahUtils.PhaseEnum phase = MeshuggahUtils.PhaseEnum.OUVERTURE; - - PlatineContactDto platineContactDto; - try { - platineContactDto = objectMapper.treeToValue(contactNode, PlatineContactDto.class); - } catch (JsonProcessingException e) { - throw new IncorrectPlatineContactError("Error while parsing the json retrieved for platine contact : " + contactNode, contactNode, e); - } - - //Get current partition from contexte - JsonNode currentPartitionNode = getCurrentPartitionNode(contextRootNode, currentPartitionId); - log.info("ProcessInstanceId={} - campainId={} - currentPartitionId={} - platineContactDto={} begin", - execution.getProcessInstanceId(), campainId, currentPartitionId,platineContactDto); - - JsonNode communicationNode = MeshuggahUtils.getCommunication(currentPartitionNode, medium, phase); - JsonNode body = initBody(platineContactDto); - - MeshuggahComDetails meshuggahComDetails = MeshuggahUtils.computeMeshuggahComDetails(campainId, currentPartitionId, communicationNode); - meshuggahService.postSendCommunication(meshuggahComDetails, body); - - log.debug("ProcessInstanceId={} - campainId={} - currentPartitionId={} - platineContactDto={} end", - execution.getProcessInstanceId(), campainId, currentPartitionId,platineContactDto); - } - - @Override - public Set getContextErrors(JsonNode contextRootNode) { - if (contextRootNode == null) { - return Set.of("Context is missing"); - } - Set results = new HashSet<>(); - Set requiredNodes = Set.of( - //Global & Campaign - CTX_CAMPAGNE_ID, CTX_PARTITIONS); - Set requiredPartition = Set.of(CTX_PARTITION_ID, CTX_PARTITION_COMMUNICATIONS); - - Set requiredCommunication = MeshuggahUtils.getCommunicationRequiredFields(); - results.addAll(DelegateContextVerifier.computeMissingChildrenMessages(requiredNodes, contextRootNode, getClass())); - - //Partitions - var partitionIterator = contextRootNode.path(CTX_PARTITIONS).elements(); - while (partitionIterator.hasNext()) { - var partitionNode = partitionIterator.next(); - var missingChildren = DelegateContextVerifier.computeMissingChildrenMessages(requiredPartition, partitionNode, getClass()); - if (!missingChildren.isEmpty()) { - results.addAll(missingChildren); - continue; - } - - //Communications of the partition - var communicationIterator = partitionNode.path(CTX_PARTITION_COMMUNICATIONS).elements(); - while (communicationIterator.hasNext()) { - var communicationNode = communicationIterator.next(); - var missingChildrenCom = DelegateContextVerifier.computeMissingChildrenMessages(requiredCommunication, communicationNode, getClass()); - if (!missingChildrenCom.isEmpty()) { - results.addAll(missingChildrenCom); - } - } - } - return results; - } - - -} - diff --git a/src/main/java/fr/insee/protools/backend/service/meshuggah/MeshuggahService.java b/src/main/java/fr/insee/protools/backend/service/meshuggah/MeshuggahService.java index 342a4348..225e370d 100644 --- a/src/main/java/fr/insee/protools/backend/service/meshuggah/MeshuggahService.java +++ b/src/main/java/fr/insee/protools/backend/service/meshuggah/MeshuggahService.java @@ -1,86 +1,42 @@ package fr.insee.protools.backend.service.meshuggah; + import com.fasterxml.jackson.databind.JsonNode; -import fr.insee.protools.backend.dto.meshuggah.MeshuggahComDetails; -import fr.insee.protools.backend.httpclients.webclient.WebClientHelper; +import fr.insee.protools.backend.restclient.RestClientHelper; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import java.util.List; -import static fr.insee.protools.backend.httpclients.configuration.ApiConfigProperties.KNOWN_API.KNOWN_API_MESHUGGAH; +import static fr.insee.protools.backend.restclient.configuration.ApiConfigProperties.KNOWN_API.KNOWN_API_MESHUGGAH; @Service @Slf4j @RequiredArgsConstructor public class MeshuggahService { - private final WebClientHelper webClientHelper; - + private final RestClientHelper restClientHelper; - public void postCreateCommunication(MeshuggahComDetails meshuggahComDetails, JsonNode body) { - log.debug("postCreateCommunication: meshuggahComDetails={}",meshuggahComDetails); - String response = webClientHelper.getWebClient(KNOWN_API_MESHUGGAH) + public void postContext(String campaignId, JsonNode contextRootNode) { + log.trace("postContext: campaignId={}",campaignId); + var response = restClientHelper.getRestClient(KNOWN_API_MESHUGGAH) .post() - .uri(uriBuilder -> uriBuilder - .path("/api/communication/medium/{medium}/campagne/{campaignId}/partition/{partitioningId}/phase/{phase}/operation/{operation}/mode/{mode}/protocol/{protocol}") - .queryParam("avecQuestionnaire",meshuggahComDetails.isAvecQuestionnaire()) - .build( - meshuggahComDetails.getMedium(), - meshuggahComDetails.getCampaignId(), - meshuggahComDetails.getPartitioningId(), - meshuggahComDetails.getPhase(), - meshuggahComDetails.getOperation(), - meshuggahComDetails.getMode(), - meshuggahComDetails.getProtocol())) - .bodyValue(body) + .uri("/context") + .body(contextRootNode) .retrieve() - .bodyToMono(String.class) - .block(); - log.debug("postCreateCommunication: meshuggahComDetails={} - response={}",meshuggahComDetails,response); - + .body(String.class); + log.trace("postContext: campaignId={} - response={} ",campaignId,response); } - public void postSendCommunication(MeshuggahComDetails meshuggahComDetails, JsonNode body) { - log.debug("postSendCommunication: meshuggahComDetails={}",meshuggahComDetails); - String response = webClientHelper.getWebClient(KNOWN_API_MESHUGGAH) + public void postCommunicationRequest(String campaignId, String communicationId, List list) { + log.trace("postCommunicationRequest: campaignId={} - communicationId={}",campaignId,communicationId); + var response = restClientHelper.getRestClient(KNOWN_API_MESHUGGAH) .post() - .uri(uriBuilder -> uriBuilder - .path("/api/communication-request/medium/{medium}/campagne/{campaignId}/partition/{partitioningId}/phase/{phase}/operation/{operation}/mode/{mode}/protocol/{protocol}") - .queryParam("avecQuestionnaire",meshuggahComDetails.isAvecQuestionnaire()) - .build( - meshuggahComDetails.getMedium(), - meshuggahComDetails.getCampaignId(), - meshuggahComDetails.getPartitioningId(), - meshuggahComDetails.getPhase(), - meshuggahComDetails.getOperation(), - meshuggahComDetails.getMode(), - meshuggahComDetails.getProtocol())) - .bodyValue(body) + .uri("/context") + .body(list) .retrieve() - .bodyToMono(String.class) - .block(); - log.debug("postSendCommunication: meshuggahComDetails={} - response={}",meshuggahComDetails,response); - - } - - - //V2 - - public void sendCommunications(String campaign, String mode, List interrogations) { - log.debug("postSendCommunication: campaign={} - mode={} - interrogations.size={}",campaign,mode,interrogations.size()); - String response = webClientHelper.getWebClient(KNOWN_API_MESHUGGAH) - .post() - .uri(uriBuilder -> uriBuilder - .path("/api/campagne/{campaignId}/mode/{mode}") - .build(campaign,mode)) - .bodyValue(interrogations) - .retrieve() - .bodyToMono(String.class) - .block(); - log.debug("postSendCommunication: campaign={} - mode={} - response={}",campaign,mode,response); - - } - + .body(String.class); + log.trace("postCommunicationRequest: campaignId={} - communicationId={} - response={} ",campaignId,communicationId,response); } +} diff --git a/src/main/java/fr/insee/protools/backend/service/meshuggah/MeshuggahUtils.java b/src/main/java/fr/insee/protools/backend/service/meshuggah/MeshuggahUtils.java deleted file mode 100644 index ae5e4d7c..00000000 --- a/src/main/java/fr/insee/protools/backend/service/meshuggah/MeshuggahUtils.java +++ /dev/null @@ -1,154 +0,0 @@ -package fr.insee.protools.backend.service.meshuggah; - -import com.fasterxml.jackson.databind.JsonNode; -import fr.insee.protools.backend.service.context.exception.BadContextIncorrectBPMNError; -import fr.insee.protools.backend.dto.meshuggah.MeshuggahComDetails; - -import java.util.Set; - -import static fr.insee.protools.backend.service.context.ContextConstants.*; - -public class MeshuggahUtils { - - static MeshuggahComDetails computeMeshuggahComDetails(String campagneId, Long partitionId, JsonNode communicationNode) { - String ctxMoyenCommunication = communicationNode.path(CTX_PARTITION_COMMUNICATION_MOYEN).asText(); - String ctxPhase = communicationNode.path(CTX_PARTITION_COMMUNICATION_PHASE).asText(); - String ctxTypeModele = communicationNode.path(CTX_PARTITION_COMMUNICATION_TYPE_MODELE).asText(); - String ctxMode = communicationNode.path(CTX_PARTITION_COMMUNICATION_MODE).asText(); - String ctxProtocol = communicationNode.path(CTX_PARTITION_COMMUNICATION_PROTOCOLE).asText(); - boolean meshAvecQuestionnaire = communicationNode.path(CTX_PARTITION_COMMUNICATION_AVEC_QUESTIONNAIRE_PAPIER).asBoolean(); - return MeshuggahComDetails.builder().campaignId(campagneId).partitioningId(String.valueOf(partitionId)).medium(MeshuggahUtils.MediumEnum.fromCtxValue(ctxMoyenCommunication).meshuggahValue).phase(MeshuggahUtils.PhaseEnum.fromCtxValue(ctxPhase).meshuggahValue).operation(MeshuggahUtils.TypeModeleEnum.fromCtxValue(ctxTypeModele).meshuggahValue).mode(MeshuggahUtils.ModeEnum.fromCtxValue(ctxMode).meshuggahValue).protocol(MeshuggahUtils.ProtocolEnum.fromCtxValue(ctxProtocol).meshuggahValue).avecQuestionnaire(meshAvecQuestionnaire).build(); - } - - - public static Set getCommunicationRequiredFields() { - return Set.of(CTX_PARTITION_COMMUNICATION_MOYEN, CTX_PARTITION_COMMUNICATION_PHASE, CTX_PARTITION_COMMUNICATION_TYPE_MODELE, CTX_PARTITION_COMMUNICATION_MODE, CTX_PARTITION_COMMUNICATION_PROTOCOLE, CTX_PARTITION_COMMUNICATION_AVEC_QUESTIONNAIRE_PAPIER); - } - - //Search for a communication in the contexte. - public static JsonNode getCommunication(JsonNode partitionNode, MeshuggahUtils.MediumEnum medium, MeshuggahUtils.PhaseEnum phase) { - JsonNode communicationNode = null; - for (JsonNode subNode : partitionNode.path(CTX_PARTITION_COMMUNICATIONS)) { - if (subNode.has(CTX_PARTITION_COMMUNICATION_MOYEN) && subNode.has(CTX_PARTITION_COMMUNICATION_PHASE) && subNode.get(CTX_PARTITION_COMMUNICATION_MOYEN).asText().equalsIgnoreCase(medium.ctxValue) && subNode.get(CTX_PARTITION_COMMUNICATION_PHASE).asText().equalsIgnoreCase(phase.ctxValue)) { - communicationNode = subNode; - break; - } - } - if (communicationNode == null) { - throw new BadContextIncorrectBPMNError(String.format("Communication medium=[%s] - phase=[%s] not found ", medium, phase)); - } - return communicationNode; - } - - enum MediumEnum { - - COURRIER("courrier", "COURRIER"), MAIL("mail", "EMAIL"); - - final String meshuggahValue; - final String ctxValue; - - MediumEnum(String ctxValue, String meshuggahValue) { - this.meshuggahValue = meshuggahValue; - this.ctxValue = ctxValue; - } - - public static MediumEnum fromCtxValue(String ctxValue) { - for (var c : values()) { - if (c.ctxValue.equalsIgnoreCase(ctxValue)) { - return c; - } - } - throw new IllegalArgumentException(ctxValue); - } - } - - enum PhaseEnum { - - OUVERTURE("ouverture", "OUVERTURE"), RELANCE("relance", "RELANCE"), PONCTUEL("ponctuel", "PONCTUEL"); - - final String meshuggahValue; - final String ctxValue; - - PhaseEnum(String ctxValue, String meshuggahValue) { - this.meshuggahValue = meshuggahValue; - this.ctxValue = ctxValue; - } - - public static PhaseEnum fromCtxValue(String ctxValue) { - for (var c : values()) { - if (c.ctxValue.equals(ctxValue)) { - return c; - } - } - throw new IllegalArgumentException(ctxValue); - } - } - - enum TypeModeleEnum { - - OUVERTURE("ouverture", "OUVERTURE"), RELANCE("relance", "RELANCE"), RELANCE_LIBRE("relance_libre", "RELANCE_LIBRE"); - - final String meshuggahValue; - final String ctxValue; - - TypeModeleEnum(String ctxValue, String meshuggahValue) { - this.meshuggahValue = meshuggahValue; - this.ctxValue = ctxValue; - } - - public static TypeModeleEnum fromCtxValue(String ctxValue) { - for (var c : values()) { - if (c.ctxValue.equals(ctxValue)) { - return c; - } - } - throw new IllegalArgumentException(ctxValue); - } - } - - enum ModeEnum { - - FAF("faf", "FAF"), TEL("tel", "TEL"), WEB("web", "WEB"); - - final String meshuggahValue; - final String ctxValue; - - ModeEnum(String ctxValue, String meshuggahValue) { - this.meshuggahValue = meshuggahValue; - this.ctxValue = ctxValue; - } - - public static ModeEnum fromCtxValue(String ctxValue) { - for (var c : values()) { - if (c.ctxValue.equals(ctxValue)) { - return c; - } - } - throw new IllegalArgumentException(ctxValue); - } - } - - enum ProtocolEnum { - - SEQ_WT("sequentiel web tel faf", "SEQ_WT"), SEQ_TW("sequentiel tel web", "SEQ_TW"), PANEL("panel", "PANEL"), DEFAULT("null", "DEFAULT"); - - final String meshuggahValue; - final String ctxValue; - - ProtocolEnum(String ctxValue, String meshuggahValue) { - this.meshuggahValue = meshuggahValue; - this.ctxValue = ctxValue; - } - - public static ProtocolEnum fromCtxValue(String ctxValue) { - for (var c : values()) { - if (c.ctxValue.equals(ctxValue)) { - return c; - } - } - return DEFAULT; - } - } - - -} diff --git a/src/main/java/fr/insee/protools/backend/service/meshuggah/delegate/MeshuggahCreateContextTaskREST.java b/src/main/java/fr/insee/protools/backend/service/meshuggah/delegate/MeshuggahCreateContextTaskREST.java new file mode 100644 index 00000000..cc5a9b04 --- /dev/null +++ b/src/main/java/fr/insee/protools/backend/service/meshuggah/delegate/MeshuggahCreateContextTaskREST.java @@ -0,0 +1,34 @@ +package fr.insee.protools.backend.service.meshuggah.delegate; + +import com.fasterxml.jackson.databind.JsonNode; +import fr.insee.protools.backend.service.DelegateContextVerifier; +import fr.insee.protools.backend.service.context.ContextService; +import fr.insee.protools.backend.service.meshuggah.MeshuggahService; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.JavaDelegate; +import org.springframework.stereotype.Component; + +import static fr.insee.protools.backend.service.context.ContextConstants.CTX_CAMPAGNE_ID; + +@Slf4j +@RequiredArgsConstructor +@Component +public class MeshuggahCreateContextTaskREST implements JavaDelegate, DelegateContextVerifier { + private final ContextService protoolsContext; + private final MeshuggahService service; + + @Override + public void execute(DelegateExecution execution) { + log.info("ProcessInstanceId={} begin",execution.getProcessInstanceId()); + JsonNode contextRootNode = protoolsContext.getContextJsonNodeByProcessInstance(execution.getProcessInstanceId()); + String campainId = contextRootNode.path(CTX_CAMPAGNE_ID).asText(); + + checkContextOrThrow(log,execution.getProcessInstanceId(), contextRootNode); + service.postContext(campainId,contextRootNode); + + log.info("ProcessInstanceId={} end",execution.getProcessInstanceId()); + + } +} diff --git a/src/main/java/fr/insee/protools/backend/service/meshuggah/v2/MeshuggahSendCommunicationForInterrogationListTaskREST.java b/src/main/java/fr/insee/protools/backend/service/meshuggah/delegate/MeshuggahSendCommunicationForInterrogationListTaskREST.java similarity index 50% rename from src/main/java/fr/insee/protools/backend/service/meshuggah/v2/MeshuggahSendCommunicationForInterrogationListTaskREST.java rename to src/main/java/fr/insee/protools/backend/service/meshuggah/delegate/MeshuggahSendCommunicationForInterrogationListTaskREST.java index b06d88da..6ce1d475 100644 --- a/src/main/java/fr/insee/protools/backend/service/meshuggah/v2/MeshuggahSendCommunicationForInterrogationListTaskREST.java +++ b/src/main/java/fr/insee/protools/backend/service/meshuggah/delegate/MeshuggahSendCommunicationForInterrogationListTaskREST.java @@ -1,6 +1,7 @@ -package fr.insee.protools.backend.service.meshuggah.v2; +package fr.insee.protools.backend.service.meshuggah.delegate; import com.fasterxml.jackson.databind.JsonNode; +import fr.insee.protools.backend.dto.ContexteProcessus; import fr.insee.protools.backend.service.meshuggah.MeshuggahService; import fr.insee.protools.backend.service.utils.FlowableVariableUtils; import fr.insee.protools.backend.service.utils.delegate.DefaultCallServiceInterroListTask; @@ -10,6 +11,8 @@ import java.util.List; +import static fr.insee.protools.backend.service.FlowableVariableNameConstants.VARNAME_CURRENT_COMMUNICATION_ID; + @Slf4j @RequiredArgsConstructor public class MeshuggahSendCommunicationForInterrogationListTaskREST extends DefaultCallServiceInterroListTask { @@ -18,19 +21,18 @@ public class MeshuggahSendCommunicationForInterrogationListTaskREST extends Defa @Override - protected void serviceAction(String campaignId, List list, String... params) { + protected void serviceAction(ContexteProcessus context, List list, String... params) { if(params.length!=1){ log.error("Wrong number of paramaters : {} - expected 1",params.length); } - String mode=params[0]; - meshuggahService.sendCommunications(campaignId,mode,list); + String currentCommunicationId=params[0]; + meshuggahService.postCommunicationRequest(context.getId().toString(),currentCommunicationId,list); } @Override - protected void callService(DelegateExecution execution, JsonNode contextRootNode, String campaignId, List list) { - //TODO : communicationMode - String communicationMode = FlowableVariableUtils.getVariableOrThrow(execution,"communicationMode", String.class); - serviceAction(campaignId, list,communicationMode); + protected void callService(DelegateExecution execution, ContexteProcessus context, List list) { + String currentCommunicationId= FlowableVariableUtils.getVariableOrThrow(execution, VARNAME_CURRENT_COMMUNICATION_ID, String.class); + serviceAction(context, list,currentCommunicationId); } } diff --git a/src/main/java/fr/insee/protools/backend/service/nomenclature/NomenclatureFromStaticWebsiteServiceImpl.java b/src/main/java/fr/insee/protools/backend/service/nomenclature/NomenclatureFromStaticWebsiteServiceImpl.java deleted file mode 100644 index 35030355..00000000 --- a/src/main/java/fr/insee/protools/backend/service/nomenclature/NomenclatureFromStaticWebsiteServiceImpl.java +++ /dev/null @@ -1,46 +0,0 @@ -package fr.insee.protools.backend.service.nomenclature; - -import fr.insee.protools.backend.service.context.exception.BadContextIncorrectBPMNError; -import fr.insee.protools.backend.httpclients.webclient.WebClientHelper; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.stereotype.Service; - -import java.net.URI; -import java.net.URISyntaxException; - -/** - * This service retrieves the nomenclatures from a static website based on a property uri - */ -@Service -@Slf4j -@RequiredArgsConstructor -public class NomenclatureFromStaticWebsiteServiceImpl implements NomenclatureService{ - - //TODO : expose mandatory configuration? - @Value("${fr.insee.protools.nomenclature.uri}") - private String nomenclatureUri; - - private final WebClientHelper webClientHelper; - - @Override - public String getNomenclatureContent(String nomenclatureId, String folderPath) { - log.debug("Get Naming Model Value for nomenclatureId={}", nomenclatureId); - String uri; - String fullPath=nomenclatureUri+ "/" +folderPath+ "/"+nomenclatureId + ".json"; - try { - uri = new URI(fullPath).normalize().toString(); - } catch (URISyntaxException e) { - throw new BadContextIncorrectBPMNError(String.format("nomenclatureId=[%s] - folderPath=[%s] : fullPath=[%s] cannot be parsed: Error=[%s]" - ,nomenclatureId,folderPath,fullPath, e.getMessage())); - } - return - webClientHelper.getWebClientForFile() - .get() - .uri(uri) - .retrieve() - .bodyToMono(String.class) - .block(); - } -} diff --git a/src/main/java/fr/insee/protools/backend/service/nomenclature/NomenclatureService.java b/src/main/java/fr/insee/protools/backend/service/nomenclature/NomenclatureService.java deleted file mode 100644 index c3230836..00000000 --- a/src/main/java/fr/insee/protools/backend/service/nomenclature/NomenclatureService.java +++ /dev/null @@ -1,13 +0,0 @@ -package fr.insee.protools.backend.service.nomenclature; - -public interface NomenclatureService { - - /** - * Returns the nomenclature associated with stored at - * @param nomenclatureId - * @param folderPath - * @return the nomenclature content retrieved from external source - */ - String getNomenclatureContent(String nomenclatureId,String folderPath); - -} diff --git a/src/main/java/fr/insee/protools/backend/service/platine/delegate/PlatinePilotageCreateContextTask.java b/src/main/java/fr/insee/protools/backend/service/platine/delegate/PlatinePilotageCreateContextTask.java deleted file mode 100644 index dc1837dd..00000000 --- a/src/main/java/fr/insee/protools/backend/service/platine/delegate/PlatinePilotageCreateContextTask.java +++ /dev/null @@ -1,223 +0,0 @@ -package fr.insee.protools.backend.service.platine.delegate; - -import com.fasterxml.jackson.databind.JsonNode; -import fr.insee.protools.backend.service.DelegateContextVerifier; -import fr.insee.protools.backend.service.context.ContextService; -import fr.insee.protools.backend.service.platine.pilotage.PlatinePilotageService; -import fr.insee.protools.backend.service.platine.pilotage.metadata.*; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.EnumUtils; -import org.flowable.engine.delegate.DelegateExecution; -import org.flowable.engine.delegate.JavaDelegate; -import org.springframework.stereotype.Component; - -import java.util.Arrays; -import java.util.HashSet; -import java.util.Set; - -import static fr.insee.protools.backend.service.context.ContextConstants.*; -import static fr.insee.protools.backend.service.platine.utils.PlatineHelper.computePilotagePartitionID; - -@Slf4j -@Component -@RequiredArgsConstructor -public class PlatinePilotageCreateContextTask implements JavaDelegate, DelegateContextVerifier { - - private final ContextService protoolsContext; - private final PlatinePilotageService platinePilotageService; - @Override - public void execute(DelegateExecution execution) { - log.info("ProcessInstanceId={} begin",execution.getProcessInstanceId()); - JsonNode contextRootNode = protoolsContext.getContextByProcessInstance(execution.getProcessInstanceId()); - checkContextOrThrow(log,execution.getProcessInstanceId(), contextRootNode); - var dtos = computeMetadataDtoForEachPartition(contextRootNode); - - for (MetadataDto dto: dtos) { - platinePilotageService.putMetadata(dto.getPartitioningDto().getId(),dto); - } - - log.info("ProcessInstanceId={} end",execution.getProcessInstanceId()); - - } - @Override - public Set getContextErrors(JsonNode contextRootNode) { - if(contextRootNode==null){ - return Set.of("Context is missing"); - } - Set results=new HashSet<>(); - Set requiredNodes = - Set.of( - //Global & Campaign - CTX_METADONNEES, CTX_CAMPAGNE_ID, CTX_CAMPAGNE_LABEL, CTX_PARTITIONS - ); - Set requiredMetadonnees = - //For source/Serie - Set.of(//Campaign - CTX_META_OPERATION_ID, CTX_META_SERIE_ID,CTX_META_ANNEE,CTX_META_PERIODE,CTX_META_PERIODICITE, - CTX_META_SERIE_LABEL_LONG, CTX_META_SERIE_LABEL_COURT, CTX_META_PORTAIL_MES_ENQUETE_OPERATION, - //For support - CTX_META_ASSISTANCE_NIVO2_ID, CTX_META_ASSISTANCE_NIVO2_LABEL, CTX_META_ASSISTANCE_NIVO2_TEL, CTX_META_ASSISTANCE_NIVO2_MAIL, CTX_META_ASSISTANCE_NIVO2_PAYS, - CTX_META_ASSISTANCE_NIVO2_NUMERO_VOIE, CTX_META_ASSISTANCE_NIVO2_NOM_VOIE, CTX_META_ASSISTANCE_NIVO2_COMMUNE, CTX_META_ASSISTANCE_NIVO2_CODE_POSTAL, - //For Owner - CTX_META_PROPRIETAIRE_ID, CTX_META_PROPRIETAIRE_LABEL, CTX_META_MINISTERE_TUTELLE, CTX_META_PROPRIETAIRE_LOGO, - //For Source/serie - //For Survey - CTX_META_LABEL_LONG_OPERATION, CTX_META_LABEL_COURT_OPERATION, CTX_META_OBJECTIFS_LONGS, CTX_META_OBJECTIFS_COURTS, - CTX_META_NUMERO_VISA, CTX_META_CNIS_URL, CTX_META_DIFFUSION_URL, CTX_META_NOTICE_URL, CTX_META_SPECIMENT_URL - ); - Set requiredPartition = - Set.of(CTX_PARTITION_ID,CTX_PARTITION_LABEL, CTX_PARTITION_DATE_DEBUT_COLLECTE, CTX_PARTITION_DATE_FIN_COLLECTE, CTX_PARTITION_DATE_RETOUR); - results.addAll(DelegateContextVerifier.computeMissingChildrenMessages(requiredNodes,contextRootNode,getClass())); - results.addAll(DelegateContextVerifier.computeMissingChildrenMessages(requiredMetadonnees,contextRootNode.path(CTX_METADONNEES),getClass())); - - var partitionIterator =contextRootNode.path(CTX_PARTITIONS).elements(); - //Partitions - while (partitionIterator.hasNext()) { - var partitionNode = partitionIterator.next(); - results.addAll(DelegateContextVerifier.computeMissingChildrenMessages(requiredPartition,partitionNode,getClass())); - } - - - //Check value of PERIODE Enum - String periode = contextRootNode.path(CTX_METADONNEES).path(CTX_META_PERIODE).asText(); - if(! EnumUtils.isValidEnumIgnoreCase(PeriodEnum.class, periode)){ - results.add(DelegateContextVerifier.computeIncorrectEnumMessage(CTX_META_PERIODE,periode,Arrays.toString(PeriodEnum.values()),getClass())); - } - //Check value of PERIODICITE Enum - String periodicite = contextRootNode.path(CTX_METADONNEES).path(CTX_META_PERIODICITE).asText(); - if(! EnumUtils.isValidEnumIgnoreCase(PeriodicityEnum.class, periodicite)){ - results.add(DelegateContextVerifier.computeIncorrectEnumMessage(CTX_META_PERIODICITE,periodicite,Arrays.toString(PeriodicityEnum.values()),getClass())); - } - return results; - } - - private static Set computeMetadataDtoForEachPartition(JsonNode contextRootNode) { - - Set result = new HashSet<>(); - String campainId = contextRootNode.path(CTX_CAMPAGNE_ID).asText(); - //Get the list of partitions - var partitionIterator =contextRootNode.path(CTX_PARTITIONS).elements(); - - //These parts are always the same - CampaignDto campaignDto = computeCampaignDto(contextRootNode); - SurveyDto surveyDto = computeSurveyDto(contextRootNode); - SourceDto sourceDto = computeSourceDto(contextRootNode); - OwnerDto ownerDto = computeOwnerDto(contextRootNode); - SupportDto supportDto = computeSupportDto(contextRootNode); - - - //Partition part - while (partitionIterator.hasNext()) { - var partitionNode = partitionIterator.next(); - PartitioningDto partitioningDto = computePartitioningDto(partitionNode, campainId); - MetadataDto metadataDto = new MetadataDto(partitioningDto, campaignDto, surveyDto, sourceDto, ownerDto, supportDto); - result.add(metadataDto); - } - return result; - } - - private static SupportDto computeSupportDto(JsonNode contextRootNode) { - JsonNode medatadata = contextRootNode.path(CTX_METADONNEES); - - return SupportDto.builder() - .id(medatadata.path(CTX_META_ASSISTANCE_NIVO2_ID).asText()) - .label(medatadata.path(CTX_META_ASSISTANCE_NIVO2_LABEL).asText()) - .phoneNumber(medatadata.path(CTX_META_ASSISTANCE_NIVO2_TEL).asText()) - .mail(medatadata.path(CTX_META_ASSISTANCE_NIVO2_MAIL).asText()) - .countryName(medatadata.path(CTX_META_ASSISTANCE_NIVO2_PAYS).asText()) - .streetNumber(medatadata.path(CTX_META_ASSISTANCE_NIVO2_NUMERO_VOIE).asText()) - .streetName(medatadata.path(CTX_META_ASSISTANCE_NIVO2_NOM_VOIE).asText()) - .city(medatadata.path(CTX_META_ASSISTANCE_NIVO2_COMMUNE).asText()) - .zipCode(medatadata.path(CTX_META_ASSISTANCE_NIVO2_CODE_POSTAL).asText()) - .build(); - } - - private static OwnerDto computeOwnerDto(JsonNode contextRootNode) { - String idProprietaire = contextRootNode.path(CTX_METADONNEES).path(CTX_META_PROPRIETAIRE_ID).asText(); - String labelProprietaire = contextRootNode.path(CTX_METADONNEES).path(CTX_META_PROPRIETAIRE_LABEL).asText(); - String ministereTutelle = contextRootNode.path(CTX_METADONNEES).path(CTX_META_MINISTERE_TUTELLE).asText(); - String logoProprietaire = contextRootNode.path(CTX_METADONNEES).path(CTX_META_PROPRIETAIRE_LOGO).asText(); - return OwnerDto.builder() - .id(idProprietaire) - .label(labelProprietaire) - .ministry(ministereTutelle) - .logo(logoProprietaire) - .build(); - } - - private static SourceDto computeSourceDto(JsonNode contextRootNode) { - String serieId = contextRootNode.path(CTX_METADONNEES).path(CTX_META_SERIE_ID).asText(); - String labelLongSerie = contextRootNode.path(CTX_METADONNEES).path(CTX_META_SERIE_LABEL_LONG).asText(); - String labelCourtSerie = contextRootNode.path(CTX_METADONNEES).path(CTX_META_SERIE_LABEL_COURT).asText(); - PeriodicityEnum periodicite = PeriodicityEnum.valueOf(contextRootNode.path(CTX_METADONNEES).path(CTX_META_PERIODICITE).asText()); - boolean mandatoryMySurveys = contextRootNode.path(CTX_METADONNEES).path(CTX_META_PORTAIL_MES_ENQUETE_OPERATION).asBoolean(); - - return SourceDto.builder() - .id(serieId) - .longWording(labelLongSerie) - .shortWording(labelCourtSerie) - .periodicity(periodicite) - .mandatoryMySurveys(mandatoryMySurveys) - .build(); - } - - private static SurveyDto computeSurveyDto(JsonNode contextRootNode) { - JsonNode medatadata = contextRootNode.path(CTX_METADONNEES); - String id = medatadata.path(CTX_META_OPERATION_ID).asText(); - String serieId = medatadata.path(CTX_META_SERIE_ID).asText(); - int year = medatadata.path(CTX_META_ANNEE).asInt(); - String labelLongOperation = medatadata.path(CTX_META_LABEL_LONG_OPERATION).asText(); - String labelCourtOperation = medatadata.path(CTX_META_LABEL_COURT_OPERATION).asText(); - String labelLongObjectifs = medatadata.path(CTX_META_OBJECTIFS_LONGS).asText(); - String labelCourtObjectifs = medatadata.path(CTX_META_OBJECTIFS_COURTS).asText(); - String numeroVisa = medatadata.path(CTX_META_NUMERO_VISA).asText(); - String cnisUrl = medatadata.path(CTX_META_CNIS_URL).asText(); - String diffusionUrl = medatadata.path(CTX_META_DIFFUSION_URL).asText(); - String noticeUrl = medatadata.path(CTX_META_NOTICE_URL).asText(); - String specimenUrl = medatadata.path(CTX_META_SPECIMENT_URL).asText(); - return SurveyDto.builder() - .id(id) - .sourceId(serieId) - .year(year) - .sampleSize(0) - .longWording(labelLongOperation) - .shortWording(labelCourtOperation) - .shortObjectives(labelCourtObjectifs) - .longObjectives(labelLongObjectifs) - .visaNumber(numeroVisa) - .cnisUrl(cnisUrl) - .diffusionUrl(diffusionUrl) - .noticeUrl(noticeUrl) - .specimenUrl(specimenUrl) - .communication("") - .build(); - } - - - private static PartitioningDto computePartitioningDto(JsonNode partitionNode, String campaignId) { - return PartitioningDto.builder() - .id(computePilotagePartitionID(campaignId,partitionNode.path(CTX_PARTITION_ID).asLong())) - .campaignId(campaignId) - .label(partitionNode.path(CTX_PARTITION_LABEL).asText()) - .openingDate(partitionNode.path(CTX_PARTITION_DATE_DEBUT_COLLECTE).asText()) - .closingDate(partitionNode.path(CTX_PARTITION_DATE_FIN_COLLECTE).asText()) - .returnDate(partitionNode.path(CTX_PARTITION_DATE_RETOUR).asText()) - .build(); - } - - private static CampaignDto computeCampaignDto(JsonNode contextRootNode) { - String campaignId = contextRootNode.path(CTX_CAMPAGNE_ID).asText(); - String serieId = contextRootNode.path(CTX_METADONNEES).path(CTX_META_SERIE_ID).asText(); - int year = contextRootNode.path(CTX_METADONNEES).path(CTX_META_ANNEE).asInt(); - String campaignLabel = contextRootNode.path(CTX_CAMPAGNE_LABEL).asText(); - PeriodEnum period = PeriodEnum.valueOf(contextRootNode.path(CTX_METADONNEES).path(CTX_META_PERIODE).asText()); - return CampaignDto.builder() - .id(campaignId) - .surveyId(serieId) - .year(year) - .campaignWording(campaignLabel) - .period(period) - .build(); - } -} \ No newline at end of file diff --git a/src/main/java/fr/insee/protools/backend/service/platine/delegate/PlatinePilotageCreateInterrogationListTask.java b/src/main/java/fr/insee/protools/backend/service/platine/delegate/PlatinePilotageCreateInterrogationListTask.java deleted file mode 100644 index ba5ff039..00000000 --- a/src/main/java/fr/insee/protools/backend/service/platine/delegate/PlatinePilotageCreateInterrogationListTask.java +++ /dev/null @@ -1,202 +0,0 @@ -package fr.insee.protools.backend.service.platine.delegate; - -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; -import fr.insee.protools.backend.dto.internal.ProtoolsInterrogationDto; -import fr.insee.protools.backend.dto.platine.pilotage.PlatineAddressDto; -import fr.insee.protools.backend.dto.platine.pilotage.PlatinePilotageGenderType; -import fr.insee.protools.backend.dto.platine.pilotage.query.ContactAccreditationDto; -import fr.insee.protools.backend.dto.platine.pilotage.query.QuestioningWebclientDto; -import fr.insee.protools.backend.dto.platine.pilotage.questioning.PlatineQuestioningSurveyUnitDto; -import fr.insee.protools.backend.dto.rem.*; -import fr.insee.protools.backend.service.DelegateContextVerifier; -import fr.insee.protools.backend.service.context.ContextService; -import fr.insee.protools.backend.service.context.enums.CampaignContextEnum; -import fr.insee.protools.backend.service.context.enums.PartitionTypeEchantillon; -import fr.insee.protools.backend.service.platine.pilotage.PlatinePilotageService; -import fr.insee.protools.backend.service.platine.utils.PlatineHelper; -import fr.insee.protools.backend.service.rem.RemDtoUtils; -import fr.insee.protools.backend.service.utils.FlowableVariableUtils; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.EnumUtils; -import org.flowable.engine.delegate.DelegateExecution; -import org.flowable.engine.delegate.JavaDelegate; -import org.springframework.beans.BeanUtils; -import org.springframework.stereotype.Component; - -import java.util.Arrays; -import java.util.HashSet; -import java.util.List; -import java.util.Set; - -import static com.fasterxml.jackson.databind.DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES; -import static fr.insee.protools.backend.service.FlowableVariableNameConstants.VARNAME_CURRENT_PARTITION_ID; -import static fr.insee.protools.backend.service.FlowableVariableNameConstants.VARNAME_REM_INTERRO_LIST; -import static fr.insee.protools.backend.service.context.ContextConstants.*; -import static fr.insee.protools.backend.service.utils.ContextUtils.getCurrentPartitionNode; - -@Slf4j -@Component -@RequiredArgsConstructor -public class PlatinePilotageCreateInterrogationListTask implements JavaDelegate, DelegateContextVerifier { - - private static final ObjectMapper objectMapper = new ObjectMapper().configure(FAIL_ON_UNKNOWN_PROPERTIES,false); - - private final ContextService protoolsContext; - private final PlatinePilotageService platinePilotageService; - - @Override - public void execute(DelegateExecution execution) { - JsonNode contextRootNode = protoolsContext.getContextByProcessInstance(execution.getProcessInstanceId()); - checkContextOrThrow(log,execution.getProcessInstanceId(), contextRootNode); - - String campainId = contextRootNode.path(CTX_CAMPAGNE_ID).asText(); - Long currentPartitionId = FlowableVariableUtils.getVariableOrThrow(execution, VARNAME_CURRENT_PARTITION_ID, Long.class); - List interrogationList = FlowableVariableUtils.getVariableOrThrow(execution, VARNAME_REM_INTERRO_LIST, List.class); - - JsonNode currentPartitionNode = getCurrentPartitionNode(contextRootNode, currentPartitionId); - for (ProtoolsInterrogationDto interrogationDto : interrogationList){ - //Create the platine DTO object - QuestioningWebclientDto dto = computeQuestioningWebclientDto(interrogationDto.getRemInterrogation(), - interrogationDto.getWebConnectionId(),//TODO: a terme fait partie de l'interrogation - currentPartitionNode,campainId); - log.info("ProcessInstanceId={} campainId={} - currentPartitionId={} - remSUNode.id={} ", - execution.getProcessInstanceId(), campainId,currentPartitionId,dto.getSurveyUnit().getIdSu()); - //Call service - platinePilotageService.putQuestionings(dto); - } - - log.info("ProcessInstanceId={} campainId={} - currentPartitionId={} - end ", - execution.getProcessInstanceId(), campainId,currentPartitionId); - } - - private static QuestioningWebclientDto computeQuestioningWebclientDto(JsonNode remSUNode, String webConnectionId,JsonNode currentPartitionNode, String idCampagne) { - REMSurveyUnitDto remSurveyUnitDto=PlatineHelper.parseRemSUNode(objectMapper,remSUNode); - boolean isLogement = currentPartitionNode.path(CTX_PARTITION_TYPE_ECHANTILLON).textValue().equalsIgnoreCase(PartitionTypeEchantillon.LOGEMENT.getAsString()); - PersonDto contact = RemDtoUtils.findContact(remSUNode, remSurveyUnitDto, isLogement); - - PlatineAddressDto platineAdress = computePlatineAdress(remSurveyUnitDto.getAddress()); - ContactAccreditationDto platineContact = convertREMPersonToPlatineContact(webConnectionId, platineAdress, contact); - - return - QuestioningWebclientDto.builder() - .idPartitioning(PlatineHelper.computePilotagePartitionID(idCampagne,currentPartitionNode.path(CTX_PARTITION_ID).asLong())) - .modelName(currentPartitionNode.path(CTX_PARTITION_QUESTIONNAIRE_MODEL).asText()) - .surveyUnit(computeSurveyUnitDto(remSurveyUnitDto)) - .contacts(List.of(platineContact)) - .build(); - } - - - - private static PlatineQuestioningSurveyUnitDto computeSurveyUnitDto(REMSurveyUnitDto remSurveyUnitDto) { - - return PlatineQuestioningSurveyUnitDto.builder() - .idSu(remSurveyUnitDto.getRepositoryId().toString()) - .identificationCode("") - .identificationName("") - .address(computePlatineAdress(remSurveyUnitDto.getAddress())) - .build(); - } - - @Override - public Set getContextErrors(JsonNode contextRootNode) { - if(contextRootNode==null){ - return Set.of("Context is missing"); - } - Set results=new HashSet<>(); - Set requiredNodes = - Set.of( - //Global & Campaign - CTX_CAMPAGNE_ID,CTX_CAMPAGNE_CONTEXTE, CTX_PARTITIONS - ); - Set requiredPartition = - Set.of(CTX_PARTITION_ID, CTX_PARTITION_QUESTIONNAIRE_MODEL, CTX_PARTITION_TYPE_ECHANTILLON); - - - results.addAll(DelegateContextVerifier.computeMissingChildrenMessages(requiredNodes,contextRootNode,getClass())); - String contexte = contextRootNode.path(CTX_CAMPAGNE_CONTEXTE).asText(); - if(! EnumUtils.isValidEnumIgnoreCase(CampaignContextEnum.class, contexte)){ - results.add(DelegateContextVerifier.computeIncorrectEnumMessage(CTX_CAMPAGNE_CONTEXTE,contexte, Arrays.toString(CampaignContextEnum.values()),getClass())); - } - - //Maybe one day we will have partitions for platine and partitions for sabiane and we will only validate the platine ones - //Partitions - var partitionIterator =contextRootNode.path(CTX_PARTITIONS).elements(); - while (partitionIterator.hasNext()) { - var partitionNode = partitionIterator.next(); - results.addAll(DelegateContextVerifier.computeMissingChildrenMessages(requiredPartition,partitionNode,getClass())); - - //Check value of Enum - String enumVal = partitionNode.path(CTX_PARTITION_TYPE_ECHANTILLON).asText(); - if(! EnumUtils.isValidEnumIgnoreCase(PartitionTypeEchantillon.class, enumVal)){ - results.add(DelegateContextVerifier.computeIncorrectEnumMessage(CTX_PARTITION_TYPE_ECHANTILLON,enumVal,Arrays.toString(PartitionTypeEchantillon.values()),getClass())); - } - } - return results; - } - - /** - * Compute the lastname to send to platine. - * @param lastname from rem - * @param birthname from rem - * @return the computed platine last name - */ - protected static String getPlatineLastname(String lastname, String birthname){ - if(lastname!=null) - return lastname; - else if(birthname!=null) - return birthname; - return ""; - } - - private static ContactAccreditationDto convertREMPersonToPlatineContact(String idInternaute, PlatineAddressDto platineAdress, PersonDto remPersonDto) { - //If lastname is null then we use birthname - String platineName = getPlatineLastname(remPersonDto.getLastName(),remPersonDto.getBirthName()); - return ContactAccreditationDto.builder() - .identifier(idInternaute) - .externalId(remPersonDto.getExternalId()) - .function("") - .lastName(platineName) - .firstName(remPersonDto.getFirstName()) - .isMain(true) - .civility(convertREMGenderToPlatineCivility(remPersonDto.getGender()).getLabel()) - //Get favorite phone/mail ; if no favorite get the first of the list ; else empty - .email(remPersonDto.getEmails().stream() - .filter(email -> email.getFavorite()!=null && email.getFavorite()) - .findFirst() - .orElse(remPersonDto.getEmails().stream().findFirst().orElse(new EmailDto())) - .getMailAddress()) - .phone( - remPersonDto.getPhoneNumbers().stream() - .filter(phoneNumber -> phoneNumber.getFavorite()!=null && phoneNumber.getFavorite()) - .findFirst() - .orElse(remPersonDto.getPhoneNumbers().stream().findFirst().orElse(new PhoneNumberDto())) - .getNumber()) - .address(platineAdress) - .build(); - } - - static PlatinePilotageGenderType convertREMGenderToPlatineCivility(String remGender) { - if(remGender==null) - return PlatinePilotageGenderType.Undefined; - return switch (remGender) { - case "2": - yield PlatinePilotageGenderType.Female; - case "1" : - yield PlatinePilotageGenderType.Male; - default: - yield PlatinePilotageGenderType.Undefined; - }; - } - - private static PlatineAddressDto computePlatineAdress(REMAddressDto remAddressDto) { - //The REM REMAddressDto and Platine PlatineQuestioningSurveyUnitDto are identical - //I'll use the copyProperty to recopy identical members - var platineAdresse = BeanUtils.instantiateClass(PlatineAddressDto.class); - BeanUtils.copyProperties(remAddressDto, platineAdresse); - return platineAdresse; - } - -} diff --git a/src/main/java/fr/insee/protools/backend/service/platine/delegate/PlatinePilotageCreateSurveyUnitTask.java b/src/main/java/fr/insee/protools/backend/service/platine/delegate/PlatinePilotageCreateSurveyUnitTask.java deleted file mode 100644 index 26d1bcf8..00000000 --- a/src/main/java/fr/insee/protools/backend/service/platine/delegate/PlatinePilotageCreateSurveyUnitTask.java +++ /dev/null @@ -1,29 +0,0 @@ -package fr.insee.protools.backend.service.platine.delegate; - -import fr.insee.protools.backend.service.DelegateContextVerifier; -import fr.insee.protools.backend.service.context.ContextService; -import fr.insee.protools.backend.service.exception.ProtoolsTaskBPMNError; -import fr.insee.protools.backend.service.platine.pilotage.PlatinePilotageService; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.flowable.engine.delegate.DelegateExecution; -import org.flowable.engine.delegate.JavaDelegate; -import org.springframework.stereotype.Component; - -//TODO : à supprimer - -@Slf4j -@Component -@RequiredArgsConstructor -public class PlatinePilotageCreateSurveyUnitTask implements JavaDelegate, DelegateContextVerifier { - - private final ContextService protoolsContext; - private final PlatinePilotageService platinePilotageService; - - @Override - public void execute(DelegateExecution execution) { - throw new ProtoolsTaskBPMNError("Removed"); - - } - -} diff --git a/src/main/java/fr/insee/protools/backend/service/platine/delegate/PlatinePilotageGetSUContactTask.java b/src/main/java/fr/insee/protools/backend/service/platine/delegate/PlatinePilotageGetSUContactTask.java deleted file mode 100644 index 1983ed85..00000000 --- a/src/main/java/fr/insee/protools/backend/service/platine/delegate/PlatinePilotageGetSUContactTask.java +++ /dev/null @@ -1,59 +0,0 @@ -package fr.insee.protools.backend.service.platine.delegate; - -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; -import fr.insee.protools.backend.dto.platine.pilotage.contact.PlatineContactDto; -import fr.insee.protools.backend.service.DelegateContextVerifier; -import fr.insee.protools.backend.service.context.ContextService; -import fr.insee.protools.backend.service.platine.pilotage.PlatinePilotageService; -import fr.insee.protools.backend.service.utils.FlowableVariableUtils; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.flowable.engine.delegate.DelegateExecution; -import org.flowable.engine.delegate.JavaDelegate; -import org.springframework.stereotype.Component; - -import java.util.Set; - -import static com.fasterxml.jackson.databind.DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES; -import static fr.insee.protools.backend.service.FlowableVariableNameConstants.*; -import static fr.insee.protools.backend.service.context.ContextConstants.CTX_CAMPAGNE_ID; -import static fr.insee.protools.backend.service.platine.utils.PlatineHelper.computePilotagePartitionID; - -@Slf4j -@Component -@RequiredArgsConstructor -public class PlatinePilotageGetSUContactTask implements JavaDelegate, DelegateContextVerifier { - - private static final ObjectMapper objectMapper = new ObjectMapper().configure(FAIL_ON_UNKNOWN_PROPERTIES,false); - private final ContextService protoolsContext; - private final PlatinePilotageService platinePilotageService; - - @Override - public void execute(DelegateExecution execution) { - //Contexte - JsonNode contextRootNode = protoolsContext.getContextByProcessInstance(execution.getProcessInstanceId()); - checkContextOrThrow(log,execution.getProcessInstanceId(), contextRootNode); - String campainId = contextRootNode.path(CTX_CAMPAGNE_ID).asText(); - //Process variables - Long suId = FlowableVariableUtils.getVariableOrThrow(execution, VARNAME_REM_SURVEY_UNIT_IDENTIFIER, Long.class); - Long currentPartitionId = FlowableVariableUtils.getVariableOrThrow(execution, VARNAME_CURRENT_PARTITION_ID, Long.class); - log.info("ProcessInstanceId={} - currentPartitionId={} suId={} ",execution.getProcessInstanceId(), currentPartitionId,suId); - - //Get the Contact details from platine pilotage - String platinePartitionId = computePilotagePartitionID(campainId,currentPartitionId); - PlatineContactDto platineContactDto = platinePilotageService.getSUMainContact(suId, platinePartitionId); - - //STORE this info - execution.getParent().setVariableLocal(VARNAME_PLATINE_CONTACT, objectMapper.valueToTree(platineContactDto)); - log.info("Got contact info : platineContactDto.Identifier={}", platineContactDto.getIdentifier()); - } - - @Override - public Set getContextErrors(JsonNode contextRootNode) { - if(contextRootNode==null){ - return Set.of("Context is missing"); - } - return DelegateContextVerifier.computeMissingChildrenMessages(Set.of(CTX_CAMPAGNE_ID),contextRootNode,getClass()); - } -} \ No newline at end of file diff --git a/src/main/java/fr/insee/protools/backend/service/platine/delegate/PlatinePilotageGetSUIsToFollowUpTask.java b/src/main/java/fr/insee/protools/backend/service/platine/delegate/PlatinePilotageGetSUIsToFollowUpTask.java deleted file mode 100644 index 8af4e9a9..00000000 --- a/src/main/java/fr/insee/protools/backend/service/platine/delegate/PlatinePilotageGetSUIsToFollowUpTask.java +++ /dev/null @@ -1,57 +0,0 @@ -package fr.insee.protools.backend.service.platine.delegate; - -import com.fasterxml.jackson.databind.JsonNode; -import fr.insee.protools.backend.service.DelegateContextVerifier; -import fr.insee.protools.backend.service.context.ContextService; -import fr.insee.protools.backend.service.platine.pilotage.PlatinePilotageService; -import fr.insee.protools.backend.service.utils.FlowableVariableUtils; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.flowable.engine.delegate.DelegateExecution; -import org.flowable.engine.delegate.JavaDelegate; -import org.springframework.stereotype.Component; - -import java.util.Set; - -import static fr.insee.protools.backend.service.FlowableVariableNameConstants.*; -import static fr.insee.protools.backend.service.context.ContextConstants.CTX_CAMPAGNE_ID; -import static fr.insee.protools.backend.service.platine.utils.PlatineHelper.computePilotagePartitionID; - -@Slf4j -@Component -@RequiredArgsConstructor -public class PlatinePilotageGetSUIsToFollowUpTask implements JavaDelegate, DelegateContextVerifier { - - private final ContextService protoolsContext; - private final PlatinePilotageService platinePilotageService; - - - @Override - public void execute(DelegateExecution execution) { - //Contexte - JsonNode contextRootNode = protoolsContext.getContextByProcessInstance(execution.getProcessInstanceId()); - checkContextOrThrow(log,execution.getProcessInstanceId(), contextRootNode); - String campainId = contextRootNode.path(CTX_CAMPAGNE_ID).asText(); - //Process variables - Long suId = FlowableVariableUtils.getVariableOrThrow(execution, VARNAME_REM_SURVEY_UNIT_IDENTIFIER, Long.class); - Long currentPartitionId = FlowableVariableUtils.getVariableOrThrow(execution, VARNAME_CURRENT_PARTITION_ID, Long.class); - log.info("ProcessInstanceId={} - currentPartitionId={} suId={} begin",execution.getProcessInstanceId(), currentPartitionId,suId); - - //Check if this survey unit isToFollowUp - String platinePartitionId = computePilotagePartitionID(campainId,currentPartitionId); - Boolean suIsToFollowUp = platinePilotageService.isToFollowUp(suId, platinePartitionId); - - //STORE this info - execution.getParent().setVariableLocal(VARNAME_SU_IS_TO_FOLLOWUP, suIsToFollowUp); - log.info("ProcessInstanceId={} - currentPartitionId={} - suId={} - suIsToFollowUp={} end" - ,execution.getProcessInstanceId(), currentPartitionId,suId,suIsToFollowUp); - } - - @Override - public Set getContextErrors(JsonNode contextRootNode) { - if(contextRootNode==null){ - return Set.of("Context is missing"); - } - return DelegateContextVerifier.computeMissingChildrenMessages(Set.of(CTX_CAMPAGNE_ID),contextRootNode,getClass()); - } -} \ No newline at end of file diff --git a/src/main/java/fr/insee/protools/backend/service/platine/delegate/PlatineQuestionnaireCreateContextTask.java b/src/main/java/fr/insee/protools/backend/service/platine/delegate/PlatineQuestionnaireCreateContextTask.java deleted file mode 100644 index 7b361066..00000000 --- a/src/main/java/fr/insee/protools/backend/service/platine/delegate/PlatineQuestionnaireCreateContextTask.java +++ /dev/null @@ -1,109 +0,0 @@ -package fr.insee.protools.backend.service.platine.delegate; - -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; -import fr.insee.protools.backend.dto.platine_sabiane_questionnaire.MetadataConstants; -import fr.insee.protools.backend.dto.platine_sabiane_questionnaire.campaign.MetadataValue; -import fr.insee.protools.backend.dto.platine_sabiane_questionnaire.campaign.MetadataValueItem; -import fr.insee.protools.backend.dto.platine_sabiane_questionnaire.campaign.MetadataVariables; -import fr.insee.protools.backend.service.DelegateContextVerifier; -import fr.insee.protools.backend.service.common.platine_sabiane.QuestionnaireHelper; -import fr.insee.protools.backend.service.context.ContextService; -import fr.insee.protools.backend.service.nomenclature.NomenclatureService; -import fr.insee.protools.backend.service.platine.questionnaire.PlatineQuestionnaireService; -import fr.insee.protools.backend.service.questionnaire_model.QuestionnaireModelService; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.flowable.engine.delegate.DelegateExecution; -import org.flowable.engine.delegate.JavaDelegate; -import org.springframework.stereotype.Component; - -import java.util.List; -import java.util.Set; - -import static fr.insee.protools.backend.service.context.ContextConstants.*; - -@Component -@Slf4j -@RequiredArgsConstructor -public class PlatineQuestionnaireCreateContextTask implements JavaDelegate, DelegateContextVerifier { - - private final ContextService protoolsContext; - private final ObjectMapper objectMapper; - private final NomenclatureService nomenclatureService; - private final QuestionnaireModelService questionnaireModelService; - private final PlatineQuestionnaireService platineQuestionnaireService; - - @Override - public void execute(DelegateExecution execution) { - JsonNode contextRootNode = protoolsContext.getContextByProcessInstance(execution.getProcessInstanceId()); - //check context - checkContextOrThrow(log,execution.getProcessInstanceId(), contextRootNode); - - MetadataValue metadataDto = createMetadataDto(contextRootNode); - log.info("ProcessInstanceId={} - campagne={}" - ,execution.getProcessInstanceId(),contextRootNode.path(CTX_CAMPAGNE_CONTEXTE).asText()); - - QuestionnaireHelper.createQuestionnaire(contextRootNode,platineQuestionnaireService,nomenclatureService, - questionnaireModelService,execution.getProcessInstanceId(),metadataDto); - - log.debug("ProcessInstanceId={} end",execution.getProcessInstanceId()); - } - - @Override - public Set getContextErrors(JsonNode contextRootNode) { - if(contextRootNode==null){ - return Set.of(String.format("Class=%s : Context is missing ", this.getClass().getSimpleName())); - } - - //Standard verifications (common between platine and sabiane) - Set missingNodes = - QuestionnaireHelper.getCreateCtxContextErrors(contextRootNode); - - //Metadata used by platine - Set requiredMetadonnes = - Set.of(CTX_META_LABEL_LONG_OPERATION, CTX_META_OBJECTIFS_COURTS, CTX_META_CARACTERE_OBLIGATOIRE, - CTX_META_NUMERO_VISA, CTX_META_MINISTERE_TUTELLE, CTX_META_PARUTION_JO, CTX_META_DATE_PARUTION_JO, - CTX_META_RESPONSABLE_OPERATIONNEL, CTX_META_RESPONSABLE_TRAITEMENT, CTX_META_ANNEE_VISA, - CTX_META_QUALITE_STATISTIQUE, CTX_META_TEST_NON_LABELLISE, - //Legal - CTX_META_URL_LOI_RGPD,CTX_META_URL_LOI_INFORMATIQUE,CTX_META_URL_LOI_STATISTIQUE - ); - - if (contextRootNode.get(CTX_METADONNEES) != null) { - missingNodes.addAll(DelegateContextVerifier.computeMissingChildrenMessages(requiredMetadonnes,contextRootNode.path(CTX_METADONNEES),getClass())); - } - - return missingNodes; - } - - - - MetadataValue createMetadataDto(JsonNode contextRootNode){ - JsonNode metadataNode = contextRootNode.path(CTX_METADONNEES); - return MetadataValue.builder() - .value(MetadataVariables.builder() - .variables( - List.of( - new MetadataValueItem(MetadataConstants.Enq_LibelleEnquete,metadataNode.path(CTX_META_LABEL_LONG_OPERATION).asText()), - new MetadataValueItem(MetadataConstants.Enq_ObjectifsCourts,metadataNode.path(CTX_META_OBJECTIFS_COURTS).asText()), - new MetadataValueItem(MetadataConstants.Enq_CaractereObligatoire,metadataNode.path(CTX_META_CARACTERE_OBLIGATOIRE).asBoolean()), - new MetadataValueItem(MetadataConstants.Enq_NumeroVisa,metadataNode.path(CTX_META_NUMERO_VISA).asText()), - new MetadataValueItem(MetadataConstants.Enq_MinistereTutelle,metadataNode.path(CTX_META_MINISTERE_TUTELLE).asText()), - new MetadataValueItem(MetadataConstants.Enq_ParutionJo,metadataNode.path(CTX_META_PARUTION_JO).asBoolean()), - new MetadataValueItem(MetadataConstants.Enq_DateParutionJo,metadataNode.path(CTX_META_DATE_PARUTION_JO).asText()), - new MetadataValueItem(MetadataConstants.Enq_RespOperationnel,metadataNode.path(CTX_META_RESPONSABLE_OPERATIONNEL).asText()), - new MetadataValueItem(MetadataConstants.Enq_RespTraitement,metadataNode.path(CTX_META_RESPONSABLE_TRAITEMENT).asText()), - new MetadataValueItem(MetadataConstants.Enq_AnneeVisa,metadataNode.path(CTX_META_ANNEE_VISA).asInt()), - new MetadataValueItem(MetadataConstants.Enq_QualiteStatistique,metadataNode.path(CTX_META_QUALITE_STATISTIQUE).asBoolean()), - new MetadataValueItem(MetadataConstants.Enq_TestNonLabellise,metadataNode.path(CTX_META_TEST_NON_LABELLISE).asBoolean()), - new MetadataValueItem(MetadataConstants.Loi_statistique,metadataNode.path(CTX_META_URL_LOI_STATISTIQUE).asText()), - new MetadataValueItem(MetadataConstants.Loi_rgpd,metadataNode.path(CTX_META_URL_LOI_RGPD).asText()), - new MetadataValueItem(MetadataConstants.Loi_informatique,metadataNode.path(CTX_META_URL_LOI_INFORMATIQUE).asText()) - ) - ) - .inseeContext(contextRootNode.path(CTX_CAMPAGNE_CONTEXTE).asText()) - .build()) - .build(); - } -} diff --git a/src/main/java/fr/insee/protools/backend/service/platine/delegate/PlatineQuestionnaireCreateInterrogationListTask.java b/src/main/java/fr/insee/protools/backend/service/platine/delegate/PlatineQuestionnaireCreateInterrogationListTask.java deleted file mode 100644 index a36f5fbf..00000000 --- a/src/main/java/fr/insee/protools/backend/service/platine/delegate/PlatineQuestionnaireCreateInterrogationListTask.java +++ /dev/null @@ -1,36 +0,0 @@ -package fr.insee.protools.backend.service.platine.delegate; - -import com.fasterxml.jackson.databind.JsonNode; -import fr.insee.protools.backend.service.DelegateContextVerifier; -import fr.insee.protools.backend.service.common.platine_sabiane.QuestionnaireHelper; -import fr.insee.protools.backend.service.context.ContextService; -import fr.insee.protools.backend.service.platine.questionnaire.PlatineQuestionnaireService; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.flowable.engine.delegate.DelegateExecution; -import org.flowable.engine.delegate.JavaDelegate; -import org.springframework.stereotype.Component; - -import java.util.Set; - -@Slf4j -@Component -@RequiredArgsConstructor -public class PlatineQuestionnaireCreateInterrogationListTask implements JavaDelegate, DelegateContextVerifier { - - private final ContextService protoolsContext; - private final PlatineQuestionnaireService platineQuestionnaireService; - - @Override - public void execute(DelegateExecution execution) { - JsonNode contextRootNode = protoolsContext.getContextByProcessInstance(execution.getProcessInstanceId()); - checkContextOrThrow(log,execution.getProcessInstanceId(), contextRootNode); - QuestionnaireHelper.createInterrogationsTaskPlatine(execution,protoolsContext,platineQuestionnaireService); - } - - @Override - public Set getContextErrors(JsonNode contextRootNode) { - return QuestionnaireHelper.getCreateSUContextErrorsPlatine(contextRootNode); - } - -} diff --git a/src/main/java/fr/insee/protools/backend/service/platine/delegate/PlatineQuestionnaireCreateSurveyUnitTask.java b/src/main/java/fr/insee/protools/backend/service/platine/delegate/PlatineQuestionnaireCreateSurveyUnitTask.java deleted file mode 100644 index 4e3d01f5..00000000 --- a/src/main/java/fr/insee/protools/backend/service/platine/delegate/PlatineQuestionnaireCreateSurveyUnitTask.java +++ /dev/null @@ -1,35 +0,0 @@ -package fr.insee.protools.backend.service.platine.delegate; - -import com.fasterxml.jackson.databind.JsonNode; -import fr.insee.protools.backend.service.DelegateContextVerifier; -import fr.insee.protools.backend.service.common.platine_sabiane.QuestionnaireHelper; -import fr.insee.protools.backend.service.context.ContextService; -import fr.insee.protools.backend.service.exception.ProtoolsTaskBPMNError; -import fr.insee.protools.backend.service.platine.questionnaire.PlatineQuestionnaireService; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.flowable.engine.delegate.DelegateExecution; -import org.flowable.engine.delegate.JavaDelegate; -import org.springframework.stereotype.Component; - -import java.util.Set; - -@Slf4j -@Component -@RequiredArgsConstructor -public class PlatineQuestionnaireCreateSurveyUnitTask implements JavaDelegate, DelegateContextVerifier { - - private final ContextService protoolsContext; - private final PlatineQuestionnaireService platineQuestionnaireService; - - @Override - public void execute(DelegateExecution execution) { - throw new ProtoolsTaskBPMNError("Removed"); - } - - @Override - public Set getContextErrors(JsonNode contextRootNode) { - return QuestionnaireHelper.getCreateSUContextErrorsPlatine(contextRootNode); - } - -} diff --git a/src/main/java/fr/insee/protools/backend/service/platine/delegate/v2/pilotatage/PlatinePilotageCreateCommunicationEventTaskREST.java b/src/main/java/fr/insee/protools/backend/service/platine/delegate/pilotatage/PlatinePilotageCreateCommunicationEventTaskREST.java similarity index 82% rename from src/main/java/fr/insee/protools/backend/service/platine/delegate/v2/pilotatage/PlatinePilotageCreateCommunicationEventTaskREST.java rename to src/main/java/fr/insee/protools/backend/service/platine/delegate/pilotatage/PlatinePilotageCreateCommunicationEventTaskREST.java index 445228eb..cb4b69a7 100644 --- a/src/main/java/fr/insee/protools/backend/service/platine/delegate/v2/pilotatage/PlatinePilotageCreateCommunicationEventTaskREST.java +++ b/src/main/java/fr/insee/protools/backend/service/platine/delegate/pilotatage/PlatinePilotageCreateCommunicationEventTaskREST.java @@ -1,10 +1,10 @@ -package fr.insee.protools.backend.service.platine.delegate.v2.pilotatage; +package fr.insee.protools.backend.service.platine.delegate.pilotatage; import com.fasterxml.jackson.databind.JsonNode; -import fr.insee.protools.backend.dto.platine.pilotage.v2.PlatinePilotageCommunicationEventDto; +import fr.insee.protools.backend.dto.platine.pilotage.PlatinePilotageCommunicationEventDto; import fr.insee.protools.backend.service.DelegateContextVerifier; import fr.insee.protools.backend.service.context.ContextService; -import fr.insee.protools.backend.service.platine.pilotage.PlatinePilotageService; +import fr.insee.protools.backend.service.platine.service.PlatinePilotageService; import fr.insee.protools.backend.service.utils.FlowableVariableUtils; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -12,13 +12,11 @@ import org.flowable.engine.delegate.JavaDelegate; import org.springframework.stereotype.Component; -import javax.naming.Context; import java.util.List; import java.util.Map; -import static fr.insee.protools.backend.dto.platine.pilotage.v2.PlatinePilotageCommunicationEventType.COMMUNICATION_STATE_SENT; +import static fr.insee.protools.backend.dto.platine.pilotage.PlatinePilotageCommunicationEventType.COMMUNICATION_STATE_SENT; import static fr.insee.protools.backend.service.FlowableVariableNameConstants.*; -import static fr.insee.protools.backend.service.utils.ContextUtils.getPartitionNodeIfExists; @Slf4j @RequiredArgsConstructor @@ -26,7 +24,6 @@ public class PlatinePilotageCreateCommunicationEventTaskREST implements JavaDelegate, DelegateContextVerifier { private final PlatinePilotageService platinePilotageService; - private final ContextService protoolsContext; @Override public void execute(DelegateExecution execution) { diff --git a/src/main/java/fr/insee/protools/backend/service/platine/delegate/v2/pilotatage/PlatinePilotageCreateContextTaskREST.java b/src/main/java/fr/insee/protools/backend/service/platine/delegate/pilotatage/PlatinePilotageCreateContextTaskREST.java similarity index 80% rename from src/main/java/fr/insee/protools/backend/service/platine/delegate/v2/pilotatage/PlatinePilotageCreateContextTaskREST.java rename to src/main/java/fr/insee/protools/backend/service/platine/delegate/pilotatage/PlatinePilotageCreateContextTaskREST.java index 516266b0..7768e528 100644 --- a/src/main/java/fr/insee/protools/backend/service/platine/delegate/v2/pilotatage/PlatinePilotageCreateContextTaskREST.java +++ b/src/main/java/fr/insee/protools/backend/service/platine/delegate/pilotatage/PlatinePilotageCreateContextTaskREST.java @@ -1,16 +1,16 @@ -package fr.insee.protools.backend.service.platine.delegate.v2.pilotatage; +package fr.insee.protools.backend.service.platine.delegate.pilotatage; import com.fasterxml.jackson.databind.JsonNode; import fr.insee.protools.backend.service.DelegateContextVerifier; import fr.insee.protools.backend.service.context.ContextService; -import fr.insee.protools.backend.service.platine.pilotage.PlatinePilotageService; +import fr.insee.protools.backend.service.platine.service.PlatinePilotageService; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.flowable.engine.delegate.DelegateExecution; import org.flowable.engine.delegate.JavaDelegate; import org.springframework.stereotype.Component; -import static fr.insee.protools.backend.service.context.ContextConstants.*; +import static fr.insee.protools.backend.service.context.ContextConstants.CTX_CAMPAGNE_ID; @Slf4j @RequiredArgsConstructor @@ -23,7 +23,7 @@ public class PlatinePilotageCreateContextTaskREST implements JavaDelegate, Deleg @Override public void execute(DelegateExecution execution) { log.info("ProcessInstanceId={} begin",execution.getProcessInstanceId()); - JsonNode contextRootNode = protoolsContext.getContextByProcessInstance(execution.getProcessInstanceId()); + JsonNode contextRootNode = protoolsContext.getContextJsonNodeByProcessInstance(execution.getProcessInstanceId()); String campainId = contextRootNode.path(CTX_CAMPAGNE_ID).asText(); checkContextOrThrow(log,execution.getProcessInstanceId(), contextRootNode); diff --git a/src/main/java/fr/insee/protools/backend/service/platine/delegate/v2/pilotatage/PlatinePilotageCreateInterrogationListTaskREST.java b/src/main/java/fr/insee/protools/backend/service/platine/delegate/pilotatage/PlatinePilotageCreateInterrogationListTaskREST.java similarity index 51% rename from src/main/java/fr/insee/protools/backend/service/platine/delegate/v2/pilotatage/PlatinePilotageCreateInterrogationListTaskREST.java rename to src/main/java/fr/insee/protools/backend/service/platine/delegate/pilotatage/PlatinePilotageCreateInterrogationListTaskREST.java index 0285a31f..62ef45a7 100644 --- a/src/main/java/fr/insee/protools/backend/service/platine/delegate/v2/pilotatage/PlatinePilotageCreateInterrogationListTaskREST.java +++ b/src/main/java/fr/insee/protools/backend/service/platine/delegate/pilotatage/PlatinePilotageCreateInterrogationListTaskREST.java @@ -1,7 +1,8 @@ -package fr.insee.protools.backend.service.platine.delegate.v2.pilotatage; +package fr.insee.protools.backend.service.platine.delegate.pilotatage; import com.fasterxml.jackson.databind.JsonNode; -import fr.insee.protools.backend.service.platine.pilotage.PlatinePilotageService; +import fr.insee.protools.backend.dto.ContexteProcessus; +import fr.insee.protools.backend.service.platine.service.PlatinePilotageService; import fr.insee.protools.backend.service.utils.delegate.DefaultCallServiceInterroListTask; import lombok.RequiredArgsConstructor; @@ -13,7 +14,7 @@ public class PlatinePilotageCreateInterrogationListTaskREST extends DefaultCallS private final PlatinePilotageService platinePilotageService; @Override - protected void serviceAction(String campaignId, List list, String... params) { - platinePilotageService.putQuestionings(campaignId,list); + protected void serviceAction(ContexteProcessus context, List list, String... params) { + platinePilotageService.postInterrogations(context.getId().toString(),list); } } diff --git a/src/main/java/fr/insee/protools/backend/service/platine/delegate/pilotatage/PlatinePilotageGetListOfInterroToFollowUpPaginatedTaskREST.java b/src/main/java/fr/insee/protools/backend/service/platine/delegate/pilotatage/PlatinePilotageGetListOfInterroToFollowUpPaginatedTaskREST.java new file mode 100644 index 00000000..b6111eac --- /dev/null +++ b/src/main/java/fr/insee/protools/backend/service/platine/delegate/pilotatage/PlatinePilotageGetListOfInterroToFollowUpPaginatedTaskREST.java @@ -0,0 +1,51 @@ +package fr.insee.protools.backend.service.platine.delegate.pilotatage; + +import com.fasterxml.jackson.databind.JsonNode; +import fr.insee.protools.backend.restclient.pagination.PageResponse; +import fr.insee.protools.backend.service.DelegateContextVerifier; +import fr.insee.protools.backend.service.platine.service.PlatinePilotageService; +import fr.insee.protools.backend.service.utils.FlowableVariableUtils; +import fr.insee.protools.backend.service.utils.delegate.PaginationHelper; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.JavaDelegate; +import org.slf4j.Logger; +import org.springframework.stereotype.Component; + +import java.util.List; +import java.util.Map; +import java.util.Optional; + +import static fr.insee.protools.backend.service.FlowableVariableNameConstants.*; + + +@Slf4j +@Component +@RequiredArgsConstructor +public class PlatinePilotageGetListOfInterroToFollowUpPaginatedTaskREST implements JavaDelegate, DelegateContextVerifier, PaginationHelper { + + private final PlatinePilotageService pilotageService; + + private PageResponse readFunction(Integer pageToRead, Object... objects) { + Long partitionId = (Long) objects[0]; + return pilotageService.getInterrogationToFollowUpPaginated(partitionId, pageToRead, Optional.of(Boolean.TRUE)); + } + + @Override + public void execute(DelegateExecution execution) { + String currentPartitionId = FlowableVariableUtils.getVariableOrThrow(execution, VARNAME_CURRENT_PARTITION_ID, String.class); + getAndTreat(execution, VARNAME_INTERRO_LIST_PAGEABLE_CURRENT_PAGE, VARNAME_INTERRO_LIST_PAGEABLE_IS_LAST_PAGE, this::readFunction, currentPartitionId); + } + + @Override + public Logger getLogger() { + return log; + } + + @Override + public Map treatPage(DelegateExecution execution, List contentList) { + Map variables = Map.of(VARNAME_REM_INTERRO_LIST, contentList); + return variables; + } +} \ No newline at end of file diff --git a/src/main/java/fr/insee/protools/backend/service/platine/delegate/v2/questionnaire/PlatineQuestionnaireCreateContextTaskREST.java b/src/main/java/fr/insee/protools/backend/service/platine/delegate/questionnaire/PlatineQuestionnaireCreateContextTaskREST.java similarity index 81% rename from src/main/java/fr/insee/protools/backend/service/platine/delegate/v2/questionnaire/PlatineQuestionnaireCreateContextTaskREST.java rename to src/main/java/fr/insee/protools/backend/service/platine/delegate/questionnaire/PlatineQuestionnaireCreateContextTaskREST.java index f780f656..a519db03 100644 --- a/src/main/java/fr/insee/protools/backend/service/platine/delegate/v2/questionnaire/PlatineQuestionnaireCreateContextTaskREST.java +++ b/src/main/java/fr/insee/protools/backend/service/platine/delegate/questionnaire/PlatineQuestionnaireCreateContextTaskREST.java @@ -1,9 +1,9 @@ -package fr.insee.protools.backend.service.platine.delegate.v2.questionnaire; +package fr.insee.protools.backend.service.platine.delegate.questionnaire; import com.fasterxml.jackson.databind.JsonNode; import fr.insee.protools.backend.service.DelegateContextVerifier; import fr.insee.protools.backend.service.context.ContextService; -import fr.insee.protools.backend.service.platine.questionnaire.PlatineQuestionnaireService; +import fr.insee.protools.backend.service.platine.service.PlatineQuestionnaireService; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.flowable.engine.delegate.DelegateExecution; @@ -23,7 +23,7 @@ public class PlatineQuestionnaireCreateContextTaskREST implements JavaDelegate, @Override public void execute(DelegateExecution execution) { log.info("ProcessInstanceId={} begin",execution.getProcessInstanceId()); - JsonNode contextRootNode = protoolsContext.getContextByProcessInstance(execution.getProcessInstanceId()); + JsonNode contextRootNode = protoolsContext.getContextJsonNodeByProcessInstance(execution.getProcessInstanceId()); String campainId = contextRootNode.path(CTX_CAMPAGNE_ID).asText(); checkContextOrThrow(log,execution.getProcessInstanceId(), contextRootNode); diff --git a/src/main/java/fr/insee/protools/backend/service/platine/delegate/v2/questionnaire/PlatineQuestionnaireCreateInterrogationListTaskREST.java b/src/main/java/fr/insee/protools/backend/service/platine/delegate/questionnaire/PlatineQuestionnaireCreateInterrogationListTaskREST.java similarity index 57% rename from src/main/java/fr/insee/protools/backend/service/platine/delegate/v2/questionnaire/PlatineQuestionnaireCreateInterrogationListTaskREST.java rename to src/main/java/fr/insee/protools/backend/service/platine/delegate/questionnaire/PlatineQuestionnaireCreateInterrogationListTaskREST.java index 107d9f2b..f894459b 100644 --- a/src/main/java/fr/insee/protools/backend/service/platine/delegate/v2/questionnaire/PlatineQuestionnaireCreateInterrogationListTaskREST.java +++ b/src/main/java/fr/insee/protools/backend/service/platine/delegate/questionnaire/PlatineQuestionnaireCreateInterrogationListTaskREST.java @@ -1,7 +1,8 @@ -package fr.insee.protools.backend.service.platine.delegate.v2.questionnaire; +package fr.insee.protools.backend.service.platine.delegate.questionnaire; import com.fasterxml.jackson.databind.JsonNode; -import fr.insee.protools.backend.service.platine.questionnaire.PlatineQuestionnaireService; +import fr.insee.protools.backend.dto.ContexteProcessus; +import fr.insee.protools.backend.service.platine.service.PlatineQuestionnaireService; import fr.insee.protools.backend.service.utils.delegate.DefaultCallServiceInterroListTask; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -17,8 +18,8 @@ public class PlatineQuestionnaireCreateInterrogationListTaskREST extends Default private final PlatineQuestionnaireService platineQuestionnaireService; @Override - protected void serviceAction(String campaignId,List list, String... params) { - platineQuestionnaireService.postSurveyUnits(campaignId,list); + protected void serviceAction(ContexteProcessus context, List list, String... params) { + platineQuestionnaireService.postInterrogations(context.getId().toString(),list); } } diff --git a/src/main/java/fr/insee/protools/backend/service/platine/pilotage/PlatinePilotageService.java b/src/main/java/fr/insee/protools/backend/service/platine/pilotage/PlatinePilotageService.java deleted file mode 100644 index 3522c51e..00000000 --- a/src/main/java/fr/insee/protools/backend/service/platine/pilotage/PlatinePilotageService.java +++ /dev/null @@ -1,159 +0,0 @@ -package fr.insee.protools.backend.service.platine.pilotage; - -import com.fasterxml.jackson.databind.JsonNode; -import fr.insee.protools.backend.dto.platine.pilotage.PlatinePilotageEligibleDto; -import fr.insee.protools.backend.dto.platine.pilotage.contact.PlatineContactDto; -import fr.insee.protools.backend.dto.platine.pilotage.query.QuestioningWebclientDto; -import fr.insee.protools.backend.dto.platine.pilotage.v2.PlatinePilotageCommunicationEventDto; -import fr.insee.protools.backend.httpclients.exception.runtime.HttpClient4xxBPMNError; -import fr.insee.protools.backend.httpclients.pagination.PageResponse; -import fr.insee.protools.backend.httpclients.restclient.RestClientHelper; -import fr.insee.protools.backend.service.platine.pilotage.metadata.MetadataDto; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.slf4j.event.Level; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.core.ParameterizedTypeReference; -import org.springframework.http.HttpStatus; -import org.springframework.stereotype.Service; - -import java.util.List; -import java.util.Optional; - -import static fr.insee.protools.backend.httpclients.configuration.ApiConfigProperties.KNOWN_API.KNOWN_API_REM; -import static fr.insee.protools.backend.httpclients.webclient.WebClientHelper.logJson; -import static fr.insee.protools.backend.httpclients.configuration.ApiConfigProperties.KNOWN_API.KNOWN_API_PLATINE_PILOTAGE; - -@Service -@Slf4j -@RequiredArgsConstructor -public class PlatinePilotageService { - - private final RestClientHelper restClientHelper; - - @Value("${fr.insee.protools.api.platine-pilotage.interrogation.page.size:5000}") - private int pageSizeGetInterro; - - public void putMetadata(String partitionId , MetadataDto dto) { - log.debug("putMetadata : partitionId={} - dto.su.id={} ",partitionId,dto.getSurveyDto().getId()); - logJson(String.format("putMetadata - partitionId=%s : ",partitionId),dto, log,Level.DEBUG); - var response = restClientHelper.getRestClient(KNOWN_API_PLATINE_PILOTAGE) - .put() - .uri(uriBuilder -> uriBuilder - .path("/api/metadata/{id}") - .build(partitionId)) - .body(dto) - .retrieve() - .body(String.class); - log.trace("putMetadata : partitionId={} - response={} ",partitionId,response); - } - - public void putQuestionings(QuestioningWebclientDto dto) { - log.debug("putQuestionings: idPartitioning={} - idSu={}",dto.getIdPartitioning(),dto.getSurveyUnit().getIdSu()); - logJson("putMetadata ",dto,log,Level.TRACE); - var response = restClientHelper.getRestClient(KNOWN_API_PLATINE_PILOTAGE) - .put() - .uri("/api/questionings") - .body(dto) - .retrieve() - .body(String.class); - log.trace("putQuestionings - response={} ",response); - } - - public PlatineContactDto getSUMainContact(Long idSU, String platinePartitionId){ - log.debug("getSUMainContact: platinePartitionId={} - idSu={}",platinePartitionId,idSU); - PlatineContactDto response = restClientHelper.getRestClient(KNOWN_API_PLATINE_PILOTAGE) - .get() - .uri(uriBuilder -> uriBuilder - .path("/api/main-contact") - .queryParam("partitioning", platinePartitionId) - .queryParam("survey-unit", idSU) - .build()) - .retrieve() - .body(PlatineContactDto.class); - logJson("getSUMainContact response : ",response,log,Level.TRACE); - return response; - } - - public Boolean isToFollowUp(Long idSU, String platinePartitionId){ - log.debug("isToFollowUp: platinePartitionId={} - idSu={}",platinePartitionId,idSU); - PlatinePilotageEligibleDto response = restClientHelper.getRestClient(KNOWN_API_PLATINE_PILOTAGE) - .get() - .uri(uriBuilder -> uriBuilder - .path("/api/partitionings/{idPartitioning}/survey-units/{idSu}/follow-up") - .build(platinePartitionId,idSU)) - .retrieve() - .body(PlatinePilotageEligibleDto.class); - Boolean result = Boolean.valueOf(response.getEligible()); - logJson("isToFollowUp: result="+result+" - response : ",response,log,Level.TRACE); - return result; - } - - //V2 - public void putQuestionings(String campaignId, List interrogations) { - log.trace("putQuestionings: campaignId={}",campaignId); - logJson("putMetadata ",interrogations,log,Level.TRACE); - var response = restClientHelper.getRestClient(KNOWN_API_PLATINE_PILOTAGE) - .put() - .uri("/api/questionings") - .body(interrogations) - .retrieve() - .body(String.class); - log.trace("putQuestionings: campaignId={} - response={} ",campaignId,response); - } - - public void postContext(String campaignId,JsonNode contextRootNode) { - log.trace("postContext: campaignId={}",campaignId); - var response = restClientHelper.getRestClient(KNOWN_API_PLATINE_PILOTAGE) - .post() - .uri("/context") - .body(contextRootNode) - .retrieve() - .body(String.class); - log.trace("postContext: campaignId={} - response={} ",campaignId,response); - } - - public void postCommunicationEvent(List platinePilotageCommunicationEventList) { - log.trace("postCommunicationEvent: "); - logJson("postCommunicationEvent ",platinePilotageCommunicationEventList,log,Level.TRACE); - - var response = restClientHelper.getRestClient(KNOWN_API_PLATINE_PILOTAGE) - .post() - .uri("/interrogations/communication-events") - .body(platinePilotageCommunicationEventList) - .retrieve() - .body(String.class); - log.trace("postCommunicationEvent: response={} ",response); - } - - public PageResponse getInterrogationToFollowUpPaginated(Long partitionId, long page, Optional isToFollowUp) { - log.debug("partitionId={} - page={} - pageSizeGetInterro={} - hasAccount={}",partitionId,page,pageSizeGetInterro,isToFollowUp); - ParameterizedTypeReference> typeReference = new ParameterizedTypeReference<>() { }; - try { - PageResponse response = restClientHelper.getRestClient(KNOWN_API_PLATINE_PILOTAGE) - .get() - .uri(uriBuilder -> uriBuilder - .path("interrogations") - .queryParam("page", page) - .queryParam("size", pageSizeGetInterro) - .queryParam("partition_id", partitionId) - .queryParamIfPresent("follow-up", isToFollowUp) - .build(partitionId)) - .retrieve() - .body(typeReference); - log.trace("partitionId={} - page={} - pageSizeGetInterro={} - response={} ", partitionId,page,pageSizeGetInterro, response.getContent().size()); - return response; - } - catch (HttpClient4xxBPMNError e){ - if(e.getHttpStatusCodeError().equals(HttpStatus.NOT_FOUND)){ - String msg= - "Error 404/NOT_FOUND during Platine Pilotage getInterrogationToFollowUpPaginated with partitionId="+partitionId - + " - msg="+e.getMessage(); - log.error(msg); - throw new HttpClient4xxBPMNError(msg,e.getHttpStatusCodeError()); - } - //Currently no remediation so just rethrow - throw e; - } - } -} diff --git a/src/main/java/fr/insee/protools/backend/service/platine/pilotage/metadata/CampaignDto.java b/src/main/java/fr/insee/protools/backend/service/platine/pilotage/metadata/CampaignDto.java deleted file mode 100644 index d6b994f4..00000000 --- a/src/main/java/fr/insee/protools/backend/service/platine/pilotage/metadata/CampaignDto.java +++ /dev/null @@ -1,14 +0,0 @@ -package fr.insee.protools.backend.service.platine.pilotage.metadata; -import lombok.Builder; -import lombok.Data; - -@Data -@Builder -public class CampaignDto { - - private String id; - private String surveyId; - private int year; - private String campaignWording; - private PeriodEnum period; -} \ No newline at end of file diff --git a/src/main/java/fr/insee/protools/backend/service/platine/pilotage/metadata/MetadataDto.java b/src/main/java/fr/insee/protools/backend/service/platine/pilotage/metadata/MetadataDto.java deleted file mode 100644 index 65924ffc..00000000 --- a/src/main/java/fr/insee/protools/backend/service/platine/pilotage/metadata/MetadataDto.java +++ /dev/null @@ -1,26 +0,0 @@ -package fr.insee.protools.backend.service.platine.pilotage.metadata; - -import com.fasterxml.jackson.annotation.JsonProperty; -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; - -@Data -@AllArgsConstructor -@NoArgsConstructor -public class MetadataDto { - - @JsonProperty("partitioning") - private PartitioningDto partitioningDto; - @JsonProperty("campaign") - private CampaignDto campaignDto; - @JsonProperty("survey") - private SurveyDto surveyDto; - @JsonProperty("source") - private SourceDto sourceDto; - @JsonProperty("owner") - private OwnerDto ownerDto; - @JsonProperty("support") - private SupportDto supportDto; - -} \ No newline at end of file diff --git a/src/main/java/fr/insee/protools/backend/service/platine/pilotage/metadata/OwnerDto.java b/src/main/java/fr/insee/protools/backend/service/platine/pilotage/metadata/OwnerDto.java deleted file mode 100644 index 40789a19..00000000 --- a/src/main/java/fr/insee/protools/backend/service/platine/pilotage/metadata/OwnerDto.java +++ /dev/null @@ -1,15 +0,0 @@ -package fr.insee.protools.backend.service.platine.pilotage.metadata; - -import lombok.Builder; -import lombok.Data; - -@Data -@Builder -public class OwnerDto { - - private String id; - private String label; - private String ministry; - private String logo; - -} \ No newline at end of file diff --git a/src/main/java/fr/insee/protools/backend/service/platine/pilotage/metadata/PartitioningDto.java b/src/main/java/fr/insee/protools/backend/service/platine/pilotage/metadata/PartitioningDto.java deleted file mode 100644 index d378887a..00000000 --- a/src/main/java/fr/insee/protools/backend/service/platine/pilotage/metadata/PartitioningDto.java +++ /dev/null @@ -1,17 +0,0 @@ -package fr.insee.protools.backend.service.platine.pilotage.metadata; - -import lombok.Builder; -import lombok.Data; - -@Data -@Builder -public class PartitioningDto { - - private String id; - private String campaignId; - private String label; - //Defined as dates in platine but use String in protools so we dont have to parse them - private String openingDate; - private String closingDate; - private String returnDate; -} \ No newline at end of file diff --git a/src/main/java/fr/insee/protools/backend/service/platine/pilotage/metadata/PeriodEnum.java b/src/main/java/fr/insee/protools/backend/service/platine/pilotage/metadata/PeriodEnum.java deleted file mode 100644 index 6607150c..00000000 --- a/src/main/java/fr/insee/protools/backend/service/platine/pilotage/metadata/PeriodEnum.java +++ /dev/null @@ -1,145 +0,0 @@ -package fr.insee.protools.backend.service.platine.pilotage.metadata; - -import lombok.Getter; - -@Getter -public enum PeriodEnum { - - A00(PeriodicityEnum.A, "annual"), - X00(PeriodicityEnum.X, "pluriannual"), - X01(PeriodicityEnum.X, "pluriannual"), - X02(PeriodicityEnum.X, "pluriannual"), - X03(PeriodicityEnum.X, "pluriannual"), - X04(PeriodicityEnum.X, "pluriannual"), - X05(PeriodicityEnum.X, "pluriannual"), - X06(PeriodicityEnum.X, "pluriannual"), - X07(PeriodicityEnum.X, "pluriannual"), - X08(PeriodicityEnum.X, "pluriannual"), - X09(PeriodicityEnum.X, "pluriannual"), - X10(PeriodicityEnum.X, "pluriannual"), - X11(PeriodicityEnum.X, "pluriannual"), - X12(PeriodicityEnum.X, "pluriannual"), - X13(PeriodicityEnum.X, "pluriannual"), - X14(PeriodicityEnum.X, "pluriannual"), - X15(PeriodicityEnum.X, "pluriannual"), - X16(PeriodicityEnum.X, "pluriannual"), - X17(PeriodicityEnum.X, "pluriannual"), - X18(PeriodicityEnum.X, "pluriannual"), - X19(PeriodicityEnum.X, "pluriannual"), - X20(PeriodicityEnum.X, "pluriannual"), - X21(PeriodicityEnum.X, "pluriannual"), - X22(PeriodicityEnum.X, "pluriannual"), - X23(PeriodicityEnum.X, "pluriannual"), - X24(PeriodicityEnum.X, "pluriannual"), - X25(PeriodicityEnum.X, "pluriannual"), - X26(PeriodicityEnum.X, "pluriannual"), - X27(PeriodicityEnum.X, "pluriannual"), - X28(PeriodicityEnum.X, "pluriannual"), - X29(PeriodicityEnum.X, "pluriannual"), - X30(PeriodicityEnum.X, "pluriannual"), - X31(PeriodicityEnum.X, "pluriannual"), - X32(PeriodicityEnum.X, "pluriannual"), - X33(PeriodicityEnum.X, "pluriannual"), - X34(PeriodicityEnum.X, "pluriannual"), - X35(PeriodicityEnum.X, "pluriannual"), - X36(PeriodicityEnum.X, "pluriannual"), - X37(PeriodicityEnum.X, "pluriannual"), - X38(PeriodicityEnum.X, "pluriannual"), - X39(PeriodicityEnum.X, "pluriannual"), - X40(PeriodicityEnum.X, "pluriannual"), - X41(PeriodicityEnum.X, "pluriannual"), - X42(PeriodicityEnum.X, "pluriannual"), - X43(PeriodicityEnum.X, "pluriannual"), - X44(PeriodicityEnum.X, "pluriannual"), - X45(PeriodicityEnum.X, "pluriannual"), - X46(PeriodicityEnum.X, "pluriannual"), - X47(PeriodicityEnum.X, "pluriannual"), - X48(PeriodicityEnum.X, "pluriannual"), - X49(PeriodicityEnum.X, "pluriannual"), - X50(PeriodicityEnum.X, "pluriannual"), - X51(PeriodicityEnum.X, "pluriannual"), - X52(PeriodicityEnum.X, "pluriannual"), - X53(PeriodicityEnum.X, "pluriannual"), - X54(PeriodicityEnum.X, "pluriannual"), - X55(PeriodicityEnum.X, "pluriannual"), - X56(PeriodicityEnum.X, "pluriannual"), - X57(PeriodicityEnum.X, "pluriannual"), - X58(PeriodicityEnum.X, "pluriannual"), - X59(PeriodicityEnum.X, "pluriannual"), - X60(PeriodicityEnum.X, "pluriannual"), - X61(PeriodicityEnum.X, "pluriannual"), - X62(PeriodicityEnum.X, "pluriannual"), - X63(PeriodicityEnum.X, "pluriannual"), - X64(PeriodicityEnum.X, "pluriannual"), - X65(PeriodicityEnum.X, "pluriannual"), - X66(PeriodicityEnum.X, "pluriannual"), - X67(PeriodicityEnum.X, "pluriannual"), - X68(PeriodicityEnum.X, "pluriannual"), - X69(PeriodicityEnum.X, "pluriannual"), - X70(PeriodicityEnum.X, "pluriannual"), - X71(PeriodicityEnum.X, "pluriannual"), - X72(PeriodicityEnum.X, "pluriannual"), - X73(PeriodicityEnum.X, "pluriannual"), - X74(PeriodicityEnum.X, "pluriannual"), - X75(PeriodicityEnum.X, "pluriannual"), - X76(PeriodicityEnum.X, "pluriannual"), - X77(PeriodicityEnum.X, "pluriannual"), - X78(PeriodicityEnum.X, "pluriannual"), - X79(PeriodicityEnum.X, "pluriannual"), - X80(PeriodicityEnum.X, "pluriannual"), - X81(PeriodicityEnum.X, "pluriannual"), - X82(PeriodicityEnum.X, "pluriannual"), - X83(PeriodicityEnum.X, "pluriannual"), - X84(PeriodicityEnum.X, "pluriannual"), - X85(PeriodicityEnum.X, "pluriannual"), - X86(PeriodicityEnum.X, "pluriannual"), - X87(PeriodicityEnum.X, "pluriannual"), - X88(PeriodicityEnum.X, "pluriannual"), - X89(PeriodicityEnum.X, "pluriannual"), - X90(PeriodicityEnum.X, "pluriannual"), - X91(PeriodicityEnum.X, "pluriannual"), - X92(PeriodicityEnum.X, "pluriannual"), - X93(PeriodicityEnum.X, "pluriannual"), - X94(PeriodicityEnum.X, "pluriannual"), - X95(PeriodicityEnum.X, "pluriannual"), - X96(PeriodicityEnum.X, "pluriannual"), - X97(PeriodicityEnum.X, "pluriannual"), - X98(PeriodicityEnum.X, "pluriannual"), - X99(PeriodicityEnum.X, "pluriannual"), - S01(PeriodicityEnum.S, "1st semester"), - S02(PeriodicityEnum.S, "2nd semester"), - T01(PeriodicityEnum.T, "1st trimester"), - T02(PeriodicityEnum.T, "2nd trimester"), - T03(PeriodicityEnum.T, "3rd trimester"), - T04(PeriodicityEnum.T, "4th trimester"), - M01(PeriodicityEnum.M, "january"), - M02(PeriodicityEnum.M, "february"), - M03(PeriodicityEnum.M, "march"), - M04(PeriodicityEnum.M, "april"), - M05(PeriodicityEnum.M, "may"), - M06(PeriodicityEnum.M, "june"), - M07(PeriodicityEnum.M, "july"), - M08(PeriodicityEnum.M, "august"), - M09(PeriodicityEnum.M, "september"), - M10(PeriodicityEnum.M, "october"), - M11(PeriodicityEnum.M, "november"), - M12(PeriodicityEnum.M, "december"), - B01(PeriodicityEnum.B, "1st bimester"), - B02(PeriodicityEnum.B, "2nd bimester"), - B03(PeriodicityEnum.B, "3rd bimester"), - B04(PeriodicityEnum.B, "4th bimester"), - B05(PeriodicityEnum.B, "5th bimester"), - B06(PeriodicityEnum.B, "6th bimester"), - - ; - - PeriodEnum(PeriodicityEnum period, String value) { - this.value = value; - this.period = period; - } - - final PeriodicityEnum period; - - final String value; - -} \ No newline at end of file diff --git a/src/main/java/fr/insee/protools/backend/service/platine/pilotage/metadata/PeriodicityEnum.java b/src/main/java/fr/insee/protools/backend/service/platine/pilotage/metadata/PeriodicityEnum.java deleted file mode 100644 index bd66eddb..00000000 --- a/src/main/java/fr/insee/protools/backend/service/platine/pilotage/metadata/PeriodicityEnum.java +++ /dev/null @@ -1,26 +0,0 @@ -package fr.insee.protools.backend.service.platine.pilotage.metadata; - -import lombok.Getter; - -@Getter -public enum PeriodicityEnum { - - X("pluriannual"), A("annual"), S("semi-annual"), T("trimestrial"), B("bimonthly"), - M("monthly"); - - PeriodicityEnum(String value) { - this.value = value; - } - - final String value; - - public static PeriodicityEnum fromValue(String v) { - for (PeriodicityEnum c : PeriodicityEnum.values()) { - if (c.value.equals(v)) { - return c; - } - } - throw new IllegalArgumentException(v); - } - -} \ No newline at end of file diff --git a/src/main/java/fr/insee/protools/backend/service/platine/pilotage/metadata/SourceDto.java b/src/main/java/fr/insee/protools/backend/service/platine/pilotage/metadata/SourceDto.java deleted file mode 100644 index 74dde6e4..00000000 --- a/src/main/java/fr/insee/protools/backend/service/platine/pilotage/metadata/SourceDto.java +++ /dev/null @@ -1,15 +0,0 @@ -package fr.insee.protools.backend.service.platine.pilotage.metadata; -import lombok.Builder; -import lombok.Data; - -@Data -@Builder -public class SourceDto { - - private String id; - private String longWording; - private String shortWording; - private PeriodicityEnum periodicity; - private boolean mandatoryMySurveys; - -} \ No newline at end of file diff --git a/src/main/java/fr/insee/protools/backend/service/platine/pilotage/metadata/SupportDto.java b/src/main/java/fr/insee/protools/backend/service/platine/pilotage/metadata/SupportDto.java deleted file mode 100644 index 4c577b7d..00000000 --- a/src/main/java/fr/insee/protools/backend/service/platine/pilotage/metadata/SupportDto.java +++ /dev/null @@ -1,20 +0,0 @@ -package fr.insee.protools.backend.service.platine.pilotage.metadata; - -import lombok.Builder; -import lombok.Data; - -@Data -@Builder -public class SupportDto { - - private String id; - private String label; - private String phoneNumber; - private String mail; - private String countryName; - private String streetNumber; - private String streetName; - private String city; - private String zipCode; - -} \ No newline at end of file diff --git a/src/main/java/fr/insee/protools/backend/service/platine/pilotage/metadata/SurveyDto.java b/src/main/java/fr/insee/protools/backend/service/platine/pilotage/metadata/SurveyDto.java deleted file mode 100644 index 04392d17..00000000 --- a/src/main/java/fr/insee/protools/backend/service/platine/pilotage/metadata/SurveyDto.java +++ /dev/null @@ -1,26 +0,0 @@ -package fr.insee.protools.backend.service.platine.pilotage.metadata; - -import lombok.Builder; -import lombok.Data; -import lombok.NonNull; - -@Data -@Builder -public class SurveyDto { - - private String id; - @NonNull - private String sourceId; - private Integer year; - private Integer sampleSize; - private String longWording; - private String shortWording; - private String shortObjectives; - private String longObjectives; - private String visaNumber; - private String cnisUrl; - private String diffusionUrl; - private String noticeUrl; - private String specimenUrl; - private String communication; -} \ No newline at end of file diff --git a/src/main/java/fr/insee/protools/backend/service/platine/questionnaire/PlatineQuestionnaireService.java b/src/main/java/fr/insee/protools/backend/service/platine/questionnaire/PlatineQuestionnaireService.java deleted file mode 100644 index 688cd48d..00000000 --- a/src/main/java/fr/insee/protools/backend/service/platine/questionnaire/PlatineQuestionnaireService.java +++ /dev/null @@ -1,30 +0,0 @@ -package fr.insee.protools.backend.service.platine.questionnaire; - -import fr.insee.protools.backend.httpclients.restclient.RestClientHelper; -import fr.insee.protools.backend.service.common.platine_sabiane.QuestionnairePlatineSabianeService; -import fr.insee.protools.backend.httpclients.webclient.WebClientHelper; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.slf4j.Logger; -import org.springframework.stereotype.Service; -import org.springframework.web.client.RestClient; - -import static fr.insee.protools.backend.httpclients.configuration.ApiConfigProperties.KNOWN_API.KNOWN_API_PLATINE_QUESTIONNAIRE; - -@Service -@Slf4j -@RequiredArgsConstructor -public class PlatineQuestionnaireService implements QuestionnairePlatineSabianeService { - - private final RestClientHelper restClientHelper; - - @Override - public RestClient restClient() { - return restClientHelper.getRestClient(KNOWN_API_PLATINE_QUESTIONNAIRE); - } - - @Override - public Logger getLogger() { - return log; - } -} diff --git a/src/main/java/fr/insee/protools/backend/service/platine/service/PlatinePilotageService.java b/src/main/java/fr/insee/protools/backend/service/platine/service/PlatinePilotageService.java new file mode 100644 index 00000000..7ac35eef --- /dev/null +++ b/src/main/java/fr/insee/protools/backend/service/platine/service/PlatinePilotageService.java @@ -0,0 +1,99 @@ +package fr.insee.protools.backend.service.platine.service; + +import com.fasterxml.jackson.databind.JsonNode; +import fr.insee.protools.backend.dto.platine.pilotage.PlatinePilotageCommunicationEventDto; +import fr.insee.protools.backend.restclient.RestClientHelper; +import fr.insee.protools.backend.restclient.exception.runtime.HttpClient4xxBPMNError; +import fr.insee.protools.backend.restclient.pagination.PageResponse; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.slf4j.event.Level; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.core.ParameterizedTypeReference; +import org.springframework.http.HttpStatus; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Optional; + +import static fr.insee.protools.backend.restclient.RestClientHelper.logJson; +import static fr.insee.protools.backend.restclient.configuration.ApiConfigProperties.KNOWN_API.KNOWN_API_PLATINE_PILOTAGE; + +@Service +@Slf4j +@RequiredArgsConstructor +public class PlatinePilotageService { + + private final RestClientHelper restClientHelper; + + @Value("${fr.insee.protools.api.platine-pilotage.interrogation.page.size:5000}") + private int pageSizeGetInterro; + + public void postCommunicationEvent(List platinePilotageCommunicationEventList) { + log.trace("postCommunicationEvent: "); + logJson("postCommunicationEvent ",platinePilotageCommunicationEventList,log, Level.TRACE); + + var response = restClientHelper.getRestClient(KNOWN_API_PLATINE_PILOTAGE) + .post() + .uri("/interrogations/communication-events") + .body(platinePilotageCommunicationEventList) + .retrieve() + .body(String.class); + log.trace("postCommunicationEvent: response={} ",response); + } + + public void postContext(String campaignId, JsonNode contextRootNode) { + log.trace("postContext: campaignId={}",campaignId); + var response = restClientHelper.getRestClient(KNOWN_API_PLATINE_PILOTAGE) + .post() + .uri("/context") + .body(contextRootNode) + .retrieve() + .body(String.class); + log.trace("postContext: campaignId={} - response={} ",campaignId,response); + } + + public void postInterrogations(String campaignId, List interrogations) { + log.trace("postInterrogations: campaignId={}",campaignId); + logJson("putQuestionings ",interrogations,log,Level.TRACE); + var response = restClientHelper.getRestClient(KNOWN_API_PLATINE_PILOTAGE) + .put() + .uri("/interrogations") + .body(interrogations) + .retrieve() + .body(String.class); + log.trace("postInterrogations: campaignId={} - response={} ",campaignId,response); + } + + + public PageResponse getInterrogationToFollowUpPaginated(Long partitionId, long page, Optional isToFollowUp) { + log.debug("partitionId={} - page={} - pageSizeGetInterro={} - isToFollowUp={}",partitionId,page,pageSizeGetInterro,isToFollowUp); + ParameterizedTypeReference> typeReference = new ParameterizedTypeReference<>() { }; + try { + PageResponse response = restClientHelper.getRestClient(KNOWN_API_PLATINE_PILOTAGE) + .get() + .uri(uriBuilder -> uriBuilder + .path("interrogations") + .queryParam("page", page) + .queryParam("size", pageSizeGetInterro) + .queryParam("partition_id", partitionId) + .queryParamIfPresent("follow-up", isToFollowUp) + .build(partitionId)) + .retrieve() + .body(typeReference); + log.trace("partitionId={} - page={} - pageSizeGetInterro={} - response={} ", partitionId,page,pageSizeGetInterro, response.getContent().size()); + return response; + } + catch (HttpClient4xxBPMNError e){ + if(e.getHttpStatusCodeError().equals(HttpStatus.NOT_FOUND)){ + String msg= + "Error 404/NOT_FOUND during Platine Pilotage getInterrogationToFollowUpPaginated with partitionId="+partitionId + + " - msg="+e.getMessage(); + log.error(msg); + throw new HttpClient4xxBPMNError(msg,e.getHttpStatusCodeError()); + } + //Currently no remediation so just rethrow + throw e; + } + } +} diff --git a/src/main/java/fr/insee/protools/backend/service/platine/service/PlatineQuestionnaireService.java b/src/main/java/fr/insee/protools/backend/service/platine/service/PlatineQuestionnaireService.java new file mode 100644 index 00000000..b9804eea --- /dev/null +++ b/src/main/java/fr/insee/protools/backend/service/platine/service/PlatineQuestionnaireService.java @@ -0,0 +1,45 @@ +package fr.insee.protools.backend.service.platine.service; + +import com.fasterxml.jackson.databind.JsonNode; +import fr.insee.protools.backend.restclient.RestClientHelper; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.slf4j.event.Level; +import org.springframework.stereotype.Service; + +import java.util.List; + +import static fr.insee.protools.backend.restclient.RestClientHelper.logJson; +import static fr.insee.protools.backend.restclient.configuration.ApiConfigProperties.KNOWN_API.KNOWN_API_PLATINE_QUESTIONNAIRE; + +@Service +@Slf4j +@RequiredArgsConstructor +public class PlatineQuestionnaireService { + + private final RestClientHelper restClientHelper; + + public void postContext(String campaignId, JsonNode contextRootNode) { + log.trace("postContext: campaignId={}",campaignId); + var response = restClientHelper.getRestClient(KNOWN_API_PLATINE_QUESTIONNAIRE) + .post() + .uri("/context") + .body(contextRootNode) + .retrieve() + .body(String.class); + log.trace("postContext: campaignId={} - response={} ",campaignId,response); + } + + public void postInterrogations(String campaignId, List interrogations) { + log.trace("postInterrogations: campaignId={}",campaignId); + logJson("putQuestionings ",interrogations,log,Level.TRACE); + var response = restClientHelper.getRestClient(KNOWN_API_PLATINE_QUESTIONNAIRE) + .put() + .uri("/interrogations") + .body(interrogations) + .retrieve() + .body(String.class); + log.trace("postInterrogations: campaignId={} - response={} ",campaignId,response); + } + +} diff --git a/src/main/java/fr/insee/protools/backend/service/platine/utils/PlatineHelper.java b/src/main/java/fr/insee/protools/backend/service/platine/utils/PlatineHelper.java deleted file mode 100644 index f5b69548..00000000 --- a/src/main/java/fr/insee/protools/backend/service/platine/utils/PlatineHelper.java +++ /dev/null @@ -1,43 +0,0 @@ -package fr.insee.protools.backend.service.platine.utils; - -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; -import fr.insee.protools.backend.service.exception.IncorrectSUBPMNError; -import fr.insee.protools.backend.dto.rem.REMSurveyUnitDto; - -import static com.fasterxml.jackson.databind.DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES; - -public class PlatineHelper { - - private static final ObjectMapper objectMapper = new ObjectMapper().configure(FAIL_ON_UNKNOWN_PROPERTIES,false); - - //In platine pilotage, partition ID must start by the campaignId. We decide to follow it with the configured REM partitionID - public static String computePilotagePartitionID(String campaignId, Long partitionId){ - if(campaignId==null||partitionId==null){ - return null; - } - return campaignId+partitionId; - } - - public static REMSurveyUnitDto parseRemSUNode(ObjectMapper objectMapper, JsonNode remSUNode){ - REMSurveyUnitDto remSurveyUnitDto; - try { - remSurveyUnitDto = objectMapper.treeToValue(remSUNode, REMSurveyUnitDto.class); - } catch (JsonProcessingException e) { - throw new IncorrectSUBPMNError("Error while parsing the json retrieved from REM " ,remSUNode, e); - } - - if(remSurveyUnitDto.getRepositoryId()==null){ - throw new IncorrectSUBPMNError("Error json retrieved from REM has no repositoryId " , remSUNode); - } - return remSurveyUnitDto; - } - - - public static REMSurveyUnitDto parseRemSUNode(JsonNode remSUNode){ - return parseRemSUNode(objectMapper,remSUNode); - } - - private PlatineHelper(){} -} diff --git a/src/main/java/fr/insee/protools/backend/service/questionnaire_model/QuestionnaireModelFromStaticWebsiteServiceImpl.java b/src/main/java/fr/insee/protools/backend/service/questionnaire_model/QuestionnaireModelFromStaticWebsiteServiceImpl.java deleted file mode 100644 index 86188494..00000000 --- a/src/main/java/fr/insee/protools/backend/service/questionnaire_model/QuestionnaireModelFromStaticWebsiteServiceImpl.java +++ /dev/null @@ -1,47 +0,0 @@ -package fr.insee.protools.backend.service.questionnaire_model; - -import fr.insee.protools.backend.service.context.exception.BadContextIncorrectBPMNError; -import fr.insee.protools.backend.httpclients.webclient.WebClientHelper; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.stereotype.Service; - -import java.net.URI; -import java.net.URISyntaxException; - -/** - * This service retrieves the nomenclatures from a static website based on a property uri - */ -@Service -@Slf4j -@RequiredArgsConstructor -public class QuestionnaireModelFromStaticWebsiteServiceImpl implements QuestionnaireModelService { - - //TODO : expose mandatory configuration? - private final WebClientHelper webClientHelper; - - @Value("${fr.insee.protools.questionnaire.model.uri}") - private String questionnaireModelUri; - - - @Override - public String getQuestionnaireModel(String questionnaireModelId, String folderPath){ - log.info("Get Questionnaire Model Value for questionnaireModelId={}", questionnaireModelId); - String uri; - String fullPath=questionnaireModelUri+"/" +folderPath+ "/"+questionnaireModelId + ".json"; - try { - uri = new URI(fullPath).normalize().toString(); - } catch (URISyntaxException e) { - throw new BadContextIncorrectBPMNError(String.format("questionnaireModelId=[%s] - folderPath=[%s] : fullPath=[%s] cannot be parsed: Error=[%s]" - ,questionnaireModelId,folderPath,fullPath, e.getMessage())); - } - return - webClientHelper.getWebClientForFile() - .get() - .uri(uri) - .retrieve() - .bodyToMono(String.class) - .block(); - } -} diff --git a/src/main/java/fr/insee/protools/backend/service/questionnaire_model/QuestionnaireModelService.java b/src/main/java/fr/insee/protools/backend/service/questionnaire_model/QuestionnaireModelService.java deleted file mode 100644 index 88d402e5..00000000 --- a/src/main/java/fr/insee/protools/backend/service/questionnaire_model/QuestionnaireModelService.java +++ /dev/null @@ -1,14 +0,0 @@ -package fr.insee.protools.backend.service.questionnaire_model; - -public interface QuestionnaireModelService { - - /** - * Returns the questionnaire model associated with stored at - * @param questionnaireModelId - * @param folderPath - * @return the questionnaire model content retrieved from external source - */ - String getQuestionnaireModel(String questionnaireModelId, String folderPath); - - -} diff --git a/src/main/java/fr/insee/protools/backend/service/rem/RemDtoUtils.java b/src/main/java/fr/insee/protools/backend/service/rem/RemDtoUtils.java deleted file mode 100644 index db60c1c2..00000000 --- a/src/main/java/fr/insee/protools/backend/service/rem/RemDtoUtils.java +++ /dev/null @@ -1,113 +0,0 @@ -package fr.insee.protools.backend.service.rem; - -import com.fasterxml.jackson.databind.JsonNode; -import fr.insee.protools.backend.service.exception.IncorrectSUBPMNError; -import fr.insee.protools.backend.dto.rem.PersonDto; -import fr.insee.protools.backend.dto.rem.REMSurveyUnitDto; -import org.apache.commons.lang3.tuple.Pair; - -import java.util.ArrayList; -import java.util.List; -import java.util.Optional; - -public class RemDtoUtils { - private RemDtoUtils(){} - - - private static final String REM_ADDITIONALINFOS = "additionalInformations"; - private static final String REM_ADDITIONALINFOS_KEY = "key"; - private static final String REM_ADDITIONALINFOS_VALUE = "value"; - - public static final String REM_ADDITIONALINFOS_POLE_GESTION_OPALE = "pole_gestion_opale"; - - /** - * Search for the right contact according to the SU Type : - * For Logement : Find the first person flagged as Main - * For Individu : Find the first person flagged as Surveyed - * @param remSUNode : Used only to add it to exception in case of error - * @param remSurveyUnitDto - * @param isLogement true if logement (false if individu) - * @return the contact to be used - */ - public static PersonDto findContact(JsonNode remSUNode, REMSurveyUnitDto remSurveyUnitDto, boolean isLogement) { - //Search for right contact - PersonDto contact; - //SU Logement - if (isLogement) { - //We use the "main" person (actually it is the Declarant) - contact = remSurveyUnitDto.getPersons().stream() - .filter(personDto -> (Boolean.TRUE.equals(personDto.getMain()))) - .findFirst().orElseThrow(() -> new IncorrectSUBPMNError("No main person found in SU [id=" + remSurveyUnitDto.getRepositoryId() + "]", remSUNode)); - } - //SU INDIVIDU - else { - contact = remSurveyUnitDto.getPersons().stream() - .filter(personDto -> (Boolean.TRUE.equals(personDto.getSurveyed()))) - .findFirst().orElseThrow(() -> new IncorrectSUBPMNError("No surveyed person found in SU [id="+ remSurveyUnitDto.getRepositoryId()+"]", remSUNode)); - } - return contact; - } - - - /** - * Search for the right Main contact according to the SU Type : - * For Logement : Find the first person flagged as Main + The Co-declarant - * For Individu : Find the first person flagged as Surveyed + either the declarant or the co-declarant - * - * @param remSUNode : Used only to add it to exception in case of error - * @param remSurveyUnitDto - * @param isLogement true if logement (false if individu) - * @return A pair with the contacts; Secondary one is optional - */ - public static Pair> findContactAndSecondary(JsonNode remSUNode, REMSurveyUnitDto remSurveyUnitDto, boolean isLogement) { - //Search for right contact - PersonDto mainContact = findContact(remSUNode, remSurveyUnitDto, isLogement); - PersonDto secondaryContact; - - List remainingPersons = new ArrayList<>(remSurveyUnitDto.getPersons()); - remainingPersons.remove(mainContact); - - if(remainingPersons.isEmpty()) - return Pair.of(mainContact,Optional.ofNullable(null)); - - - //SU Logement - if (isLogement) { - //Secondary is the co-declarant - secondaryContact = remSurveyUnitDto.getPersons().stream() - .filter(personDto -> (Boolean.TRUE.equals(personDto.getCoDeclarant()))) - .findFirst().orElse(null); - } - //SU INDIVIDU - else { - //If main contact is declarant ==> secondary is the co-declarant - if(Boolean.TRUE.equals(mainContact.getMain())){ - secondaryContact = remSurveyUnitDto.getPersons().stream() - .filter(personDto -> (Boolean.TRUE.equals(personDto.getCoDeclarant()))) - .findFirst().orElse(null); - } - //else ==> secondary is the declarant (main==true) - else{ - secondaryContact = remSurveyUnitDto.getPersons().stream() - .filter(personDto -> (Boolean.TRUE.equals(personDto.getMain()))) - .findFirst().orElse(null); - } - } - return Pair.of(mainContact,Optional.ofNullable(secondaryContact)); - } - - - public static Optional searchAdditionalInformation(String searchedKey,JsonNode remSUNode){ - JsonNode additionalInfoNode = remSUNode.path(REM_ADDITIONALINFOS); - if (additionalInfoNode!=null && additionalInfoNode.isArray()) { - for (JsonNode jsonNode : additionalInfoNode) { - String key = jsonNode.path(REM_ADDITIONALINFOS_KEY).asText(); - if(key.equalsIgnoreCase(searchedKey)){ - String value=jsonNode.path(REM_ADDITIONALINFOS_VALUE).asText(); - return Optional.of(value); - } - } - } - return Optional.empty(); - } -} diff --git a/src/main/java/fr/insee/protools/backend/service/rem/RemService.java b/src/main/java/fr/insee/protools/backend/service/rem/RemService.java index 0f34e068..67ed7893 100644 --- a/src/main/java/fr/insee/protools/backend/service/rem/RemService.java +++ b/src/main/java/fr/insee/protools/backend/service/rem/RemService.java @@ -1,13 +1,10 @@ package fr.insee.protools.backend.service.rem; import com.fasterxml.jackson.databind.JsonNode; -import fr.insee.protools.backend.dto.era.CensusJsonDto; -import fr.insee.protools.backend.dto.rem.REMSurveyUnitDto; -import fr.insee.protools.backend.dto.rem.SuIdMappingJson; -import fr.insee.protools.backend.httpclients.restclient.RestClientHelper; -import fr.insee.protools.backend.httpclients.webclient.WebClientHelper; -import fr.insee.protools.backend.httpclients.exception.runtime.HttpClient4xxBPMNError; -import fr.insee.protools.backend.httpclients.pagination.PageResponse; +import fr.insee.protools.backend.restclient.RestClientHelper; +import fr.insee.protools.backend.restclient.exception.runtime.HttpClient4xxBPMNError; +import fr.insee.protools.backend.restclient.pagination.PageResponse; +import fr.insee.protools.backend.dto.rem_tmp.InterrogationAccountDto; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; @@ -17,9 +14,9 @@ import java.util.List; import java.util.Map; -import java.util.Optional; +import java.util.UUID; -import static fr.insee.protools.backend.httpclients.configuration.ApiConfigProperties.KNOWN_API.KNOWN_API_REM; +import static fr.insee.protools.backend.restclient.configuration.ApiConfigProperties.KNOWN_API.KNOWN_API_REM; @Service @Slf4j @@ -30,97 +27,8 @@ public class RemService { @Value("${fr.insee.protools.api.rem.interrogation.page.size:5000}") private int pageSizeGetInterro; - public Long[] getSampleSuIds(Long partitionId) { - log.debug("getSampleSuIds - partitionId={} ",partitionId); - try { - Long[] response = restClientHelper.getRestClient(KNOWN_API_REM) - .get() - .uri(uriBuilder -> uriBuilder - .path("/survey-units/partitions/{partitionId}/ids") - .build(partitionId)) - .retrieve() - .body(Long[].class); - log.trace("partitionIds={} - response={} ", partitionId, response); - return response; - } - catch (HttpClient4xxBPMNError e){ - if(e.getHttpStatusCodeError().equals(HttpStatus.NOT_FOUND)){ - String msg= - "Error 404/NOT_FOUND during get sample on REM with partitionId="+partitionId - + " - msg="+e.getMessage(); - log.error(msg); - throw new HttpClient4xxBPMNError(msg,e.getHttpStatusCodeError()); - } - //Currently no remediation so just rethrow - throw e; - } - } - - public REMSurveyUnitDto getSurveyUnit(Long surveyUnitId ) { - log.debug("getSurveyUnit - surveyUnitId ={}",surveyUnitId ); - try { - var response = restClientHelper.getRestClient(KNOWN_API_REM) - .get() - .uri(uriBuilder -> uriBuilder - .path("/survey-units/{surveyUnitId}") - .queryParam("withExternals", true) - .build(surveyUnitId)) - .retrieve() - .body(REMSurveyUnitDto.class); - log.trace("surveyUnitId={} - response={} ", surveyUnitId, response); - return response; - } - catch (HttpClient4xxBPMNError e){ - if(e.getHttpStatusCodeError().equals(HttpStatus.NOT_FOUND)){ - String msg= - "Error 404/NOT_FOUND during get SU on REM with surveyUnitId="+surveyUnitId - + " - msg="+e.getMessage(); - log.error(msg); - throw new HttpClient4xxBPMNError(msg,e.getHttpStatusCodeError()); - } - //Currently no remediation so just rethrow - throw e; - } - } - - /** - * @param partitionId - * @param values - * @return return null if values is null ; else return the result of the api call - */ - public SuIdMappingJson writeERASUList(long partitionId, List values) { - log.debug("writeERASUList - partitionId={} - values.size={}", partitionId, values == null ? 0 : values.size()); - if (values == null) { - log.debug("writeERASUList - partitionId={} - values==null ==> Nothing to do"); - return null; - } - try { - var response = restClientHelper.getRestClient(KNOWN_API_REM) - .post() - .uri(uriBuilder -> uriBuilder - .path("/survey-units/households/partitions/{partitionId}/census-upload") - .build(partitionId)) - .body(values) - .retrieve() - .body(SuIdMappingJson.class); - log.trace("writeERASUList - partitionId={} - response={} ", partitionId, response); - return response; - } catch (HttpClient4xxBPMNError e) { - if (e.getHttpStatusCodeError().equals(HttpStatus.NOT_FOUND)) { - String msg = - "Error 404/NOT_FOUND during REM post census-upload partitionId=" + partitionId - + " (check that the partition exists in REM) - msg=" + e.getMessage(); - log.error(msg); - throw new HttpClient4xxBPMNError(msg, e.getHttpStatusCodeError()); - } - //Currently no remediation so just rethrow - throw e; - } - } - - public PageResponse getPartitionAllInterroPaginated(String partitionId, long page) { - log.debug("partitionId={} - page={} - pageSizeGetInterro={} - hasAccount={}",partitionId,page,pageSizeGetInterro,hasAccount); + log.debug("partitionId={} - page={} - pageSizeGetInterro={} }",partitionId,page,pageSizeGetInterro); ParameterizedTypeReference> typeReference = new ParameterizedTypeReference<>() { }; try { PageResponse response = restClientHelper.getRestClient(KNOWN_API_REM) @@ -130,7 +38,7 @@ public PageResponse getPartitionAllInterroPaginated(String partitionId .queryParam("page", page) .queryParam("size", pageSizeGetInterro) .queryParam("partition_id", partitionId) - .build(partitionId)) + .build()) .retrieve() .body(typeReference); log.trace("partitionId={} - page={} - pageSizeGetInterro={} - response={} ", partitionId,page,pageSizeGetInterro, response.getContent().size()); @@ -150,24 +58,33 @@ public PageResponse getPartitionAllInterroPaginated(String partitionId } //V2 + public List getInterrogationIdsWithoutAccountForPartition(String partitionId) { + log.debug("getSampleSuIds - partitionId={} ",partitionId); + ParameterizedTypeReference> typeReference = new ParameterizedTypeReference>() {}; - public Long[] getInterrogationIdsWithoutAccountForLot(Long lotId) { - log.debug("getSampleSuIds - lotId={} ",lotId); try { - Long[] response = restClientHelper.getRestClient(KNOWN_API_REM) + List response = restClientHelper.getRestClient(KNOWN_API_REM) .get() .uri(uriBuilder -> uriBuilder - .path("/interrogations/lots/{lotId}/ids") - .build(lotId)) + .path("/interrogations/ids") + .queryParam("partition_id", partitionId) + .queryParam("hasAccount",false) + .build()) .retrieve() - .body(Long[].class); - log.trace("partitionIds={} - response={} ", lotId, response); - return response; + .body(typeReference); + + List interrogationIdsWithoutAccount = + response.stream() + .map(InterrogationAccountDto::getInterrogationId) + .map(UUID::toString).toList(); + + log.trace("partitionId={} - interrogationIdsWithoutAccount={} ", partitionId, interrogationIdsWithoutAccount); + return interrogationIdsWithoutAccount; } catch (HttpClient4xxBPMNError e){ if(e.getHttpStatusCodeError().equals(HttpStatus.NOT_FOUND)){ String msg= - "Error 404/NOT_FOUND during get lot interrogations ids on REM with lot="+lotId + "Error 404/NOT_FOUND during get lot interrogations ids on REM with partitionId="+partitionId + " - msg="+e.getMessage(); log.error(msg); throw new HttpClient4xxBPMNError(msg,e.getHttpStatusCodeError()); @@ -177,14 +94,55 @@ public Long[] getInterrogationIdsWithoutAccountForLot(Long lotId) { } } - public void patchInterrogationsSetAccounts(Map userByInterroId) { + public void patchInterrogationsSetAccounts(Map userByInterroId) { log.debug("patchInterrogationsSetAccounts - userByInterroId.size={}", userByInterroId.size()); + + List remDto = userByInterroId.entrySet() + .stream() + .map(entry -> InterrogationAccountDto.builder() + .interrogationId(UUID.fromString(entry.getKey())) + .account(entry.getValue()) + .build()) + .toList(); + var response = restClientHelper.getRestClient(KNOWN_API_REM) .post() - .uri("/interrogations/updateAccounts") - .body(userByInterroId) + .uri("/interrogations/account") + .body(remDto) .retrieve() - .body(SuIdMappingJson.class); + .body(String.class); log.trace("patchInterrogationsSetAccounts - response={} ", response); } + + public void putContactsPlatine(List contactPlatineList) { + if (contactPlatineList == null || contactPlatineList.isEmpty()) { + log.debug("putContactsPlatine ==> Nothing to do"); + return; + } + + log.debug("putContactsPlatine - contactPlatineList.size={}", contactPlatineList); + var response = restClientHelper.getRestClient(KNOWN_API_REM) + .put() + .uri("contacts-platine") + .body(contactPlatineList) + .retrieve() + .body(String.class); + log.trace("putContactsPlatine - response={} ", response); + } + + public void postRemiseEnCollecte(List interroRemiseEnCollecteList) { + if (interroRemiseEnCollecteList == null || interroRemiseEnCollecteList.isEmpty()) { + log.debug("postRemiseEnCollecte ==> Nothing to do"); + return; + } + + log.debug("postRemiseEnCollecte - interroRemiseEnCollecteList.size={}", interroRemiseEnCollecteList); + var response = restClientHelper.getRestClient(KNOWN_API_REM) + .put() + .uri("remise-en-collecte") + .body(interroRemiseEnCollecteList) + .retrieve() + .body(String.class); + log.trace("postRemiseEnCollecte - response={} ", response); + } } diff --git a/src/main/java/fr/insee/protools/backend/service/rem/delegate/ExtractContactIdentifierFromREMSUTask.java b/src/main/java/fr/insee/protools/backend/service/rem/delegate/ExtractContactIdentifierFromREMSUTask.java deleted file mode 100644 index 7e67a16a..00000000 --- a/src/main/java/fr/insee/protools/backend/service/rem/delegate/ExtractContactIdentifierFromREMSUTask.java +++ /dev/null @@ -1,47 +0,0 @@ -package fr.insee.protools.backend.service.rem.delegate; - -import com.fasterxml.jackson.databind.JsonNode; -import fr.insee.protools.backend.service.exception.IncorrectSUBPMNError; -import fr.insee.protools.backend.service.rem.RemDtoUtils; -import fr.insee.protools.backend.service.utils.FlowableVariableUtils; -import lombok.extern.slf4j.Slf4j; -import org.flowable.engine.delegate.DelegateExecution; -import org.flowable.engine.delegate.JavaDelegate; -import org.springframework.stereotype.Component; - -import java.util.Optional; - -import static fr.insee.protools.backend.service.FlowableVariableNameConstants.VARNAME_DIRECTORYACCESS_ID_CONTACT; -import static fr.insee.protools.backend.service.FlowableVariableNameConstants.VARNAME_REM_INTERROGATION; - -/** - * This delegate will search for the identifiantCompte (internet identifier) in a REM SU - * additional information. - */ -@Component -@Slf4j -public class ExtractContactIdentifierFromREMSUTask implements JavaDelegate { - - private static final String REM_ADDITIONALINFOS_KEY_IDENTIFIANTCOMPTE = "identifiantCompte"; - private static final String REM_REPOSITORY_ID = "repositoryId"; - private static final String REM_EXTERNAL_ID = "externalId"; - - @Override - public void execute(DelegateExecution execution) { - //No need protools context ==> no checkContextOrThrow - log.debug("ProcessInstanceId={} - begin",execution.getProcessInstanceId()); - JsonNode remSUNode = FlowableVariableUtils.getVariableOrThrow(execution, VARNAME_REM_INTERROGATION, JsonNode.class); - - Optional optionalIdentifiantCompte = RemDtoUtils.searchAdditionalInformation(REM_ADDITIONALINFOS_KEY_IDENTIFIANTCOMPTE,remSUNode); - String idInternaute = optionalIdentifiantCompte.orElseThrow(() -> { - String repositoryId = remSUNode.path(REM_REPOSITORY_ID).asText(); - String externalId = remSUNode.path(REM_EXTERNAL_ID).asText(); - String msg = String.format("No identifiantCompte found for REM repositoryId=%s - externalId=%s",repositoryId,externalId); - log.error(msg); - throw new IncorrectSUBPMNError(msg); - }); - execution.setVariableLocal(VARNAME_DIRECTORYACCESS_ID_CONTACT,idInternaute); - - log.debug("ProcessInstanceId={} - idInternaute="+idInternaute+" end", execution.getProcessInstanceId()); - } -} diff --git a/src/main/java/fr/insee/protools/backend/service/rem/delegate/v2/RemGetPartitionListOfInterroPaginatedTask.java b/src/main/java/fr/insee/protools/backend/service/rem/delegate/RemGetPartitionListOfInterroPaginatedTask.java similarity index 82% rename from src/main/java/fr/insee/protools/backend/service/rem/delegate/v2/RemGetPartitionListOfInterroPaginatedTask.java rename to src/main/java/fr/insee/protools/backend/service/rem/delegate/RemGetPartitionListOfInterroPaginatedTask.java index 8d4cd42c..b9e5dc0f 100644 --- a/src/main/java/fr/insee/protools/backend/service/rem/delegate/v2/RemGetPartitionListOfInterroPaginatedTask.java +++ b/src/main/java/fr/insee/protools/backend/service/rem/delegate/RemGetPartitionListOfInterroPaginatedTask.java @@ -1,7 +1,7 @@ -package fr.insee.protools.backend.service.rem.delegate.v2; +package fr.insee.protools.backend.service.rem.delegate; import com.fasterxml.jackson.databind.JsonNode; -import fr.insee.protools.backend.httpclients.pagination.PageResponse; +import fr.insee.protools.backend.restclient.pagination.PageResponse; import fr.insee.protools.backend.service.DelegateContextVerifier; import fr.insee.protools.backend.service.rem.RemService; import fr.insee.protools.backend.service.utils.FlowableVariableUtils; @@ -26,13 +26,13 @@ public class RemGetPartitionListOfInterroPaginatedTask implements JavaDelegate, RemService remService; private PageResponse readFunction(Integer pageToRead, Object... objects) { - Long partitionId = (Long) objects[0]; - return remService.getPartitionAllInterroPaginated(partitionId, pageToRead,null); + String partitionId = (String) objects[0]; + return remService.getPartitionAllInterroPaginated(partitionId, pageToRead); } @Override public void execute(DelegateExecution execution) { - Long currentPartitionId = FlowableVariableUtils.getVariableOrThrow(execution, VARNAME_CURRENT_PARTITION_ID, Long.class); + String currentPartitionId = FlowableVariableUtils.getVariableOrThrow(execution, VARNAME_CURRENT_PARTITION_ID, String.class); getAndTreat(execution, VARNAME_INTERRO_LIST_PAGEABLE_CURRENT_PAGE, VARNAME_INTERRO_LIST_PAGEABLE_IS_LAST_PAGE, this::readFunction, currentPartitionId); } diff --git a/src/main/java/fr/insee/protools/backend/service/rem/delegate/RemGetPartitionListOfSuIdTask.java b/src/main/java/fr/insee/protools/backend/service/rem/delegate/RemGetPartitionListOfSuIdTask.java deleted file mode 100644 index a3264402..00000000 --- a/src/main/java/fr/insee/protools/backend/service/rem/delegate/RemGetPartitionListOfSuIdTask.java +++ /dev/null @@ -1,35 +0,0 @@ -package fr.insee.protools.backend.service.rem.delegate; - -import fr.insee.protools.backend.service.DelegateContextVerifier; -import fr.insee.protools.backend.service.rem.RemService; -import fr.insee.protools.backend.service.utils.FlowableVariableUtils; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.flowable.engine.delegate.DelegateExecution; -import org.flowable.engine.delegate.JavaDelegate; -import org.springframework.stereotype.Component; - -import java.util.List; - -import static fr.insee.protools.backend.service.FlowableVariableNameConstants.VARNAME_CURRENT_PARTITION_ID; -import static fr.insee.protools.backend.service.FlowableVariableNameConstants.VARNAME_REM_INTERRO_ID_LIST; - -@Slf4j -@Component -@RequiredArgsConstructor -public class RemGetPartitionListOfSuIdTask implements JavaDelegate, DelegateContextVerifier { - - private final RemService remService; - - @Override - public void execute(DelegateExecution execution) { - Long currentPartitionId = FlowableVariableUtils.getVariableOrThrow(execution,VARNAME_CURRENT_PARTITION_ID, Long.class); - //No need protools context ==> no checkContextOrThrow - log.info("ProcessInstanceId={} - partition={} begin",execution.getProcessInstanceId(),currentPartitionId); - - Long[] partitionSUIds = remService.getSampleSuIds(currentPartitionId); - List remSuIdList = List.of(partitionSUIds); - execution.getParent().setVariableLocal(VARNAME_REM_INTERRO_ID_LIST, remSuIdList); - log.debug("ProcessInstanceId={} - partition={} - remSuIdList={} end",execution.getProcessInstanceId(),currentPartitionId,remSuIdList); - } -} \ No newline at end of file diff --git a/src/main/java/fr/insee/protools/backend/service/rem/delegate/RemGetSUTask.java b/src/main/java/fr/insee/protools/backend/service/rem/delegate/RemGetSUTask.java deleted file mode 100644 index b722833e..00000000 --- a/src/main/java/fr/insee/protools/backend/service/rem/delegate/RemGetSUTask.java +++ /dev/null @@ -1,38 +0,0 @@ -package fr.insee.protools.backend.service.rem.delegate; - -import com.fasterxml.jackson.databind.ObjectMapper; -import fr.insee.protools.backend.dto.rem.REMSurveyUnitDto; -import fr.insee.protools.backend.service.DelegateContextVerifier; -import fr.insee.protools.backend.service.rem.RemService; -import fr.insee.protools.backend.service.utils.FlowableVariableUtils; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.flowable.engine.delegate.DelegateExecution; -import org.flowable.engine.delegate.JavaDelegate; -import org.springframework.stereotype.Component; - -import static fr.insee.protools.backend.service.FlowableVariableNameConstants.VARNAME_REM_INTERROGATION; -import static fr.insee.protools.backend.service.FlowableVariableNameConstants.VARNAME_REM_SURVEY_UNIT_IDENTIFIER; - -@Slf4j -@Component -@RequiredArgsConstructor -public class RemGetSUTask implements JavaDelegate, DelegateContextVerifier { - - private final RemService remService; - private final ObjectMapper objectMapper; - - @Override - public void execute(DelegateExecution execution) { - //No need context - - //Get the UE - Long suId = FlowableVariableUtils.getVariableOrThrow(execution,VARNAME_REM_SURVEY_UNIT_IDENTIFIER, Long.class); - log.info("ProcessInstanceId={} - suId={}",execution.getProcessInstanceId(), suId); - //TODO : ne pas créer le DTO ici : Ca ne sert à rien... - REMSurveyUnitDto remSurveyUnitDto = remService.getSurveyUnit(suId); - execution.setVariableLocal(VARNAME_REM_INTERROGATION,objectMapper.valueToTree(remSurveyUnitDto)); - log.trace("suId={} - content={}", suId, remSurveyUnitDto); - log.debug("ProcessInstanceId={} - suId={} end",execution.getProcessInstanceId(), suId); - } -} \ No newline at end of file diff --git a/src/main/java/fr/insee/protools/backend/service/rem/delegate/RemPostResmiseEnCollecteTaskREST.java b/src/main/java/fr/insee/protools/backend/service/rem/delegate/RemPostResmiseEnCollecteTaskREST.java new file mode 100644 index 00000000..5fa163a4 --- /dev/null +++ b/src/main/java/fr/insee/protools/backend/service/rem/delegate/RemPostResmiseEnCollecteTaskREST.java @@ -0,0 +1,35 @@ +package fr.insee.protools.backend.service.rem.delegate; + +import com.fasterxml.jackson.databind.JsonNode; +import fr.insee.protools.backend.service.DelegateContextVerifier; +import fr.insee.protools.backend.service.rem.RemService; +import fr.insee.protools.backend.service.utils.FlowableVariableUtils; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.JavaDelegate; +import org.springframework.stereotype.Component; + +import java.util.List; + +import static fr.insee.protools.backend.service.FlowableVariableNameConstants.VARNAME_INTERRO_REMISE_EN_COLLECTE_LIST; + +@Slf4j +@Component +@RequiredArgsConstructor +public class RemPostResmiseEnCollecteTaskREST implements JavaDelegate, DelegateContextVerifier { + + RemService remService; + + @Override + public void execute(DelegateExecution execution) { + log.info("ProcessInstanceId={} begin", execution.getProcessInstanceId()); + + //Get the contacts + List interroRemiseEnCollecteList = FlowableVariableUtils.getVariableOrThrow(execution, VARNAME_INTERRO_REMISE_EN_COLLECTE_LIST, List.class); + remService.postRemiseEnCollecte(interroRemiseEnCollecteList); + + log.info("ProcessInstanceId={} end", execution.getProcessInstanceId()); + } + +} \ No newline at end of file diff --git a/src/main/java/fr/insee/protools/backend/service/rem/delegate/RemPutContactPlatineTaskREST.java b/src/main/java/fr/insee/protools/backend/service/rem/delegate/RemPutContactPlatineTaskREST.java new file mode 100644 index 00000000..70e28fc1 --- /dev/null +++ b/src/main/java/fr/insee/protools/backend/service/rem/delegate/RemPutContactPlatineTaskREST.java @@ -0,0 +1,35 @@ +package fr.insee.protools.backend.service.rem.delegate; + +import com.fasterxml.jackson.databind.JsonNode; +import fr.insee.protools.backend.service.DelegateContextVerifier; +import fr.insee.protools.backend.service.rem.RemService; +import fr.insee.protools.backend.service.utils.FlowableVariableUtils; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.JavaDelegate; +import org.springframework.stereotype.Component; + +import java.util.List; + +import static fr.insee.protools.backend.service.FlowableVariableNameConstants.VARNAME_PLATINE_CONTACT_LIST; + +@Slf4j +@Component +@RequiredArgsConstructor +public class RemPutContactPlatineTaskREST implements JavaDelegate, DelegateContextVerifier { + + RemService remService; + + @Override + public void execute(DelegateExecution execution) { + log.info("ProcessInstanceId={} begin", execution.getProcessInstanceId()); + + //Get the contacts + List contactPlatineList = FlowableVariableUtils.getVariableOrThrow(execution, VARNAME_PLATINE_CONTACT_LIST, List.class); + remService.putContactsPlatine(contactPlatineList); + + log.info("ProcessInstanceId={} end", execution.getProcessInstanceId()); + } + +} \ No newline at end of file diff --git a/src/main/java/fr/insee/protools/backend/service/rem/delegate/RemWriteEraSUListTask.java b/src/main/java/fr/insee/protools/backend/service/rem/delegate/RemWriteEraSUListTask.java deleted file mode 100644 index d14f8c11..00000000 --- a/src/main/java/fr/insee/protools/backend/service/rem/delegate/RemWriteEraSUListTask.java +++ /dev/null @@ -1,54 +0,0 @@ -package fr.insee.protools.backend.service.rem.delegate; - -import fr.insee.protools.backend.dto.era.CensusJsonDto; -import fr.insee.protools.backend.dto.rem.SuIdMappingJson; -import fr.insee.protools.backend.dto.rem.SuIdMappingRecord; -import fr.insee.protools.backend.service.DelegateContextVerifier; -import fr.insee.protools.backend.service.exception.ProtoolsTaskBPMNError; -import fr.insee.protools.backend.service.rem.RemService; -import fr.insee.protools.backend.service.utils.FlowableVariableUtils; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.flowable.engine.delegate.DelegateExecution; -import org.flowable.engine.delegate.JavaDelegate; -import org.springframework.stereotype.Component; - -import java.util.List; - -import static fr.insee.protools.backend.service.FlowableVariableNameConstants.*; - -@Component -@Slf4j -@RequiredArgsConstructor -public class RemWriteEraSUListTask implements JavaDelegate, DelegateContextVerifier { - - private final RemService remService; - - @Override - public void execute(DelegateExecution execution) { - - //Get the list of SU previouly retrieved from ERA - List eraSUList = FlowableVariableUtils.getVariableOrThrow(execution,VARNAME_ERA_RESPONSE, List.class); - //Get current REM partition - Long currentPartitionId = FlowableVariableUtils.getVariableOrThrow(execution,VARNAME_CURRENT_PARTITION_ID, Long.class); - if(eraSUList==null||eraSUList.isEmpty()){ - log.info("ProcessInstanceId={} - currentPartitionId={} - variable {} is empty",execution.getProcessInstanceId(), currentPartitionId,VARNAME_ERA_RESPONSE); - execution.getParent().setVariableLocal(VARNAME_REM_INTERRO_ID_LIST, List.of()); - return; - } - - log.info("ProcessInstanceId={} - currentPartitionId={} - eraSUList.size={} begin",execution.getProcessInstanceId(), currentPartitionId,eraSUList.size()); - //Store SU in REM - SuIdMappingJson remMapping = remService.writeERASUList(currentPartitionId, eraSUList); - if(remMapping==null){ - log.error("ProcessInstanceId={} - currentPartitionId={} remMapping is empty/null end",execution.getProcessInstanceId(), currentPartitionId); - execution.getParent().setVariableLocal(VARNAME_REM_INTERRO_ID_LIST, List.of()); - throw new ProtoolsTaskBPMNError("Error while writing list of Era SU to REM : REM returned a null result "); - } - - //STORE the list of REM identifier created - List remSuIdList = remMapping.getData().stream().map(SuIdMappingRecord::repositoryId).toList(); - execution.getParent().setVariableLocal(VARNAME_REM_INTERRO_ID_LIST, remSuIdList); - log.info("ProcessInstanceId={} - currentPartitionId={} - remSuIdList={} end",execution.getProcessInstanceId(), currentPartitionId,remSuIdList); - } -} diff --git a/src/main/java/fr/insee/protools/backend/service/rem/delegate/v2/RemGetPartitionListOfInterroWithoutWebAccountPaginatedTask.java b/src/main/java/fr/insee/protools/backend/service/rem/delegate/v2/RemGetPartitionListOfInterroWithoutWebAccountPaginatedTask.java deleted file mode 100644 index 800f036a..00000000 --- a/src/main/java/fr/insee/protools/backend/service/rem/delegate/v2/RemGetPartitionListOfInterroWithoutWebAccountPaginatedTask.java +++ /dev/null @@ -1,62 +0,0 @@ -package fr.insee.protools.backend.service.rem.delegate.v2; - -import com.fasterxml.jackson.databind.JsonNode; -import fr.insee.protools.backend.dto.internal.ProtoolsInterrogationDto; -import fr.insee.protools.backend.httpclients.pagination.PageResponse; -import fr.insee.protools.backend.service.DelegateContextVerifier; -import fr.insee.protools.backend.service.rem.RemService; -import fr.insee.protools.backend.service.utils.FlowableVariableUtils; -import fr.insee.protools.backend.service.utils.delegate.PaginationHelper; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.flowable.engine.delegate.DelegateExecution; -import org.flowable.engine.delegate.JavaDelegate; -import org.slf4j.Logger; -import org.springframework.stereotype.Component; - -import java.util.List; -import java.util.Map; - -import static fr.insee.protools.backend.service.FlowableVariableNameConstants.*; - -@Slf4j -@Component -@RequiredArgsConstructor -public class RemGetPartitionListOfInterroWithoutWebAccountPaginatedTask implements JavaDelegate, DelegateContextVerifier, PaginationHelper { - - private final RemService remService; - - private PageResponse readFunction(Integer pageToRead, Object... objects) { - Long partitionId = (Long) objects[0]; - return remService.getPartitionAllInterroPaginated(partitionId, pageToRead,false); - } - - @Override - public void execute(DelegateExecution execution) { - Long currentPartitionId = FlowableVariableUtils.getVariableOrThrow(execution, VARNAME_CURRENT_PARTITION_ID, Long.class); - getAndTreat(execution, VARNAME_INTERRO_LIST_PAGEABLE_CURRENT_PAGE, VARNAME_INTERRO_LIST_PAGEABLE_IS_LAST_PAGE, this::readFunction, currentPartitionId); - } - - @Override - public Logger getLogger() { - return log; - } - - @Override - public Map treatPage(DelegateExecution execution, List contentList) { - - String jsonKeyId = "id"; - List protoolsInterrogationDtos = contentList.stream() - //TODO: remove as it should not occurs? - .filter(jsonNode -> { - boolean hasId = jsonNode.has(jsonKeyId) && !jsonNode.get(jsonKeyId).isNull(); - if (!hasId) { - log.warn("Skipping interrogation without id: {}", jsonNode); - } - return hasId; - }).map(jsonNode -> ProtoolsInterrogationDto.builder().idInterrogation(jsonNode.get(jsonKeyId).asText()).remInterrogation(jsonNode).build()).toList(); - - Map variables = Map.of(VARNAME_REM_PROTOOLS_INTERRO_LIST, protoolsInterrogationDtos); - return variables; - } -} \ No newline at end of file diff --git a/src/main/java/fr/insee/protools/backend/service/sabiane/SabianeIdHelper.java b/src/main/java/fr/insee/protools/backend/service/sabiane/SabianeIdHelper.java deleted file mode 100644 index b4b4671d..00000000 --- a/src/main/java/fr/insee/protools/backend/service/sabiane/SabianeIdHelper.java +++ /dev/null @@ -1,15 +0,0 @@ -package fr.insee.protools.backend.service.sabiane; - -import fr.insee.protools.backend.service.exception.IncorrectSUBPMNError; - -public class SabianeIdHelper { - - public static String computeSabianeID(String partitionId, String remRepositoryID){ - if(partitionId!=null && remRepositoryID!=null) - return partitionId + "P" + remRepositoryID; - else - throw new IncorrectSUBPMNError("partitionId and/or remRepositoryID cannot be null to compute sabiane ID"); - } - //Utility class - private SabianeIdHelper(){} -} diff --git a/src/main/java/fr/insee/protools/backend/service/sabiane/delegate/SabianePilotageCreateContextTask.java b/src/main/java/fr/insee/protools/backend/service/sabiane/delegate/SabianePilotageCreateContextTask.java deleted file mode 100644 index eb450cf1..00000000 --- a/src/main/java/fr/insee/protools/backend/service/sabiane/delegate/SabianePilotageCreateContextTask.java +++ /dev/null @@ -1,278 +0,0 @@ -package fr.insee.protools.backend.service.sabiane.delegate; - -import com.fasterxml.jackson.databind.JsonNode; -import fr.insee.protools.backend.dto.sabiane.pilotage.*; -import fr.insee.protools.backend.service.DelegateContextVerifier; -import fr.insee.protools.backend.service.context.ContextService; -import fr.insee.protools.backend.service.context.ContextServiceImpl; -import fr.insee.protools.backend.service.context.exception.BadContextDateTimeParseBPMNError; -import fr.insee.protools.backend.service.sabiane.pilotage.SabianePilotageService; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.flowable.engine.delegate.DelegateExecution; -import org.flowable.engine.delegate.JavaDelegate; -import org.springframework.stereotype.Component; - -import java.time.Instant; -import java.util.*; - -import static fr.insee.protools.backend.service.context.ContextConstants.*; - -@Slf4j -@Component -@RequiredArgsConstructor -public class SabianePilotageCreateContextTask implements JavaDelegate, DelegateContextVerifier { - - private static final String REFERENT_PRIMARY = "PRIMARY"; - private static final String REFERENT_SECONDARY = "SECONDARY"; - private final ContextService protoolsContext; - private final SabianePilotageService sabianePilotageService; - - @Override - public void execute(DelegateExecution execution) { - JsonNode contextRootNode = protoolsContext.getContextByProcessInstance(execution.getProcessInstanceId()); - checkContextOrThrow(log,execution.getProcessInstanceId(), contextRootNode); - - log.info("ProcessInstanceId={} - campagne={}" - ,execution.getProcessInstanceId(),contextRootNode.path(CTX_CAMPAGNE_CONTEXTE).asText()); - - CampaignContextDto dto = computeCampaignContextDto(contextRootNode); - sabianePilotageService.postCampaign(dto); - log.debug("ProcessInstanceId={} end",execution.getProcessInstanceId()); - } - - private CampaignContextDto computeCampaignContextDto(JsonNode contextRootNode) { - - String campaignId = contextRootNode.path(CTX_CAMPAGNE_ID).asText(); - String campaignLabel = contextRootNode.path(CTX_CAMPAGNE_LABEL).asText(); - String campaignAssistanceMail = contextRootNode.path(CTX_METADONNEES).path(CTX_META_ASSISTANCE_NIVO2_MAIL).asText(); - - //TODO : vérifier les valeurs dans le check de la conf - String essaisContact = contextRootNode.path(CTX_METADONNEES).path(CTX_META_ESSAIS_CONTACT).asText(); - ContactAttemptConfiguration contactAttemptConfiguration = ContactAttemptConfiguration.valueOfLabel(essaisContact); - - String bilanContact = contextRootNode.path(CTX_METADONNEES).path(CTX_META_BILAN_CONTACT).asText(); - ContactOutcomeConfiguration contactOutcomeConfiguration = ContactOutcomeConfiguration.valueOfLabel(bilanContact); - - String reperage = contextRootNode.path(CTX_METADONNEES).path(CTX_META_REPERAGE).asText(); - IdentificationConfiguration identificationConfiguration = IdentificationConfiguration.valueOfLabel(reperage); - - List visibilityContextDtos = computeVisibilities(contextRootNode); - List referents = computeReferents(contextRootNode); - - return CampaignContextDto.builder() - .campaign(campaignId) - .campaignLabel(campaignLabel) - .visibilities(visibilityContextDtos) - .referents(referents) - .email(campaignAssistanceMail) - .identificationConfiguration(identificationConfiguration) - .contactOutcomeConfiguration(contactOutcomeConfiguration) - .contactAttemptConfiguration(contactAttemptConfiguration) - .build(); - } - - private List computeReferents(JsonNode contextRootNode) { - JsonNode referentsPrincipauxNode = contextRootNode.path(CTX_METADONNEES).path(CTX_META_REFERENTS_PRINCIPAUX); - JsonNode referentsSecondairesNode = contextRootNode.path(CTX_METADONNEES).path(CTX_META_REFERENTS_SECONDAIRES); - - List result = new ArrayList<>(getReferents(referentsPrincipauxNode.elements(), true)); - result.addAll(getReferents(referentsSecondairesNode.elements(),false)); - return result; - } - - private List getReferents(Iterator refIterator, boolean isPrincipal){ - List result = new ArrayList<>(); - while(refIterator.hasNext()){ - var referentNode = refIterator.next(); - String prenom = referentNode.path(CTX_META_REFERENT_PRENOM).asText(); - String nom = referentNode.path(CTX_META_REFERENT_NOM).asText(); - String telephone = referentNode.path(CTX_META_REFERENT_TELEPHONE).asText(); - String role = (isPrincipal)? REFERENT_PRIMARY : REFERENT_SECONDARY; - result.add(ReferentDto.builder() - .firstName(prenom) - .lastName(nom) - .phoneNumber(telephone) - .role(role) - .build()); - } - return result; - } - - private List computeVisibilities(JsonNode contextRootNode) - { - List result = new ArrayList<>(); - //need to compute mins/maxs of partitions - var partitionIterator =contextRootNode.path(CTX_PARTITIONS).elements(); - - Instant maxDateFinCollecte=null; - Instant minDateDebutCollecte=null; - Instant maxDateFinTraitement=null; - Instant minDateDebutReperage=null; - Instant minDateDebutVisibiliteEnqueteur=null; - Instant maxDateDebutVisibiliteGestionnaire=null; - - while (partitionIterator.hasNext()) { - var partitionNode = partitionIterator.next(); - Instant dateFinCollecte = ContextServiceImpl.getInstantFromPartition(partitionNode,CTX_PARTITION_DATE_FIN_COLLECTE); - Instant dateDebutCollecte = ContextServiceImpl.getInstantFromPartition(partitionNode,CTX_PARTITION_DATE_DEBUT_COLLECTE); - Instant dateFinTraitement = ContextServiceImpl.getInstantFromPartition(partitionNode,CTX_PARTITION_SABIANE_DATE_FIN_TRAITEMENT); - Instant dateDebutReperage = ContextServiceImpl.getInstantFromPartition(partitionNode,CTX_PARTITION_SABIANE_DATE_DEBUT_REPERAGE); - Instant dateDebutVisibiliteEnqueteur = ContextServiceImpl.getInstantFromPartition(partitionNode,CTX_PARTITION_SABIANE_DATE_DEBUT_VISIBILITE_ENQUETEUR); - Instant dateDebutVisibiliteGestionnaire = ContextServiceImpl.getInstantFromPartition(partitionNode,CTX_PARTITION_SABIANE_DATE_DEBUT_VISIBILITE_GESTIONNAIRE); - - if(maxDateFinCollecte==null || maxDateFinCollecte.isBefore(dateFinCollecte)){ - maxDateFinCollecte=dateFinCollecte; - } - - if(minDateDebutCollecte==null || minDateDebutCollecte.isAfter(dateDebutCollecte)){ - minDateDebutCollecte=dateDebutCollecte; - } - - if(maxDateFinTraitement==null || maxDateFinTraitement.isBefore(dateFinTraitement)){ - maxDateFinTraitement=dateFinTraitement; - } - - if(minDateDebutReperage==null || minDateDebutReperage.isAfter(dateDebutReperage)){ - minDateDebutReperage=dateDebutReperage; - } - - if(minDateDebutVisibiliteEnqueteur==null || minDateDebutVisibiliteEnqueteur.isAfter(dateDebutVisibiliteEnqueteur)){ - minDateDebutVisibiliteEnqueteur=dateDebutVisibiliteEnqueteur; - } - - if(maxDateDebutVisibiliteGestionnaire==null || maxDateDebutVisibiliteGestionnaire.isBefore(dateDebutVisibiliteGestionnaire)){ - maxDateDebutVisibiliteGestionnaire=dateDebutVisibiliteGestionnaire; - } - } - - var siteGestionIterator = contextRootNode.path(CTX_METADONNEES).path(CTX_META_SITES_GESTION).elements(); - while(siteGestionIterator.hasNext()){ - JsonNode siteGestion = siteGestionIterator.next(); - VisibilityContextDto visibilityContextDto = VisibilityContextDto.builder() - .collectionEndDate(maxDateFinCollecte.toEpochMilli()) - .collectionStartDate(minDateDebutCollecte.toEpochMilli()) - .endDate(maxDateFinTraitement.toEpochMilli()) - .identificationPhaseStartDate(minDateDebutReperage.toEpochMilli()) - .interviewerStartDate(minDateDebutVisibiliteEnqueteur.toEpochMilli()) - .managementStartDate(maxDateDebutVisibiliteGestionnaire.toEpochMilli()) - .organizationalUnit(siteGestion.asText()) - .build(); - result.add(visibilityContextDto); - } - return result; - } - - @Override - @SuppressWarnings("java:S3776") //disable the warning about cognitive complexity as it is long but simple - public Set getContextErrors(JsonNode contextRootNode) { - if(contextRootNode==null){ - return Set.of("Context is missing"); - } - Set results=new HashSet<>(); - Set requiredNodes = - Set.of( - //Global & Campaign - CTX_METADONNEES, CTX_CAMPAGNE_ID, CTX_CAMPAGNE_LABEL, CTX_CAMPAGNE_CONTEXTE, CTX_PARTITIONS - ); - Set requiredMetadonnees = - Set.of( - CTX_META_LABEL_COURT_OPERATION,CTX_META_LABEL_LONG_OPERATION, - CTX_META_ASSISTANCE_NIVO2_MAIL, - CTX_META_REPERAGE,CTX_META_ESSAIS_CONTACT,CTX_META_BILAN_CONTACT, - CTX_META_REFERENTS_PRINCIPAUX, CTX_META_REFERENTS_SECONDAIRES, - //array with at least one element - CTX_META_SITES_GESTION - ); - Set requiredReferent = - Set.of(CTX_META_REFERENT_NOM,CTX_META_REFERENT_PRENOM,CTX_META_REFERENT_TELEPHONE); - Set requiredPartitionDates= - Set.of(CTX_PARTITION_DATE_DEBUT_COLLECTE, CTX_PARTITION_DATE_FIN_COLLECTE, - //specific sabiane - CTX_PARTITION_SABIANE_DATE_DEBUT_VISIBILITE_GESTIONNAIRE, - CTX_PARTITION_SABIANE_DATE_DEBUT_VISIBILITE_ENQUETEUR, - CTX_PARTITION_SABIANE_DATE_DEBUT_REPERAGE, - CTX_PARTITION_SABIANE_DATE_FIN_TRAITEMENT); - //For a partition, we need all the dates + the ID + label - Set requiredPartition = - new HashSet<>(requiredPartitionDates); - requiredPartition.add(CTX_PARTITION_ID); - requiredPartition.add(CTX_PARTITION_LABEL); - - - results.addAll(DelegateContextVerifier.computeMissingChildrenMessages(requiredNodes,contextRootNode,getClass())); - results.addAll(DelegateContextVerifier.computeMissingChildrenMessages(requiredMetadonnees,contextRootNode.path(CTX_METADONNEES),getClass())); - - var referentIterator=contextRootNode.path(CTX_META_REFERENTS_PRINCIPAUX).elements(); - while (referentIterator.hasNext()) { - var referentNode = referentIterator.next(); - results.addAll(DelegateContextVerifier.computeMissingChildrenMessages(requiredReferent,referentNode,getClass())); - } - - referentIterator=contextRootNode.path(CTX_META_REFERENTS_SECONDAIRES).elements(); - while (referentIterator.hasNext()) { - var referentNode = referentIterator.next(); - results.addAll(DelegateContextVerifier.computeMissingChildrenMessages(requiredReferent,referentNode,getClass())); - } - - var partitionIterator =contextRootNode.path(CTX_PARTITIONS).elements(); - //Partitions - while (partitionIterator.hasNext()) { - var partitionNode = partitionIterator.next(); - results.addAll(DelegateContextVerifier.computeMissingChildrenMessages(requiredPartition,partitionNode,getClass())); - - for(var dateNode : requiredPartitionDates) { - //Check the date format - try { - ContextServiceImpl.getInstantFromPartition(partitionNode, dateNode); - } catch (BadContextDateTimeParseBPMNError e) { - results.add(e.getMessage()); - } - } - } - - //Check sites de gestion (an array with at least one element) - JsonNode sitesGestionNode= contextRootNode.path(CTX_METADONNEES).path(CTX_META_SITES_GESTION); - if(!sitesGestionNode.isArray()){ - results.add(DelegateContextVerifier.computeIncorrectMessage(CTX_META_SITES_GESTION," should be an array", getClass())); - } - else if(sitesGestionNode.isEmpty()){ - results.add(DelegateContextVerifier.computeIncorrectMessage(CTX_META_SITES_GESTION," should not be an empty an array", getClass())); - } - else{ - var iter = sitesGestionNode.elements(); - while (iter.hasNext()){ - var value = iter.next(); - if(!value.isTextual()){ - results.add(DelegateContextVerifier.computeIncorrectMessage(CTX_META_SITES_GESTION," contains non textual values", getClass())); - break; - } - } - } - - //Check value of enums - try { - String essaisContact = contextRootNode.path(CTX_METADONNEES).path(CTX_META_ESSAIS_CONTACT).asText(); - ContactAttemptConfiguration.valueOfLabel(essaisContact); - }catch (IllegalArgumentException e){ - results.add(DelegateContextVerifier.computeIncorrectEnumMessage(CTX_META_ESSAIS_CONTACT,contextRootNode.path(CTX_METADONNEES).path(CTX_META_ESSAIS_CONTACT).asText(),Arrays.toString(ContactAttemptConfiguration.labels()),getClass())); - } - - try { - String bilanContact = contextRootNode.path(CTX_METADONNEES).path(CTX_META_BILAN_CONTACT).asText(); - ContactOutcomeConfiguration.valueOfLabel(bilanContact); - }catch (IllegalArgumentException e){ - results.add(DelegateContextVerifier.computeIncorrectEnumMessage(CTX_META_BILAN_CONTACT,contextRootNode.path(CTX_METADONNEES).path(CTX_META_BILAN_CONTACT).asText(),Arrays.toString(ContactOutcomeConfiguration.labels()),getClass())); - } - - try { - String reperage = contextRootNode.path(CTX_METADONNEES).path(CTX_META_REPERAGE).asText(); - IdentificationConfiguration.valueOfLabel(reperage); - }catch (IllegalArgumentException e){ - results.add(DelegateContextVerifier.computeIncorrectEnumMessage(CTX_META_REPERAGE,contextRootNode.path(CTX_METADONNEES).path(CTX_META_REPERAGE).asText(),Arrays.toString(IdentificationConfiguration.labels()),getClass())); - } - - return results; - - } -} diff --git a/src/main/java/fr/insee/protools/backend/service/sabiane/delegate/SabianePilotageCreateSUTask.java b/src/main/java/fr/insee/protools/backend/service/sabiane/delegate/SabianePilotageCreateSUTask.java deleted file mode 100644 index 0a2a757d..00000000 --- a/src/main/java/fr/insee/protools/backend/service/sabiane/delegate/SabianePilotageCreateSUTask.java +++ /dev/null @@ -1,359 +0,0 @@ -package fr.insee.protools.backend.service.sabiane.delegate; - -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; -import fr.insee.protools.backend.dto.rem.*; -import fr.insee.protools.backend.dto.sabiane.pilotage.*; -import fr.insee.protools.backend.service.DelegateContextVerifier; -import fr.insee.protools.backend.service.context.ContextService; -import fr.insee.protools.backend.service.context.enums.PartitionTypeEchantillon; -import fr.insee.protools.backend.service.exception.IncorrectSUBPMNError; -import fr.insee.protools.backend.service.platine.utils.PlatineHelper; -import fr.insee.protools.backend.service.rem.RemDtoUtils; -import fr.insee.protools.backend.service.sabiane.SabianeIdHelper; -import fr.insee.protools.backend.service.sabiane.pilotage.SabianePilotageService; -import fr.insee.protools.backend.service.utils.FlowableVariableUtils; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.EnumUtils; -import org.apache.commons.lang3.StringUtils; -import org.apache.commons.lang3.tuple.Pair; -import org.flowable.engine.delegate.DelegateExecution; -import org.flowable.engine.delegate.JavaDelegate; -import org.springframework.stereotype.Component; - -import java.time.Instant; -import java.time.LocalDate; -import java.time.ZoneId; -import java.time.ZonedDateTime; -import java.time.format.DateTimeFormatter; -import java.time.format.DateTimeParseException; -import java.util.*; -import java.util.stream.Collectors; - -import static com.fasterxml.jackson.databind.DeserializationFeature.FAIL_ON_MISSING_CREATOR_PROPERTIES; -import static com.fasterxml.jackson.databind.DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES; -import static fr.insee.protools.backend.service.FlowableVariableNameConstants.VARNAME_CURRENT_PARTITION_ID; -import static fr.insee.protools.backend.service.FlowableVariableNameConstants.VARNAME_REM_INTERROGATION; -import static fr.insee.protools.backend.service.context.ContextConstants.*; -import static fr.insee.protools.backend.service.utils.ContextUtils.getCurrentPartitionNode; - -@Slf4j -@Component -@RequiredArgsConstructor -public class SabianePilotageCreateSUTask implements JavaDelegate, DelegateContextVerifier { - - private final ContextService protoolsContext; - private final SabianePilotageService sabianePilotageService; - - private static final DateTimeFormatter birthdateFormatter = DateTimeFormatter.ofPattern("yyyyMMdd"); - private static final ZoneId parisTimezone = ZoneId.of("Europe/Paris"); - private static final ObjectMapper objectMapper = new ObjectMapper().configure(FAIL_ON_UNKNOWN_PROPERTIES, false).configure(FAIL_ON_MISSING_CREATOR_PROPERTIES, true); - - @Override - public void execute(DelegateExecution execution) { - JsonNode contextRootNode = protoolsContext.getContextByProcessInstance(execution.getProcessInstanceId()); - checkContextOrThrow(log, execution.getProcessInstanceId(), contextRootNode); - - Long currentPartitionId = FlowableVariableUtils.getVariableOrThrow(execution, VARNAME_CURRENT_PARTITION_ID, Long.class); - JsonNode remSUNode = FlowableVariableUtils.getVariableOrThrow(execution, VARNAME_REM_INTERROGATION, JsonNode.class); - JsonNode currentPartitionNode = getCurrentPartitionNode(contextRootNode, currentPartitionId); - - Boolean priority = currentPartitionNode.path(CTX_PARTITION_PRIORITAIRE).asBoolean(); - boolean isLogement = currentPartitionNode.path(CTX_PARTITION_TYPE_ECHANTILLON).textValue().equalsIgnoreCase(PartitionTypeEchantillon.LOGEMENT.getAsString()); - - //Create the DTO object - SurveyUnitContextDto dto = createSabianeSUContextDto(contextRootNode, currentPartitionId, remSUNode, isLogement, priority); - - log.info("ProcessInstanceId={} - currentPartitionId={} - remSU.id={}", execution.getProcessInstanceId(), currentPartitionId, dto.getId()); - - //Call service - sabianePilotageService.postSurveyUnits(List.of(dto)); - - log.debug("ProcessInstanceId={} end", execution.getProcessInstanceId()); - } - - @Override - public Set getContextErrors(JsonNode contextRootNode) { - if(contextRootNode==null){ - return Set.of("Context is missing"); - } - Set results=new HashSet<>(); - - Set requiredNodes = - Set.of( - //Global & Campaign - CTX_CAMPAGNE_ID, CTX_PARTITIONS - ); - Set requiredPartition = - Set.of(CTX_PARTITION_ID, CTX_PARTITION_TYPE_ECHANTILLON,CTX_PARTITION_PRIORITAIRE); - - results.addAll(DelegateContextVerifier.computeMissingChildrenMessages(requiredNodes,contextRootNode,getClass())); - - //Partitions - if(!contextRootNode.path(CTX_PARTITIONS).isArray() || contextRootNode.path(CTX_PARTITIONS).isEmpty()){ - results.add(DelegateContextVerifier.computeIncorrectMessage(CTX_PARTITIONS," should be a non empty array", getClass())); - } - else{ - var partitionIterator =contextRootNode.path(CTX_PARTITIONS).elements(); - while (partitionIterator.hasNext()) { - var partitionNode = partitionIterator.next(); - results.addAll(DelegateContextVerifier.computeMissingChildrenMessages(requiredPartition,partitionNode,getClass())); - - //Check value of Enum - String enumVal = partitionNode.path(CTX_PARTITION_TYPE_ECHANTILLON).asText(); - if(! EnumUtils.isValidEnumIgnoreCase(PartitionTypeEchantillon.class, enumVal)){ - results.add(DelegateContextVerifier.computeIncorrectEnumMessage(CTX_PARTITION_TYPE_ECHANTILLON,enumVal,Arrays.toString(PartitionTypeEchantillon.values()),getClass())); - } - } - } - - return results; - } - - /** - * Compute a timestamp considering that {@code remBirthdate} is localized in - * "Europe/Paris" timezone and is at the start of day - * @param remBirthdate A birthdate. Can be of the form - *
    - *
  • yyyyMMdd - ex: 20110823
  • - *
  • yyyyMM then assume dd is 01 - ex 201108 ==> 20110801
  • - *
  • yyyy then assume MM is 01 and dd is 01 - ex: 2011 ==> 20110101
  • - *
- * @return the unix timestamp (number of seconds since epoch) corresponding to this birthdate - */ - protected static Long computeSabianeBirthDateFromRem(String remBirthdate) { - if(StringUtils.isBlank(remBirthdate)) - return null; - - String adjudstedBirthDate = remBirthdate.trim(); - int len = adjudstedBirthDate.length(); - switch (len) { - case 4: - adjudstedBirthDate += "0101";//If 4 char (ex: 2009) consider 1st junary - break; - case 6: - adjudstedBirthDate += "01";//If 6 char (ex: 200912) : consider 1st day of month - break; - default: - } - try { - LocalDate localDate = LocalDate.parse(adjudstedBirthDate, birthdateFormatter); - ZonedDateTime zonedDateTime = localDate.atStartOfDay(parisTimezone); - return zonedDateTime.toInstant().getEpochSecond(); - } catch (DateTimeParseException e) { - throw new IncorrectSUBPMNError("Error while parsing the json retrieved from REM : the birthdate" + remBirthdate + " is incorrect."); - } - } - - private static SabianePhoneNumberDto createSabianePhoneNumberFromREM(PhoneNumberDto remPhone, Source sabianeSource) { - return new SabianePhoneNumberDto(sabianeSource, remPhone.getFavorite(), remPhone.getNumber()); - } - - protected static List createSabianePhoneList(List remPhones) { - List res = new ArrayList<>(2); - //Get the favorites numbers (excluding interviewers ones) - List favoritesNumeros = - remPhones.stream() - .filter(e -> !REMPhoneSource.INTERVIEWER.equals(e.getSource())) - .filter(e->Boolean.TRUE.equals(e.getFavorite())) - .toList(); - - //INTERVIEWER : Keep all phones numbers - remPhones.stream() - .filter(e -> REMPhoneSource.INTERVIEWER.equals(e.getSource())) - .forEach(phoneNumberDto -> res.add(createSabianePhoneNumberFromREM(phoneNumberDto, Source.INTERVIEWER))); - - - List nonInterviewerNonFavoriteByPriority = - remPhones.stream() - .filter(e->Boolean.FALSE.equals(e.getFavorite())) - //Discard interviewer as they are handled just before - .filter(phoneNumberDto -> !(phoneNumberDto.getSource().equals(REMPhoneSource.INTERVIEWER))) - .sorted(Comparator.comparingInt(obj -> { - //Selection priority order INITIAL>DIRECTORY>OTHER - switch (obj.getSource()) { - case INITIAL: - return 0; - case DIRECTORY: - return 1; - case OTHER: - return 2; - default: - return 3; // Handle other cases if necessary - } - })) - .collect(Collectors.toCollection(ArrayList::new));//Must be mutable - - switch (favoritesNumeros.size()) { - case 0://no favorite number : FILL FISCAL and DIRECTORY using priority (initial, directory, other) - if (!nonInterviewerNonFavoriteByPriority.isEmpty()) { - PhoneNumberDto remInitialNonFavorite = nonInterviewerNonFavoriteByPriority.remove(0); - res.add(createSabianePhoneNumberFromREM(remInitialNonFavorite, Source.FISCAL)); - } - if (!nonInterviewerNonFavoriteByPriority.isEmpty()) { - PhoneNumberDto remInitialNonFavorite = nonInterviewerNonFavoriteByPriority.remove(0); - res.add(createSabianePhoneNumberFromREM(remInitialNonFavorite, Source.DIRECTORY)); - } - break; - case 1: - res.add(createSabianePhoneNumberFromREM(favoritesNumeros.get(0), Source.FISCAL)); - if (!nonInterviewerNonFavoriteByPriority.isEmpty()) { - PhoneNumberDto remInitialNonFavorite = nonInterviewerNonFavoriteByPriority.remove(0); - res.add(createSabianePhoneNumberFromREM(remInitialNonFavorite, Source.DIRECTORY)); - } - break; - case 2: - res.add(createSabianePhoneNumberFromREM(favoritesNumeros.get(0), Source.FISCAL)); - res.add(createSabianePhoneNumberFromREM(favoritesNumeros.get(1), Source.DIRECTORY)); - break; - default: //More than 2 favorite numbers - throw new IncorrectSUBPMNError("Error while parsing the json retrieved from REM : more than 2 favorite phone number"); - } - return res; - } - - private static SabianePersonDto createSabianePersonFromRemPerson(PersonDto remPerson, Boolean isPrivileged) { - return SabianePersonDto.builder() - .title(convertREMGenderToSabianeCivilityTitle(remPerson.getGender())) - .firstName(remPerson.getFirstName()) - .lastName(remPerson.getLastName()) - .email(remPerson.getEmails().stream().findFirst().map(EmailDto::getMailAddress).orElse("")) - .birthdate(computeSabianeBirthDateFromRem(remPerson.getDateOfBirth())) - .favoriteEmail(Boolean.FALSE).privileged(isPrivileged) - .phoneNumbers(createSabianePhoneList(remPerson.getPhoneNumbers())) - .build(); - } - - protected static SurveyUnitContextDto createSabianeSUContextDto(JsonNode contextRootNode, Long currentPartitionId, JsonNode remSUNode, Boolean isLogement, Boolean priority) { - REMSurveyUnitDto remSurveyUnitDto = PlatineHelper.parseRemSUNode(objectMapper, remSUNode); - Pair> mainAndSecondaryPerson = RemDtoUtils.findContactAndSecondary(remSUNode, remSurveyUnitDto, isLogement); - String id = SabianeIdHelper.computeSabianeID(currentPartitionId.toString(), remSurveyUnitDto.getRepositoryId().toString()); - - List sabianePersons = new ArrayList<>(2); - sabianePersons.add(createSabianePersonFromRemPerson(mainAndSecondaryPerson.getLeft(), true)); //first is privileged - mainAndSecondaryPerson.getRight().ifPresent(personDto -> sabianePersons.add(createSabianePersonFromRemPerson(personDto, false))); - - //Organisation Unit (probably useless in production) - Optional poleGestionOpale = RemDtoUtils.searchAdditionalInformation(RemDtoUtils.REM_ADDITIONALINFOS_POLE_GESTION_OPALE,remSUNode); - - String noGrap = (remSurveyUnitDto.getOtherIdentifier()==null)?null:remSurveyUnitDto.getOtherIdentifier().getNograp(); - return SurveyUnitContextDto.builder() - .id(id) - .persons(sabianePersons) - .address(computeSabianeAdress(remSurveyUnitDto.getAddress(), mainAndSecondaryPerson.getLeft())) - .organizationUnitId(poleGestionOpale.orElse(null)) - .priority(priority) - .campaign(contextRootNode.path(CTX_CAMPAGNE_ID).textValue()) - .sampleIdentifiers( - SampleIdentifiersDto.builder() - .autre("0") - .bs(0) - .ec("0") - .le(0) - .nograp(noGrap).noi(0).nole(0).nolog(0).numfa(0).rges(0).ssech(currentPartitionId).build()) - .states(List.of(StateDto.builder().date(Instant.now().toEpochMilli()).type(StateType.NVM).build())) - .build(); - } - - /** - * @param str the string to parse - * @return l2 and l3 part of an address by splitting {@code str} at 38 char. If {@code str} is null or empty - * return a pair of empty strings - */ - protected static Pair computeL2L3(String str) { - if (str == null || str.isEmpty() || str.isBlank()) { - return Pair.of(StringUtils.EMPTY, StringUtils.EMPTY); - } - if (str.length() <= 38) { - return Pair.of(str, StringUtils.EMPTY); - } - return Pair.of(str.substring(0, 38), str.substring(38)); - } - - /** - * @param remGender - * @return A {@code SabianeTitle} for the passed string (supposedly a rem gender). MISTER if value is 1. MISS in every other case - */ - protected static SabianeTitle convertREMGenderToSabianeCivilityTitle(String remGender) { - if(remGender == null){ - return SabianeTitle.MISS; - } - return switch (remGender) { - //TODO: enable when pass to java 19 (preview in 17) - //case null: - // yield SabianeTitle.MISS; - case "1": - yield SabianeTitle.MISTER; - default: - yield SabianeTitle.MISS; - }; - } - - protected static AddressDto computeSabianeAdress(REMAddressDto remAddressDto, PersonDto contact) { - - //l1 : “M” si REM.person.gender = "1" ; “MME” sinon + “firstName” + “lastName” (pour la personne mise en privileged) - StringBuilder l1Builder = new StringBuilder(convertREMGenderToSabianeCivilityTitle(contact.getGender()).getFrenchCivility()); - l1Builder.append(org.apache.commons.lang3.StringUtils.SPACE); - if(!StringUtils.isBlank(contact.getFirstName())){ - l1Builder.append(contact.getFirstName()); - l1Builder.append(org.apache.commons.lang3.StringUtils.SPACE); - } - if(!StringUtils.isBlank(contact.getLastName())){ - l1Builder.append(contact.getLastName()); - } - String l1=l1Builder.toString().trim(); - - //l2 : partie de “REM.address.addressSupplement” <=38 caractères - //l3 : partie de “REM.address.addressSupplement” > 38 caractères - Pair l2L3 = computeL2L3(remAddressDto.getAddressSupplement()); - String l2 = l2L3.getLeft(); - String l3 = l2L3.getRight(); - - //l4: “REM.address.streetNumber” + “REM.address.repetitionIndex” + “REM.address.streetType” + “REM.address.streetName” - StringBuilder l4Builder = new StringBuilder(); - if(!StringUtils.isBlank(remAddressDto.getStreetNumber())){ - l4Builder.append(remAddressDto.getStreetNumber()); - l4Builder.append(org.apache.commons.lang3.StringUtils.SPACE); - } - if(!StringUtils.isBlank(remAddressDto.getRepetitionIndex())){ - l4Builder.append(remAddressDto.getRepetitionIndex()); - l4Builder.append(org.apache.commons.lang3.StringUtils.SPACE); - } - if(!StringUtils.isBlank(remAddressDto.getStreetType())){ - l4Builder.append(remAddressDto.getStreetType()); - l4Builder.append(org.apache.commons.lang3.StringUtils.SPACE); - } - if(!StringUtils.isBlank(remAddressDto.getStreetName())){ - l4Builder.append(remAddressDto.getStreetName()); - } - String l4 = l4Builder.toString().trim(); - - //l5: “REM.address.specialDistribution” - String l5 = (StringUtils.isBlank(remAddressDto.getSpecialDistribution()) ? "" : remAddressDto.getSpecialDistribution()); - - //l6: “REM.address.zipCode” + “REM.address.cityName” - StringBuilder l6Builder = new StringBuilder(); - if(!StringUtils.isBlank(remAddressDto.getZipCode())){ - l6Builder.append(remAddressDto.getZipCode()); - l6Builder.append(org.apache.commons.lang3.StringUtils.SPACE); - } - if(!StringUtils.isBlank(remAddressDto.getCityName())){ - l6Builder.append(remAddressDto.getCityName()); - } - String l6 = l6Builder.toString().trim(); - - //l7: REM.countryName ou “FRANCE” si null - String l7 = (StringUtils.isBlank(remAddressDto.getCountryName()) ? "FRANCE" : remAddressDto.getCountryName()); - - if(remAddressDto.getLocationHelp()!=null) { - return AddressDto.builder().elevator(remAddressDto.getLocationHelp().getElevator()).building(remAddressDto.getLocationHelp().getBuilding()) - .floor(remAddressDto.getLocationHelp().getFloor()).door(remAddressDto.getLocationHelp().getDoor()).staircase(remAddressDto.getLocationHelp().getStaircase()) - .cityPriorityDistrict(remAddressDto.getLocationHelp().getCityPriorityDistrict()) - .l1(l1).l2(l2).l3(l3).l4(l4).l5(l5).l6(l6).l7(l7).build(); - } - else{ - return AddressDto.builder().l1(l1).l2(l2).l3(l3).l4(l4).l5(l5).l6(l6).l7(l7).build(); - } - } -} diff --git a/src/main/java/fr/insee/protools/backend/service/sabiane/delegate/SabianeQuestionnaireCreateContextTask.java b/src/main/java/fr/insee/protools/backend/service/sabiane/delegate/SabianeQuestionnaireCreateContextTask.java deleted file mode 100644 index 2bcaa0f0..00000000 --- a/src/main/java/fr/insee/protools/backend/service/sabiane/delegate/SabianeQuestionnaireCreateContextTask.java +++ /dev/null @@ -1,86 +0,0 @@ -package fr.insee.protools.backend.service.sabiane.delegate; - -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; -import fr.insee.protools.backend.dto.platine_sabiane_questionnaire.MetadataConstants; -import fr.insee.protools.backend.dto.platine_sabiane_questionnaire.campaign.MetadataValue; -import fr.insee.protools.backend.dto.platine_sabiane_questionnaire.campaign.MetadataValueItem; -import fr.insee.protools.backend.dto.platine_sabiane_questionnaire.campaign.MetadataVariables; -import fr.insee.protools.backend.service.DelegateContextVerifier; -import fr.insee.protools.backend.service.common.platine_sabiane.QuestionnaireHelper; -import fr.insee.protools.backend.service.context.ContextService; -import fr.insee.protools.backend.service.nomenclature.NomenclatureService; -import fr.insee.protools.backend.service.questionnaire_model.QuestionnaireModelService; -import fr.insee.protools.backend.service.sabiane.questionnaire.SabianeQuestionnaireService; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.flowable.engine.delegate.DelegateExecution; -import org.flowable.engine.delegate.JavaDelegate; -import org.springframework.stereotype.Component; - -import java.util.List; -import java.util.Set; - -import static fr.insee.protools.backend.service.context.ContextConstants.*; - -@Slf4j -@Component -@RequiredArgsConstructor -public class SabianeQuestionnaireCreateContextTask implements JavaDelegate, DelegateContextVerifier { - - private final ContextService protoolsContext; - private final ObjectMapper objectMapper; - private final NomenclatureService nomenclatureService; - private final QuestionnaireModelService questionnaireModelService; - private final SabianeQuestionnaireService sabianeQuestionnaireService; - - @Override - public void execute(DelegateExecution execution) { - JsonNode contextRootNode = protoolsContext.getContextByProcessInstance(execution.getProcessInstanceId()); - //check context - checkContextOrThrow(log,execution.getProcessInstanceId(), contextRootNode); - log.info("ProcessInstanceId={} - campagne={}" - ,execution.getProcessInstanceId(),contextRootNode.path(CTX_CAMPAGNE_CONTEXTE).asText()); - - MetadataValue metadataDto = createMetadataDto(contextRootNode); - QuestionnaireHelper.createQuestionnaire(contextRootNode,sabianeQuestionnaireService,nomenclatureService, - questionnaireModelService,execution.getProcessInstanceId(),metadataDto); - - log.debug("ProcessInstanceId={} end",execution.getProcessInstanceId()); - } - - @Override - public Set getContextErrors(JsonNode contextRootNode) { - if(contextRootNode==null){ - return Set.of(String.format("Class=%s : Context is missing ", this.getClass().getSimpleName())); - } - - //Standard verifications (common between platine and sabiane) - Set missingNodes = - QuestionnaireHelper.getCreateCtxContextErrors(contextRootNode); - - //Metadata used by sabiane - Set requiredMetadonnes = - Set.of(CTX_META_LABEL_LONG_OPERATION); - - if (contextRootNode.get(CTX_METADONNEES) != null) { - missingNodes.addAll(DelegateContextVerifier.computeMissingChildrenMessages(requiredMetadonnes,contextRootNode.path(CTX_METADONNEES),getClass())); - } - - return missingNodes; - } - - MetadataValue createMetadataDto(JsonNode contextRootNode){ - JsonNode metadataNode = contextRootNode.path(CTX_METADONNEES); - return MetadataValue.builder() - .value(MetadataVariables.builder() - .variables( - List.of( - new MetadataValueItem(MetadataConstants.Enq_LibelleEnquete,metadataNode.path(CTX_META_LABEL_LONG_OPERATION).asText()) - ) - ) - .inseeContext(contextRootNode.path(CTX_CAMPAGNE_CONTEXTE).asText()) - .build()) - .build(); - } -} diff --git a/src/main/java/fr/insee/protools/backend/service/sabiane/delegate/SabianeQuestionnaireCreateSUTask.java b/src/main/java/fr/insee/protools/backend/service/sabiane/delegate/SabianeQuestionnaireCreateSUTask.java deleted file mode 100644 index 7c559a72..00000000 --- a/src/main/java/fr/insee/protools/backend/service/sabiane/delegate/SabianeQuestionnaireCreateSUTask.java +++ /dev/null @@ -1,36 +0,0 @@ -package fr.insee.protools.backend.service.sabiane.delegate; - -import com.fasterxml.jackson.databind.JsonNode; -import fr.insee.protools.backend.service.DelegateContextVerifier; -import fr.insee.protools.backend.service.common.platine_sabiane.QuestionnaireHelper; -import fr.insee.protools.backend.service.context.ContextService; -import fr.insee.protools.backend.service.sabiane.questionnaire.SabianeQuestionnaireService; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.flowable.engine.delegate.DelegateExecution; -import org.flowable.engine.delegate.JavaDelegate; -import org.springframework.stereotype.Component; - -import java.util.Set; - -@Slf4j -@Component -@RequiredArgsConstructor -public class SabianeQuestionnaireCreateSUTask implements JavaDelegate, DelegateContextVerifier { - - private final ContextService protoolsContext; - private final SabianeQuestionnaireService sabianeQuestionnaireService; - - @Override - public void execute(DelegateExecution execution) { - JsonNode contextRootNode = protoolsContext.getContextByProcessInstance(execution.getProcessInstanceId()); - checkContextOrThrow(log,execution.getProcessInstanceId(), contextRootNode); - QuestionnaireHelper.createSUTaskSabiane(execution,protoolsContext,sabianeQuestionnaireService); - } - - @Override - public Set getContextErrors(JsonNode contextRootNode) { - return QuestionnaireHelper.getCreateSUContextErrorsSabiane(contextRootNode); - } - -} diff --git a/src/main/java/fr/insee/protools/backend/service/sabiane/pilotage/SabianePilotageService.java b/src/main/java/fr/insee/protools/backend/service/sabiane/pilotage/SabianePilotageService.java deleted file mode 100644 index af06cc35..00000000 --- a/src/main/java/fr/insee/protools/backend/service/sabiane/pilotage/SabianePilotageService.java +++ /dev/null @@ -1,53 +0,0 @@ -package fr.insee.protools.backend.service.sabiane.pilotage; - -import fr.insee.protools.backend.dto.sabiane.pilotage.CampaignContextDto; -import fr.insee.protools.backend.dto.sabiane.pilotage.SurveyUnitContextDto; -import fr.insee.protools.backend.httpclients.webclient.WebClientHelper; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.slf4j.event.Level; -import org.springframework.stereotype.Service; - -import java.util.List; - -import static fr.insee.protools.backend.httpclients.configuration.ApiConfigProperties.KNOWN_API.KNOWN_API_SABIANE_PILOTAGE; - - -@Service -@Slf4j -@RequiredArgsConstructor -public class SabianePilotageService { - - private final WebClientHelper webClientHelper; - - public void postCampaign(CampaignContextDto campaignContextDto) { - WebClientHelper.logJson("postCampaign: ",campaignContextDto, log,Level.DEBUG); - - //TODO: This call returns that if campaign already exists : statusCode=400 BAD_REQUEST - contentType=Optional[text/plain;charset=UTF-8] - Campaign with id 'MBG2022X01' already exists - var response = webClientHelper.getWebClient(KNOWN_API_SABIANE_PILOTAGE) - .post() - .uri("/api/campaign") - .bodyValue(campaignContextDto) - .retrieve() - .bodyToMono(String.class) - .block(); - log.trace("postCampaign: campaign={} - response={} ", campaignContextDto.getCampaign(), response); - } - public void postSurveyUnits(List values) { - log.debug("postSurveyUnits - values.size={}", values == null ? 0 : values.size()); - if (values == null) { - log.debug("postSurveyUnits - values==null ==> Nothing to do"); - return; - } - var response = webClientHelper.getWebClient(KNOWN_API_SABIANE_PILOTAGE) - .post() - .uri("/api/survey-units") - .bodyValue(values) - .retrieve() - .bodyToMono(String.class) - .block(); - log.trace("postSurveyUnits - response={} ", response); - } -} - - diff --git a/src/main/java/fr/insee/protools/backend/service/sabiane/questionnaire/SabianeQuestionnaireService.java b/src/main/java/fr/insee/protools/backend/service/sabiane/questionnaire/SabianeQuestionnaireService.java deleted file mode 100644 index dffb5804..00000000 --- a/src/main/java/fr/insee/protools/backend/service/sabiane/questionnaire/SabianeQuestionnaireService.java +++ /dev/null @@ -1,33 +0,0 @@ -package fr.insee.protools.backend.service.sabiane.questionnaire; - -import fr.insee.protools.backend.httpclients.restclient.RestClientHelper; -import fr.insee.protools.backend.service.common.platine_sabiane.QuestionnairePlatineSabianeService; -import fr.insee.protools.backend.httpclients.webclient.WebClientHelper; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.slf4j.Logger; -import org.springframework.stereotype.Service; -import org.springframework.web.client.RestClient; -import org.springframework.web.reactive.function.client.WebClient; - -import static fr.insee.protools.backend.httpclients.configuration.ApiConfigProperties.KNOWN_API.KNOWN_API_SABIANE_QUESTIONNAIRE; - - -@Service -@Slf4j -@RequiredArgsConstructor -public class SabianeQuestionnaireService implements QuestionnairePlatineSabianeService { - private final RestClientHelper restClientHelper; - - @Override - public RestClient restClient() { - return restClientHelper.getRestClient(KNOWN_API_SABIANE_QUESTIONNAIRE); - } - - @Override - public Logger getLogger() { - return log; - } -} - - diff --git a/src/main/java/fr/insee/protools/backend/service/sugoi/SugoiCreateUserListTask.java b/src/main/java/fr/insee/protools/backend/service/sugoi/SugoiCreateUserListTask.java deleted file mode 100644 index 3388238d..00000000 --- a/src/main/java/fr/insee/protools/backend/service/sugoi/SugoiCreateUserListTask.java +++ /dev/null @@ -1,102 +0,0 @@ -package fr.insee.protools.backend.service.sugoi; - -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; -import fr.insee.protools.backend.dto.internal.ProtoolsInterrogationDto; -import fr.insee.protools.backend.dto.sugoi.Habilitation; -import fr.insee.protools.backend.dto.sugoi.User; -import fr.insee.protools.backend.service.DelegateContextVerifier; -import fr.insee.protools.backend.service.context.ContextService; -import fr.insee.protools.backend.service.context.enums.CampaignContextEnum; -import fr.insee.protools.backend.service.utils.FlowableVariableUtils; -import fr.insee.protools.backend.service.utils.password.PasswordService; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.EnumUtils; -import org.flowable.engine.delegate.DelegateExecution; -import org.flowable.engine.delegate.JavaDelegate; -import org.springframework.stereotype.Component; - -import java.util.*; - -import static com.fasterxml.jackson.databind.DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES; -import static fr.insee.protools.backend.service.FlowableVariableNameConstants.*; -import static fr.insee.protools.backend.service.context.ContextConstants.CTX_CAMPAGNE_CONTEXTE; - -@Slf4j -@Component -@RequiredArgsConstructor -public class SugoiCreateUserListTask implements JavaDelegate, DelegateContextVerifier { - - protected static final Habilitation PLATINE_HABILITATION = new Habilitation("platine", "repondant", null); - protected static final User createSugoiUserBody = User.builder().habilitations(List.of(PLATINE_HABILITATION)).build(); - - private final SugoiService sugoiService; - private final PasswordService passwordService; - private final ContextService protoolsContext; - - public static final int householdPasswordSize=8; - public static final int defaultPasswordSize=12; - - private static final ObjectMapper objectMapper = new ObjectMapper().configure(FAIL_ON_UNKNOWN_PROPERTIES,false); - - - @Override - public void execute(DelegateExecution execution) { - log.debug("ProcessInstanceId={} begin", execution.getProcessInstanceId()); - JsonNode contextRootNode = protoolsContext.getContextByProcessInstance(execution.getProcessInstanceId()); - List interrogationList = FlowableVariableUtils.getVariableOrThrow(execution, VARNAME_REM_INTERRO_LIST, List.class); - - checkContextOrThrow(log,execution.getProcessInstanceId(), contextRootNode); - int passwordSize = getPasswordSize(contextRootNode); - - for (ProtoolsInterrogationDto interrogation : interrogationList){ - //Create User - User createdUser = sugoiService.postCreateUsers(createSugoiUserBody); - //init password - String userPassword = passwordService.generatePassword(passwordSize); - sugoiService.postInitPassword(createdUser.getUsername(), userPassword); - - //TODO : bidouille à supprimer (à la cible on met à jour REM) - interrogation.setWebConnectionId(createdUser.getUsername()); - - interrogation.setWebPassword(userPassword); - log.debug("ProcessInstanceId={} - username={} ", createdUser.getUsername()); - } - - execution.setVariableLocal(VARNAME_REM_INTERRO_LIST, interrogationList); - log.info("ProcessInstanceId={} - size={} end", execution.getProcessInstanceId(), interrogationList.size()); - } - - public static int getPasswordSize(JsonNode contextRootNode){ - String contexte=contextRootNode.path(CTX_CAMPAGNE_CONTEXTE).asText(); - CampaignContextEnum contextEnum = CampaignContextEnum.fromLabel(contexte); - if(CampaignContextEnum.HOUSEHOLD.equals(contextEnum)){ - return householdPasswordSize; - } - return defaultPasswordSize; - } - - @Override - public Set getContextErrors(JsonNode contextRootNode) { - if(contextRootNode==null){ - return Set.of("Context is missing"); - } - Set results=new HashSet<>(); - Set requiredNodes = - Set.of( - //Global & Campaign - CTX_CAMPAGNE_CONTEXTE - ); - - results.addAll(DelegateContextVerifier.computeMissingChildrenMessages(requiredNodes,contextRootNode,getClass())); - - String contexte = contextRootNode.path(CTX_CAMPAGNE_CONTEXTE).asText(); - if(! EnumUtils.isValidEnumIgnoreCase(CampaignContextEnum.class, contexte)){ - results.add(DelegateContextVerifier.computeIncorrectEnumMessage(CTX_CAMPAGNE_CONTEXTE,contexte, Arrays.toString(CampaignContextEnum.values()),getClass())); - } - - return results; - } - -} diff --git a/src/main/java/fr/insee/protools/backend/service/sugoi/SugoiCreateUserTask.java b/src/main/java/fr/insee/protools/backend/service/sugoi/SugoiCreateUserTask.java deleted file mode 100644 index 566db79e..00000000 --- a/src/main/java/fr/insee/protools/backend/service/sugoi/SugoiCreateUserTask.java +++ /dev/null @@ -1,93 +0,0 @@ -package fr.insee.protools.backend.service.sugoi; - -import com.fasterxml.jackson.databind.JsonNode; -import fr.insee.protools.backend.dto.sugoi.Habilitation; -import fr.insee.protools.backend.dto.sugoi.User; -import fr.insee.protools.backend.service.DelegateContextVerifier; -import fr.insee.protools.backend.service.context.ContextService; -import fr.insee.protools.backend.service.context.enums.CampaignContextEnum; -import fr.insee.protools.backend.service.utils.password.PasswordService; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.EnumUtils; -import org.flowable.engine.delegate.DelegateExecution; -import org.flowable.engine.delegate.JavaDelegate; -import org.springframework.stereotype.Component; - -import java.util.Arrays; -import java.util.HashSet; -import java.util.List; -import java.util.Set; - -import static fr.insee.protools.backend.service.FlowableVariableNameConstants.VARNAME_DIRECTORYACCESS_ID_CONTACT; -import static fr.insee.protools.backend.service.FlowableVariableNameConstants.VARNAME_DIRECTORYACCESS_PWD_CONTACT; -import static fr.insee.protools.backend.service.context.ContextConstants.CTX_CAMPAGNE_CONTEXTE; - -@Slf4j -@Component -@RequiredArgsConstructor -public class SugoiCreateUserTask implements JavaDelegate, DelegateContextVerifier { - - protected static final Habilitation PLATINE_HABILITATION = new Habilitation("platine", "repondant", null); - protected static final User createSugoiUserBody = User.builder().habilitations(List.of(PLATINE_HABILITATION)).build(); - - private final SugoiService sugoiService; - private final PasswordService passwordService; - private final ContextService protoolsContext; - - public static final int householdPasswordSize=8; - public static final int defaultPasswordSize=12; - - - @Override - public void execute(DelegateExecution execution) { - log.debug("ProcessInstanceId={} begin", execution.getProcessInstanceId()); - JsonNode contextRootNode = protoolsContext.getContextByProcessInstance(execution.getProcessInstanceId()); - checkContextOrThrow(log,execution.getProcessInstanceId(), contextRootNode); - int passwordSize = getPasswordSize(contextRootNode); - - //Create User - User createdUser = sugoiService.postCreateUsers(createSugoiUserBody); - //init password - String userPassword = passwordService.generatePassword(passwordSize); - sugoiService.postInitPassword(createdUser.getUsername(), userPassword); - - execution.setVariableLocal(VARNAME_DIRECTORYACCESS_ID_CONTACT, createdUser.getUsername()); - //TODO : find a way to not store password in protools variables - execution.setVariableLocal(VARNAME_DIRECTORYACCESS_PWD_CONTACT, userPassword); - - log.info("ProcessInstanceId={} username={} end", execution.getProcessInstanceId(), createdUser.getUsername()); - } - - public static int getPasswordSize(JsonNode contextRootNode){ - String contexte=contextRootNode.path(CTX_CAMPAGNE_CONTEXTE).asText(); - CampaignContextEnum contextEnum = CampaignContextEnum.fromLabel(contexte); - if(CampaignContextEnum.HOUSEHOLD.equals(contextEnum)){ - return householdPasswordSize; - } - return defaultPasswordSize; - } - - @Override - public Set getContextErrors(JsonNode contextRootNode) { - if(contextRootNode==null){ - return Set.of("Context is missing"); - } - Set results=new HashSet<>(); - Set requiredNodes = - Set.of( - //Global & Campaign - CTX_CAMPAGNE_CONTEXTE - ); - - results.addAll(DelegateContextVerifier.computeMissingChildrenMessages(requiredNodes,contextRootNode,getClass())); - - String contexte = contextRootNode.path(CTX_CAMPAGNE_CONTEXTE).asText(); - if(! EnumUtils.isValidEnumIgnoreCase(CampaignContextEnum.class, contexte)){ - results.add(DelegateContextVerifier.computeIncorrectEnumMessage(CTX_CAMPAGNE_CONTEXTE,contexte, Arrays.toString(CampaignContextEnum.values()),getClass())); - } - - return results; - } - -} diff --git a/src/main/java/fr/insee/protools/backend/service/sugoi/SugoiService.java b/src/main/java/fr/insee/protools/backend/service/sugoi/SugoiService.java index caa9ef36..d38ba651 100644 --- a/src/main/java/fr/insee/protools/backend/service/sugoi/SugoiService.java +++ b/src/main/java/fr/insee/protools/backend/service/sugoi/SugoiService.java @@ -3,16 +3,16 @@ import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.node.ObjectNode; import fr.insee.protools.backend.dto.sugoi.User; +import fr.insee.protools.backend.restclient.RestClientHelper; +import fr.insee.protools.backend.restclient.exception.runtime.HttpClient4xxBPMNError; import fr.insee.protools.backend.service.exception.UsernameAlreadyExistsSugoiBPMNError; -import fr.insee.protools.backend.httpclients.webclient.WebClientHelper; -import fr.insee.protools.backend.httpclients.exception.runtime.HttpClient4xxBPMNError; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; import org.springframework.http.HttpStatus; import org.springframework.stereotype.Service; -import static fr.insee.protools.backend.httpclients.configuration.ApiConfigProperties.KNOWN_API.KNOWN_API_SUGOI; +import static fr.insee.protools.backend.restclient.configuration.ApiConfigProperties.KNOWN_API.KNOWN_API_SUGOI; @Service @Slf4j @@ -21,7 +21,7 @@ public class SugoiService { //TODO: a quel niveau configure on ça? static final String STORAGE = "default"; - private final WebClientHelper webClientHelper; + private final RestClientHelper restClientHelper; private final ObjectMapper objectMapper; @Value("${fr.insee.protools.api.sugoi.dmz-account-creation-realm:questionnaire-particuliers}") private String realm; @@ -29,15 +29,14 @@ public class SugoiService { public User postCreateUsers(User userBody) { log.debug("postCreateUsers"); try { - User userCreated = webClientHelper.getWebClient(KNOWN_API_SUGOI) + User userCreated = restClientHelper.getRestClient(KNOWN_API_SUGOI) .post() .uri(uriBuilder -> uriBuilder .path("/realms/{realm}/storages/{storage}/users") .build(realm, STORAGE)) - .bodyValue(userBody) + .body(userBody) .retrieve() - .bodyToMono(User.class) - .block(); + .body(User.class); log.info("postCreateUsers - response={} ", userCreated); return userCreated; } catch (HttpClient4xxBPMNError e) { @@ -58,16 +57,15 @@ public void postInitPassword(String userId, String password) { log.debug("postInitPassword - userId={} begin", userId); ObjectNode body = objectMapper.createObjectNode(); body.put("password", password); - webClientHelper.getWebClient(KNOWN_API_SUGOI) + restClientHelper.getRestClient(KNOWN_API_SUGOI) .post() .uri(uriBuilder -> uriBuilder .path("/realms/{realm}/users/{id}/init-password") .queryParam("change-password-reset-status", true) .build(realm, userId)) - .bodyValue(body) + .body(body) .retrieve() - .toBodilessEntity() - .block(); + .toBodilessEntity(); log.info("postInitPassword - userId={} end", userId); } } diff --git a/src/main/java/fr/insee/protools/backend/service/sugoi/v2/CleanPasswordsTask.java b/src/main/java/fr/insee/protools/backend/service/sugoi/delegate/CleanPasswordsTask.java similarity index 88% rename from src/main/java/fr/insee/protools/backend/service/sugoi/v2/CleanPasswordsTask.java rename to src/main/java/fr/insee/protools/backend/service/sugoi/delegate/CleanPasswordsTask.java index f5a6f402..59358818 100644 --- a/src/main/java/fr/insee/protools/backend/service/sugoi/v2/CleanPasswordsTask.java +++ b/src/main/java/fr/insee/protools/backend/service/sugoi/delegate/CleanPasswordsTask.java @@ -1,4 +1,4 @@ -package fr.insee.protools.backend.service.sugoi.v2; +package fr.insee.protools.backend.service.sugoi.delegate; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -14,11 +14,10 @@ import java.util.List; -import static fr.insee.protools.backend.service.FlowableVariableNameConstants.VARNAME_DIRECTORYACCESS_PWD_CONTACT; import static fr.insee.protools.backend.service.FlowableVariableNameConstants.VARNAME_DIRECTORYACCESS_PWD_FOR_INTERRO_ID_MAP; /** - * Suprime la variable mot de passe et supprime aussi toutes les occurences de l'historique + * Supprime tous les mots de passe et toutes les occurences de l'historique */ @Slf4j @Component diff --git a/src/main/java/fr/insee/protools/backend/service/sugoi/CleanUserPasswordTask.java b/src/main/java/fr/insee/protools/backend/service/sugoi/delegate/CleanUserPasswordTask.java similarity index 93% rename from src/main/java/fr/insee/protools/backend/service/sugoi/CleanUserPasswordTask.java rename to src/main/java/fr/insee/protools/backend/service/sugoi/delegate/CleanUserPasswordTask.java index 5e52c048..ac91edc2 100644 --- a/src/main/java/fr/insee/protools/backend/service/sugoi/CleanUserPasswordTask.java +++ b/src/main/java/fr/insee/protools/backend/service/sugoi/delegate/CleanUserPasswordTask.java @@ -1,4 +1,4 @@ -package fr.insee.protools.backend.service.sugoi; +package fr.insee.protools.backend.service.sugoi.delegate; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -17,7 +17,7 @@ import static fr.insee.protools.backend.service.FlowableVariableNameConstants.VARNAME_DIRECTORYACCESS_PWD_CONTACT; /** - * Suprime la variable mot de passe et supprime aussi toutes les occurences de l'historique + * Supprime la variable mot de passe et supprime aussi toutes les occurences de l'historique */ @Slf4j @Component diff --git a/src/main/java/fr/insee/protools/backend/service/sugoi/LogTask.java b/src/main/java/fr/insee/protools/backend/service/sugoi/delegate/LogCredentialsTask.java similarity index 85% rename from src/main/java/fr/insee/protools/backend/service/sugoi/LogTask.java rename to src/main/java/fr/insee/protools/backend/service/sugoi/delegate/LogCredentialsTask.java index ac48f830..9c63551d 100644 --- a/src/main/java/fr/insee/protools/backend/service/sugoi/LogTask.java +++ b/src/main/java/fr/insee/protools/backend/service/sugoi/delegate/LogCredentialsTask.java @@ -1,4 +1,4 @@ -package fr.insee.protools.backend.service.sugoi; +package fr.insee.protools.backend.service.sugoi.delegate; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -8,13 +8,10 @@ import org.flowable.engine.impl.cfg.ProcessEngineConfigurationImpl; import org.flowable.variable.api.history.HistoricVariableInstance; import org.flowable.variable.api.history.HistoricVariableInstanceQuery; -import org.flowable.variable.service.HistoricVariableService; -import org.flowable.variable.service.impl.persistence.entity.HistoricVariableInstanceEntity; import org.springframework.stereotype.Component; import java.util.HashSet; import java.util.List; -import java.util.Map; import java.util.Set; import static fr.insee.protools.backend.service.FlowableVariableNameConstants.VARNAME_DIRECTORYACCESS_PWD_CONTACT; @@ -25,7 +22,7 @@ @Slf4j @Component @RequiredArgsConstructor -public class LogTask implements JavaDelegate { +public class LogCredentialsTask implements JavaDelegate { private final ProcessEngineConfigurationImpl processEngineConfiguration; diff --git a/src/main/java/fr/insee/protools/backend/service/sugoi/v2/SugoiREMCreateUserListTask.java b/src/main/java/fr/insee/protools/backend/service/sugoi/delegate/SugoiREMCreateMissingAccountListTask.java similarity index 68% rename from src/main/java/fr/insee/protools/backend/service/sugoi/v2/SugoiREMCreateUserListTask.java rename to src/main/java/fr/insee/protools/backend/service/sugoi/delegate/SugoiREMCreateMissingAccountListTask.java index f3a3087b..58c6de64 100644 --- a/src/main/java/fr/insee/protools/backend/service/sugoi/v2/SugoiREMCreateUserListTask.java +++ b/src/main/java/fr/insee/protools/backend/service/sugoi/delegate/SugoiREMCreateMissingAccountListTask.java @@ -1,8 +1,7 @@ -package fr.insee.protools.backend.service.sugoi.v2; +package fr.insee.protools.backend.service.sugoi.delegate; import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; -import fr.insee.protools.backend.dto.internal.ProtoolsInterrogationDto; +import fr.insee.protools.backend.dto.ContexteProcessus; import fr.insee.protools.backend.dto.sugoi.Habilitation; import fr.insee.protools.backend.dto.sugoi.User; import fr.insee.protools.backend.service.DelegateContextVerifier; @@ -15,21 +14,20 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.EnumUtils; -import org.apache.commons.lang3.tuple.Pair; import org.flowable.engine.delegate.DelegateExecution; import org.flowable.engine.delegate.JavaDelegate; import org.springframework.stereotype.Component; import java.util.*; -import static com.fasterxml.jackson.databind.DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES; -import static fr.insee.protools.backend.service.FlowableVariableNameConstants.*; +import static fr.insee.protools.backend.service.FlowableVariableNameConstants.VARNAME_CURRENT_PARTITION_ID; +import static fr.insee.protools.backend.service.FlowableVariableNameConstants.VARNAME_DIRECTORYACCESS_PWD_FOR_INTERRO_ID_MAP; import static fr.insee.protools.backend.service.context.ContextConstants.CTX_CAMPAGNE_CONTEXTE; @Slf4j @Component @RequiredArgsConstructor -public class SugoiREMCreateUserListTask implements JavaDelegate, DelegateContextVerifier { +public class SugoiREMCreateMissingAccountListTask implements JavaDelegate, DelegateContextVerifier { protected static final Habilitation PLATINE_HABILITATION = new Habilitation("platine", "repondant", null); protected static final User createSugoiUserBody = User.builder().habilitations(List.of(PLATINE_HABILITATION)).build(); @@ -40,22 +38,22 @@ public class SugoiREMCreateUserListTask implements JavaDelegate, DelegateContext private final PasswordService passwordService; private final ContextService protoolsContext; - public static final int householdPasswordSize=8; - public static final int defaultPasswordSize=12; + public static final int HOUSEHOLD_PASSWORD_SIZE=8; + public static final int DEFAULT_PASSWORD_SIZE=12; @Override public void execute(DelegateExecution execution) { log.debug("ProcessInstanceId={} begin", execution.getProcessInstanceId()); - JsonNode contextRootNode = protoolsContext.getContextByProcessInstance(execution.getProcessInstanceId()); - Long currentLotId = FlowableVariableUtils.getVariableOrThrow(execution, VARNAME_CURRENT_PARTITION_ID, Long.class); - checkContextOrThrow(log,execution.getProcessInstanceId(), contextRootNode); - Long[] interrogationIdsWithoutAccount = remService.getInterrogationIdsWithoutAccountForLot(currentLotId); + var context = protoolsContext.getContextDtoByProcessInstance(execution.getProcessInstanceId()); + String currentPartitionId = FlowableVariableUtils.getVariableOrThrow(execution, VARNAME_CURRENT_PARTITION_ID, String.class); + checkContextOrThrow(log,execution.getProcessInstanceId(), context); + List interrogationIdsWithoutAccount = remService.getInterrogationIdsWithoutAccountForPartition(currentPartitionId); - Map userByInterroId = new LinkedHashMap<>(interrogationIdsWithoutAccount.length); - Map pwdByInterroId = new LinkedHashMap<>(interrogationIdsWithoutAccount.length); + Map userByInterroId = new LinkedHashMap<>(interrogationIdsWithoutAccount.size()); + Map pwdByInterroId = new LinkedHashMap<>(interrogationIdsWithoutAccount.size()); - int passwordSize = getPasswordSize(contextRootNode); - for (Long interrogationId : interrogationIdsWithoutAccount){ + int passwordSize = getPasswordSize(context); + for (String interrogationId : interrogationIdsWithoutAccount){ //Create User User createdUser = sugoiService.postCreateUsers(createSugoiUserBody); //init password @@ -72,13 +70,11 @@ public void execute(DelegateExecution execution) { log.info("ProcessInstanceId={} - size={} end", execution.getProcessInstanceId(), userByInterroId.size()); } - public static int getPasswordSize(JsonNode contextRootNode){ - String contexte=contextRootNode.path(CTX_CAMPAGNE_CONTEXTE).asText(); - CampaignContextEnum contextEnum = CampaignContextEnum.fromLabel(contexte); - if(CampaignContextEnum.HOUSEHOLD.equals(contextEnum)){ - return householdPasswordSize; + public static int getPasswordSize(ContexteProcessus context){ + if(context.getContexte().equals(ContexteProcessus.Contexte.MENAGE)){ + return HOUSEHOLD_PASSWORD_SIZE; } - return defaultPasswordSize; + return DEFAULT_PASSWORD_SIZE; } @Override diff --git a/src/main/java/fr/insee/protools/backend/service/traiterXXXX/TraiterXXXService.java b/src/main/java/fr/insee/protools/backend/service/traiterXXXX/TraiterXXXService.java new file mode 100644 index 00000000..65e52300 --- /dev/null +++ b/src/main/java/fr/insee/protools/backend/service/traiterXXXX/TraiterXXXService.java @@ -0,0 +1,47 @@ +package fr.insee.protools.backend.service.traiterXXXX; + +import com.fasterxml.jackson.databind.JsonNode; +import fr.insee.protools.backend.restclient.RestClientHelper; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.core.ParameterizedTypeReference; +import org.springframework.stereotype.Service; + +import java.util.List; + +import static fr.insee.protools.backend.restclient.configuration.ApiConfigProperties.KNOWN_API.KNOWN_API_TRAITERXXX; + +@Service +@Slf4j +@RequiredArgsConstructor +public class TraiterXXXService { + + private final RestClientHelper restClientHelper; + + public List getRemiseEnCollecteForPartition(String partitionId) { + log.debug("getRemiseEnCollecteForPartition - partitionId={} ",partitionId); + ParameterizedTypeReference> typeReference = new ParameterizedTypeReference<>() { }; + + List response = restClientHelper.getRestClient(KNOWN_API_TRAITERXXX) + .get() + .uri(uriBuilder -> uriBuilder + .path("remise-en-collecte") + .queryParam("partition_id", partitionId) + .build()) + .retrieve() + .body(typeReference); + log.trace("getRemiseEnCollecteForPartition={} - response={} ", partitionId, response); + return response; + } + + public void postContext(String campaignId,JsonNode contextRootNode) { + log.trace("postContext: campaignId={}",campaignId); + var response = restClientHelper.getRestClient(KNOWN_API_TRAITERXXX) + .post() + .uri("/context") + .body(contextRootNode) + .retrieve() + .body(String.class); + log.trace("postContext: campaignId={} - response={} ",campaignId,response); + } +} diff --git a/src/main/java/fr/insee/protools/backend/service/traiterXXXX/delegate/TraiterXXXCreateContextTaskREST.java b/src/main/java/fr/insee/protools/backend/service/traiterXXXX/delegate/TraiterXXXCreateContextTaskREST.java new file mode 100644 index 00000000..9d890c3f --- /dev/null +++ b/src/main/java/fr/insee/protools/backend/service/traiterXXXX/delegate/TraiterXXXCreateContextTaskREST.java @@ -0,0 +1,34 @@ +package fr.insee.protools.backend.service.traiterXXXX.delegate; + +import com.fasterxml.jackson.databind.JsonNode; +import fr.insee.protools.backend.service.DelegateContextVerifier; +import fr.insee.protools.backend.service.context.ContextService; +import fr.insee.protools.backend.service.traiterXXXX.TraiterXXXService; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.JavaDelegate; +import org.springframework.stereotype.Component; + +import static fr.insee.protools.backend.service.context.ContextConstants.CTX_CAMPAGNE_ID; + +@Slf4j +@RequiredArgsConstructor +@Component +public class TraiterXXXCreateContextTaskREST implements JavaDelegate, DelegateContextVerifier { + private final ContextService protoolsContext; + private final TraiterXXXService service; + + @Override + public void execute(DelegateExecution execution) { + log.info("ProcessInstanceId={} begin",execution.getProcessInstanceId()); + JsonNode contextRootNode = protoolsContext.getContextJsonNodeByProcessInstance(execution.getProcessInstanceId()); + String campainId = contextRootNode.path(CTX_CAMPAGNE_ID).asText(); + + checkContextOrThrow(log,execution.getProcessInstanceId(), contextRootNode); + service.postContext(campainId,contextRootNode); + + log.info("ProcessInstanceId={} end",execution.getProcessInstanceId()); + + } +} diff --git a/src/main/java/fr/insee/protools/backend/service/traiterXXXX/delegate/TraiterXXXGetRemiseEnCollecteTaskREST.java b/src/main/java/fr/insee/protools/backend/service/traiterXXXX/delegate/TraiterXXXGetRemiseEnCollecteTaskREST.java new file mode 100644 index 00000000..1e1d44e3 --- /dev/null +++ b/src/main/java/fr/insee/protools/backend/service/traiterXXXX/delegate/TraiterXXXGetRemiseEnCollecteTaskREST.java @@ -0,0 +1,36 @@ +package fr.insee.protools.backend.service.traiterXXXX.delegate; + +import com.fasterxml.jackson.databind.JsonNode; +import fr.insee.protools.backend.service.DelegateContextVerifier; +import fr.insee.protools.backend.service.traiterXXXX.TraiterXXXService; +import fr.insee.protools.backend.service.utils.FlowableVariableUtils; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.JavaDelegate; +import org.springframework.stereotype.Component; + +import java.util.List; + +import static fr.insee.protools.backend.service.FlowableVariableNameConstants.VARNAME_CURRENT_PARTITION_ID; +import static fr.insee.protools.backend.service.FlowableVariableNameConstants.VARNAME_INTERRO_REMISE_EN_COLLECTE_LIST; + +@Slf4j +@RequiredArgsConstructor +@Component +public class TraiterXXXGetRemiseEnCollecteTaskREST implements JavaDelegate, DelegateContextVerifier { + private final TraiterXXXService service; + + @Override + public void execute(DelegateExecution execution) { + String currentPartitionId = FlowableVariableUtils.getVariableOrThrow(execution, VARNAME_CURRENT_PARTITION_ID, String.class); + log.info("ProcessInstanceId={} begin",execution.getProcessInstanceId()); + + + List interroRemiseEnCollecteList = service.getRemiseEnCollecteForPartition(currentPartitionId); + execution.getParent().setVariableLocal(VARNAME_INTERRO_REMISE_EN_COLLECTE_LIST,interroRemiseEnCollecteList); + + log.info("ProcessInstanceId={} end",execution.getProcessInstanceId()); + + } +} diff --git a/src/main/java/fr/insee/protools/backend/service/utils/ContextUtils.java b/src/main/java/fr/insee/protools/backend/service/utils/ContextUtils.java deleted file mode 100644 index f20a9d50..00000000 --- a/src/main/java/fr/insee/protools/backend/service/utils/ContextUtils.java +++ /dev/null @@ -1,77 +0,0 @@ -package fr.insee.protools.backend.service.utils; - -import com.fasterxml.jackson.databind.JsonNode; -import fr.insee.protools.backend.service.exception.IncoherentBPMNContextError; -import org.apache.commons.collections4.IteratorUtils; -import org.flowable.common.engine.api.FlowableIllegalArgumentException; - -import java.util.ArrayList; -import java.util.List; -import java.util.Optional; -import java.util.stream.StreamSupport; - -import static fr.insee.protools.backend.service.context.ContextConstants.*; - -//TODO : à déplacer dans ContextService?? -public class ContextUtils { - - //TODO: supprimer?? - //Search for the current partition in the contexte. - public static JsonNode getCurrentPartitionNode(JsonNode contextRootNode, Long currentPartitionId) { - JsonNode currentPartitionNode=null; - // Search for the correct partition based on it's ID - for (JsonNode subNode : contextRootNode.path(CTX_PARTITIONS)) { - if (subNode.has(CTX_PARTITION_ID) && subNode.get(CTX_PARTITION_ID).asLong()==currentPartitionId) { - currentPartitionNode = subNode; - break; - } - } - if (currentPartitionNode == null) { - throw new FlowableIllegalArgumentException(String.format("Partition id=[%d] not found in contexte", currentPartitionId)); - } - return currentPartitionNode; - } - - - public static Optional getPartitionNodeIfExists(JsonNode contextRootNode, String partitionId) { - JsonNode currentPartitionNode=null; - // Search for the correct partition based on it's ID - for (JsonNode subNode : contextRootNode.path(CTX_PARTITIONS)) { - if (subNode.has(CTX_PARTITION_ID) && subNode.get(CTX_PARTITION_ID).asText().equals(partitionId)) { - currentPartitionNode = subNode; - break; - } - } - return Optional.ofNullable(currentPartitionNode); - } - - public static Optional getCommunicationFromPartition(JsonNode contextRootNode,String partitionId, String communicationId){ - return getPartitionNodeIfExists(contextRootNode,partitionId) - .map(partitionNode -> getCommunicationFromPartition(partitionNode,communicationId)) - .orElse(Optional.empty()); - } - - public static Optional getCommunicationFromPartition(JsonNode partitionNode, String communicationId){ - var communicationsIterator = partitionNode.path(CTX_PARTITION_COMMUNICATIONS).elements(); - return StreamSupport.stream(((Iterable) () -> communicationsIterator).spliterator(), false) - .filter(node -> node.path(CTX_PARTITION_COMMUNICATION_ID).asText().equals(communicationId)) - .findFirst(); - } - - - public static List getCommunicationsFromPartition(JsonNode contextRootNode, String partitionId) { - Optional partitionNode = getPartitionNodeIfExists(contextRootNode, partitionId); - return partitionNode.map( - partNode -> { - var communicationIterator = partNode.path(CTX_PARTITION_COMMUNICATIONS).elements(); - return IteratorUtils.toList(communicationIterator); - }) - .orElse(new ArrayList<>()); - } - - public static List getCommunicationsFromPartition(JsonNode partitionNode) { - return IteratorUtils.toList(partitionNode.path(CTX_PARTITION_COMMUNICATIONS).elements()); - } - - private ContextUtils(){} -} diff --git a/src/main/java/fr/insee/protools/backend/service/utils/delegate/DefaultCallServiceInterroListTask.java b/src/main/java/fr/insee/protools/backend/service/utils/delegate/DefaultCallServiceInterroListTask.java index 73160c0c..2bb3de53 100644 --- a/src/main/java/fr/insee/protools/backend/service/utils/delegate/DefaultCallServiceInterroListTask.java +++ b/src/main/java/fr/insee/protools/backend/service/utils/delegate/DefaultCallServiceInterroListTask.java @@ -1,6 +1,7 @@ package fr.insee.protools.backend.service.utils.delegate; import com.fasterxml.jackson.databind.JsonNode; +import fr.insee.protools.backend.dto.ContexteProcessus; import fr.insee.protools.backend.dto.internal.ProtoolsInterrogationDto; import fr.insee.protools.backend.service.DelegateContextVerifier; import fr.insee.protools.backend.service.context.ContextService; @@ -16,7 +17,6 @@ import static fr.insee.protools.backend.service.FlowableVariableNameConstants.VARNAME_CURRENT_PARTITION_ID; import static fr.insee.protools.backend.service.FlowableVariableNameConstants.VARNAME_REM_INTERRO_LIST; -import static fr.insee.protools.backend.service.context.ContextConstants.CTX_CAMPAGNE_ID; @Slf4j @@ -28,27 +28,26 @@ public abstract class DefaultCallServiceInterroListTask implements JavaDelegate, private final ContextService protoolsContext; // Abstract method for the specific service action - protected abstract void serviceAction(String campaignId,List list,String ... params); - protected void callService(DelegateExecution execution, JsonNode contextRootNode, String campaignId,List list){ - serviceAction(campaignId,list); + protected abstract void serviceAction(ContexteProcessus context,List list,String ... params); + protected void callService(DelegateExecution execution, ContexteProcessus context, List list){ + serviceAction(context,list); } @Override public void execute(DelegateExecution execution) { - JsonNode contextRootNode = protoolsContext.getContextByProcessInstance(execution.getProcessInstanceId()); - checkContextOrThrow(log,execution.getProcessInstanceId(), contextRootNode); + ContexteProcessus context = protoolsContext.getContextDtoByProcessInstance(execution.getProcessInstanceId()); + checkContextOrThrow(log,execution.getProcessInstanceId(), context); - String campainId = contextRootNode.path(CTX_CAMPAGNE_ID).asText(); - Long currentPartitionId = FlowableVariableUtils.getVariableOrThrow(execution, VARNAME_CURRENT_PARTITION_ID, Long.class); + String currentPartitionId = FlowableVariableUtils.getVariableOrThrow(execution, VARNAME_CURRENT_PARTITION_ID, String.class); List protoolsInterrogationList = FlowableVariableUtils.getVariableOrThrow(execution, VARNAME_REM_INTERRO_LIST, List.class); List interrogationList = protoolsInterrogationList.stream() .map(protoolsInterrogationDto -> { log.trace("ProcessInstanceId={} - campainId={} - currentPartitionId={} - idInterrogation={}", - execution.getProcessInstanceId(),campainId,currentPartitionId,protoolsInterrogationDto.getIdInterrogation()); + execution.getProcessInstanceId(),context.getId(),currentPartitionId,protoolsInterrogationDto.getIdInterrogation()); return protoolsInterrogationDto.getRemInterrogation(); }) .toList(); - callService(execution,contextRootNode,campainId,interrogationList); + callService(execution,context,interrogationList); } } diff --git a/src/main/java/fr/insee/protools/backend/service/utils/delegate/PaginationHelper.java b/src/main/java/fr/insee/protools/backend/service/utils/delegate/PaginationHelper.java index 8cf8b6a0..a0b10d67 100644 --- a/src/main/java/fr/insee/protools/backend/service/utils/delegate/PaginationHelper.java +++ b/src/main/java/fr/insee/protools/backend/service/utils/delegate/PaginationHelper.java @@ -1,7 +1,7 @@ package fr.insee.protools.backend.service.utils.delegate; import com.fasterxml.jackson.databind.JsonNode; -import fr.insee.protools.backend.httpclients.pagination.PageResponse; +import fr.insee.protools.backend.restclient.pagination.PageResponse; import fr.insee.protools.backend.service.exception.PageableAPIBPMNError; import fr.insee.protools.backend.service.utils.FlowableVariableUtils; import org.flowable.engine.delegate.DelegateExecution; diff --git a/src/main/resources/processes/proto_platine_pagination_v1.bpmn b/src/main/resources/processes/proto_platine_pagination_v1.bpmn new file mode 100644 index 00000000..da43934c --- /dev/null +++ b/src/main/resources/processes/proto_platine_pagination_v1.bpmn @@ -0,0 +1,302 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/test/backup/java/fr/insee/protools/backend/StarterApplicationTests.java b/src/test/backup/java/fr/insee/protools/backend/StarterApplicationTests.java new file mode 100644 index 00000000..cd7751a1 --- /dev/null +++ b/src/test/backup/java/fr/insee/protools/backend/StarterApplicationTests.java @@ -0,0 +1,8 @@ +package fr.insee.protools.backend; + +//@SpringBootTest class StarterApplicationTests { +// +// @Test void contextLoads() { +// } + +//} diff --git a/src/test/java/fr/insee/protools/backend/controller/StarterControllerTest.java b/src/test/backup/java/fr/insee/protools/backend/controller/StarterControllerTest.java similarity index 94% rename from src/test/java/fr/insee/protools/backend/controller/StarterControllerTest.java rename to src/test/backup/java/fr/insee/protools/backend/controller/StarterControllerTest.java index 441eaf2e..8e79362b 100644 --- a/src/test/java/fr/insee/protools/backend/controller/StarterControllerTest.java +++ b/src/test/backup/java/fr/insee/protools/backend/controller/StarterControllerTest.java @@ -1,6 +1,6 @@ package fr.insee.protools.backend.controller; -import fr.insee.protools.backend.httpclients.webclient.WebClientHelper; +import fr.insee.protools.backend.restclient.RestClientHelper; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; @@ -22,7 +22,8 @@ @WebMvcTest(value = StarterController.class) //@ActiveProfiles(value = "test") class StarterControllerTest { - @MockBean WebClientHelper webClientHelper; + @MockBean + RestClientHelper restClientHelper; @MockBean JwtDecoder jwtDecoder; diff --git a/src/test/java/fr/insee/protools/backend/flowable/engine/SimpleProcessTest.java b/src/test/backup/java/fr/insee/protools/backend/flowable/engine/SimpleProcessTest.java similarity index 100% rename from src/test/java/fr/insee/protools/backend/flowable/engine/SimpleProcessTest.java rename to src/test/backup/java/fr/insee/protools/backend/flowable/engine/SimpleProcessTest.java diff --git a/src/test/java/fr/insee/protools/backend/integration/EraREMProcessTest.java b/src/test/backup/java/fr/insee/protools/backend/integration/EraREMProcessTest.java similarity index 85% rename from src/test/java/fr/insee/protools/backend/integration/EraREMProcessTest.java rename to src/test/backup/java/fr/insee/protools/backend/integration/EraREMProcessTest.java index 76989a46..aac5957a 100644 --- a/src/test/java/fr/insee/protools/backend/integration/EraREMProcessTest.java +++ b/src/test/backup/java/fr/insee/protools/backend/integration/EraREMProcessTest.java @@ -2,13 +2,10 @@ import fr.insee.protools.backend.service.context.ContextServiceImpl; -import fr.insee.protools.backend.service.era.EraService; -import fr.insee.protools.backend.dto.era.CensusJsonDto; -import fr.insee.protools.backend.dto.era.GenderType; import fr.insee.protools.backend.service.rem.RemService; -import fr.insee.protools.backend.dto.rem.REMSurveyUnitDto; -import fr.insee.protools.backend.dto.rem.SuIdMappingJson; -import fr.insee.protools.backend.dto.rem.SuIdMappingRecord; +import fr.insee.protools.backend.dto.rem_tmp.REMSurveyUnitDto; +import fr.insee.protools.backend.dto.rem_tmp.SuIdMappingJson; +import fr.insee.protools.backend.dto.rem_tmp.SuIdMappingRecord; import org.flowable.engine.test.Deployment; import org.flowable.engine.test.FlowableTest; import org.junit.jupiter.api.Test; @@ -53,11 +50,11 @@ void testBPMN_ERA_REM() { //ERA SU for 2 Partitions (2 SU for each partition) //42 : Men //43 : Females - Long partition1=42l,partition2=43l; - CensusJsonDto eraP1SU1=createCensusJsonDto(1l,partition1); - CensusJsonDto eraP1SU2=createCensusJsonDto(2l,partition1); - CensusJsonDto eraP2SU1=createCensusJsonDto(3l,partition2); - CensusJsonDto eraP2SU2=createCensusJsonDto(4l,partition2); + String partition1="42",partition2="41"; + CensusJsonDto eraP1SU1=createCensusJsonDto("1",partition1); + CensusJsonDto eraP1SU2=createCensusJsonDto("2",partition1); + CensusJsonDto eraP2SU1=createCensusJsonDto("3",partition2); + CensusJsonDto eraP2SU2=createCensusJsonDto("4",partition2); List listOfEraSU_P1 = List.of(eraP1SU1,eraP1SU2); List listOfEraSU_P2 = List.of(eraP2SU1,eraP2SU2); @@ -99,13 +96,13 @@ void testBPMN_ERA_REM() { } } - private static CensusJsonDto createCensusJsonDto(Long eraId, Long partitionID){ + private static CensusJsonDto createCensusJsonDto(String eraId, String partitionID){ return CensusJsonDto.builder() .id(eraId) .identifiantCompte("SU1_PART_"+partitionID) .build(); } - private static SuIdMappingJson createSuIdMappingJson(Long partitionId,List eraSUList){ + private static SuIdMappingJson createSuIdMappingJson(String partitionId,List eraSUList){ List mappingEraREM = eraSUList.stream().map(censusJsonDto -> new SuIdMappingRecord(i.incrementAndGet(),String.valueOf(censusJsonDto.getId()))).toList(); return SuIdMappingJson.builder() .count(mappingEraREM.size()) diff --git a/src/test/java/fr/insee/protools/backend/httpclients/restclient/RestClientHelperTest.java b/src/test/backup/java/fr/insee/protools/backend/restclient/restclient/RestClientHelperTest.java similarity index 90% rename from src/test/java/fr/insee/protools/backend/httpclients/restclient/RestClientHelperTest.java rename to src/test/backup/java/fr/insee/protools/backend/restclient/restclient/RestClientHelperTest.java index a8c39346..5bf2cb74 100644 --- a/src/test/java/fr/insee/protools/backend/httpclients/restclient/RestClientHelperTest.java +++ b/src/test/backup/java/fr/insee/protools/backend/restclient/restclient/RestClientHelperTest.java @@ -1,14 +1,14 @@ -package fr.insee.protools.backend.httpclients.restclient; +package fr.insee.protools.backend.restclient.restclient; import com.fasterxml.jackson.databind.ObjectMapper; -import fr.insee.protools.backend.ProtoolsTestUtils; -import fr.insee.protools.backend.httpclients.configuration.APIProperties; -import fr.insee.protools.backend.httpclients.configuration.ApiConfigProperties; -import fr.insee.protools.backend.httpclients.exception.ApiNotConfiguredBPMNError; -import fr.insee.protools.backend.httpclients.exception.KeycloakTokenConfigUncheckedBPMNError; -import fr.insee.protools.backend.httpclients.exception.runtime.HttpClient4xxBPMNError; -import fr.insee.protools.backend.httpclients.keycloak.KeycloakResponse; -import fr.insee.protools.backend.httpclients.keycloak.KeycloakService; +import fr.insee.protools.backend.restclient.RestClientHelper; +import fr.insee.protools.backend.restclient.configuration.APIProperties; +import fr.insee.protools.backend.restclient.configuration.ApiConfigProperties; +import fr.insee.protools.backend.restclient.exception.ApiNotConfiguredBPMNError; +import fr.insee.protools.backend.restclient.exception.KeycloakTokenConfigUncheckedBPMNError; +import fr.insee.protools.backend.restclient.exception.runtime.HttpClient4xxBPMNError; +import fr.insee.protools.backend.restclient.keycloak.KeycloakResponse; +import fr.insee.protools.backend.restclient.keycloak.KeycloakService; import okhttp3.mockwebserver.MockResponse; import okhttp3.mockwebserver.MockWebServer; import org.junit.jupiter.api.AfterEach; @@ -25,10 +25,7 @@ import org.springframework.http.MediaType; import org.springframework.web.client.RestClient; -import java.io.File; import java.io.IOException; -import java.io.RandomAccessFile; -import java.util.List; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; diff --git a/src/test/java/fr/insee/protools/backend/httpclients/webclient/KeycloakServiceTest.java b/src/test/backup/java/fr/insee/protools/backend/restclient/webclient/KeycloakServiceTest.java similarity index 95% rename from src/test/java/fr/insee/protools/backend/httpclients/webclient/KeycloakServiceTest.java rename to src/test/backup/java/fr/insee/protools/backend/restclient/webclient/KeycloakServiceTest.java index 056e2b71..3f7fdf29 100644 --- a/src/test/java/fr/insee/protools/backend/httpclients/webclient/KeycloakServiceTest.java +++ b/src/test/backup/java/fr/insee/protools/backend/restclient/webclient/KeycloakServiceTest.java @@ -1,10 +1,10 @@ -package fr.insee.protools.backend.httpclients.webclient; +package fr.insee.protools.backend.restclient.webclient; import com.fasterxml.jackson.databind.ObjectMapper; -import fr.insee.protools.backend.httpclients.keycloak.KeycloakResponse; -import fr.insee.protools.backend.httpclients.keycloak.KeycloakService; -import fr.insee.protools.backend.httpclients.configuration.APIProperties; -import fr.insee.protools.backend.httpclients.exception.KeycloakTokenConfigBPMNError; +import fr.insee.protools.backend.restclient.keycloak.KeycloakResponse; +import fr.insee.protools.backend.restclient.keycloak.KeycloakService; +import fr.insee.protools.backend.restclient.configuration.APIProperties; +import fr.insee.protools.backend.restclient.exception.KeycloakTokenConfigBPMNError; import okhttp3.mockwebserver.MockResponse; import okhttp3.mockwebserver.MockWebServer; import org.junit.jupiter.api.AfterEach; diff --git a/src/test/java/fr/insee/protools/backend/httpclients/webclient/WebClientHelperTest.java b/src/test/backup/java/fr/insee/protools/backend/restclient/webclient/RestClientHelperTest.java similarity index 73% rename from src/test/java/fr/insee/protools/backend/httpclients/webclient/WebClientHelperTest.java rename to src/test/backup/java/fr/insee/protools/backend/restclient/webclient/RestClientHelperTest.java index 575afe87..7a2656fd 100644 --- a/src/test/java/fr/insee/protools/backend/httpclients/webclient/WebClientHelperTest.java +++ b/src/test/backup/java/fr/insee/protools/backend/restclient/webclient/RestClientHelperTest.java @@ -1,14 +1,15 @@ -package fr.insee.protools.backend.httpclients.webclient; +package fr.insee.protools.backend.restclient.webclient; import com.fasterxml.jackson.databind.ObjectMapper; import fr.insee.protools.backend.ProtoolsTestUtils; -import fr.insee.protools.backend.httpclients.keycloak.KeycloakResponse; -import fr.insee.protools.backend.httpclients.keycloak.KeycloakService; -import fr.insee.protools.backend.httpclients.configuration.APIProperties; -import fr.insee.protools.backend.httpclients.configuration.ApiConfigProperties; -import fr.insee.protools.backend.httpclients.exception.ApiNotConfiguredBPMNError; -import fr.insee.protools.backend.httpclients.exception.KeycloakTokenConfigUncheckedBPMNError; -import fr.insee.protools.backend.httpclients.exception.runtime.HttpClient4xxBPMNError; +import fr.insee.protools.backend.restclient.RestClientHelper; +import fr.insee.protools.backend.restclient.keycloak.KeycloakResponse; +import fr.insee.protools.backend.restclient.keycloak.KeycloakService; +import fr.insee.protools.backend.restclient.configuration.APIProperties; +import fr.insee.protools.backend.restclient.configuration.ApiConfigProperties; +import fr.insee.protools.backend.restclient.exception.ApiNotConfiguredBPMNError; +import fr.insee.protools.backend.restclient.exception.KeycloakTokenConfigUncheckedBPMNError; +import fr.insee.protools.backend.restclient.exception.runtime.HttpClient4xxBPMNError; import okhttp3.mockwebserver.MockResponse; import okhttp3.mockwebserver.MockWebServer; import org.junit.jupiter.api.AfterEach; @@ -23,6 +24,7 @@ import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; +import org.springframework.web.client.RestClient; import org.springframework.web.reactive.function.client.WebClient; import org.springframework.web.reactive.function.client.WebClientResponseException; @@ -38,7 +40,7 @@ import static org.mockito.Mockito.when; @ExtendWith(MockitoExtension.class) -class WebClientHelperTest { +class RestClientHelperTest { @Spy private Environment environment; @@ -48,7 +50,7 @@ class WebClientHelperTest { @Mock private ApiConfigProperties apiConfigProperties; - private WebClientHelper webClientHelper; + private RestClientHelper restClientHelper; private MockWebServer mockWebServer; @@ -59,7 +61,7 @@ class WebClientHelperTest { @BeforeEach public void prepare() { keycloakService= new KeycloakService(environment); - webClientHelper = new WebClientHelper(keycloakService,apiConfigProperties); + restClientHelper = new RestClientHelper(keycloakService,apiConfigProperties); this.keycloakService.initialize(); } @@ -95,42 +97,42 @@ private MockResponse fileToResponse(String contentType, File file) throws IOExce } @Test - @DisplayName("Test getWebClient method without specifying an API") - void testGetWebClientWithoutApi() { - WebClient client = webClientHelper.getWebClient(); + @DisplayName("Test getRestClient method without specifying an API") + void testgetRestClientWithoutApi() { + RestClient client = restClientHelper.getRestClient(); assertThat(client).isNotNull(); } - private void testGetWebClientWithIncompleteKCConfig(APIProperties.AuthProperties kcAuth){ + private void testgetRestClientWithIncompleteKCConfig(APIProperties.AuthProperties kcAuth){ when(apiConfigProperties.getAPIProperties(any())).thenReturn(new APIProperties(getServerHostPort(), kcAuth, true)); - var webClient = webClientHelper.getWebClient(ApiConfigProperties.KNOWN_API.KNOWN_API_ERA); + var webClient = restClientHelper.getRestClient(ApiConfigProperties.KNOWN_API.KNOWN_API_ERA); assertThat(webClient).isNotNull(); //Should throw an exception as the realm is missing assertThrows(KeycloakTokenConfigUncheckedBPMNError.class , () -> webClient.get().uri(getDummyUriWithPort()).exchange().block()); } @Test - @DisplayName("Test getWebClient method without incomplete keycloak configuration") - void getWebClientWithIncompleteKCConfig() throws IOException { + @DisplayName("Test getRestClient method without incomplete keycloak configuration") + void getRestClientWithIncompleteKCConfig() throws IOException { //Missing realm APIProperties.AuthProperties kcAuth = new APIProperties.AuthProperties(getDummyUriWithPort(),null, "toto","toto"); //Should throw an exception as the realm is missing - testGetWebClientWithIncompleteKCConfig(kcAuth); + testgetRestClientWithIncompleteKCConfig(kcAuth); //Missing url kcAuth = new APIProperties.AuthProperties("null","realm", "toto","toto"); - testGetWebClientWithIncompleteKCConfig(kcAuth); + testgetRestClientWithIncompleteKCConfig(kcAuth); //Missing clientId kcAuth = new APIProperties.AuthProperties(getDummyUriWithPort(),"realm", null,"toto"); - testGetWebClientWithIncompleteKCConfig(kcAuth); + testgetRestClientWithIncompleteKCConfig(kcAuth); //Missing secret kcAuth = new APIProperties.AuthProperties(getDummyUriWithPort(),"realm", "toto",null); - testGetWebClientWithIncompleteKCConfig(kcAuth); + testgetRestClientWithIncompleteKCConfig(kcAuth); } @Test - void getWebClient() throws IOException { + void getRestClient() throws IOException { APIProperties.AuthProperties kcAuth = new APIProperties.AuthProperties(); kcAuth.setClientId("clientId-toto"); @@ -140,8 +142,8 @@ void getWebClient() throws IOException { when(apiConfigProperties.getAPIProperties(any())).thenReturn(new APIProperties(getServerHostPort(), kcAuth, true)); - WebClient webClient = webClientHelper.getWebClient(ApiConfigProperties.KNOWN_API.KNOWN_API_ERA); - assertThat(webClient).isNotNull(); + RestClient client = restClientHelper.getRestClient(ApiConfigProperties.KNOWN_API.KNOWN_API_ERA); + assertThat(client).isNotNull(); KeycloakResponse kcResponse = new KeycloakResponse(); kcResponse.setAccesToken("MYTOKEN"); @@ -159,19 +161,19 @@ void getWebClient() throws IOException { mockWebServer.enqueue(mockResponseKC); mockWebServer.enqueue(mockResponse); - assertThat(webClient.get().uri(getDummyUriWithPort()).exchange().block().statusCode()).isEqualTo(HttpStatus.NO_CONTENT); + assertThat(client.get().uri(getDummyUriWithPort()).exchange().block().statusCode()).isEqualTo(HttpStatus.NO_CONTENT); } @Test - @DisplayName("Test getWebClientForFile method - get the webclient and download files of different sizes") - void getWebClientForFile() throws IOException { - WebClient webClient = webClientHelper.getWebClientForFile(); + @DisplayName("Test getRestClientForFile method - get the webclient and download files of different sizes") + void getRestClientForFile() throws IOException { + WebClient webClient = restClientHelper.getRestClientForFile(); assertThat(webClient).isNotNull(); //Create a 1Mo File File file1mo = createDummyFile(1024 * 1024 * 1,".json"); - File file19mo = createDummyFile(WebClientHelper.getDefaultFileBufferSize()-1024,".json"); - int tooBigSize=WebClientHelper.getDefaultFileBufferSize()+1024; + File file19mo = createDummyFile(RestClientHelper.getDefaultFileBufferSize()-1024,".json"); + int tooBigSize=RestClientHelper.getDefaultFileBufferSize()+1024; File fileTooBig = createDummyFile(tooBigSize,".json"); MockResponse fileToResponse_1Mo = fileToResponse(MediaType.APPLICATION_JSON_VALUE, file1mo); @@ -215,7 +217,7 @@ public MockResponse dispatch(RecordedRequest request) { mockWebServer.enqueue(fileToResponseTooBig); //Check for 1Mo file - assertDoesNotThrow(()->webClientHelper.getWebClientForFile() + assertDoesNotThrow(()-> restClientHelper.getRestClientForFile() .get() .uri(getDummyUriWithPort()) .retrieve() @@ -223,7 +225,7 @@ public MockResponse dispatch(RecordedRequest request) { .block()); //Check for 19Mo file - assertDoesNotThrow(()->webClientHelper.getWebClientForFile() + assertDoesNotThrow(()-> restClientHelper.getRestClientForFile() .get() .uri(getDummyUriWithPort()) .retrieve() @@ -231,7 +233,7 @@ public MockResponse dispatch(RecordedRequest request) { .block()); //Check for a too big file : Should throw and exception as default buffer is 20Mo - assertThrows(WebClientResponseException.class, () -> webClientHelper.getWebClientForFile() + assertThrows(WebClientResponseException.class, () -> restClientHelper.getRestClientForFile() .get() .uri(getDummyUriWithPort()) .retrieve() @@ -239,7 +241,7 @@ public MockResponse dispatch(RecordedRequest request) { .block()); //Check for a too big file with a custom buffer ==> Should be ok - assertDoesNotThrow(() -> webClientHelper.getWebClientForFile(tooBigSize) + assertDoesNotThrow(() -> restClientHelper.getRestClientForFile(tooBigSize) .get() .uri(getDummyUriWithPort()) .retrieve() @@ -249,17 +251,17 @@ public MockResponse dispatch(RecordedRequest request) { @Test - void getWebClient_withInvalidApiConfig() { + void getRestClient_withInvalidApiConfig() { when(apiConfigProperties.getAPIProperties(any())).thenReturn(null); - assertThatThrownBy(() -> webClientHelper.getWebClient(any())) + assertThatThrownBy(() -> restClientHelper.getRestClient(any())) .isInstanceOf(ApiNotConfiguredBPMNError.class) .hasMessageContaining("is not configured in properties"); } @Test - void getWebClient_withDisabledApiConfig() { + void getRestClient_withDisabledApiConfig() { when(apiConfigProperties.getAPIProperties(any())).thenReturn(new APIProperties("http://localhost:8080", new APIProperties.AuthProperties(), false )); - assertThatThrownBy(() -> webClientHelper.getWebClient(any())) + assertThatThrownBy(() -> restClientHelper.getRestClient(any())) .isInstanceOf(ApiNotConfiguredBPMNError.class) .hasMessageContaining("is disabled in properties"); } @@ -267,8 +269,8 @@ void getWebClient_withDisabledApiConfig() { @Test @DisplayName("Test that the retrieval of spring private field still works") void extractClientResponseRequestDescriptionPrivateFiledUsingReflexion_shouldWork() throws IOException { - WebClient webClient = webClientHelper.getWebClient(); - assertThat(webClient).isNotNull(); + RestClient restClient = restClientHelper.getRestClient(); + assertThat(restClient).isNotNull(); //Mock an error response MockResponse mockResponse = new MockResponse() @@ -279,9 +281,8 @@ void extractClientResponseRequestDescriptionPrivateFiledUsingReflexion_shouldWor mockWebServer.enqueue(mockResponse); //Call method under test - HttpClient4xxBPMNError exception = assertThrows(HttpClient4xxBPMNError.class , () ->webClient.get().uri(getDummyUriWithPort()).retrieve() - .bodyToMono(String.class) - .block()); + HttpClient4xxBPMNError exception = assertThrows(HttpClient4xxBPMNError.class , () ->restClient.get().uri(getDummyUriWithPort()).retrieve() + .body(String.class)); //Post call conditions (we get more or less the expected message with the original request) //IF it is not the case, check that the spring private field has not changed or been renamed @@ -302,32 +303,32 @@ void containsCauseOfType_shouldFindCauseIfExists() { Exception ex = new Exception("dummy",exLvl1 ); //Call - boolean found = WebClientHelper.containsCauseOfType(ex, List.of(ArithmeticException.class)); + boolean found = RestClientHelper.containsCauseOfType(ex, List.of(ArithmeticException.class)); //Check assertTrue(found,"ArithmeticException should be found"); //Call - found = WebClientHelper.containsCauseOfType(exLvl1, List.of(ArithmeticException.class)); + found = RestClientHelper.containsCauseOfType(exLvl1, List.of(ArithmeticException.class)); //Check assertTrue(found,"ArithmeticException should be found"); //Call - found = WebClientHelper.containsCauseOfType(exRoot, List.of(ArithmeticException.class)); + found = RestClientHelper.containsCauseOfType(exRoot, List.of(ArithmeticException.class)); //Check assertTrue(found,"ArithmeticException should be found"); //Call - found = WebClientHelper.containsCauseOfType(exRoot, List.of(RuntimeException.class)); + found = RestClientHelper.containsCauseOfType(exRoot, List.of(RuntimeException.class)); //Check assertTrue(found,"RuntimeException should be found"); //Call - found = WebClientHelper.containsCauseOfType(exRoot, List.of(IOException.class,RuntimeException.class)); + found = RestClientHelper.containsCauseOfType(exRoot, List.of(IOException.class,RuntimeException.class)); //Check assertTrue(found,"RuntimeException should be found"); //Call - found = WebClientHelper.containsCauseOfType(exRoot, List.of(IOException.class)); + found = RestClientHelper.containsCauseOfType(exRoot, List.of(IOException.class)); //Check (should not be found) assertFalse(found,"IOException should not be found"); } diff --git a/src/test/java/fr/insee/protools/backend/service/context/ContextServiceTest.java b/src/test/backup/java/fr/insee/protools/backend/service/context/ContextServiceTest.java similarity index 100% rename from src/test/java/fr/insee/protools/backend/service/context/ContextServiceTest.java rename to src/test/backup/java/fr/insee/protools/backend/service/context/ContextServiceTest.java diff --git a/src/test/java/fr/insee/protools/backend/service/meshuggah/MeshuggahCreateCommunicationsContextTaskTest.java b/src/test/backup/java/fr/insee/protools/backend/service/meshuggah/MeshuggahCreateCommunicationsContextTaskTest.java similarity index 97% rename from src/test/java/fr/insee/protools/backend/service/meshuggah/MeshuggahCreateCommunicationsContextTaskTest.java rename to src/test/backup/java/fr/insee/protools/backend/service/meshuggah/MeshuggahCreateCommunicationsContextTaskTest.java index e52eab39..f1a06793 100644 --- a/src/test/java/fr/insee/protools/backend/service/meshuggah/MeshuggahCreateCommunicationsContextTaskTest.java +++ b/src/test/backup/java/fr/insee/protools/backend/service/meshuggah/MeshuggahCreateCommunicationsContextTaskTest.java @@ -3,6 +3,8 @@ import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.JsonNode; import fr.insee.protools.backend.ProtoolsTestUtils; +import fr.insee.protools.backend.deprecated.service.meshuggah.MeshuggahCreateCommunicationsContextTask; +import fr.insee.protools.backend.deprecated.service.meshuggah.MeshuggahService; import fr.insee.protools.backend.service.context.exception.BadContextIncorrectBPMNError; import fr.insee.protools.backend.dto.meshuggah.MeshuggahComDetails; import fr.insee.protools.backend.service.utils.TestWithContext; @@ -27,8 +29,10 @@ class MeshuggahCreateCommunicationsContextTaskTest extends TestWithContext { - @Mock MeshuggahService meshuggahService; - @InjectMocks MeshuggahCreateCommunicationsContextTask meshuggahTask; + @Mock + MeshuggahService meshuggahService; + @InjectMocks + MeshuggahCreateCommunicationsContextTask meshuggahTask; //To be able to run tests with differents protools contexts private static Stream contextErrorArguments() { diff --git a/src/test/java/fr/insee/protools/backend/service/meshuggah/MeshuggahCtxExamples.java b/src/test/backup/java/fr/insee/protools/backend/service/meshuggah/MeshuggahCtxExamples.java similarity index 100% rename from src/test/java/fr/insee/protools/backend/service/meshuggah/MeshuggahCtxExamples.java rename to src/test/backup/java/fr/insee/protools/backend/service/meshuggah/MeshuggahCtxExamples.java diff --git a/src/test/java/fr/insee/protools/backend/service/meshuggah/MeshuggahSendOpeningMailCommunicationForSUTaskTest.java b/src/test/backup/java/fr/insee/protools/backend/service/meshuggah/MeshuggahSendOpeningMailCommunicationForSUTaskTest.java similarity index 94% rename from src/test/java/fr/insee/protools/backend/service/meshuggah/MeshuggahSendOpeningMailCommunicationForSUTaskTest.java rename to src/test/backup/java/fr/insee/protools/backend/service/meshuggah/MeshuggahSendOpeningMailCommunicationForSUTaskTest.java index c8558443..d637066b 100644 --- a/src/test/java/fr/insee/protools/backend/service/meshuggah/MeshuggahSendOpeningMailCommunicationForSUTaskTest.java +++ b/src/test/backup/java/fr/insee/protools/backend/service/meshuggah/MeshuggahSendOpeningMailCommunicationForSUTaskTest.java @@ -5,6 +5,8 @@ import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.node.ObjectNode; import fr.insee.protools.backend.ProtoolsTestUtils; +import fr.insee.protools.backend.deprecated.service.meshuggah.MeshuggahSendOpeningMailCommunicationForSUTask; +import fr.insee.protools.backend.deprecated.service.meshuggah.MeshuggahService; import fr.insee.protools.backend.service.context.exception.BadContextIncorrectBPMNError; import fr.insee.protools.backend.dto.meshuggah.MeshuggahComDetails; import fr.insee.protools.backend.service.utils.TestWithContext; @@ -55,8 +57,10 @@ void execute_should_throwError_when_null_context(){ assertThat_delegate_throwError_when_null_context(meshuggahTask); } - @Mock MeshuggahService meshuggahService; - @InjectMocks MeshuggahSendOpeningMailCommunicationForSUTask meshuggahTask; + @Mock + MeshuggahService meshuggahService; + @InjectMocks + MeshuggahSendOpeningMailCommunicationForSUTask meshuggahTask; @Test @DisplayName("Test execute method - should throw if VARNAME_CURRENT_PARTITION_ID or VARNAME_PLATINE_CONTACT not initialized") @@ -73,7 +77,7 @@ void execute_should_throw_FlowableIllegalArgumentException_when_variables_notDef assertThat(exception.getMessage()).isEqualTo(getMissingVariableMessage(VARNAME_CURRENT_PARTITION_ID)); //Create First variable - when(execution.getVariable(VARNAME_CURRENT_PARTITION_ID, Long.class)).thenReturn(99L); + when(execution.getVariable(VARNAME_CURRENT_PARTITION_ID, String.class)).thenReturn("99"); //Execute again exception = assertThrows(FlowableIllegalArgumentException.class, () -> meshuggahTask.execute(execution)); //Check the error @@ -112,7 +116,7 @@ void execute_should_work_when_variables_OK() throws JsonProcessingException { lenient().when(execution.getProcessInstanceId()).thenReturn(dumyId); initContexteMockWithString(MeshuggahCtxExamples.ctx_OK_envoi_mail_1part_ouverture_mail); - when(execution.getVariable(VARNAME_CURRENT_PARTITION_ID, Long.class)).thenReturn(MeshuggahCtxExamples.ctx_partition1); + when(execution.getVariable(VARNAME_CURRENT_PARTITION_ID, String.class)).thenReturn(MeshuggahCtxExamples.ctx_partition1.toString()); JsonNode platineContact = objectMapper.readTree(platineContactContent); when(execution.getVariable(VARNAME_PLATINE_CONTACT, JsonNode.class)).thenReturn(platineContact); //Run method under test diff --git a/src/test/java/fr/insee/protools/backend/service/platine/delegate/PlatinePilotageCreateContextTaskTest.java b/src/test/backup/java/fr/insee/protools/backend/service/platine/delegate/PlatinePilotageCreateContextTaskTest.java similarity index 90% rename from src/test/java/fr/insee/protools/backend/service/platine/delegate/PlatinePilotageCreateContextTaskTest.java rename to src/test/backup/java/fr/insee/protools/backend/service/platine/delegate/PlatinePilotageCreateContextTaskTest.java index 07605cce..bde532d8 100644 --- a/src/test/java/fr/insee/protools/backend/service/platine/delegate/PlatinePilotageCreateContextTaskTest.java +++ b/src/test/backup/java/fr/insee/protools/backend/service/platine/delegate/PlatinePilotageCreateContextTaskTest.java @@ -1,8 +1,9 @@ package fr.insee.protools.backend.service.platine.delegate; +import fr.insee.protools.backend.deprecated.service.platine.delegate.PlatinePilotageCreateContextTask; import fr.insee.protools.backend.service.context.exception.BadContextIncorrectBPMNError; -import fr.insee.protools.backend.service.platine.pilotage.PlatinePilotageService; -import fr.insee.protools.backend.service.platine.pilotage.metadata.MetadataDto; +import fr.insee.protools.backend.deprecated.service.platine.pilotage.PlatinePilotageService; +import fr.insee.protools.backend.deprecated.service.platine.pilotage.metadata.MetadataDto; import fr.insee.protools.backend.service.utils.TestWithContext; import org.flowable.engine.delegate.DelegateExecution; import org.flowable.engine.test.FlowableTest; @@ -28,7 +29,8 @@ class PlatinePilotageCreateContextTaskTest extends TestWithContext { @Mock PlatinePilotageService platinePilotageService; - @InjectMocks PlatinePilotageCreateContextTask platinePilotageTask; + @InjectMocks + PlatinePilotageCreateContextTask platinePilotageTask; @Test diff --git a/src/test/java/fr/insee/protools/backend/service/platine/delegate/PlatinePilotageCreateSurveyUnitTaskTest.java b/src/test/backup/java/fr/insee/protools/backend/service/platine/delegate/PlatinePilotageCreateSurveyUnitTaskTest.java similarity index 91% rename from src/test/java/fr/insee/protools/backend/service/platine/delegate/PlatinePilotageCreateSurveyUnitTaskTest.java rename to src/test/backup/java/fr/insee/protools/backend/service/platine/delegate/PlatinePilotageCreateSurveyUnitTaskTest.java index bdf886ec..261f047b 100644 --- a/src/test/java/fr/insee/protools/backend/service/platine/delegate/PlatinePilotageCreateSurveyUnitTaskTest.java +++ b/src/test/backup/java/fr/insee/protools/backend/service/platine/delegate/PlatinePilotageCreateSurveyUnitTaskTest.java @@ -3,15 +3,17 @@ import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.node.ObjectNode; import fr.insee.protools.backend.ProtoolsTestUtils; +import fr.insee.protools.backend.deprecated.service.platine.delegate.PlatinePilotageCreateInterrogationListTask; +import fr.insee.protools.backend.deprecated.service.platine.delegate.PlatinePilotageCreateSurveyUnitTask; import fr.insee.protools.backend.service.context.ContextConstants; import fr.insee.protools.backend.service.context.exception.BadContextIncorrectBPMNError; import fr.insee.protools.backend.service.exception.IncorrectSUBPMNError; -import fr.insee.protools.backend.service.platine.pilotage.PlatinePilotageService; +import fr.insee.protools.backend.deprecated.service.platine.pilotage.PlatinePilotageService; import fr.insee.protools.backend.dto.platine.pilotage.PlatinePilotageGenderType; import fr.insee.protools.backend.dto.platine.pilotage.query.QuestioningWebclientDto; import fr.insee.protools.backend.service.rem.RemDtoUtils; -import fr.insee.protools.backend.dto.rem.PersonDto; -import fr.insee.protools.backend.dto.rem.REMSurveyUnitDto; +import fr.insee.protools.backend.dto.rem_tmp.PersonDto; +import fr.insee.protools.backend.dto.rem_tmp.REMSurveyUnitDto; import fr.insee.protools.backend.service.utils.TestWithContext; import fr.insee.protools.backend.service.utils.data.RemSUData; import org.flowable.engine.delegate.DelegateExecution; @@ -28,7 +30,7 @@ import java.util.stream.Stream; import static fr.insee.protools.backend.service.FlowableVariableNameConstants.*; -import static fr.insee.protools.backend.service.platine.utils.PlatineHelper.computePilotagePartitionID; +import static fr.insee.protools.backend.deprecated.service.platine.utils.PlatineHelper.computePilotagePartitionID; import static org.assertj.core.api.Assertions.assertThat; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertThrows; @@ -76,8 +78,8 @@ void execute_should_work_when_ContextOK(String context_json) { DelegateExecution execution=createMockedExecution(); JsonNode contextRootNode = initContexteMockWithFile(context_json); JsonNode remSU = ProtoolsTestUtils.asJsonNode(RemSUData.rem_su_3personnes); - Long idPArtition=1l; - lenient().doReturn(idPArtition).when(execution).getVariable(VARNAME_CURRENT_PARTITION_ID,Long.class); + String idPartition="1"; + lenient().doReturn(idPartition).when(execution).getVariable(VARNAME_CURRENT_PARTITION_ID,String.class); lenient().doReturn(remSU).when(execution).getVariable(VARNAME_REM_INTERROGATION,JsonNode.class); lenient().doReturn("TOTO").when(execution).getVariable(VARNAME_DIRECTORYACCESS_ID_CONTACT,String.class); @@ -93,7 +95,7 @@ void execute_should_work_when_ContextOK(String context_json) { assertEquals("TOBEFOUND", valueParam.getContacts().get(0).getFirstName(),"Wrong contact found"); String campagneId=contextRootNode.path(ContextConstants.CTX_CAMPAGNE_ID).asText(); - assertEquals(computePilotagePartitionID(campagneId,idPArtition), valueParam.getIdPartitioning(),"Wrong Partition ID"); + assertEquals(computePilotagePartitionID(campagneId,idPartition), valueParam.getIdPartitioning(),"Wrong Partition ID"); assertEquals("3043280", valueParam.getSurveyUnit().getIdSu(),"Wrong ID SU (repository id)"); } @@ -162,8 +164,8 @@ void execute_should_throw_IncorrectSUException_when_wrongSU() { JsonNode remSU = ProtoolsTestUtils.asJsonNode(RemSUData.rem_su_3personnes); //Break this node ((ObjectNode) remSU).remove("repositoryId"); - Long idPartition=1l; - lenient().doReturn(idPartition).when(execution).getVariable(VARNAME_CURRENT_PARTITION_ID,Long.class); + String idPartition="1"; + lenient().doReturn(idPartition).when(execution).getVariable(VARNAME_CURRENT_PARTITION_ID,String.class); lenient().doReturn(remSU).when(execution).getVariable(VARNAME_REM_INTERROGATION,JsonNode.class); lenient().doReturn("TOTO").when(execution).getVariable(VARNAME_DIRECTORYACCESS_ID_CONTACT,String.class); diff --git a/src/test/java/fr/insee/protools/backend/service/platine/delegate/PlatinePilotageGetSUContactTaskTest.java b/src/test/backup/java/fr/insee/protools/backend/service/platine/delegate/PlatinePilotageGetSUContactTaskTest.java similarity index 92% rename from src/test/java/fr/insee/protools/backend/service/platine/delegate/PlatinePilotageGetSUContactTaskTest.java rename to src/test/backup/java/fr/insee/protools/backend/service/platine/delegate/PlatinePilotageGetSUContactTaskTest.java index 43ab2858..5743a6b5 100644 --- a/src/test/java/fr/insee/protools/backend/service/platine/delegate/PlatinePilotageGetSUContactTaskTest.java +++ b/src/test/backup/java/fr/insee/protools/backend/service/platine/delegate/PlatinePilotageGetSUContactTaskTest.java @@ -3,10 +3,11 @@ import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; +import fr.insee.protools.backend.deprecated.service.platine.delegate.PlatinePilotageGetSUContactTask; import fr.insee.protools.backend.service.context.exception.BadContextIncorrectBPMNError; -import fr.insee.protools.backend.service.platine.pilotage.PlatinePilotageService; +import fr.insee.protools.backend.deprecated.service.platine.pilotage.PlatinePilotageService; import fr.insee.protools.backend.dto.platine.pilotage.contact.PlatineContactDto; -import fr.insee.protools.backend.service.platine.utils.PlatineHelper; +import fr.insee.protools.backend.deprecated.service.platine.utils.PlatineHelper; import fr.insee.protools.backend.service.rem.delegate.ExtractContactIdentifierFromREMSUTask; import fr.insee.protools.backend.service.utils.TestWithContext; import org.flowable.common.engine.api.FlowableIllegalArgumentException; @@ -30,7 +31,8 @@ class PlatinePilotageGetSUContactTaskTest extends TestWithContext { final static String platine_context_incorrect_json = ressourceFolder + "/protools-contexte-platine-incorrect-no-campaign-id.json"; @Mock PlatinePilotageService platinePilotageService; - @InjectMocks PlatinePilotageGetSUContactTask platinePilotageTask; + @InjectMocks + PlatinePilotageGetSUContactTask platinePilotageTask; @Test void execute_should_throwError_when_null_context(){ @@ -60,7 +62,7 @@ void execute_should_throw_when_variable1_missing() { DelegateExecution execution = createMockedExecution(); ExtractContactIdentifierFromREMSUTask extractTask = new ExtractContactIdentifierFromREMSUTask(); //set the 2nd variable correctly - lenient().doReturn(999L).when(execution).getVariable(VARNAME_CURRENT_PARTITION_ID, Long.class); + lenient().doReturn("999").when(execution).getVariable(VARNAME_CURRENT_PARTITION_ID, String.class); //No variable set ==> Error @@ -117,8 +119,8 @@ void execute_should_work_when_context_and_variables_OK() throws JsonProcessingEx doReturn(executionParent).when(execution).getParent(); //Process variables Long suId = 20231110L; - Long currentPartitionID = 120883L; - lenient().doReturn(currentPartitionID).when(execution).getVariable(VARNAME_CURRENT_PARTITION_ID, Long.class); + String currentPartitionID = "120883"; + lenient().doReturn(currentPartitionID).when(execution).getVariable(VARNAME_CURRENT_PARTITION_ID, String.class); lenient().doReturn(suId).when(execution).getVariable(VARNAME_REM_SURVEY_UNIT_IDENTIFIER, Long.class); //Prepare service response from platine diff --git a/src/test/java/fr/insee/protools/backend/service/platine/delegate/PlatineQuestionnaireCreateContextTaskTest.java b/src/test/backup/java/fr/insee/protools/backend/service/platine/delegate/PlatineQuestionnaireCreateContextTaskTest.java similarity index 93% rename from src/test/java/fr/insee/protools/backend/service/platine/delegate/PlatineQuestionnaireCreateContextTaskTest.java rename to src/test/backup/java/fr/insee/protools/backend/service/platine/delegate/PlatineQuestionnaireCreateContextTaskTest.java index cfa3242d..fc698cc3 100644 --- a/src/test/java/fr/insee/protools/backend/service/platine/delegate/PlatineQuestionnaireCreateContextTaskTest.java +++ b/src/test/backup/java/fr/insee/protools/backend/service/platine/delegate/PlatineQuestionnaireCreateContextTaskTest.java @@ -3,14 +3,13 @@ import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import fr.insee.protools.backend.ProtoolsTestUtils; -import fr.insee.protools.backend.dto.platine_sabiane_questionnaire.campaign.CampaignDto; -import fr.insee.protools.backend.dto.platine_sabiane_questionnaire.campaign.MetadataValue; +import fr.insee.protools.backend.deprecated.service.platine.delegate.PlatineQuestionnaireCreateContextTask; import fr.insee.protools.backend.service.context.ContextConstants; import fr.insee.protools.backend.service.context.ContextService; import fr.insee.protools.backend.service.context.exception.BadContextIncorrectBPMNError; -import fr.insee.protools.backend.service.nomenclature.NomenclatureService; -import fr.insee.protools.backend.service.platine.questionnaire.PlatineQuestionnaireService; -import fr.insee.protools.backend.service.questionnaire_model.QuestionnaireModelService; +import fr.insee.protools.backend.deprecated.service.nomenclature.NomenclatureService; +import fr.insee.protools.backend.deprecated.service.platine.questionnaire.PlatineQuestionnaireService; +import fr.insee.protools.backend.deprecated.service.questionnaire_model.QuestionnaireModelService; import org.flowable.engine.delegate.DelegateExecution; import org.flowable.engine.test.FlowableTest; import org.junit.jupiter.api.Test; diff --git a/src/test/java/fr/insee/protools/backend/service/platine/delegate/PlatineQuestionnaireCreateSurveyUnitTaskTest.java b/src/test/backup/java/fr/insee/protools/backend/service/platine/delegate/PlatineQuestionnaireCreateSurveyUnitTaskTest.java similarity index 93% rename from src/test/java/fr/insee/protools/backend/service/platine/delegate/PlatineQuestionnaireCreateSurveyUnitTaskTest.java rename to src/test/backup/java/fr/insee/protools/backend/service/platine/delegate/PlatineQuestionnaireCreateSurveyUnitTaskTest.java index a554c059..4e9830fc 100644 --- a/src/test/java/fr/insee/protools/backend/service/platine/delegate/PlatineQuestionnaireCreateSurveyUnitTaskTest.java +++ b/src/test/backup/java/fr/insee/protools/backend/service/platine/delegate/PlatineQuestionnaireCreateSurveyUnitTaskTest.java @@ -5,10 +5,11 @@ import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.node.ObjectNode; import fr.insee.protools.backend.ProtoolsTestUtils; +import fr.insee.protools.backend.deprecated.service.platine.delegate.PlatineQuestionnaireCreateSurveyUnitTask; import fr.insee.protools.backend.dto.platine_sabiane_questionnaire.surveyunit.SurveyUnitResponseDto; import fr.insee.protools.backend.service.context.exception.BadContextIncorrectBPMNError; import fr.insee.protools.backend.service.exception.IncorrectSUBPMNError; -import fr.insee.protools.backend.service.platine.questionnaire.PlatineQuestionnaireService; +import fr.insee.protools.backend.deprecated.service.platine.questionnaire.PlatineQuestionnaireService; import fr.insee.protools.backend.service.utils.TestWithContext; import fr.insee.protools.backend.service.utils.data.RemSUData; import org.flowable.engine.delegate.DelegateExecution; @@ -67,8 +68,8 @@ void execute_should_work_when_ContextOK(String context_json) throws JsonProcessi DelegateExecution execution=createMockedExecution(); JsonNode contextRootNode = initContexteMockWithFile(context_json); JsonNode remSU = ProtoolsTestUtils.asJsonNode(RemSUData.rem_su_3personnes); - Long idPartition=1l; - lenient().doReturn(idPartition).when(execution).getVariable(VARNAME_CURRENT_PARTITION_ID,Long.class); + String idPartition="1"; + lenient().doReturn(idPartition).when(execution).getVariable(VARNAME_CURRENT_PARTITION_ID,String.class); lenient().doReturn(remSU).when(execution).getVariable(VARNAME_REM_INTERROGATION,JsonNode.class); lenient().doReturn("TOTO").when(execution).getVariable(VARNAME_DIRECTORYACCESS_ID_CONTACT,String.class); @@ -99,8 +100,8 @@ void execute_should_throw_IncorrectSUException_when_wrongSU() { JsonNode remSU = ProtoolsTestUtils.asJsonNode(RemSUData.rem_su_3personnes); //Break this node ((ObjectNode) remSU).remove("repositoryId"); - Long idPartition=1l; - lenient().doReturn(idPartition).when(execution).getVariable(VARNAME_CURRENT_PARTITION_ID,Long.class); + String idPartition="1"; + lenient().doReturn(idPartition).when(execution).getVariable(VARNAME_CURRENT_PARTITION_ID,String.class); lenient().doReturn(remSU).when(execution).getVariable(VARNAME_REM_INTERROGATION,JsonNode.class); lenient().doReturn("TOTO").when(execution).getVariable(VARNAME_DIRECTORYACCESS_ID_CONTACT,String.class); diff --git a/src/test/backup/java/fr/insee/protools/backend/service/platine/delegate/pilotatage/PlatinePilotageCreateContextTaskRESTTest.java b/src/test/backup/java/fr/insee/protools/backend/service/platine/delegate/pilotatage/PlatinePilotageCreateContextTaskRESTTest.java new file mode 100644 index 00000000..b1f5bf4a --- /dev/null +++ b/src/test/backup/java/fr/insee/protools/backend/service/platine/delegate/pilotatage/PlatinePilotageCreateContextTaskRESTTest.java @@ -0,0 +1,72 @@ +package fr.insee.protools.backend.service.platine.delegate.pilotatage; + +import com.fasterxml.jackson.databind.JsonNode; +import fr.insee.protools.backend.ProtoolsTestUtils; +import fr.insee.protools.backend.service.context.exception.BadContextIncorrectBPMNError; +import fr.insee.protools.backend.service.platine.delegate.PlatineQuestionnaireCreateContextTaskTest; +import fr.insee.protools.backend.service.platine.service.PlatinePilotageService; +import fr.insee.protools.backend.service.utils.TestWithContext; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.test.FlowableTest; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.ArgumentCaptor; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; +import org.springframework.util.ClassUtils; + +import java.util.List; + +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; + +@ExtendWith(MockitoExtension.class) +@FlowableTest +class PlatinePilotageCreateContextTaskRESTTest extends TestWithContext { + final static String ressourceFolder = ClassUtils.convertClassNameToResourcePath(PlatineQuestionnaireCreateContextTaskTest.class.getPackageName()); + final static String platine_context_json = ressourceFolder+"/protools-contexte-platine-individu.json"; + + + @Mock + PlatinePilotageService platinePilotageService; + @InjectMocks + PlatinePilotageCreateContextTaskREST platinePilotageTask; + + + @Test + void execute_should_throwError_when_null_context(){ + assertThat_delegate_throwError_when_null_context(platinePilotageTask); + } + + @Test + void execute_should_throw_BadContextIncorrectException_when_noContext() { + DelegateExecution execution = createMockedExecution(); + + //Execute the unit under test + assertThrows(BadContextIncorrectBPMNError.class,() -> platinePilotageTask.execute(execution)); + } + + @Test + void execute_should_work_when_contextOK() { + DelegateExecution execution = createMockedExecution(); + initContexteMockWithFile(platine_context_json); + String partitionId="1"; + String campaignId="DEM2022X00"; + + //Execute the unit under test + platinePilotageTask.execute(execution); + + //Verify postContext + ArgumentCaptor acCtx = ArgumentCaptor.forClass(JsonNode.class); + verify(platinePilotageService,times(1)).postContext(eq(campaignId),acCtx.capture()); + List allValues = acCtx.getAllValues(); + assertEquals(1, allValues.size(),"We should have exactly one partition"); + + JsonNode expectedContext = ProtoolsTestUtils.asJsonNode(platine_context_json); + assertEquals(expectedContext,allValues.get(0),"Wrong context passed"); + } + +} \ No newline at end of file diff --git a/src/test/java/fr/insee/protools/backend/service/platine/utils/PlatineHelperTest.java b/src/test/backup/java/fr/insee/protools/backend/service/platine/utils/PlatineHelperTest.java similarity index 76% rename from src/test/java/fr/insee/protools/backend/service/platine/utils/PlatineHelperTest.java rename to src/test/backup/java/fr/insee/protools/backend/service/platine/utils/PlatineHelperTest.java index 6cba1e11..48eb6a06 100644 --- a/src/test/java/fr/insee/protools/backend/service/platine/utils/PlatineHelperTest.java +++ b/src/test/backup/java/fr/insee/protools/backend/service/platine/utils/PlatineHelperTest.java @@ -1,5 +1,6 @@ package fr.insee.protools.backend.service.platine.utils; +import fr.insee.protools.backend.deprecated.service.platine.utils.PlatineHelper; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.junit.jupiter.MockitoExtension; @@ -11,9 +12,9 @@ class PlatineHelperTest { @Test void computePilotagePartitionID_should_returnConcat(){ - assertEquals("A1",PlatineHelper.computePilotagePartitionID("A",1l)); - assertEquals("AAAAAAAAA1",PlatineHelper.computePilotagePartitionID("AAAAAAAAA",1l)); - assertEquals(null,PlatineHelper.computePilotagePartitionID(null,1l)); + assertEquals("A1", PlatineHelper.computePilotagePartitionID("A","1")); + assertEquals("AAAAAAAAA1",PlatineHelper.computePilotagePartitionID("AAAAAAAAA","1")); + assertEquals(null,PlatineHelper.computePilotagePartitionID(null,"1")); assertEquals(null,PlatineHelper.computePilotagePartitionID("1",null)); assertEquals(null,PlatineHelper.computePilotagePartitionID(null,null)); } diff --git a/src/test/java/fr/insee/protools/backend/service/rem/RemDtoUtilsTest.java b/src/test/backup/java/fr/insee/protools/backend/service/rem/RemDtoUtilsTest.java similarity index 99% rename from src/test/java/fr/insee/protools/backend/service/rem/RemDtoUtilsTest.java rename to src/test/backup/java/fr/insee/protools/backend/service/rem/RemDtoUtilsTest.java index 273073f5..493b916e 100644 --- a/src/test/java/fr/insee/protools/backend/service/rem/RemDtoUtilsTest.java +++ b/src/test/backup/java/fr/insee/protools/backend/service/rem/RemDtoUtilsTest.java @@ -1,8 +1,8 @@ package fr.insee.protools.backend.service.rem; import fr.insee.protools.backend.service.exception.IncorrectSUBPMNError; -import fr.insee.protools.backend.dto.rem.PersonDto; -import fr.insee.protools.backend.dto.rem.REMSurveyUnitDto; +import fr.insee.protools.backend.dto.rem_tmp.PersonDto; +import fr.insee.protools.backend.dto.rem_tmp.REMSurveyUnitDto; import org.apache.commons.lang3.tuple.Pair; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; diff --git a/src/test/java/fr/insee/protools/backend/service/rem/delegate/ExtractContactIdentifierFromREMSUTaskTest.java b/src/test/backup/java/fr/insee/protools/backend/service/rem/delegate/ExtractContactIdentifierFromREMSUTaskTest.java similarity index 100% rename from src/test/java/fr/insee/protools/backend/service/rem/delegate/ExtractContactIdentifierFromREMSUTaskTest.java rename to src/test/backup/java/fr/insee/protools/backend/service/rem/delegate/ExtractContactIdentifierFromREMSUTaskTest.java diff --git a/src/test/java/fr/insee/protools/backend/service/rem/delegate/RemGetPartitionListOfSuIdTaskTest.java b/src/test/backup/java/fr/insee/protools/backend/service/rem/delegate/RemGetPartitionListOfSuIdTaskTest.java similarity index 95% rename from src/test/java/fr/insee/protools/backend/service/rem/delegate/RemGetPartitionListOfSuIdTaskTest.java rename to src/test/backup/java/fr/insee/protools/backend/service/rem/delegate/RemGetPartitionListOfSuIdTaskTest.java index dd936887..bfa0e49f 100644 --- a/src/test/java/fr/insee/protools/backend/service/rem/delegate/RemGetPartitionListOfSuIdTaskTest.java +++ b/src/test/backup/java/fr/insee/protools/backend/service/rem/delegate/RemGetPartitionListOfSuIdTaskTest.java @@ -70,7 +70,7 @@ void execute_should_throw_FlowableIllegalArgumentException_when_variableCurrentP } - void execute_should_work_when_contextNpartition_and_variable_OK(String contexte, Long currentPartitionId, Long[] remSuIdList) throws JsonProcessingException { + void execute_should_work_when_contextNpartition_and_variable_OK(String contexte, String currentPartitionId, Long[] remSuIdList) throws JsonProcessingException { //Préconditions DelegateExecution execution = mock(DelegateExecution.class); DelegateExecution executionParent = mock(DelegateExecution.class); @@ -78,7 +78,7 @@ void execute_should_work_when_contextNpartition_and_variable_OK(String contexte, when(execution.getProcessInstanceId()).thenReturn(dumyId); //No context used by this task - when(execution.getVariable(VARNAME_CURRENT_PARTITION_ID, Long.class)).thenReturn(currentPartitionId); + when(execution.getVariable(VARNAME_CURRENT_PARTITION_ID, String.class)).thenReturn(currentPartitionId); when(execution.getParent()).thenReturn(executionParent); List expectedResult = List.of(remSuIdList); @@ -102,7 +102,7 @@ void execute_should_work_when_context1partition_and_variable_OK() throws JsonPro " \"id\": 1" + " }]" + "}"; - execute_should_work_when_contextNpartition_and_variable_OK(json1Partition, 1l, remSuIdList); + execute_should_work_when_contextNpartition_and_variable_OK(json1Partition, "1", remSuIdList); } @Test @@ -110,6 +110,6 @@ void execute_should_work_when_context3partition_and_variable_OK() throws JsonPro Long[] remSuIdList = {1l, 2l, 3l}; String json3Partition = "{ \"partitions\": [{ \"id\": 1 },{ \"id\": 56 }, { \"id\": 99 }] }"; - execute_should_work_when_contextNpartition_and_variable_OK(json3Partition, 1l, remSuIdList); + execute_should_work_when_contextNpartition_and_variable_OK(json3Partition, "1", remSuIdList); } } \ No newline at end of file diff --git a/src/test/java/fr/insee/protools/backend/service/rem/delegate/RemGetSUTaskTest.java b/src/test/backup/java/fr/insee/protools/backend/service/rem/delegate/RemGetSUTaskTest.java similarity index 97% rename from src/test/java/fr/insee/protools/backend/service/rem/delegate/RemGetSUTaskTest.java rename to src/test/backup/java/fr/insee/protools/backend/service/rem/delegate/RemGetSUTaskTest.java index bdadbe3b..4e65c581 100644 --- a/src/test/java/fr/insee/protools/backend/service/rem/delegate/RemGetSUTaskTest.java +++ b/src/test/backup/java/fr/insee/protools/backend/service/rem/delegate/RemGetSUTaskTest.java @@ -3,7 +3,7 @@ import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import fr.insee.protools.backend.service.rem.RemService; -import fr.insee.protools.backend.dto.rem.REMSurveyUnitDto; +import fr.insee.protools.backend.dto.rem_tmp.REMSurveyUnitDto; import org.flowable.common.engine.api.FlowableIllegalArgumentException; import org.flowable.engine.delegate.DelegateExecution; import org.flowable.engine.test.FlowableTest; diff --git a/src/test/java/fr/insee/protools/backend/service/rem/delegate/RemWriteEraSUListTaskTest.java b/src/test/backup/java/fr/insee/protools/backend/service/rem/delegate/RemWriteEraSUListTaskTest.java similarity index 94% rename from src/test/java/fr/insee/protools/backend/service/rem/delegate/RemWriteEraSUListTaskTest.java rename to src/test/backup/java/fr/insee/protools/backend/service/rem/delegate/RemWriteEraSUListTaskTest.java index 57f61cae..666a1a65 100644 --- a/src/test/java/fr/insee/protools/backend/service/rem/delegate/RemWriteEraSUListTaskTest.java +++ b/src/test/backup/java/fr/insee/protools/backend/service/rem/delegate/RemWriteEraSUListTaskTest.java @@ -3,8 +3,8 @@ import com.fasterxml.jackson.core.JsonProcessingException; import fr.insee.protools.backend.dto.era.CensusJsonDto; import fr.insee.protools.backend.service.rem.RemService; -import fr.insee.protools.backend.dto.rem.SuIdMappingJson; -import fr.insee.protools.backend.dto.rem.SuIdMappingRecord; +import fr.insee.protools.backend.dto.rem_tmp.SuIdMappingJson; +import fr.insee.protools.backend.dto.rem_tmp.SuIdMappingRecord; import org.flowable.common.engine.api.FlowableIllegalArgumentException; import org.flowable.engine.delegate.DelegateExecution; import org.flowable.engine.test.FlowableTest; @@ -65,10 +65,10 @@ void execute_should_work_when_variables_Ok() throws JsonProcessingException { when(execution.getParent()).thenReturn(executionParent); lenient().when(execution.getProcessInstanceId()).thenReturn(dumyId); - //PArtitionID - Long partitionID = 99l; + //PartitionID + String partitionID = "99"; //Stubbed list of ERA Values - Long eraId1=500l, eraId2=1000l; + String eraId1="500", eraId2="1000"; CensusJsonDto eraSU1 = CensusJsonDto.builder() .id(eraId1) .build(); @@ -77,7 +77,7 @@ void execute_should_work_when_variables_Ok() throws JsonProcessingException { .build(); List listOfEraSU = List.of(eraSU1,eraSU2); lenient().when(execution.getVariable(VARNAME_ERA_RESPONSE, List.class)).thenReturn(listOfEraSU); - lenient().when(execution.getVariable(VARNAME_CURRENT_PARTITION_ID, Long.class)).thenReturn(partitionID); + lenient().when(execution.getVariable(VARNAME_CURRENT_PARTITION_ID, String.class)).thenReturn(partitionID); //Stubbed list id mapping between ERA SU and created REM SU long remId1=1l,remId2=2l; diff --git a/src/test/java/fr/insee/protools/backend/service/sabiane/SabianeIdHelperTest.java b/src/test/backup/java/fr/insee/protools/backend/service/sabiane/SabianeIdHelperTest.java similarity index 100% rename from src/test/java/fr/insee/protools/backend/service/sabiane/SabianeIdHelperTest.java rename to src/test/backup/java/fr/insee/protools/backend/service/sabiane/SabianeIdHelperTest.java diff --git a/src/test/java/fr/insee/protools/backend/service/sabiane/delegate/SabianeCtxExamples.java b/src/test/backup/java/fr/insee/protools/backend/service/sabiane/delegate/SabianeCtxExamples.java similarity index 100% rename from src/test/java/fr/insee/protools/backend/service/sabiane/delegate/SabianeCtxExamples.java rename to src/test/backup/java/fr/insee/protools/backend/service/sabiane/delegate/SabianeCtxExamples.java diff --git a/src/test/java/fr/insee/protools/backend/service/sabiane/delegate/SabianePilotageCreateContextTaskTest.java b/src/test/backup/java/fr/insee/protools/backend/service/sabiane/delegate/SabianePilotageCreateContextTaskTest.java similarity index 100% rename from src/test/java/fr/insee/protools/backend/service/sabiane/delegate/SabianePilotageCreateContextTaskTest.java rename to src/test/backup/java/fr/insee/protools/backend/service/sabiane/delegate/SabianePilotageCreateContextTaskTest.java diff --git a/src/test/java/fr/insee/protools/backend/service/sabiane/delegate/SabianePilotageCreateSUTaskTest.java b/src/test/backup/java/fr/insee/protools/backend/service/sabiane/delegate/SabianePilotageCreateSUTaskTest.java similarity index 99% rename from src/test/java/fr/insee/protools/backend/service/sabiane/delegate/SabianePilotageCreateSUTaskTest.java rename to src/test/backup/java/fr/insee/protools/backend/service/sabiane/delegate/SabianePilotageCreateSUTaskTest.java index df34d81c..fcafcda2 100644 --- a/src/test/java/fr/insee/protools/backend/service/sabiane/delegate/SabianePilotageCreateSUTaskTest.java +++ b/src/test/backup/java/fr/insee/protools/backend/service/sabiane/delegate/SabianePilotageCreateSUTaskTest.java @@ -5,7 +5,7 @@ import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.node.ObjectNode; import fr.insee.protools.backend.ProtoolsTestUtils; -import fr.insee.protools.backend.dto.rem.*; +import fr.insee.protools.backend.dto.rem_tmp.*; import fr.insee.protools.backend.dto.sabiane.pilotage.*; import fr.insee.protools.backend.service.context.exception.BadContextIncorrectBPMNError; import fr.insee.protools.backend.service.exception.IncorrectSUBPMNError; @@ -46,7 +46,7 @@ class SabianePilotageCreateSUTaskTest extends TestWithContext { - static final Long ctx_partition1 = 99L; + static final String ctx_partition1 = "99"; static final String minimal_ctx_ok = """ { "id": "TEST_ID" , "partitions": [{ "id":99, "typeEchantillon": "logement" , "prioritaire": "false"}] } @@ -618,7 +618,7 @@ void execute_should_throw_FlowableIllegalArgumentException_when_variables_notDef assertThat(exception.getMessage()).isEqualTo(getMissingVariableMessage(VARNAME_CURRENT_PARTITION_ID)); //Create First variable - when(execution.getVariable(VARNAME_CURRENT_PARTITION_ID, Long.class)).thenReturn(99L); + when(execution.getVariable(VARNAME_CURRENT_PARTITION_ID, String.class)).thenReturn("99"); //Execute again exception = assertThrows(FlowableIllegalArgumentException.class, () -> sabianePilotageTask.execute(execution)); //Check the error @@ -648,7 +648,7 @@ void execute_should_throw_BadContext_when_contextIncorrect(String context_json) //Precondition DelegateExecution execution = createMockedExecution(); //Variables - lenient().when(execution.getVariable(VARNAME_CURRENT_PARTITION_ID, Long.class)).thenReturn(CtxExamples.ctx_partition1); + lenient().when(execution.getVariable(VARNAME_CURRENT_PARTITION_ID, String.class)).thenReturn(CtxExamples.ctx_partition1); lenient().when(execution.getVariable(VARNAME_REM_INTERROGATION, JsonNode.class)).thenReturn(ProtoolsTestUtils.asJsonNode(RemSUData.rem_su_1personne)); //Ctx ProtoolsTestUtils.initContexteMockFromString(protoolsContext, context_json); @@ -679,7 +679,7 @@ void execute_should_work_when_ctx_1part_logement(String inputCtx, String inputRe //Precondition DelegateExecution execution = mock(DelegateExecution.class); lenient().when(execution.getProcessInstanceId()).thenReturn(dumyId); - lenient().when(execution.getVariable(VARNAME_CURRENT_PARTITION_ID, Long.class)).thenReturn(CtxExamples.ctx_partition1); + lenient().when(execution.getVariable(VARNAME_CURRENT_PARTITION_ID, String.class)).thenReturn(CtxExamples.ctx_partition1); JsonNode remSU = ProtoolsTestUtils.asJsonNode(inputRemSU); lenient().when(execution.getVariable(VARNAME_REM_INTERROGATION, JsonNode.class)).thenReturn(remSU); //Ctx diff --git a/src/test/java/fr/insee/protools/backend/service/sabiane/delegate/SabianeQuestionnaireCreateContextTaskTest.java b/src/test/backup/java/fr/insee/protools/backend/service/sabiane/delegate/SabianeQuestionnaireCreateContextTaskTest.java similarity index 94% rename from src/test/java/fr/insee/protools/backend/service/sabiane/delegate/SabianeQuestionnaireCreateContextTaskTest.java rename to src/test/backup/java/fr/insee/protools/backend/service/sabiane/delegate/SabianeQuestionnaireCreateContextTaskTest.java index 0de791dd..77de2b85 100644 --- a/src/test/java/fr/insee/protools/backend/service/sabiane/delegate/SabianeQuestionnaireCreateContextTaskTest.java +++ b/src/test/backup/java/fr/insee/protools/backend/service/sabiane/delegate/SabianeQuestionnaireCreateContextTaskTest.java @@ -3,13 +3,10 @@ import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import fr.insee.protools.backend.ProtoolsTestUtils; -import fr.insee.protools.backend.dto.platine_sabiane_questionnaire.campaign.CampaignDto; -import fr.insee.protools.backend.dto.platine_sabiane_questionnaire.campaign.MetadataValue; import fr.insee.protools.backend.service.context.ContextConstants; -import fr.insee.protools.backend.service.context.ContextService; import fr.insee.protools.backend.service.context.exception.BadContextIncorrectBPMNError; -import fr.insee.protools.backend.service.nomenclature.NomenclatureService; -import fr.insee.protools.backend.service.questionnaire_model.QuestionnaireModelService; +import fr.insee.protools.backend.deprecated.service.nomenclature.NomenclatureService; +import fr.insee.protools.backend.deprecated.service.questionnaire_model.QuestionnaireModelService; import fr.insee.protools.backend.service.sabiane.questionnaire.SabianeQuestionnaireService; import fr.insee.protools.backend.service.utils.TestWithContext; import org.flowable.engine.delegate.DelegateExecution; diff --git a/src/test/java/fr/insee/protools/backend/service/sabiane/delegate/SabianeQuestionnaireCreateSUTaskTest.java b/src/test/backup/java/fr/insee/protools/backend/service/sabiane/delegate/SabianeQuestionnaireCreateSUTaskTest.java similarity index 97% rename from src/test/java/fr/insee/protools/backend/service/sabiane/delegate/SabianeQuestionnaireCreateSUTaskTest.java rename to src/test/backup/java/fr/insee/protools/backend/service/sabiane/delegate/SabianeQuestionnaireCreateSUTaskTest.java index e5af13e2..b8f30402 100644 --- a/src/test/java/fr/insee/protools/backend/service/sabiane/delegate/SabianeQuestionnaireCreateSUTaskTest.java +++ b/src/test/backup/java/fr/insee/protools/backend/service/sabiane/delegate/SabianeQuestionnaireCreateSUTaskTest.java @@ -83,7 +83,7 @@ void execute_should_throw_FlowableIllegalArgumentException_when_variables_notDef assertThat(exception.getMessage()).isEqualTo(getMissingVariableMessage(VARNAME_CURRENT_PARTITION_ID)); //Create First variable - when(execution.getVariable(VARNAME_CURRENT_PARTITION_ID, Long.class)).thenReturn(99L); + when(execution.getVariable(VARNAME_CURRENT_PARTITION_ID, String.class)).thenReturn(CtxExamples.ctx_partition1); //Execute again exception = assertThrows(FlowableIllegalArgumentException.class, () -> sabianePilotageTask.execute(execution)); //Check the error @@ -109,7 +109,7 @@ void execute_should_throw_BadContext_when_contextIncorrect(String context_json) //Precondition DelegateExecution execution = createMockedExecution(); //Variables - lenient().when(execution.getVariable(VARNAME_CURRENT_PARTITION_ID, Long.class)).thenReturn(CtxExamples.ctx_partition1); + lenient().when(execution.getVariable(VARNAME_CURRENT_PARTITION_ID, String.class)).thenReturn(CtxExamples.ctx_partition1); lenient().when(execution.getVariable(VARNAME_REM_INTERROGATION, JsonNode.class)).thenReturn(ProtoolsTestUtils.asJsonNode(RemSUData.rem_su_1personne)); //Ctx ProtoolsTestUtils.initContexteMockFromString(protoolsContext, context_json); @@ -126,7 +126,7 @@ void execute_should_work_when_ctx_1part_logement(String inputCtx, String inputRe //Precondition DelegateExecution execution = mock(DelegateExecution.class); lenient().when(execution.getProcessInstanceId()).thenReturn(dumyId); - lenient().when(execution.getVariable(VARNAME_CURRENT_PARTITION_ID, Long.class)).thenReturn(CtxExamples.ctx_partition1); + lenient().when(execution.getVariable(VARNAME_CURRENT_PARTITION_ID, String.class)).thenReturn(CtxExamples.ctx_partition1); JsonNode remSU = ProtoolsTestUtils.asJsonNode(inputRemSU); lenient().when(execution.getVariable(VARNAME_REM_INTERROGATION, JsonNode.class)).thenReturn(remSU); //Ctx diff --git a/src/test/java/fr/insee/protools/backend/service/sugoi/SugoiCreateUserTaskTest.java b/src/test/backup/java/fr/insee/protools/backend/service/sugoi/SugoiCreateUserTaskTest.java similarity index 100% rename from src/test/java/fr/insee/protools/backend/service/sugoi/SugoiCreateUserTaskTest.java rename to src/test/backup/java/fr/insee/protools/backend/service/sugoi/SugoiCreateUserTaskTest.java diff --git a/src/test/java/fr/insee/protools/backend/service/utils/ContextUtilsTest.java b/src/test/backup/java/fr/insee/protools/backend/service/utils/ContextUtilsTest.java similarity index 93% rename from src/test/java/fr/insee/protools/backend/service/utils/ContextUtilsTest.java rename to src/test/backup/java/fr/insee/protools/backend/service/utils/ContextUtilsTest.java index 07582aac..21d9fc0f 100644 --- a/src/test/java/fr/insee/protools/backend/service/utils/ContextUtilsTest.java +++ b/src/test/backup/java/fr/insee/protools/backend/service/utils/ContextUtilsTest.java @@ -3,6 +3,7 @@ import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; +import fr.insee.protools.backend.deprecated.service.utils.ContextUtils; import org.flowable.common.engine.api.FlowableIllegalArgumentException; import org.junit.jupiter.api.Test; @@ -23,7 +24,7 @@ void getCurrentPartitionNode_ShouldReturnCorrectPartitionNode_WhenFound() throws // Arrange JsonNode contextRootNode = new ObjectMapper().readTree(json1Partition); // Act - JsonNode result = ContextUtils.getCurrentPartitionNode(contextRootNode, 1l); + JsonNode result = ContextUtils.getCurrentPartitionNode(contextRootNode, "1"); // Assert assertEquals("val1",result.path("toto").asText()); } @@ -33,7 +34,7 @@ void getCurrentPartitionNode_ShouldReturnCorrectPartitionNode_WhenFound2() throw // Arrange JsonNode contextRootNode = new ObjectMapper().readTree(json2Partition); // Act - JsonNode result = ContextUtils.getCurrentPartitionNode(contextRootNode, 2l); + JsonNode result = ContextUtils.getCurrentPartitionNode(contextRootNode, "2"); // Assert assertEquals("val2",result.path("toto").asText()); } @@ -46,7 +47,7 @@ void getCurrentPartitionNode_ShouldThrowFlowableIllegalArgumentException_WhenPar // Act assertThrows(FlowableIllegalArgumentException.class, - () -> ContextUtils.getCurrentPartitionNode(contextRootNode, 55l)); + () -> ContextUtils.getCurrentPartitionNode(contextRootNode, "55")); } @Test @@ -56,6 +57,6 @@ void getCurrentPartitionNode_ShouldThrowFlowableIllegalArgumentException_WhenPar // Act assertThrows(FlowableIllegalArgumentException.class, - () -> ContextUtils.getCurrentPartitionNode(contextRootNode, 55l)); + () -> ContextUtils.getCurrentPartitionNode(contextRootNode, "55")); } } \ No newline at end of file diff --git a/src/test/java/fr/insee/protools/backend/service/utils/FlowableVariableUtilsTest.java b/src/test/backup/java/fr/insee/protools/backend/service/utils/FlowableVariableUtilsTest.java similarity index 100% rename from src/test/java/fr/insee/protools/backend/service/utils/FlowableVariableUtilsTest.java rename to src/test/backup/java/fr/insee/protools/backend/service/utils/FlowableVariableUtilsTest.java diff --git a/src/test/java/fr/insee/protools/backend/service/utils/data/CtxExamples.java b/src/test/backup/java/fr/insee/protools/backend/service/utils/data/CtxExamples.java similarity index 98% rename from src/test/java/fr/insee/protools/backend/service/utils/data/CtxExamples.java rename to src/test/backup/java/fr/insee/protools/backend/service/utils/data/CtxExamples.java index 33ca4849..b7ff02c7 100644 --- a/src/test/java/fr/insee/protools/backend/service/utils/data/CtxExamples.java +++ b/src/test/backup/java/fr/insee/protools/backend/service/utils/data/CtxExamples.java @@ -2,7 +2,7 @@ public class CtxExamples { - public static final Long ctx_partition1 = 99L; + public static final String ctx_partition1 = "99"; //CTX public static final String ctx_no_part = diff --git a/src/test/java/fr/insee/protools/backend/service/utils/data/RemSUData.java b/src/test/backup/java/fr/insee/protools/backend/service/utils/data/RemSUData.java similarity index 100% rename from src/test/java/fr/insee/protools/backend/service/utils/data/RemSUData.java rename to src/test/backup/java/fr/insee/protools/backend/service/utils/data/RemSUData.java diff --git a/src/test/java/fr/insee/protools/backend/service/utils/password/PasswordServiceTest.java b/src/test/backup/java/fr/insee/protools/backend/service/utils/password/PasswordServiceTest.java similarity index 100% rename from src/test/java/fr/insee/protools/backend/service/utils/password/PasswordServiceTest.java rename to src/test/backup/java/fr/insee/protools/backend/service/utils/password/PasswordServiceTest.java diff --git a/src/test/java/fr/insee/protools/backend/ProtoolsTestUtils.java b/src/test/java/fr/insee/protools/backend/ProtoolsTestUtils.java index 86f22462..70e10019 100644 --- a/src/test/java/fr/insee/protools/backend/ProtoolsTestUtils.java +++ b/src/test/java/fr/insee/protools/backend/ProtoolsTestUtils.java @@ -79,7 +79,7 @@ public static Buffer fileToBytes(File file) throws IOException { public static JsonNode initContexteMockFromString(ContextService protoolsContext, String contextAsString) throws JsonProcessingException { JsonNode contextRootNode = new ObjectMapper().readTree(contextAsString); - when(protoolsContext.getContextByProcessInstance(anyString())).thenReturn(contextRootNode); + when(protoolsContext.getContextJsonNodeByProcessInstance(anyString())).thenReturn(contextRootNode); return contextRootNode; } } diff --git a/src/test/java/fr/insee/protools/backend/service/platine/service/PlatinePilotageServiceTest.java b/src/test/java/fr/insee/protools/backend/service/platine/service/PlatinePilotageServiceTest.java new file mode 100644 index 00000000..4f0607e5 --- /dev/null +++ b/src/test/java/fr/insee/protools/backend/service/platine/service/PlatinePilotageServiceTest.java @@ -0,0 +1,52 @@ +package fr.insee.protools.backend.service.platine.service; + +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.node.JsonNodeFactory; +import fr.insee.protools.backend.restclient.RestClientHelper; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; +import org.springframework.web.client.RestClient; + +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.*; + +@ExtendWith(MockitoExtension.class) +class PlatinePilotageServiceTest { + + @Mock + RestClientHelper restClientHelper; + @Mock + private RestClient.RequestBodyUriSpec requestBodyUriSpec; // Mock post() call + @Mock + private RestClient.ResponseSpec responseSpec; // Mock retrieve() call + + @InjectMocks + PlatinePilotageService service; + + @Test + void postContext_should_call_correctURIAndBody(){ + //Prepare + RestClient mockRestClient = mock(RestClient.class); + doReturn(mockRestClient).when(restClientHelper).getRestClient(any()); + // Mock the chaining of RestClient calls + when(mockRestClient.post()).thenReturn(requestBodyUriSpec); + when(requestBodyUriSpec.uri(anyString(), any(Object[].class))).thenReturn(requestBodyUriSpec); + when(requestBodyUriSpec.body(any(Object.class))).thenReturn(requestBodyUriSpec); + when(requestBodyUriSpec.retrieve()).thenReturn(responseSpec); + + JsonNode contextNode = JsonNodeFactory.instance.objectNode(); + + //Call method under test + service.postContext("TOTO", contextNode); + + //Verifications + // Then - Verify that the uri method was called with "/context" + verify(requestBodyUriSpec).uri("/context"); + // and with expected body + verify(requestBodyUriSpec).body(contextNode); + } + +} \ No newline at end of file diff --git a/src/test/java/fr/insee/protools/backend/service/utils/TestWithContext.java b/src/test/java/fr/insee/protools/backend/service/utils/TestWithContext.java index 6cd2f3dd..e35a6d0f 100644 --- a/src/test/java/fr/insee/protools/backend/service/utils/TestWithContext.java +++ b/src/test/java/fr/insee/protools/backend/service/utils/TestWithContext.java @@ -1,9 +1,13 @@ package fr.insee.protools.backend.service.utils; import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; import fr.insee.protools.backend.ProtoolsTestUtils; +import fr.insee.protools.backend.dto.ContexteProcessus; import fr.insee.protools.backend.service.context.ContextService; +import fr.insee.protools.backend.service.context.exception.BadContexMissingBPMNError; import fr.insee.protools.backend.service.context.exception.BadContextIncorrectBPMNError; +import lombok.SneakyThrows; import org.flowable.engine.delegate.DelegateExecution; import org.flowable.engine.delegate.JavaDelegate; import org.junit.jupiter.api.AfterEach; @@ -25,14 +29,18 @@ public abstract class TestWithContext { @Spy protected ContextService protoolsContext; protected final String dumyId="ID1"; + private ObjectMapper objectMapper=new ObjectMapper(); @AfterEach void mockitoResetContext() { Mockito.reset(protoolsContext); } - protected JsonNode initContexteMockWithFile(String contexteToLoad){ + @SneakyThrows + protected JsonNode initContexteMockWithFile(String contexteToLoad) { JsonNode contextRootNode = ProtoolsTestUtils.asJsonNode(contexteToLoad); - doReturn(contextRootNode).when(protoolsContext).getContextByProcessInstance(anyString()); + ContexteProcessus schema = objectMapper.readValue(contexteToLoad, ContexteProcessus.class); + doReturn(contextRootNode).when(protoolsContext).getContextJsonNodeByProcessInstance(anyString()); + doReturn(schema).when(protoolsContext).getContextDtoByProcessInstance(anyString()); return contextRootNode; } @@ -53,8 +61,9 @@ protected void assertThat_delegate_throwError_when_null_context(JavaDelegate del //Precondition DelegateExecution execution = mock(DelegateExecution.class); lenient().when(execution.getProcessInstanceId()).thenReturn(dumyId); - doReturn(null).when(protoolsContext).getContextByProcessInstance(anyString()); + doThrow(new BadContexMissingBPMNError("Erreur")).when(protoolsContext).getContextDtoByProcessInstance(anyString()); + doThrow(new BadContexMissingBPMNError("Erreur")).when(protoolsContext).getContextJsonNodeByProcessInstance(anyString()); - assertThrows(BadContextIncorrectBPMNError.class, () -> delegate.execute(execution)); + assertThrows(BadContexMissingBPMNError.class, () -> delegate.execute(execution)); } } diff --git a/src/test/java/fr/insee/protools/backend/utils/data/CtxExamples.java b/src/test/java/fr/insee/protools/backend/utils/data/CtxExamples.java new file mode 100644 index 00000000..7316f704 --- /dev/null +++ b/src/test/java/fr/insee/protools/backend/utils/data/CtxExamples.java @@ -0,0 +1,21 @@ +package fr.insee.protools.backend.utils.data; + +import org.springframework.util.ClassUtils; + +public class CtxExamples { + + + public static final String ctx_empty = + """ + { + "id": "b958cfac-2bf3-478d-a97a-dda5e751898c" + } + """; + public static final String ctx_empty_id="b958cfac-2bf3-478d-a97a-dda5e751898c"; + + final static String ressourceFolder = ClassUtils.convertClassNameToResourcePath(CtxExamples.class.getPackageName()); + public final static String context_minimal = ressourceFolder+"/ctx_minimal.json"; + + + private CtxExamples(){} +} From 9e3c1e847a2f105c24d6e05fa59b73f3f33ca785 Mon Sep 17 00:00:00 2001 From: SNDIL - Marc Date: Mon, 9 Sep 2024 16:38:46 +0200 Subject: [PATCH 55/75] json schema : en cours --- pom.xml | 55 +++- .../contexte-processus.json} | 289 ++++++------------ .../QuestionnaireHelperTest.java | 259 ---------------- .../EraGetSUForPeriodAndGenderTaskTest.java | 145 --------- ...tinePilotageCreateContextTaskRESTTest.java | 59 ++++ ...uestionnaireCreateContextTaskRESTTest.java | 52 ++++ .../PlatineQuestionnaireServiceTest.java | 55 ++++ 7 files changed, 307 insertions(+), 607 deletions(-) rename src/main/resources/{context_schema.json => schema/contexte-processus.json} (78%) delete mode 100644 src/test/java/fr/insee/protools/backend/service/common/platine_sabiane/QuestionnaireHelperTest.java delete mode 100644 src/test/java/fr/insee/protools/backend/service/era/EraGetSUForPeriodAndGenderTaskTest.java create mode 100644 src/test/java/fr/insee/protools/backend/service/platine/delegate/pilotatage/PlatinePilotageCreateContextTaskRESTTest.java create mode 100644 src/test/java/fr/insee/protools/backend/service/platine/delegate/questionnaire/PlatineQuestionnaireCreateContextTaskRESTTest.java create mode 100644 src/test/java/fr/insee/protools/backend/service/platine/service/PlatineQuestionnaireServiceTest.java diff --git a/pom.xml b/pom.xml index c541f06d..cf9a0752 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ org.springframework.boot spring-boot-starter-parent - 3.3.1 + 3.3.3 fr.insee.sndil.protools @@ -133,6 +133,14 @@ test
+ + + com.networknt + json-schema-validator + 1.5.1 + + +
@@ -203,8 +211,53 @@ 21 21 + + fr/insee/protools/backend/deprecated/**/*.java + + + **/deprecated/**/*.java + + + + org.jsonschema2pojo + jsonschema2pojo-maven-plugin + 1.2.1 + + java.time.Instant + ${basedir}/src/main/resources/schema + fr.insee.protools.backend.dto + ALWAYS + + + + + generate + + + + + + + org.codehaus.mojo + build-helper-maven-plugin + + + generate-sources + + add-source + + + + ${project.build.directory}/generated-sources/jsonschema2pojo + + + + + + + diff --git a/src/main/resources/context_schema.json b/src/main/resources/schema/contexte-processus.json similarity index 78% rename from src/main/resources/context_schema.json rename to src/main/resources/schema/contexte-processus.json index 1284ca91..d421870d 100644 --- a/src/main/resources/context_schema.json +++ b/src/main/resources/schema/contexte-processus.json @@ -4,16 +4,6 @@ "title": "Contexte de processus", "description": "Le contexte d'un processus", "type": "object", - "required": [ - "id", - "labelCourt", - "label", - "contexte", - "metadonnees", - "lots", - "questionnairesModeles", - "nomenclatures" - ], "properties": { "id": { "description": "Identifiant de la campagne", @@ -50,7 +40,7 @@ "type": "string" }, "periodicite": { - "description": "Périodicité de XXX. X: pluriannuelle; A: annuelle ; S: semestrielle ; T: trimestrielle; B: bi-mensuelle; M: mensuelle", + "description": "Fréquence de la collecte (code). X: pluriannuelle; A: annuelle ; S: semestrielle ; T: trimestrielle; B: bi-mensuelle; M: mensuelle", "enum": [ "X", "A", @@ -69,7 +59,7 @@ "$ref": "#/$defs/annee4digit" }, "operationId": { - "description": "XXXX", + "description": "Identifiant de l'opération statistique", "type": "string" }, "operationLabelCourt": { @@ -93,15 +83,15 @@ "type": "string" }, "diffusionUrl": { - "description": "XXXX", + "description": "URL d'information de diffusion sur l'enquête", "type": "string" }, "noticeUrl": { - "description": "XXXX", + "description": "URL de la notice de l'enquête", "type": "string" }, "specimenUrl": { - "description": "XXXX", + "description": "URL du specimen de l'enquête", "type": "string" }, "numeroVisa": { @@ -110,7 +100,7 @@ }, "anneeVisa": { "description": "Année du VISA", - "$ref": "#/$defs/annee4digit" + "type": "string" }, "caractereObligatoire": { "description": "Caractère obligatoire de l'enquête", @@ -121,35 +111,36 @@ "type": "boolean" }, "qualiteStatistique": { - "description": "XXXX", + "description": "Obtention du caractère de qualité statistique de l'enquête", "type": "boolean" }, "testNonLabellise": { - "description": "XXXX", + "description": "Enquête non labellisée", "type": "boolean" }, "parutionJo": { - "description": "XXXX", + "description": "Publication du visa Cnis au journal officiel", "type": "boolean" }, "dateParutionJo": { + "description": "Date de publication au journal officiel, apparaissant sur les courriers/mails envoyés aux enquêtés", "type": "string", "format": "date" }, "portailMesEnquetesOperation": { - "description": "XXXX", + "description": "Présence ou non d'un portail Mes enquêtes pour la réponse à une enquête web", "type": "boolean" }, "proprietaireId": { - "description": "XXXX (visiblement ca part dans les metadonnees proprietaire de platine)", + "description": "Identifiant du propriétaire de l'enquête", "type": "string" }, "proprietaireLabel": { - "description": "XXXX (visiblement ca part dans les metadonnees proprietaire de platine)", + "description": "Nom du propriétaire de l'enquête", "type": "string" }, "imageLogos": { - "description": "XXXX", + "description": "Logo de l'entête des courriers envoyés aux enquêtés", "type": "string" }, "ministereTutelle": { @@ -157,34 +148,35 @@ "type": "string" }, "commanditaire": { - "description": "Commanditaire de cette enquête", + "description": "Le ou les organisme(s) en charge de l’enquête statistique affiché(s) sur les courriers envoyés aux enquêtés.", "type": "string" }, "responsableOperationnel": { - "description": "XXXX", + "description": "Responsable opérationnel en charge du traitement pour l’exercice des droits", "type": "string" }, "mailResponsableOperationnel": { - "description": "XXXX", + "description": "Mail du responsable opérationnel du traitement pour l’exercice des droits", "type": "string" }, "responsableTraitement": { - "description": "XXXX", + "description": "Nom du responsable du traitement", "type": "string" }, "responsableTraitementIdenti": { + "description": "Nom court du responsable du traitement", "type": "string" }, "responsableTraitementIdentiFem": { - "description": "XXXX", + "description": "Genre féminin du responsable du traitement", "type": "boolean" }, "urlResponsableTraitement": { - "description": "XXXX", + "description": "Url du site du responsable du traitement", "type": "string" }, "prestataire": { - "description": "L'equête est elle réalisée par un prestataire", + "description": "Présence d'un prestataire pour réaliser l'enquête", "type": "boolean" }, "nomPrestataire": { @@ -196,198 +188,199 @@ "type": "string" }, "logoPartenaire": { - "description": "Logo du partenaire", + "description": "Logo du partenaire de l'Insee participant à l'enquête, affiché dans les mails envoyés aux enquêtés", "type": "string" }, "serviceCollecteurSignataireFonction": { - "description": "XXX", + "description": "Fonction du signataire des communications", "type": "string" }, "serviceCollecteurSignataireNom": { - "description": "XXX", + "description": "Prénom et nom du signataire des communications", "type": "string" }, "imageLogoSignataire": { - "description": "XXX", + "description": "Logo affiché dans les courriers envoyés aux enquêtés, à côté du signataire du courrier", "type": "string" }, "assistanceTel": { - "description": "Numéro de téléphone pour l'assitance", + "description": "Numéro de téléphone pour l'assistance, affiché sur les courriers", "type": "string" }, "assistanceMail": { - "description": "Moyen pour envoyer un mail à l'assistance", + "description": "Assistance par internet, affiché dans la rubrique Nous contacter des courriers", "type": "string" }, "assistanceAdresseL1": { - "description": "Ligne 1 de l'adresse postale du service responsables de l'enquête", + "description": "Ligne 1 de l'adresse postale de l'assistance, affiché sur les courriers", "type": "string" }, "assistanceAdresseL2": { - "description": "Ligne 2 de l'adresse postale du service responsables de l'enquête", + "description": "Ligne 2 de l'adresse postale de l'assistance, affiché sur les courriers", "type": "string" }, "assistanceAdresseL3": { - "description": "Ligne 3 de l'adresse postale du service responsables de l'enquête", + "description": "Ligne 3 de l'adresse postale de l'assistance, affiché sur les courriers", "type": "string" }, "assistanceAdresseL4": { - "description": "Ligne 4 de l'adresse postale du service responsables de l'enquête", + "description": "Ligne 4 de l'adresse postale de l'assistance, affiché sur les courriers", "type": "string" }, "assistanceAdresseL5": { - "description": "Ligne 5 de l'adresse postale du service responsables de l'enquête", + "description": "Ligne 5 de l'adresse postale de l'assistance, affiché sur les courriers", "type": "string" }, "adresseRetourQL1": { - "description": "XXX", + "description": "Adresse du site en charge de la numérisation des questionnaires papier – ligne 1", "type": "string" }, "adresseRetourQL2": { - "description": "XXX", + "description": "Adresse du site en charge de la numérisation des questionnaires papier – ligne 2", "type": "string" }, "adresseRetourQL3": { - "description": "XXX", + "description": "Adresse du site en charge de la numérisation des questionnaires papier – ligne 3", "type": "string" }, "adresseRetourQL4": { - "description": "XXX", + "description": "Adresse du site en charge de la numérisation des questionnaires papier – ligne 4", "type": "string" }, "adresseRetourQL5": { - "description": "XXX", + "description": "XAdresse du site en charge de la numérisation des questionnaires papier – ligne 5", "type": "string" }, "adresseRetourQL6": { - "description": "XXX", + "description": "Adresse du site en charge de la numérisation des questionnaires papier – ligne 6", "type": "string" }, "adresseRetourQL7": { - "description": "XXX", + "description": "Adresse du site en charge de la numérisation des questionnaires papier – ligne 7", "type": "string" }, "representantLegal": { - "description": "XXX", + "description": "Mention des représentants légaux dans les courriers", "type": "boolean" }, "mineur": { - "description": "XXX", + "description": "Présence de mineurs parmi les personnes échantillonnées", "type": "boolean" }, "mineurDroit": { - "description": "XXX", + "description": "Phrase à ajouter dans le cartouche en cas de présence de mineurs parmi les personnes échantillonnées", "type": "string" }, "dpd": { - "description:": "XXX délégué à la protection des données", + "description:": "Mention du délégué à la protection des données dans les courriers et mails envoyés aux enquêtés", "type": "boolean" }, "mailDPD": { - "description:": "Courriel permettant de contacter le DPD", + "description:": "Mail du délégué à la protection des données du Ministère de tutelle pour l’exercice des droits", "type": "string" }, "appariement": { - "description": "XXX", + "description": "Données obtenues par appariement ou non, et précisés dans les courriers", "type": "boolean" }, "sourceAdmin": { - "description": "XXX", + "description": "Données administratives utilisées pour les appariements, affichées dans les courriers en cas d'appariement", "type": "string" }, "archivage": { - "description": "XXX", + "description": "Archivage ou non des données", "type": "boolean" }, "dureeConservation": { - "description": "Durée de conservation (textuelle)", + "description": "Durée de conservation des données indiquée dans le document de conformité RGPD, affichée sur les courriers aux enquêtés ", "type": "string" }, "dureeConservationIdenti": { - "description": "XXX", + "description": "Durée de conservation des données d’identification (affichée sur les courriers)", "type": "string" }, "urlEnquete": { - "description": "XXX", + "description": "Url de l’enquête", "type": "string" }, "incitationARepondre": { - "description": "XXX", + "description": "Phrase sur les courriers pour inciter l’enquêté à répondre à l’enquête", "type": "string" }, "mailBoiteRetour": { - "description": "XXX", + "description": "Boîte fonctionnelle qui accueille les échecs de remise de mail par SPOC", "type": "string" }, "themeMieuxConnaitreMail": { - "description": "Adresse de contact pour XXX", + "description": "Texte affiché dans le bandeau du mail après le Mieux Connaître", "type": "string" }, "ville": { - "description": "XXX", + "description": "Ville de rédaction du courrier", "type": "string" }, "complementOpportunite": { - "description": "XXX", + "description": "Précisions sur l’opportunité de l’enquête dans le cadre légal", "type": "string" }, "paragrapheDonneesPersonnelles": { - "description": "XXX", + "description": "Affichage ou non d’un paragraphe sur les données personnelles dans les courriers", "type": "boolean" }, "messageOffline": { - "description": "XXX", + "description": "Message affiché sur le portail de promotion de l'enquête lorsqu'elle est terminée", "type": "string" }, "messageInfoOffline": { + "description": "Message supplémentaire affiché sur le portail de promotion de l'enquête lorsqu'elle est terminée", "type": "string" }, "configurationVerificationMail": { - "description": "XXX", + "description": "Demande de confirmation du mail de l’enquêté à la connexion", "type": "boolean" }, "imageResultat": { - "description": "XXX", + "description": "Image de la rubrique Quelques résultats du portail de promotion de l’enquête", "type": "string" }, "paragrapheResultat": { - "description": "XXX", + "description": "Texte de la rubrique Quelques résultats du portail de promotion de l’enquête", "type": "string" }, "urlInformationEnquete": { - "description": "XXX", + "description": "Url de la page d’information sur l’enquête", "type": "string" }, "dureeConservationDonneesConnexion": { - "description": "XXX", + "description": "Durée de conservation des données de connexion, mentionné sur le portail de promotion de l'enquête", "type": "string" }, "urlAQuoiServentVosReponses": { - "description": "XXX", + "description": "Url affiché dans la rubrique « a quoi servent vos réponses » du portail de promotion Platine", "type": "string" }, "texteUrlAQuoiServentVosReponses": { - "description": "XXX", + "description": "Texte de l'url affiché dans la rubrique « a quoi servent vos réponses » du portail de promotion Platine", "type": "string" }, "paragrapheAQuoiServentVosReponses": { - "description": "XXX", + "description": "Paragraphe affiché dans la rubrique « a quoi servent vos réponses » du portail de promotion Platine", "type": "string" }, "frequenceExtraction": { - "description": "XXX : Visiblement une expression de type cron ; préciser le format", + "description": "Fréquence d'extraction des données -- Visiblement une expression de type cron ; préciser le format", "type": "string" }, "cheminLivraisonDonnees": { - "description": "XXX", + "description": "Pour préciser l'endroit où sont transmises les données -- A preciser format", "type": "string" }, "chiffrement": { - "description": "XXX", + "description": "Chiffrement des données -- A préciser le format", "type": "string" }, "livraisonDifferentielle": { - "description": "XXX", + "description": "Livraison différentielle des données", "type": "boolean" }, "formatLivraisonDonnees": { @@ -395,11 +388,11 @@ "type": "string" }, "mailBoiteFonctionnelle": { - "description": "XXX", + "description": "Boite fonctionnelle en charge de l’enquête", "type": "string" }, "referents": { - "description": "XXX Référents sabiane; peuvent être principaux (sinon considérés comme secondaires) ", + "description": "Référents de l'enquête, affiché dans Sabiane Gestion - peuvent être principaux (sinon considérés comme secondaires)", "type": "array", "items": { "type": "object", @@ -416,13 +409,7 @@ "principal": { "type": "boolean" } - }, - "required": [ - "nom", - "prenom", - "telephone", - "principal" - ] + } } }, "champGeographiqueEnquete": { @@ -434,7 +421,7 @@ "type": "string" }, "urlLoiStatistique": { - "description": "URL légifrance de la loi relative aux statistiques", + "description": "URL légifrance de la loi relative aux statistiques (loi de 1951)", "type": "string" }, "urlLoiRGPD": { @@ -445,104 +432,7 @@ "description": "URL légifrance de la loi relative à l'informatique, aux fichiers et aux libertés", "type": "string" } - }, - "required": [ - "serieId", - "serieLabelCourt", - "serieLabelLong", - "periodicite", - "periode", - "annee", - "operationId", - "operationLabelCourt", - "operationLabelLong", - "objectifsCourts", - "objectifsLongs", - "cnisUrl", - "diffusionUrl", - "noticeUrl", - "specimenUrl", - "numeroVisa", - "anneeVisa", - "caractereObligatoire", - "interetGeneral", - "qualiteStatistique", - "testNonLabellise", - "parutionJo", - "dateParutionJo", - "portailMesEnquetesOperation", - "proprietaireId", - "proprietaireLabel", - "imageLogos", - "ministereTutelle", - "commanditaire", - "responsableOperationnel", - "mailResponsableOperationnel", - "responsableTraitement", - "responsableTraitementIdenti", - "responsableTraitementIdentiFem", - "urlResponsableTraitement", - "prestataire", - "nomPrestataire", - "urlPrestataire", - "logoPartenaire", - "serviceCollecteurSignataireFonction", - "serviceCollecteurSignataireNom", - "imageLogoSignataire", - "assistanceTel", - "assistanceMail", - "assistanceAdresseL1", - "assistanceAdresseL2", - "assistanceAdresseL3", - "assistanceAdresseL4", - "assistanceAdresseL5", - "adresseRetourQL1", - "adresseRetourQL2", - "adresseRetourQL3", - "adresseRetourQL4", - "adresseRetourQL5", - "adresseRetourQL6", - "adresseRetourQL7", - "representantLegal", - "mineur", - "mineurDroit", - "dpd", - "mailDPD", - "appariement", - "sourceAdmin", - "archivage", - "dureeConservation", - "dureeConservationIdenti", - "urlEnquete", - "incitationARepondre", - "mailBoiteRetour", - "themeMieuxConnaitreMail", - "ville", - "complementOpportunite", - "paragrapheDonneesPersonnelles", - "messageOffline", - "messageInfoOffline", - "configurationVerificationMail", - "imageResultat", - "paragrapheResultat", - "urlInformationEnquete", - "dureeConservationDonneesConnexion", - "urlAQuoiServentVosReponses", - "texteUrlAQuoiServentVosReponses", - "paragrapheAQuoiServentVosReponses", - "frequenceExtraction", - "cheminLivraisonDonnees", - "chiffrement", - "livraisonDifferentielle", - "formatLivraisonDonnees", - "mailBoiteFonctionnelle", - "referents", - "champGeographiqueEnquete", - "champStatistiqueEnquete", - "urlLoiStatistique", - "urlLoiRGPD", - "urlLoiInformatique" - ] + } }, "lots": { "type": "array", @@ -559,7 +449,7 @@ "type": "string" }, "lotsEnLien": { - "description": "Lots précédants et suivants pour les remises en collecte", + "description": "Lots précédents et suivants pour les remises en collecte", "type": "array", "items": { "type": "object", @@ -570,7 +460,7 @@ "format": "uuid" }, "lien": { - "description": "XXXX : Lien entre le lot lié et le lot décrit. Ex: precedent ==> le lot en lien precede le lot actuel ", + "description": "Lien entre le lot lié et le lot décrit. Ex: precedent ==> le lot en lien precede le lot actuel", "type": "string", "enum": [ "precedent", @@ -578,15 +468,10 @@ ] }, "regleRemiseCollecte": { - "description": "XXXX", + "description": "Règle de remise en collecte entre le lot décrit et le lot lié -- A PRECISER LE FORMAT", "type": "string" } - }, - "required": [ - "id", - "lien", - "regleRemiseCollecte" - ] + } } }, "typeEchantillon": { @@ -1081,8 +966,8 @@ "description": "Mode de collecte de l'échantillon CAPI=XXX...", "$ref": "#/$defs/modesDeCollecte" }, - "cheminRepertoire": { - "description": "XXX:(à modifier pour mettre une URL??) : Chemin du répertoire où le modèle de questionnaire est déposé sur gitlab", + "url": { + "description": "URL permettant d'accéder au modèle de questionnaire", "type": "string" }, "label": { @@ -1101,7 +986,7 @@ "required": [ "id", "modeCollecte", - "cheminRepertoire", + "url", "label", "nomenclaturesReferencees" ] @@ -1116,8 +1001,8 @@ "description": "Identifiant de la nomenclature", "type": "string" }, - "cheminRepertoire": { - "description": "XXX:(à modifier pour mettre une URL??) : Chemin du répertoire où la nomenclature est déposée sur gitlab", + "url": { + "description": "URL permettant d'accéder à la nommenclature", "type": "string" }, "label": { @@ -1127,7 +1012,7 @@ }, "required": [ "id", - "cheminRepertoire", + "url", "label" ] } @@ -1149,7 +1034,7 @@ ] }, "periode": { - "description": "XXX. A00: annuelle; X00-X99: pluriannuelle; S01-02: 1er et 2nd semestre; T1-4: 1er-4e trimestre; M01-M12: Mois de l'année; B01-B06: Bimestre dans l'année ", + "description": "Période de l'enquête. A00: annuelle; X00-X99: pluriannuelle; S01-02: 1er et 2nd semestre; T1-4: 1er-4e trimestre; M01-M12: Mois de l'année; B01-B06: Bimestre dans l'année ", "type": "string", "enum": [ "A00", diff --git a/src/test/java/fr/insee/protools/backend/service/common/platine_sabiane/QuestionnaireHelperTest.java b/src/test/java/fr/insee/protools/backend/service/common/platine_sabiane/QuestionnaireHelperTest.java deleted file mode 100644 index 6c0d2896..00000000 --- a/src/test/java/fr/insee/protools/backend/service/common/platine_sabiane/QuestionnaireHelperTest.java +++ /dev/null @@ -1,259 +0,0 @@ -package fr.insee.protools.backend.service.common.platine_sabiane; - -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; -import fr.insee.protools.backend.ProtoolsTestUtils; -import fr.insee.protools.backend.dto.platine_sabiane_questionnaire.campaign.MetadataValue; -import fr.insee.protools.backend.dto.platine_sabiane_questionnaire.campaign.MetadataValueItem; -import fr.insee.protools.backend.dto.platine_sabiane_questionnaire.campaign.MetadataVariables; -import fr.insee.protools.backend.service.context.ContextConstants; -import fr.insee.protools.backend.service.nomenclature.NomenclatureService; -import fr.insee.protools.backend.service.platine.delegate.PlatineQuestionnaireCreateContextTaskTest; -import fr.insee.protools.backend.service.questionnaire_model.QuestionnaireModelService; -import fr.insee.protools.backend.service.sabiane.delegate.SabianeQuestionnaireCreateContextTaskTest; -import org.apache.commons.lang3.tuple.ImmutablePair; -import org.apache.commons.lang3.tuple.Pair; -import org.assertj.core.groups.Tuple; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; -import org.mockito.ArgumentCaptor; -import org.mockito.Mock; -import org.mockito.Spy; -import org.mockito.junit.jupiter.MockitoExtension; -import org.springframework.util.ClassUtils; - -import java.io.IOException; -import java.util.*; -import java.util.stream.Collectors; -import java.util.stream.Stream; - -import static fr.insee.protools.backend.service.context.ContextConstants.*; -import static org.junit.jupiter.api.Assertions.*; -import static org.mockito.ArgumentMatchers.anyString; -import static org.mockito.Mockito.*; - -@ExtendWith(MockitoExtension.class) -class QuestionnaireHelperTest { - - final static String platineRessourceFolder = ClassUtils.convertClassNameToResourcePath(PlatineQuestionnaireCreateContextTaskTest.class.getPackageName()); - final static String platine_context_json = platineRessourceFolder + "/protools-contexte-platine-individu.json"; - - final static String sabianeRessourceFolder = ClassUtils.convertClassNameToResourcePath(SabianeQuestionnaireCreateContextTaskTest.class.getPackageName()); - final static String sabiane_context_json = sabianeRessourceFolder + "/protools-contexte-sabiane.json"; - - - @Mock QuestionnaireModelService questionnaireModelService; - @Mock NomenclatureService nomenclatureService; - @Mock QuestionnairePlatineSabianeService questionnairePlatineSabianeService; - @Spy ObjectMapper objectMapper; - - private final String nomenclatureContent1 = "{\"content\":\"content1\"}"; - private final String nomenclatureContent2 = "{\"content\":\"content2\"}"; - private final String nomenclatureID1 = "ID1"; - private final String nomenclatureID2 = "ID2"; - private final String nomenclatureLabel1 = "label1"; - private final String nomenclatureLabel2 = "label2"; - private final String questionnaireContent1 = "{\"id\":\"TOTO\"}"; - - private JsonNode initNomenclatureTest() { - // preconditions - List> nomenclatures = new ArrayList<>(2); - Map nomenclature1 = Map.of("id", nomenclatureID1, "cheminRepertoire", "path", "label", nomenclatureLabel1); - Map nomenclature2 = Map.of("id", nomenclatureID2, "cheminRepertoire", "path", "label", nomenclatureLabel2); - nomenclatures.add(nomenclature1); - nomenclatures.add(nomenclature2); - //For some tests where the nomenclature already exists in platine, this mock will never be used - //To avoid mockito exception warning about unused mock, we can mark it as lenient - lenient().when(nomenclatureService.getNomenclatureContent(nomenclatureID2, "path")).thenReturn(nomenclatureContent2); - lenient().when(nomenclatureService.getNomenclatureContent(nomenclatureID1, "path")).thenReturn(nomenclatureContent1); - return objectMapper.valueToTree(nomenclatures); - } - - @Test - void initRequiredNomenclatures_should_work_when_no_nomenclature_not_exists_in_remote_plateform() throws IOException { - // preconditions (2 nomenclatures - None already exists in platine/sabiane) - JsonNode nomenclaturesNode = initNomenclatureTest(); - when(questionnairePlatineSabianeService.getNomenclaturesId()).thenReturn(new HashSet<>()); - var iter = nomenclaturesNode.elements(); - - //Execute the unit under test - QuestionnaireHelper.initRequiredNomenclatures(questionnairePlatineSabianeService, nomenclatureService, "1", iter); - - // postconditions : Both nomenclatures are created - verify(questionnairePlatineSabianeService).postNomenclature( - nomenclatureID1, - nomenclatureLabel1, - objectMapper.readTree(nomenclatureContent1)); - verify(questionnairePlatineSabianeService).postNomenclature( - nomenclatureID2, - nomenclatureLabel2, - objectMapper.readTree(nomenclatureContent2)); - } - - @Test - void initRequiredNomenclatures_should_work_when_one_nomenclature_exists_in_remote_plateform() throws IOException { - // preconditions (2 nomenclatures - One already exists in platine/sabiane) - JsonNode nomenclaturesNode = initNomenclatureTest(); - when(questionnairePlatineSabianeService.getNomenclaturesId()).thenReturn(Set.of("XXX", nomenclatureID1, "TOTO", "TATA")); - var iter = nomenclaturesNode.elements(); - - //Execute the unit under test - QuestionnaireHelper.initRequiredNomenclatures(questionnairePlatineSabianeService, nomenclatureService, "1", iter); - - // postconditions - //Existing nomenclature is not created - verify(questionnairePlatineSabianeService, never()).postNomenclature( - nomenclatureID1, - nomenclatureLabel1, - objectMapper.readTree(nomenclatureContent1)); - //New nomenclature is created - verify(questionnairePlatineSabianeService).postNomenclature( - nomenclatureID2, - nomenclatureLabel2, - objectMapper.readTree(nomenclatureContent2)); - } - - private Set runInitQuestionnaireModels(JsonNode contextRootNode) { - // preconditions - when(questionnaireModelService.getQuestionnaireModel(anyString(), anyString())).thenReturn(questionnaireContent1); - - //Execute the unit under test - return QuestionnaireHelper.initQuestionnaireModels(questionnairePlatineSabianeService, questionnaireModelService, "1", contextRootNode); - } - - @Test - void initQuestionnaireModels_should_return_list_of_modelsId_with_platine_context() { - JsonNode contextRootNode = ProtoolsTestUtils.asJsonNode(platine_context_json); - assertEquals(1, contextRootNode.path(ContextConstants.CTX_QUESTIONNAIRE_MODELS).size(), "Context error : expected exactly one questionnaire model"); - - Set questionnaireModels = runInitQuestionnaireModels(contextRootNode); - - // postconditions : we expect to find exactly one questionnaire Model - String idQuestionnaireModel = contextRootNode.path(ContextConstants.CTX_QUESTIONNAIRE_MODELS).get(0).path(CTX_QUESTIONNAIRE_MODEL_ID).asText(); - assertEquals(Set.of(idQuestionnaireModel), questionnaireModels); - verify(questionnaireModelService,times(1)).getQuestionnaireModel( - contextRootNode.path(CTX_QUESTIONNAIRE_MODELS).get(0).path(CTX_QUESTIONNAIRE_MODEL_ID).asText() - , contextRootNode.path(CTX_QUESTIONNAIRE_MODELS).get(0).path(CTX_QUESTIONNAIRE_MODEL_CHEMIN_REPERTOIRE).asText()); - - final ArgumentCaptor > nomenclaturesCaptor - = ArgumentCaptor.forClass((Class) Set.class); - ArgumentCaptor acModelID = ArgumentCaptor.forClass(String.class); - ArgumentCaptor acLabel = ArgumentCaptor.forClass(String.class); - - verify(questionnairePlatineSabianeService,times(1)).postQuestionnaireModel( - acModelID.capture(), - acLabel.capture(), - any(), nomenclaturesCaptor.capture()); - assertEquals(contextRootNode.path(CTX_QUESTIONNAIRE_MODELS).get(0).path(CTX_QUESTIONNAIRE_MODEL_ID).asText(),acModelID.getValue()); - assertEquals(contextRootNode.path(CTX_QUESTIONNAIRE_MODELS).get(0).path(CTX_QUESTIONNAIRE_MODEL_LABEL).asText(),acLabel.getValue()); - - List> captured = nomenclaturesCaptor.getAllValues(); - assertEquals(1,captured.size(),"We are supposed to call the method only one"); - Set actualNomenclatures = captured.get(0); - Set expectedNomenclatures = Set.of( - "L_DEPNAIS-1-1-0", - "L_PAYSNAIS-1-1-0", - "L_NATIONETR-1-1-0"); - assertTrue(expectedNomenclatures.size()==actualNomenclatures.size() - &&expectedNomenclatures.containsAll(actualNomenclatures) - && actualNomenclatures.containsAll(expectedNomenclatures) - ,"The set of nomenclature is incorrect"); - } - - @Test - void initQuestionnaireModels_should_return_list_of_modelsId_with_sabiane_context() { - JsonNode contextRootNode = ProtoolsTestUtils.asJsonNode(sabiane_context_json); - assertEquals(2, contextRootNode.path(ContextConstants.CTX_QUESTIONNAIRE_MODELS).size(), "Context error : expected exactly one questionnaire model"); - - Set questionnaireModels = runInitQuestionnaireModels(contextRootNode); - - // postconditions : we expect to find 2 Questionnaire Models - assertEquals(Stream.of("FAM2022X01", "tic2023a00_webMBG").collect(Collectors.toCollection(HashSet::new)), questionnaireModels); - } - - /** - * BIG integration test - */ - @Test - void createQuestionnaire_should_work_with_sabiane_context() { - JsonNode contextRootNode = ProtoolsTestUtils.asJsonNode(sabiane_context_json); - when(questionnairePlatineSabianeService.getNomenclaturesId()).thenReturn(new HashSet<>()); - when(nomenclatureService.getNomenclatureContent(any(), any())).thenReturn(nomenclatureContent1); - when(questionnaireModelService.getQuestionnaireModel(anyString(), anyString())).thenReturn(questionnaireContent1); - - MetadataValueItem medatadataItem = new MetadataValueItem("TOTO", "VALUE"); - MetadataValue metadataValue = MetadataValue - .builder() - .value(MetadataVariables.builder() - .variables(List.of(medatadataItem)) - .inseeContext("INSEE_CONTEXT") - .build() - ) - .build(); - //Execute the unit under test - QuestionnaireHelper.createQuestionnaire( - contextRootNode, questionnairePlatineSabianeService, nomenclatureService, questionnaireModelService, "1", metadataValue); - - - //Post Conditions on nomenclature part - ArgumentCaptor acNomenclatureId = ArgumentCaptor.forClass(String.class); - ArgumentCaptor acNomenclatureLabel = ArgumentCaptor.forClass(String.class); - ArgumentCaptor acNomenclatureValue = ArgumentCaptor.forClass(JsonNode.class); - //Context has 4 nomenclatures - verify(questionnairePlatineSabianeService, times(4)).postNomenclature(acNomenclatureId.capture(), acNomenclatureLabel.capture(), acNomenclatureValue.capture()); - //Verify arguments - Pair nomenclature1 = new ImmutablePair<>("L_DEPNAIS-1-1-0", "Liste des départements"); - Pair nomenclature2 = new ImmutablePair("L_PAYSNAIS-1-1-0", "liste des pays"); - Pair nomenclature3 = new ImmutablePair("L_NATIONETR-1-1-0", "liste des nationalités"); - Pair nomenclature4 = new ImmutablePair("L_COMMUNEPASSEE-1-1-0", "liste des communes"); - List> listOfNomenclatures = List.of(nomenclature1, nomenclature2, nomenclature3, nomenclature4); - //Creation of each nomenclature - assertTrue( - acNomenclatureId.getAllValues() - .containsAll( - List.of(nomenclature1.getKey(), nomenclature2.getKey(), nomenclature3.getKey(), nomenclature4.getKey()) - )); - //With correct parameters - for (int i = 0; i < 4; i++) { - String argId = acNomenclatureId.getAllValues().get(i); - Pair nomenclature = listOfNomenclatures.stream() - .filter(item -> argId.equals(item.getKey())) - .findAny() - .orElse(null); - assertNotNull(nomenclature, "Internal error in test : nomenclature should not be null here"); - assertEquals( nomenclature.getValue(),acNomenclatureLabel.getAllValues().get(i)); - assertEquals(nomenclatureContent1,acNomenclatureValue.getAllValues().get(i).toString().trim()); - } - - - //Post Conditions on questionnaire model part - ArgumentCaptor acQuestionnaireId = ArgumentCaptor.forClass(String.class); - ArgumentCaptor acQuestionnaireLabel = ArgumentCaptor.forClass(String.class); - ArgumentCaptor acQuestionnaireValue = ArgumentCaptor.forClass(JsonNode.class); - ArgumentCaptor> acRequiredNomenclatures = ArgumentCaptor.forClass( Set.class); - //Creation of each model - verify(questionnairePlatineSabianeService, times(2)) - .postQuestionnaireModel( - acQuestionnaireId.capture(),acQuestionnaireLabel.capture(),acQuestionnaireValue.capture(),acRequiredNomenclatures.capture() - ); - //With correct parameters - Tuple q1 = new Tuple("tic2023a00_webMBG","Super modèle 1",Set.of("L_DEPNAIS-1-1-0", "L_PAYSNAIS-1-1-0","L_NATIONETR-1-1-0")); - Tuple q2 = new Tuple("FAM2022X01","Super modèle 2",Set.of("L_COMMUNEPASSEE-1-1-0")); - List listOfModels = List.of(q1,q2); - - for (int i = 0; i < 2; i++) { - String argId = acQuestionnaireId.getAllValues().get(i); - Tuple modele = listOfModels.stream() - .filter(item -> argId.equals(item.toList().get(0))) - .findAny() - .orElse(null); - assertNotNull(modele, "Internal error in test : modele should not be null here"); - assertEquals( modele.toList().get(1),acQuestionnaireLabel.getAllValues().get(i)); - assertEquals( modele.toList().get(2),acRequiredNomenclatures.getAllValues().get(i)); - assertEquals(questionnaireContent1,acQuestionnaireValue.getAllValues().get(i).toString()); - - } - - } - -} \ No newline at end of file diff --git a/src/test/java/fr/insee/protools/backend/service/era/EraGetSUForPeriodAndGenderTaskTest.java b/src/test/java/fr/insee/protools/backend/service/era/EraGetSUForPeriodAndGenderTaskTest.java deleted file mode 100644 index 2a0d3f21..00000000 --- a/src/test/java/fr/insee/protools/backend/service/era/EraGetSUForPeriodAndGenderTaskTest.java +++ /dev/null @@ -1,145 +0,0 @@ -package fr.insee.protools.backend.service.era; - -import com.fasterxml.jackson.core.JsonProcessingException; -import fr.insee.protools.backend.ProtoolsTestUtils; -import fr.insee.protools.backend.dto.era.CensusJsonDto; -import fr.insee.protools.backend.dto.era.GenderType; -import fr.insee.protools.backend.service.context.exception.BadContextIncorrectBPMNError; -import fr.insee.protools.backend.service.utils.TestWithContext; -import org.flowable.common.engine.api.FlowableIllegalArgumentException; -import org.flowable.engine.delegate.DelegateExecution; -import org.flowable.engine.test.FlowableTest; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; -import org.mockito.InjectMocks; -import org.mockito.Mock; -import org.mockito.Mockito; -import org.mockito.junit.jupiter.MockitoExtension; - -import java.time.LocalDate; -import java.util.List; - -import static fr.insee.protools.backend.service.FlowableVariableNameConstants.*; -import static fr.insee.protools.backend.service.utils.FlowableVariableUtils.getMissingVariableMessage; -import static org.assertj.core.api.Assertions.assertThat; -import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; -import static org.junit.jupiter.api.Assertions.assertThrows; -import static org.mockito.Mockito.*; - -@ExtendWith(MockitoExtension.class) -@FlowableTest -class EraGetSUForPeriodAndGenderTaskTest extends TestWithContext { - - @Mock EraService eraService; - @InjectMocks EraGetSUForPeriodAndGenderTask eraGetSUForPeriodAndGenderTask; - - String dumyId = "ID999"; - final static String era_context_2partition = "{ \"partitions\": [{ \"id\": 1 , \"sexe\": \"hommes\" }, { \"id\": 2 , \"sexe\": \"femmes\" }] }"; - - @Test - void execute_should_throwError_when_null_context(){ - assertThat_delegate_throwError_when_null_context(eraGetSUForPeriodAndGenderTask); - } - - @Test - @DisplayName("Test execute method - should throw if VARNAME_ERA_QUERY_START_DATE or VARNAME_ERA_QUERY_END_DATE or VARNAME_CURRENT_PARTITION_ID not initialized") - void execute_should_throw_FlowableIllegalArgumentException_when_variables_notDefined() { - //Precondition - DelegateExecution execution = mock(DelegateExecution.class); - lenient().when(execution.getProcessInstanceId()).thenReturn(dumyId); - initContexteMockWithString(era_context_2partition); - - //Execute the unit under test - FlowableIllegalArgumentException exception = assertThrows(FlowableIllegalArgumentException.class, () -> eraGetSUForPeriodAndGenderTask.execute(execution)); - //Post conditions - assertThat(exception.getMessage()).isEqualTo(getMissingVariableMessage(VARNAME_ERA_QUERY_START_DATE)); - - //Create First variable - when(execution.getVariable(VARNAME_ERA_QUERY_START_DATE, LocalDate.class)).thenReturn(LocalDate.now().minusDays(1)); - //Execute again - exception = assertThrows(FlowableIllegalArgumentException.class, () -> eraGetSUForPeriodAndGenderTask.execute(execution)); - //Check the error - assertThat(exception.getMessage()).isEqualTo(getMissingVariableMessage(VARNAME_ERA_QUERY_END_DATE)); - - //Create 2nd variable - when(execution.getVariable(VARNAME_ERA_QUERY_END_DATE, LocalDate.class)).thenReturn(LocalDate.now()); - //Execute again - exception = assertThrows(FlowableIllegalArgumentException.class, () -> eraGetSUForPeriodAndGenderTask.execute(execution)); - //Check the error - assertThat(exception.getMessage()).isEqualTo(getMissingVariableMessage(VARNAME_CURRENT_PARTITION_ID)); - - //Create 3rd variable - when(execution.getVariable(VARNAME_CURRENT_PARTITION_ID, Long.class)).thenReturn(1l); - //Execute again - assertDoesNotThrow(() -> eraGetSUForPeriodAndGenderTask.execute(execution)); - } - - @Test - @DisplayName("Test execute method - should throw if Context is not correct") - void execute_should_throw_BadContext_when_contextIncorrect() throws JsonProcessingException { - //Precondition - DelegateExecution execution = mock(DelegateExecution.class); - lenient().when(execution.getProcessInstanceId()).thenReturn(dumyId); - - LocalDate startDate = LocalDate.now().minusDays(1), endDate = LocalDate.now(); - when(execution.getVariable(VARNAME_ERA_QUERY_START_DATE, LocalDate.class)).thenReturn(startDate); - when(execution.getVariable(VARNAME_ERA_QUERY_END_DATE, LocalDate.class)).thenReturn(endDate); - when(execution.getVariable(VARNAME_CURRENT_PARTITION_ID, Long.class)).thenReturn(1l); - - final String context1 = - "{ \"partitions\": [{ \"id\": 1 }] }"; - final String context2 = - "{ \"partitions\": [{ \"id\": 1 , \"sexe\": \"3\" }] }"; - final String context3 = - "{ \"partitions\": [{ \"id\": 1 , \"sexe\": \"1\" }] }"; - final String context4 = - "{ \"partitions\": [{ \"id\": 1 , \"sexe\": 3 }] }"; - List contextErrorTestList=List.of(context1,context2,context3,context4); - for(String context : contextErrorTestList){ - //Precondition - ProtoolsTestUtils.initContexteMockFromString(protoolsContext, context); - //Run test - assertThrows(BadContextIncorrectBPMNError.class, () -> eraGetSUForPeriodAndGenderTask.execute(execution)); - Mockito.reset(protoolsContext); - } - //TEST OK - //Precondition - ProtoolsTestUtils.initContexteMockFromString(protoolsContext, era_context_2partition); - //Run test - assertDoesNotThrow(() -> eraGetSUForPeriodAndGenderTask.execute(execution)); - Mockito.reset(protoolsContext); - } - - @Test - @DisplayName("Test execute method - should work and make correct call to service and store result in correct variable") - void execute_should_work_when_variables_OK() { - //Precondition - DelegateExecution execution = mock(DelegateExecution.class); - lenient().when(execution.getProcessInstanceId()).thenReturn(dumyId); - LocalDate startDate = LocalDate.now().minusDays(1), endDate = LocalDate.now(); - initContexteMockWithString(era_context_2partition); - - when(execution.getVariable(VARNAME_ERA_QUERY_START_DATE, LocalDate.class)).thenReturn(startDate); - when(execution.getVariable(VARNAME_ERA_QUERY_END_DATE, LocalDate.class)).thenReturn(endDate); - when(execution.getVariable(VARNAME_CURRENT_PARTITION_ID, Long.class)).thenReturn(1l); - - GenderType gender = GenderType.MALE; - Long eraId1 = 500l, eraId2 = 1000l; - CensusJsonDto eraSU1 = CensusJsonDto.builder() - .id(eraId1) - .build(); - CensusJsonDto eraSU2 = CensusJsonDto.builder() - .id(eraId2) - .build(); - List listOfEraSU = List.of(eraSU1, eraSU2); - when(eraService.getSUForPeriodAndSex(startDate, endDate, gender)).thenReturn(listOfEraSU); - - //Run method under test - assertDoesNotThrow(() -> eraGetSUForPeriodAndGenderTask.execute(execution)); - - //Post conditions - verify(eraService, times(1)).getSUForPeriodAndSex(startDate, endDate, gender); - verify(execution, times(1)).setVariableLocal(VARNAME_ERA_RESPONSE, listOfEraSU); - } -} \ No newline at end of file diff --git a/src/test/java/fr/insee/protools/backend/service/platine/delegate/pilotatage/PlatinePilotageCreateContextTaskRESTTest.java b/src/test/java/fr/insee/protools/backend/service/platine/delegate/pilotatage/PlatinePilotageCreateContextTaskRESTTest.java new file mode 100644 index 00000000..764bfef0 --- /dev/null +++ b/src/test/java/fr/insee/protools/backend/service/platine/delegate/pilotatage/PlatinePilotageCreateContextTaskRESTTest.java @@ -0,0 +1,59 @@ +package fr.insee.protools.backend.service.platine.delegate.pilotatage; + +import com.fasterxml.jackson.databind.JsonNode; +import fr.insee.protools.backend.service.platine.service.PlatinePilotageService; +import fr.insee.protools.backend.service.utils.TestWithContext; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.test.FlowableTest; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.ArgumentCaptor; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.Spy; +import org.mockito.junit.jupiter.MockitoExtension; + +import java.util.List; + +import static fr.insee.protools.backend.utils.data.CtxExamples.ctx_empty; +import static fr.insee.protools.backend.utils.data.CtxExamples.ctx_empty_id; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; + +@ExtendWith(MockitoExtension.class) +@FlowableTest +class PlatinePilotageCreateContextTaskRESTTest extends TestWithContext { + + @Mock + PlatinePilotageService platinePilotageService; + + @InjectMocks + PlatinePilotageCreateContextTaskREST platinePilotageTask; + + + @Test + void execute_should_throwError_when_null_context(){ + assertThat_delegate_throwError_when_null_context(platinePilotageTask); + } + + @Test + void execute_should_work_when_contextOK() { + DelegateExecution execution = createMockedExecution(); + JsonNode expectedContext = initContexteMockWithString(ctx_empty); + + //Execute the unit under test + platinePilotageTask.execute(execution); + + //Verify postContext + ArgumentCaptor acCtx = ArgumentCaptor.forClass(JsonNode.class); + verify(platinePilotageService,times(1)).postContext(eq(ctx_empty_id),acCtx.capture()); + List allValues = acCtx.getAllValues(); + assertEquals(1, allValues.size(),"We should have exactly one value"); + + assertEquals(expectedContext,allValues.get(0),"Wrong context passed"); + + } + +} \ No newline at end of file diff --git a/src/test/java/fr/insee/protools/backend/service/platine/delegate/questionnaire/PlatineQuestionnaireCreateContextTaskRESTTest.java b/src/test/java/fr/insee/protools/backend/service/platine/delegate/questionnaire/PlatineQuestionnaireCreateContextTaskRESTTest.java new file mode 100644 index 00000000..6edc5e6d --- /dev/null +++ b/src/test/java/fr/insee/protools/backend/service/platine/delegate/questionnaire/PlatineQuestionnaireCreateContextTaskRESTTest.java @@ -0,0 +1,52 @@ +package fr.insee.protools.backend.service.platine.delegate.questionnaire; + +import com.fasterxml.jackson.databind.JsonNode; +import fr.insee.protools.backend.service.platine.service.PlatineQuestionnaireService; +import fr.insee.protools.backend.service.utils.TestWithContext; +import org.flowable.engine.delegate.DelegateExecution; +import org.junit.jupiter.api.Test; +import org.mockito.ArgumentCaptor; +import org.mockito.InjectMocks; +import org.mockito.Mock; + +import java.util.List; + +import static fr.insee.protools.backend.utils.data.CtxExamples.ctx_empty; +import static fr.insee.protools.backend.utils.data.CtxExamples.ctx_empty_id; +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; + +class PlatineQuestionnaireCreateContextTaskRESTTest extends TestWithContext { + + @Mock + PlatineQuestionnaireService platineQuestionnaireService; + + @InjectMocks + PlatineQuestionnaireCreateContextTaskREST platineQuestionnaireTask; + + + @Test + void execute_should_throwError_when_null_context(){ + assertThat_delegate_throwError_when_null_context(platineQuestionnaireTask); + } + + @Test + void execute_should_work_when_contextOK() { + DelegateExecution execution = createMockedExecution(); + JsonNode expectedContext = initContexteMockWithString(ctx_empty); + + //Execute the unit under test + platineQuestionnaireTask.execute(execution); + + //Verify postContext + ArgumentCaptor acCtx = ArgumentCaptor.forClass(JsonNode.class); + verify(platineQuestionnaireService,times(1)).postContext(eq(ctx_empty_id),acCtx.capture()); + List allValues = acCtx.getAllValues(); + assertEquals(1, allValues.size(),"We should have exactly one value"); + + assertEquals(expectedContext,allValues.get(0),"Wrong context passed"); + + } +} \ No newline at end of file diff --git a/src/test/java/fr/insee/protools/backend/service/platine/service/PlatineQuestionnaireServiceTest.java b/src/test/java/fr/insee/protools/backend/service/platine/service/PlatineQuestionnaireServiceTest.java new file mode 100644 index 00000000..8c505cc5 --- /dev/null +++ b/src/test/java/fr/insee/protools/backend/service/platine/service/PlatineQuestionnaireServiceTest.java @@ -0,0 +1,55 @@ +package fr.insee.protools.backend.service.platine.service; + +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.node.JsonNodeFactory; +import fr.insee.protools.backend.restclient.RestClientHelper; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; +import org.springframework.web.client.RestClient; + +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.Mockito.*; +import static org.mockito.Mockito.verify; + +@ExtendWith(MockitoExtension.class) +class PlatineQuestionnaireServiceTest { + + @Mock + RestClientHelper restClientHelper; + @Mock + private RestClient.RequestBodyUriSpec requestBodyUriSpec; // Mock post() call + @Mock + private RestClient.ResponseSpec responseSpec; // Mock retrieve() call + + @InjectMocks + PlatineQuestionnaireService service; + + @Test + void postContext_should_call_correctURIAndBody(){ + //Prepare + RestClient mockRestClient = mock(RestClient.class); + doReturn(mockRestClient).when(restClientHelper).getRestClient(any()); + // Mock the chaining of RestClient calls + when(mockRestClient.post()).thenReturn(requestBodyUriSpec); + when(requestBodyUriSpec.uri(anyString(), any(Object[].class))).thenReturn(requestBodyUriSpec); + when(requestBodyUriSpec.body(any(Object.class))).thenReturn(requestBodyUriSpec); + when(requestBodyUriSpec.retrieve()).thenReturn(responseSpec); + + JsonNode contextNode = JsonNodeFactory.instance.objectNode(); + + //Call method under test + service.postContext("TOTO", contextNode); + + //Verifications + // Then - Verify that the uri method was called with "/context" + verify(requestBodyUriSpec).uri("/context"); + // and with expected body + verify(requestBodyUriSpec).body(contextNode); + } + +} \ No newline at end of file From 59a37e26239ad19b944954e40be969c618f2b0e0 Mon Sep 17 00:00:00 2001 From: SNDIL - Marc Date: Tue, 10 Sep 2024 17:00:48 +0200 Subject: [PATCH 56/75] display application version in swagger description to prepare displaying the openapi contract version above --- .../backend/configuration/SpringDocConfiguration.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/main/java/fr/insee/protools/backend/configuration/SpringDocConfiguration.java b/src/main/java/fr/insee/protools/backend/configuration/SpringDocConfiguration.java index 6df81cb4..a119760c 100644 --- a/src/main/java/fr/insee/protools/backend/configuration/SpringDocConfiguration.java +++ b/src/main/java/fr/insee/protools/backend/configuration/SpringDocConfiguration.java @@ -86,7 +86,12 @@ private OpenAPI createOpenAPI() { .info( new Info() .title(buildProperties.map(BuildProperties::getName).orElse("n.a")) - .description(springdocProperties.getDescription()) + .description( + String.format("`Application version : %s`\n\n%s", + buildProperties.map(BuildProperties::getVersion).orElse("n.a"), + springdocProperties.getDescription() + ) + ) .version(buildProperties.map(BuildProperties::getVersion).orElse("n.a")) /*.license( new License() From 134dcad6173db0a8eec6539ced5acf42fb96b3d4 Mon Sep 17 00:00:00 2001 From: SNDIL - Marc Date: Tue, 10 Sep 2024 17:01:42 +0200 Subject: [PATCH 57/75] tests: tests unitaires --- .../backend/restclient/RestClientHelper.java | 3 +- .../service/context/ContextServiceImpl.java | 6 +- .../controller/StarterControllerTest.java | 50 --- .../controller/StarterControllerTest.java | 94 +++++ .../restclient/RestClientHelperTest.java | 386 ++++++++++++++++++ .../service/utils/CustomJWTHelper.java | 65 +++ 6 files changed, 549 insertions(+), 55 deletions(-) delete mode 100644 src/test/backup/java/fr/insee/protools/backend/controller/StarterControllerTest.java create mode 100644 src/test/java/fr/insee/protools/backend/controller/StarterControllerTest.java create mode 100644 src/test/java/fr/insee/protools/backend/restclient/RestClientHelperTest.java create mode 100644 src/test/java/fr/insee/protools/backend/service/utils/CustomJWTHelper.java diff --git a/src/main/java/fr/insee/protools/backend/restclient/RestClientHelper.java b/src/main/java/fr/insee/protools/backend/restclient/RestClientHelper.java index a04d1e8f..b7bfdac8 100644 --- a/src/main/java/fr/insee/protools/backend/restclient/RestClientHelper.java +++ b/src/main/java/fr/insee/protools/backend/restclient/RestClientHelper.java @@ -13,7 +13,6 @@ import fr.insee.protools.backend.restclient.exception.runtime.HttpClient5xxBPMNError; import fr.insee.protools.backend.restclient.keycloak.KeycloakService; import io.netty.handler.logging.LogLevel; -import lombok.NoArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.slf4j.Logger; import org.slf4j.event.Level; @@ -24,9 +23,9 @@ import org.springframework.http.client.ReactorNettyClientRequestFactory; import org.springframework.lang.Nullable; import org.springframework.stereotype.Component; +import org.springframework.util.Base64Utils; import org.springframework.util.StreamUtils; import org.springframework.web.client.RestClient; -import org.springframework.web.reactive.function.client.WebClient; import reactor.netty.http.client.HttpClient; import reactor.netty.transport.logging.AdvancedByteBufFormat; diff --git a/src/main/java/fr/insee/protools/backend/service/context/ContextServiceImpl.java b/src/main/java/fr/insee/protools/backend/service/context/ContextServiceImpl.java index be1c6aa2..344acf9a 100644 --- a/src/main/java/fr/insee/protools/backend/service/context/ContextServiceImpl.java +++ b/src/main/java/fr/insee/protools/backend/service/context/ContextServiceImpl.java @@ -55,14 +55,14 @@ public class ContextServiceImpl implements ContextService { //Value: Pair private static final Map contextCache = new ConcurrentHashMap<>(); //TODO: Peut être que ca va sortir dans une dépendance externe - private static final String SCHEMA_VALIDATION_FILE = "schema/contexte-processus.json"; + private static final String SCHEMA_VALIDATION_FILE = "/schema/contexte-processus.json"; private final RuntimeService runtimeService; private final TaskService taskService; private final RepositoryService repositoryService; private final ApplicationContext springApplicationContext; - JsonSchema contextJsonSchema = JsonSchemaFactory + private static final JsonSchema contextJsonSchema = JsonSchemaFactory .getInstance(SpecVersion.VersionFlag.V202012) - .getSchema(getClass().getResourceAsStream(SCHEMA_VALIDATION_FILE)); + .getSchema(ContextServiceImpl.class.getResourceAsStream(SCHEMA_VALIDATION_FILE)); //TODO : soit les json schema permettent de valider les dates, soit il faudra valider toutes les dates comme ça public static Pair getCollectionStartAndEndFromPartition(JsonNode partitionNode) { diff --git a/src/test/backup/java/fr/insee/protools/backend/controller/StarterControllerTest.java b/src/test/backup/java/fr/insee/protools/backend/controller/StarterControllerTest.java deleted file mode 100644 index 8e79362b..00000000 --- a/src/test/backup/java/fr/insee/protools/backend/controller/StarterControllerTest.java +++ /dev/null @@ -1,50 +0,0 @@ -package fr.insee.protools.backend.controller; - -import fr.insee.protools.backend.restclient.RestClientHelper; -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; -import org.springframework.boot.test.mock.mockito.MockBean; -import org.springframework.security.core.authority.SimpleGrantedAuthority; -import org.springframework.security.oauth2.core.oidc.StandardClaimNames; -import org.springframework.security.oauth2.jwt.JwtDecoder; -import org.springframework.test.web.servlet.MockMvc; - -import java.util.List; - -import static org.hamcrest.Matchers.containsString; -import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.jwt; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; -import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; - -@WebMvcTest(value = StarterController.class) -//@ActiveProfiles(value = "test") -class StarterControllerTest { - @MockBean - RestClientHelper restClientHelper; - @MockBean - JwtDecoder jwtDecoder; - - - @Autowired private MockMvc mockMvc; - @Test - void shouldReturnDefaultMessage() throws Exception { - this.mockMvc.perform(get("/starter/healthcheck").with(jwt())) - .andDo(print()).andExpect(status().isOk()) - .andExpect(content().string(containsString("OK"))); - - - mockMvc.perform(get("/starter/healthcheck").with(jwt() - .authorities(List.of(new SimpleGrantedAuthority("ROLE_AUTHORIZED_PERSONNEL"))).jwt(jwt -> { - jwt.subject("Ch4mpy"); - jwt.claims(claims -> claims.put(StandardClaimNames.PREFERRED_USERNAME, "Tonton Pirate")); - }))) - .andDo(print()) - .andExpect(content().string(containsString("OK"))) - .andExpect(content().string(containsString("Ch4mpy"))); - - } - -} diff --git a/src/test/java/fr/insee/protools/backend/controller/StarterControllerTest.java b/src/test/java/fr/insee/protools/backend/controller/StarterControllerTest.java new file mode 100644 index 00000000..6367ebe2 --- /dev/null +++ b/src/test/java/fr/insee/protools/backend/controller/StarterControllerTest.java @@ -0,0 +1,94 @@ +package fr.insee.protools.backend.controller; + +import com.fasterxml.jackson.databind.ObjectMapper; +import fr.insee.protools.backend.restclient.RestClientHelper; +import fr.insee.protools.backend.restclient.configuration.APIProperties; +import fr.insee.protools.backend.restclient.configuration.ApiConfigProperties; +import fr.insee.protools.backend.restclient.keycloak.KeycloakResponse; +import fr.insee.protools.backend.restclient.keycloak.KeycloakService; +import fr.insee.protools.backend.service.utils.CustomJWTHelper; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.boot.test.mock.mockito.SpyBean; +import org.springframework.security.core.authority.SimpleGrantedAuthority; +import org.springframework.security.oauth2.core.oidc.StandardClaimNames; +import org.springframework.security.oauth2.jwt.JwtDecoder; +import org.springframework.test.web.servlet.MockMvc; + +import java.util.*; + +import static org.hamcrest.Matchers.containsString; +import static org.junit.Assert.assertNotNull; +import static org.mockito.AdditionalMatchers.not; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.*; +import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.jwt; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + + +@WebMvcTest(value = StarterController.class) +class StarterControllerTest { + + private static final ObjectMapper objectMapper = new ObjectMapper(); + + + @MockBean + ApiConfigProperties apiConfigProperties; + + @SpyBean + KeycloakService kcService; + + @MockBean + JwtDecoder jwtDecoder; + + @SpyBean + RestClientHelper restClientHelper; + + @Autowired private MockMvc mockMvc; + + @Test + void gethealthchek_should_returnDefaultMessage() throws Exception { + this.mockMvc.perform(get("/starter/healthcheck").with(jwt())) + .andDo(print()).andExpect(status().isOk()) + .andExpect(content().string(containsString("OK"))); + + + mockMvc.perform(get("/starter/healthcheck").with(jwt() + .authorities(List.of(new SimpleGrantedAuthority("ROLE_AUTHORIZED_PERSONNEL"))).jwt(jwt -> { + jwt.subject("Ch4mpy"); + jwt.claims(claims -> claims.put(StandardClaimNames.PREFERRED_USERNAME, "Tonton Pirate")); + }))) + .andDo(print()) + .andExpect(content().string(containsString("OK"))) + .andExpect(content().string(containsString("Ch4mpy"))); + + } + + + @Test + void getTokenDetails_should_returnCorrectly() throws Exception { + + //Prepare : Only Platine pilotage is disable ; All other are confired and returns the same token + APIProperties.AuthProperties kcAuth = new APIProperties.AuthProperties("https://test.test","realm", "client","xxx"); + APIProperties apiPropertiesAll = new APIProperties("url-all",kcAuth ,true); + APIProperties apiPropertiesPlatinePil = new APIProperties("url-platine",kcAuth ,false); + + doReturn(apiPropertiesAll).when(apiConfigProperties).getAPIProperties(any()); + doReturn(apiPropertiesPlatinePil).when(apiConfigProperties).getAPIProperties(eq(ApiConfigProperties.KNOWN_API.KNOWN_API_PLATINE_PILOTAGE)); + //Token returned by getToken + doReturn(CustomJWTHelper.getEncodedToken(List.of("ROLE_administrateur_Platine","ROLE_Administrateurs_BEATLES"))).when(kcService).getToken(eq(kcAuth)); + + this.mockMvc.perform( + get("/starter/token_details_by_api").with(jwt())) + .andDo(print()).andExpect(status().isOk()) + .andExpect(content().string(containsString("List of tokens roles "))) + .andExpect(content().string(containsString("KNOWN_API_PLATINE_PILOTAGE : API KNOWN_API_PLATINE_PILOTAGE is disabled in properties"))) + .andExpect(content().string(containsString("KNOWN_API_SABIANE_QUESTIONNAIRE : [\"ROLE_administrateur_Platine\",\"ROLE_Administrateurs_BEATLES\"]"))) + .andExpect(content().string(containsString("KNOWN_API_SABIANE_PILOTAGE : [\"ROLE_administrateur_Platine\",\"ROLE_Administrateurs_BEATLES\"]"))); + } +} diff --git a/src/test/java/fr/insee/protools/backend/restclient/RestClientHelperTest.java b/src/test/java/fr/insee/protools/backend/restclient/RestClientHelperTest.java new file mode 100644 index 00000000..7fc24027 --- /dev/null +++ b/src/test/java/fr/insee/protools/backend/restclient/RestClientHelperTest.java @@ -0,0 +1,386 @@ +package fr.insee.protools.backend.restclient; + +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.node.ArrayNode; +import com.fasterxml.jackson.databind.node.JsonNodeType; +import fr.insee.protools.backend.ProtoolsTestUtils; +import fr.insee.protools.backend.restclient.configuration.APIProperties; +import fr.insee.protools.backend.restclient.configuration.ApiConfigProperties; +import fr.insee.protools.backend.restclient.exception.ApiNotConfiguredBPMNError; +import fr.insee.protools.backend.restclient.exception.KeycloakTokenConfigUncheckedBPMNError; +import fr.insee.protools.backend.restclient.exception.runtime.HttpClient4xxBPMNError; +import fr.insee.protools.backend.restclient.keycloak.KeycloakResponse; +import fr.insee.protools.backend.restclient.keycloak.KeycloakService; +import fr.insee.protools.backend.service.utils.CustomJWTHelper; +import okhttp3.mockwebserver.MockResponse; +import okhttp3.mockwebserver.MockWebServer; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.Mock; +import org.mockito.Spy; +import org.mockito.junit.jupiter.MockitoExtension; +import org.springframework.boot.test.mock.mockito.SpyBean; +import org.springframework.core.env.Environment; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.web.client.RestClient; + +import java.io.File; +import java.io.IOException; +import java.io.RandomAccessFile; +import java.util.List; +import java.util.Map; + +import static org.assertj.core.api.AssertionsForClassTypes.assertThatThrownBy; +import static org.hamcrest.Matchers.containsString; +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.eq; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Mockito.*; +import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.jwt; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + + +@ExtendWith(MockitoExtension.class) +class RestClientHelperTest { + + @Spy + private Environment environment; + + private KeycloakService keycloakService; + + @Mock + private ApiConfigProperties apiConfigProperties; + + private RestClientHelper restClientHelper; + + + private MockWebServer mockWebServer; + private static final int port = 80; + private static String getDummyUriWithPort() { return getServerHostPort()+"/api/test"; } + private static String getServerHostPort() { return "http://localhost:"+port; } + + @BeforeEach + public void prepare() { + keycloakService= spy(new KeycloakService(environment)); + restClientHelper = new RestClientHelper(keycloakService,apiConfigProperties); + this.keycloakService.initialize(); + } + + //close the mocked web server if it has been initialized + @AfterEach + void mockServerCleanup() throws Exception { + if(this.mockWebServer!=null){ + this.mockWebServer.close(); + } + } + + private void initMockWebServer() throws IOException { + this.mockWebServer = new MockWebServer(); + mockWebServer.start(port); + } + + + private File createDummyFile(int sizeInByte, String extension) throws IOException { + File file = File.createTempFile("tempFile", ".json"); + file.deleteOnExit(); + RandomAccessFile rafile; + rafile = new RandomAccessFile(file, "rw"); + //In Bytes ==> 1024 = 1Ko ==> 1024X1024 : 1Mo + rafile.setLength(sizeInByte); + return file; + } + + private MockResponse fileToResponse(String contentType, File file) throws IOException { + return new MockResponse() + .setResponseCode(HttpStatus.OK.value()) + .setBody(ProtoolsTestUtils.fileToBytes(file)) + .addHeader("content-type: " + contentType); + } + + @Test + @DisplayName("Test getRestClient method without specifying an API") + void testgetRestClientWithoutApi() { + RestClient client = restClientHelper.getRestClient(); + assertThat(client).isNotNull(); + } + + private void testgetRestClientWithIncompleteKCConfig(APIProperties.AuthProperties kcAuth){ + when(apiConfigProperties.getAPIProperties(any())).thenReturn(new APIProperties(getServerHostPort(), kcAuth, true)); + var client = restClientHelper.getRestClient(ApiConfigProperties.KNOWN_API.KNOWN_API_ERA); + assertThat(client).isNotNull(); + //Should throw an exception as the realm is missing + assertThrows(KeycloakTokenConfigUncheckedBPMNError.class , () -> client.get().uri(getDummyUriWithPort()).retrieve()); + } + @Test + @DisplayName("Test getRestClient method without incomplete keycloak configuration") + void getRestClientWithIncompleteKCConfig() throws IOException { + //Missing realm + APIProperties.AuthProperties kcAuth = new APIProperties.AuthProperties(getDummyUriWithPort(),null, "toto","toto"); + //Should throw an exception as the realm is missing + testgetRestClientWithIncompleteKCConfig(kcAuth); + + //Missing url + kcAuth = new APIProperties.AuthProperties("null","realm", "toto","toto"); + testgetRestClientWithIncompleteKCConfig(kcAuth); + + //Missing clientId + kcAuth = new APIProperties.AuthProperties(getDummyUriWithPort(),"realm", null,"toto"); + testgetRestClientWithIncompleteKCConfig(kcAuth); + + //Missing secret + kcAuth = new APIProperties.AuthProperties(getDummyUriWithPort(),"realm", "toto",null); + testgetRestClientWithIncompleteKCConfig(kcAuth); + } + + @Test + void getRestClient() throws IOException { + + APIProperties.AuthProperties kcAuth = new APIProperties.AuthProperties(); + kcAuth.setClientId("clientId-toto"); + kcAuth.setClientSecret("client-pwd-toto"); + kcAuth.setRealm("realm-toto"); + kcAuth.setUrl(getDummyUriWithPort()); + + + when(apiConfigProperties.getAPIProperties(any())).thenReturn(new APIProperties(getServerHostPort(), kcAuth, true)); + RestClient client = restClientHelper.getRestClient(ApiConfigProperties.KNOWN_API.KNOWN_API_ERA); + assertThat(client).isNotNull(); + + KeycloakResponse kcResponse = new KeycloakResponse(); + kcResponse.setAccesToken("MYTOKEN"); + kcResponse.setExpiresIn(5*60*1000); + MockResponse mockResponseKC = new MockResponse() + .addHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON) + .setResponseCode(HttpStatus.OK.value()) + .setBody(new ObjectMapper().writeValueAsString(kcResponse)); + + MockResponse mockResponse = new MockResponse() + .setResponseCode(HttpStatus.NO_CONTENT.value()) + .setBody("XXX"); + + initMockWebServer(); + mockWebServer.enqueue(mockResponseKC); + mockWebServer.enqueue(mockResponse); + + assertThat(client.get().uri(getDummyUriWithPort()).retrieve().toBodilessEntity().getStatusCode()).isEqualTo(HttpStatus.NO_CONTENT); + } +/* + @Test + @DisplayName("Test getRestClientForFile method - get the client and download files of different sizes") + void getRestClientForFile() throws IOException { + RestClient client = restClientHelper.getRestClient(); + assertThat(client).isNotNull(); + + //Create a 1Mo File + File file1mo = createDummyFile(1024 * 1024 * 1,".json"); + File file19mo = createDummyFile(RestClientHelper.getDefaultFileBufferSize()-1024,".json"); + int tooBigSize=RestClientHelper.getDefaultFileBufferSize()+1024; + File fileTooBig = createDummyFile(tooBigSize,".json"); + + MockResponse fileToResponse_1Mo = fileToResponse(MediaType.APPLICATION_JSON_VALUE, file1mo); + MockResponse fileToResponse_19Mo = fileToResponse(MediaType.APPLICATION_JSON_VALUE, file19mo); + MockResponse fileToResponseTooBig = fileToResponse(MediaType.APPLICATION_JSON_VALUE, fileTooBig); + + + + + KeycloakResponse kcResponse = new KeycloakResponse(); + kcResponse.setAccesToken("MYTOKEN"); + kcResponse.setExpiresIn(5*60*1000); + + + MockResponse mockResponseKC = new MockResponse() + .addHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON) + .setResponseCode(HttpStatus.OK.value()) + .setBody(new ObjectMapper().writeValueAsString(kcResponse)); + + final Dispatcher dispatcher = new Dispatcher() { + public MockResponse dispatch(RecordedRequest request) { + switch (request.getPath()) { + case "/users/1": + return new MockResponse().setResponseCode(200); + case "/users/2": + return new MockResponse().setResponseCode(500); + case "/users/3": + return new MockResponse().setResponseCode(200).setBody("{\"id\": 1, \"name\":\"duke\"}"); + } + return new MockResponse().setResponseCode(404); + } + + mockWebServer.enqueue(mockResponseKC); + + + + initMockWebServer(); + mockWebServer.enqueue(fileToResponse_1Mo); + mockWebServer.enqueue(fileToResponse_19Mo); + mockWebServer.enqueue(fileToResponseTooBig); + mockWebServer.enqueue(fileToResponseTooBig); + + //Check for 1Mo file + assertDoesNotThrow(()-> restClientHelper.getRestClientForFile() + .get() + .uri(getDummyUriWithPort()) + .retrieve() + .bodyToMono(String.class) + .block()); + + //Check for 19Mo file + assertDoesNotThrow(()-> restClientHelper.getRestClientForFile() + .get() + .uri(getDummyUriWithPort()) + .retrieve() + .bodyToMono(String.class) + .block()); + + //Check for a too big file : Should throw and exception as default buffer is 20Mo + assertThrows(clientResponseException.class, () -> restClientHelper.getRestClientForFile() + .get() + .uri(getDummyUriWithPort()) + .retrieve() + .bodyToMono(String.class) + .block()); + + //Check for a too big file with a custom buffer ==> Should be ok + assertDoesNotThrow(() -> restClientHelper.getRestClientForFile(tooBigSize) + .get() + .uri(getDummyUriWithPort()) + .retrieve() + .bodyToMono(String.class) + .block()); + } + + };*/ + @Test + void getRestClient_withInvalidApiConfig() { + when(apiConfigProperties.getAPIProperties(any())).thenReturn(null); + assertThatThrownBy(() -> restClientHelper.getRestClient(any())) + .isInstanceOf(ApiNotConfiguredBPMNError.class) + .hasMessageContaining("is not configured in properties"); + } + + @Test + void getRestClient_withDisabledApiConfig() { + when(apiConfigProperties.getAPIProperties(any())).thenReturn(new APIProperties("http://localhost:8080", new APIProperties.AuthProperties(), false )); + assertThatThrownBy(() -> restClientHelper.getRestClient(any())) + .isInstanceOf(ApiNotConfiguredBPMNError.class) + .hasMessageContaining("is disabled in properties"); + } + + @Test + void getTokenDetailsByAPI_should_workForOkNullAndNotConfiguredApi() throws Exception { + //Prepare : + // Platine pilotage is disabled + // Meshuggah is null + // All other are confired and returns the same token + APIProperties.AuthProperties kcAuth = new APIProperties.AuthProperties("https://test.test","realm", "client","xxx"); + APIProperties apiPropertiesAll = new APIProperties("url-all",kcAuth ,true); + APIProperties apiPropertiesPlatinePil = new APIProperties("url-platine",kcAuth ,false); + + doReturn(apiPropertiesAll).when(apiConfigProperties).getAPIProperties(any()); + doReturn(apiPropertiesPlatinePil).when(apiConfigProperties).getAPIProperties(eq(ApiConfigProperties.KNOWN_API.KNOWN_API_PLATINE_PILOTAGE)); + doReturn(null).when(apiConfigProperties).getAPIProperties(eq(ApiConfigProperties.KNOWN_API.KNOWN_API_MESHUGGAH)); + + doReturn(CustomJWTHelper.getEncodedToken(List.of("ROLE_TOTO","ROLE_Administrateurs_BEATLES"))).when(keycloakService).getToken(eq(kcAuth)); + + + Map details = restClientHelper.getTokenDetailsByAPI(); + + assertThat(details).containsEntry("KNOWN_API_PLATINE_PILOTAGE","API KNOWN_API_PLATINE_PILOTAGE is disabled in properties"); + assertThat(details).containsEntry("KNOWN_API_MESHUGGAH","API KNOWN_API_MESHUGGAH is not configured in properties"); + assertThat(details).containsEntry("KNOWN_API_REM","[\"ROLE_TOTO\",\"ROLE_Administrateurs_BEATLES\"]"); + + } + + + @Test + void getAPIConfigDetails_shouldNotThrow() { + APIProperties.AuthProperties kcAuth = new APIProperties.AuthProperties("https://test.test","realm", "client","xxx"); + APIProperties apiPropertiesAll = new APIProperties("url-all",kcAuth ,true); + doReturn(apiPropertiesAll).when(apiConfigProperties).getAPIProperties(any()); + + JsonNode result = restClientHelper.getAPIConfigDetails(); + assertEquals(JsonNodeType.ARRAY,result.getNodeType()); + ArrayNode resultArray = (ArrayNode) result; + assertEquals(ApiConfigProperties.KNOWN_API.values().length,resultArray.size()); + } + + @Test + @DisplayName("Test that the retrieval of spring private field still works") + void extractClientResponseRequestDescriptionPrivateFiledUsingReflexion_shouldWork() throws IOException { + RestClient restClient = restClientHelper.getRestClient(); + assertThat(restClient).isNotNull(); + + //Mock an error response + MockResponse mockResponse = new MockResponse() + .setResponseCode(HttpStatus.BAD_REQUEST.value()) + .setBody("XXX"); + + initMockWebServer(); + mockWebServer.enqueue(mockResponse); + + //Call method under test + HttpClient4xxBPMNError exception = assertThrows(HttpClient4xxBPMNError.class , () ->restClient.get().uri(getDummyUriWithPort()).retrieve() + .body(String.class)); + + //Post call conditions (we get more or less the expected message with the original request) + //IF it is not the case, check that the spring private field has not changed or been renamed + String actualMessage = exception.getMessage(); + assertThat(actualMessage) + .contains("GET") + .contains(getDummyUriWithPort()) + .contains(String.valueOf(HttpStatus.BAD_REQUEST.value())); + } + + @Test + @DisplayName("Test that containsCauseOfType find an existing cause") + void containsCauseOfType_shouldFindCauseIfExists() { + //Prepare + String rootMessage="TEST"; + ArithmeticException exRoot=new ArithmeticException(rootMessage); + Exception exLvl1=new Exception("dummy",exRoot ); + Exception ex = new Exception("dummy",exLvl1 ); + + //Call + boolean found = RestClientHelper.containsCauseOfType(ex, List.of(ArithmeticException.class)); + //Check + assertTrue(found,"ArithmeticException should be found"); + + //Call + found = RestClientHelper.containsCauseOfType(exLvl1, List.of(ArithmeticException.class)); + //Check + assertTrue(found,"ArithmeticException should be found"); + + //Call + found = RestClientHelper.containsCauseOfType(exRoot, List.of(ArithmeticException.class)); + //Check + assertTrue(found,"ArithmeticException should be found"); + + //Call + found = RestClientHelper.containsCauseOfType(exRoot, List.of(RuntimeException.class)); + //Check + assertTrue(found,"RuntimeException should be found"); + + //Call + found = RestClientHelper.containsCauseOfType(exRoot, List.of(IOException.class,RuntimeException.class)); + //Check + assertTrue(found,"RuntimeException should be found"); + + //Call + found = RestClientHelper.containsCauseOfType(exRoot, List.of(IOException.class)); + //Check (should not be found) + assertFalse(found,"IOException should not be found"); + } + +} \ No newline at end of file diff --git a/src/test/java/fr/insee/protools/backend/service/utils/CustomJWTHelper.java b/src/test/java/fr/insee/protools/backend/service/utils/CustomJWTHelper.java new file mode 100644 index 00000000..78c2e589 --- /dev/null +++ b/src/test/java/fr/insee/protools/backend/service/utils/CustomJWTHelper.java @@ -0,0 +1,65 @@ +package fr.insee.protools.backend.service.utils; + +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.node.ArrayNode; +import com.fasterxml.jackson.databind.node.ObjectNode; +import org.springframework.security.oauth2.jwt.Jwt; + +import javax.crypto.Mac; +import javax.crypto.spec.SecretKeySpec; +import java.nio.charset.StandardCharsets; +import java.util.Base64; +import java.util.List; + +public class CustomJWTHelper { + + private static final String SECRET_KEY = "my-secret-key"; + private static final String ALGO = "HmacSHA256"; + + private static final ObjectMapper objectMapper = new ObjectMapper(); + + private CustomJWTHelper() { + } + + public static String getEncodedToken(List roles) throws Exception { + + ObjectNode realmAccessNode = new ObjectMapper().createObjectNode(); + ArrayNode rolesNode = new ObjectMapper().createArrayNode(); + for (String role:roles){ + rolesNode.add(role); + } + realmAccessNode.put("roles", rolesNode); + + Jwt kcToken = Jwt.withTokenValue("token").header("alg", ALGO). + claim("realm_access", realmAccessNode) + .build(); + return getEncodedToken(kcToken); + } + + public static String getEncodedToken(Jwt token) throws Exception { + + byte[] a = objectMapper.writeValueAsString(token.getHeaders()).getBytes(StandardCharsets.UTF_8); + byte[] b = objectMapper.writeValueAsString(token.getClaims()).getBytes(StandardCharsets.UTF_8); + + String encodedHeader = Base64.getEncoder().encodeToString(a); + String encodedPayload = Base64.getEncoder().encodeToString(b); + + // Create the signature + String signature = createSignature(encodedHeader, encodedPayload); + + // Concatenate header, payload, and signature to form the JWT + String signedToken = encodedHeader + "." + encodedPayload + "." + signature; + return signedToken; + + } + + private static String createSignature(String header, String payload) throws Exception { + String data = header + "." + payload; + Mac sha256Hmac = Mac.getInstance("HmacSHA256"); + SecretKeySpec secretKeySpec = new SecretKeySpec(SECRET_KEY.getBytes(StandardCharsets.UTF_8), ALGO); + sha256Hmac.init(secretKeySpec); + + byte[] signatureBytes = sha256Hmac.doFinal(data.getBytes(StandardCharsets.UTF_8)); + return Base64.getUrlEncoder().encodeToString(signatureBytes); + } +} From e8d4a18654b00864b5cdfb440bd481f8b42d7f34 Mon Sep 17 00:00:00 2001 From: SNDIL - Marc Date: Thu, 12 Sep 2024 10:00:22 +0200 Subject: [PATCH 58/75] tests: tests unitaires --- .../internal/ProtoolsInterrogationDto.java | 21 --- .../resolvers/PartitionCtxResolver.java | 10 +- ...unicationForInterrogationListTaskREST.java | 35 ++-- ...lotageCreateInterrogationListTaskREST.java | 25 ++- ...nnaireCreateInterrogationListTaskREST.java | 24 ++- .../service/PlatinePilotageService.java | 2 +- ...etPartitionListOfInterroPaginatedTask.java | 1 + .../SugoiREMCreateMissingAccountListTask.java | 2 +- .../service/utils/FlowableVariableUtils.java | 3 + .../protools/backend/ProtoolsTestUtils.java | 6 - ...tinePilotageCreateContextTaskRESTTest.java | 17 +- ...geCreateInterrogationListTaskRESTTest.java | 78 +++++++++ ...uestionnaireCreateContextTaskRESTTest.java | 13 +- .../service/utils/TestWithContext.java | 164 +++++++++++++++++- .../backend/utils/data/CtxExamples.java | 4 - .../backend/utils/data/InterroExamples.java | 30 ++++ 16 files changed, 353 insertions(+), 82 deletions(-) delete mode 100644 src/main/java/fr/insee/protools/backend/dto/internal/ProtoolsInterrogationDto.java rename src/main/java/fr/insee/protools/backend/service/{sugoi => sugoi_rem}/delegate/SugoiREMCreateMissingAccountListTask.java (98%) create mode 100644 src/test/java/fr/insee/protools/backend/service/platine/delegate/pilotatage/PlatinePilotageCreateInterrogationListTaskRESTTest.java create mode 100644 src/test/java/fr/insee/protools/backend/utils/data/InterroExamples.java diff --git a/src/main/java/fr/insee/protools/backend/dto/internal/ProtoolsInterrogationDto.java b/src/main/java/fr/insee/protools/backend/dto/internal/ProtoolsInterrogationDto.java deleted file mode 100644 index c33deb7f..00000000 --- a/src/main/java/fr/insee/protools/backend/dto/internal/ProtoolsInterrogationDto.java +++ /dev/null @@ -1,21 +0,0 @@ -package fr.insee.protools.backend.dto.internal; - -import com.fasterxml.jackson.databind.JsonNode; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -import java.io.Serializable; - -@Builder -@NoArgsConstructor -@AllArgsConstructor -@Data -public class ProtoolsInterrogationDto implements Serializable { - String idInterrogation; - JsonNode remInterrogation; - String webPassword; - //TODO: à supprimer - String webConnectionId; -} diff --git a/src/main/java/fr/insee/protools/backend/service/context/resolvers/PartitionCtxResolver.java b/src/main/java/fr/insee/protools/backend/service/context/resolvers/PartitionCtxResolver.java index 2ec5c7b0..8208389e 100644 --- a/src/main/java/fr/insee/protools/backend/service/context/resolvers/PartitionCtxResolver.java +++ b/src/main/java/fr/insee/protools/backend/service/context/resolvers/PartitionCtxResolver.java @@ -52,7 +52,7 @@ public class PartitionCtxResolver { private Optional getPartition(ExecutionEntity execution, String partitionId){ var context = protoolsContext.getContextDtoByProcessInstance(execution.getProcessInstanceId()); return context.getLots().stream() - .filter(x -> x.getId().toString().equalsIgnoreCase(partitionId)) + .filter(x -> String.valueOf(x.getId()).equalsIgnoreCase(partitionId)) .findAny(); } @@ -74,7 +74,7 @@ public String getCommunicationType(ExecutionEntity execution, String partitionId return getPartition(execution,partitionId) .orElseThrow(() -> new IncoherentBPMNContextError("Tried to get communication type on an unknown partition : "+partitionId)) .getCommunications().stream() - .filter(x -> x.getId().toString().equalsIgnoreCase(communicationId)) + .filter(x -> String.valueOf(x.getId()).equalsIgnoreCase(communicationId)) .findAny() .orElseThrow(() -> new IncoherentBPMNContextError("Tried to get communication type on an unknown communication : "+communicationId)) .getTypeCommunication().toString(); @@ -116,7 +116,7 @@ public Instant scheduleNextCommunication(ExecutionEntity execution, String parti //null is an error in config so we ignore it; // and we also discard communications that have already been sent or that have been marked as in error - if(communication==null || communication.getEcheance()==null || sentCommunicationIds.contains(communication.getId().toString()) || errorCommunicationIds.contains(communication.getId().toString())){ + if(communication==null || communication.getEcheance()==null || sentCommunicationIds.contains(String.valueOf(communication.getId())) || errorCommunicationIds.contains(communication.getId().toString())){ continue; } @@ -125,14 +125,14 @@ public Instant scheduleNextCommunication(ExecutionEntity execution, String parti log.warn("Partition id={} : Communication id={} has not been sent. Its echeance [ {} ] is too far past so it will not be sent", partitionId,communication.getId(),TimeLogUtils.format(communication.getEcheance())); - errorCommunicationIds.add(communication.getId().toString()); + errorCommunicationIds.add(String.valueOf(communication.getId())); execution.getRootProcessInstance().setVariableLocal(VARNAME_COMMUNICATION_ERROR_ID_SET,errorCommunicationIds); } //Among the not treated communications we compute the one with the first echeance else if(nextCommEcheance == null || nextCommEcheance.isAfter(communication.getEcheance())){ nextCommEcheance=communication.getEcheance(); - nextCommId=communication.getId().toString(); + nextCommId=String.valueOf(communication.getId()); } } diff --git a/src/main/java/fr/insee/protools/backend/service/meshuggah/delegate/MeshuggahSendCommunicationForInterrogationListTaskREST.java b/src/main/java/fr/insee/protools/backend/service/meshuggah/delegate/MeshuggahSendCommunicationForInterrogationListTaskREST.java index 6ce1d475..79884e19 100644 --- a/src/main/java/fr/insee/protools/backend/service/meshuggah/delegate/MeshuggahSendCommunicationForInterrogationListTaskREST.java +++ b/src/main/java/fr/insee/protools/backend/service/meshuggah/delegate/MeshuggahSendCommunicationForInterrogationListTaskREST.java @@ -2,37 +2,40 @@ import com.fasterxml.jackson.databind.JsonNode; import fr.insee.protools.backend.dto.ContexteProcessus; +import fr.insee.protools.backend.service.context.ContextService; import fr.insee.protools.backend.service.meshuggah.MeshuggahService; import fr.insee.protools.backend.service.utils.FlowableVariableUtils; -import fr.insee.protools.backend.service.utils.delegate.DefaultCallServiceInterroListTask; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.JavaDelegate; +import org.springframework.stereotype.Component; import java.util.List; -import static fr.insee.protools.backend.service.FlowableVariableNameConstants.VARNAME_CURRENT_COMMUNICATION_ID; +import static fr.insee.protools.backend.service.FlowableVariableNameConstants.*; -@Slf4j +@Component @RequiredArgsConstructor -public class MeshuggahSendCommunicationForInterrogationListTaskREST extends DefaultCallServiceInterroListTask { +@Slf4j +public class MeshuggahSendCommunicationForInterrogationListTaskREST implements JavaDelegate { private final MeshuggahService meshuggahService; - + private final ContextService protoolsContext; @Override - protected void serviceAction(ContexteProcessus context, List list, String... params) { - if(params.length!=1){ - log.error("Wrong number of paramaters : {} - expected 1",params.length); - } - String currentCommunicationId=params[0]; - meshuggahService.postCommunicationRequest(context.getId().toString(),currentCommunicationId,list); - } + public void execute(DelegateExecution execution) { + ContexteProcessus context = protoolsContext.getContextDtoByProcessInstance(execution.getProcessInstanceId()); + List interroList = FlowableVariableUtils.getVariableOrThrow(execution, VARNAME_REM_INTERRO_LIST, List.class); + String currentCommunicationId = FlowableVariableUtils.getVariableOrThrow(execution, VARNAME_CURRENT_COMMUNICATION_ID, String.class); - @Override - protected void callService(DelegateExecution execution, ContexteProcessus context, List list) { - String currentCommunicationId= FlowableVariableUtils.getVariableOrThrow(execution, VARNAME_CURRENT_COMMUNICATION_ID, String.class); - serviceAction(context, list,currentCommunicationId); + log.info("ProcessInstanceId={} - currentCommunicationId={} - begin", + execution.getProcessInstanceId(), currentCommunicationId); + + meshuggahService.postCommunicationRequest(String.valueOf(context.getId()), currentCommunicationId, interroList); + + log.info("ProcessInstanceId={} - currentCommunicationId - end", + execution.getProcessInstanceId(), currentCommunicationId); } } diff --git a/src/main/java/fr/insee/protools/backend/service/platine/delegate/pilotatage/PlatinePilotageCreateInterrogationListTaskREST.java b/src/main/java/fr/insee/protools/backend/service/platine/delegate/pilotatage/PlatinePilotageCreateInterrogationListTaskREST.java index 62ef45a7..e3226acc 100644 --- a/src/main/java/fr/insee/protools/backend/service/platine/delegate/pilotatage/PlatinePilotageCreateInterrogationListTaskREST.java +++ b/src/main/java/fr/insee/protools/backend/service/platine/delegate/pilotatage/PlatinePilotageCreateInterrogationListTaskREST.java @@ -2,19 +2,36 @@ import com.fasterxml.jackson.databind.JsonNode; import fr.insee.protools.backend.dto.ContexteProcessus; +import fr.insee.protools.backend.service.context.ContextService; import fr.insee.protools.backend.service.platine.service.PlatinePilotageService; -import fr.insee.protools.backend.service.utils.delegate.DefaultCallServiceInterroListTask; +import fr.insee.protools.backend.service.utils.FlowableVariableUtils; import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.JavaDelegate; +import org.springframework.stereotype.Component; import java.util.List; +import static fr.insee.protools.backend.service.FlowableVariableNameConstants.VARNAME_CURRENT_PARTITION_ID; +import static fr.insee.protools.backend.service.FlowableVariableNameConstants.VARNAME_REM_INTERRO_LIST; + +@Component @RequiredArgsConstructor -public class PlatinePilotageCreateInterrogationListTaskREST extends DefaultCallServiceInterroListTask { +@Slf4j +public class PlatinePilotageCreateInterrogationListTaskREST implements JavaDelegate { private final PlatinePilotageService platinePilotageService; + private final ContextService protoolsContext; @Override - protected void serviceAction(ContexteProcessus context, List list, String... params) { - platinePilotageService.postInterrogations(context.getId().toString(),list); + public void execute(DelegateExecution execution) { + ContexteProcessus context = protoolsContext.getContextDtoByProcessInstance(execution.getProcessInstanceId()); + String currentPartitionId = FlowableVariableUtils.getVariableOrThrow(execution, VARNAME_CURRENT_PARTITION_ID, String.class); + List interroList = FlowableVariableUtils.getVariableOrThrow(execution, VARNAME_REM_INTERRO_LIST, List.class); + + log.info("ProcessInstanceId={} - currentPartitionId={} - begin",currentPartitionId); + platinePilotageService.postInterrogations(String.valueOf(context.getId()),interroList); + log.info("ProcessInstanceId={} - currentPartitionId={} - end",currentPartitionId); } } diff --git a/src/main/java/fr/insee/protools/backend/service/platine/delegate/questionnaire/PlatineQuestionnaireCreateInterrogationListTaskREST.java b/src/main/java/fr/insee/protools/backend/service/platine/delegate/questionnaire/PlatineQuestionnaireCreateInterrogationListTaskREST.java index f894459b..8a161fb0 100644 --- a/src/main/java/fr/insee/protools/backend/service/platine/delegate/questionnaire/PlatineQuestionnaireCreateInterrogationListTaskREST.java +++ b/src/main/java/fr/insee/protools/backend/service/platine/delegate/questionnaire/PlatineQuestionnaireCreateInterrogationListTaskREST.java @@ -2,24 +2,36 @@ import com.fasterxml.jackson.databind.JsonNode; import fr.insee.protools.backend.dto.ContexteProcessus; +import fr.insee.protools.backend.service.context.ContextService; import fr.insee.protools.backend.service.platine.service.PlatineQuestionnaireService; -import fr.insee.protools.backend.service.utils.delegate.DefaultCallServiceInterroListTask; +import fr.insee.protools.backend.service.utils.FlowableVariableUtils; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.JavaDelegate; import org.springframework.stereotype.Component; import java.util.List; -@Slf4j +import static fr.insee.protools.backend.service.FlowableVariableNameConstants.VARNAME_CURRENT_PARTITION_ID; +import static fr.insee.protools.backend.service.FlowableVariableNameConstants.VARNAME_REM_INTERRO_LIST; + @Component @RequiredArgsConstructor -public class PlatineQuestionnaireCreateInterrogationListTaskREST extends DefaultCallServiceInterroListTask { +@Slf4j +public class PlatineQuestionnaireCreateInterrogationListTaskREST implements JavaDelegate { private final PlatineQuestionnaireService platineQuestionnaireService; + private final ContextService protoolsContext; @Override - protected void serviceAction(ContexteProcessus context, List list, String... params) { - platineQuestionnaireService.postInterrogations(context.getId().toString(),list); - } + public void execute(DelegateExecution execution) { + ContexteProcessus context = protoolsContext.getContextDtoByProcessInstance(execution.getProcessInstanceId()); + String currentPartitionId = FlowableVariableUtils.getVariableOrThrow(execution, VARNAME_CURRENT_PARTITION_ID, String.class); + List interroList = FlowableVariableUtils.getVariableOrThrow(execution, VARNAME_REM_INTERRO_LIST, List.class); + log.info("ProcessInstanceId={} - currentPartitionId={} - begin",currentPartitionId); + platineQuestionnaireService.postInterrogations(String.valueOf(context.getId()),interroList); + log.info("ProcessInstanceId={} - currentPartitionId={} - end",currentPartitionId); + } } diff --git a/src/main/java/fr/insee/protools/backend/service/platine/service/PlatinePilotageService.java b/src/main/java/fr/insee/protools/backend/service/platine/service/PlatinePilotageService.java index 7ac35eef..5204086c 100644 --- a/src/main/java/fr/insee/protools/backend/service/platine/service/PlatinePilotageService.java +++ b/src/main/java/fr/insee/protools/backend/service/platine/service/PlatinePilotageService.java @@ -55,7 +55,7 @@ public void postContext(String campaignId, JsonNode contextRootNode) { public void postInterrogations(String campaignId, List interrogations) { log.trace("postInterrogations: campaignId={}",campaignId); - logJson("putQuestionings ",interrogations,log,Level.TRACE); + logJson("postInterrogations ",interrogations,log,Level.TRACE); var response = restClientHelper.getRestClient(KNOWN_API_PLATINE_PILOTAGE) .put() .uri("/interrogations") diff --git a/src/main/java/fr/insee/protools/backend/service/rem/delegate/RemGetPartitionListOfInterroPaginatedTask.java b/src/main/java/fr/insee/protools/backend/service/rem/delegate/RemGetPartitionListOfInterroPaginatedTask.java index b9e5dc0f..1d98250a 100644 --- a/src/main/java/fr/insee/protools/backend/service/rem/delegate/RemGetPartitionListOfInterroPaginatedTask.java +++ b/src/main/java/fr/insee/protools/backend/service/rem/delegate/RemGetPartitionListOfInterroPaginatedTask.java @@ -25,6 +25,7 @@ public class RemGetPartitionListOfInterroPaginatedTask implements JavaDelegate, RemService remService; + private PageResponse readFunction(Integer pageToRead, Object... objects) { String partitionId = (String) objects[0]; return remService.getPartitionAllInterroPaginated(partitionId, pageToRead); diff --git a/src/main/java/fr/insee/protools/backend/service/sugoi/delegate/SugoiREMCreateMissingAccountListTask.java b/src/main/java/fr/insee/protools/backend/service/sugoi_rem/delegate/SugoiREMCreateMissingAccountListTask.java similarity index 98% rename from src/main/java/fr/insee/protools/backend/service/sugoi/delegate/SugoiREMCreateMissingAccountListTask.java rename to src/main/java/fr/insee/protools/backend/service/sugoi_rem/delegate/SugoiREMCreateMissingAccountListTask.java index 58c6de64..0e5dfbce 100644 --- a/src/main/java/fr/insee/protools/backend/service/sugoi/delegate/SugoiREMCreateMissingAccountListTask.java +++ b/src/main/java/fr/insee/protools/backend/service/sugoi_rem/delegate/SugoiREMCreateMissingAccountListTask.java @@ -1,4 +1,4 @@ -package fr.insee.protools.backend.service.sugoi.delegate; +package fr.insee.protools.backend.service.sugoi_rem.delegate; import com.fasterxml.jackson.databind.JsonNode; import fr.insee.protools.backend.dto.ContexteProcessus; diff --git a/src/main/java/fr/insee/protools/backend/service/utils/FlowableVariableUtils.java b/src/main/java/fr/insee/protools/backend/service/utils/FlowableVariableUtils.java index a7d54e3d..61641c65 100644 --- a/src/main/java/fr/insee/protools/backend/service/utils/FlowableVariableUtils.java +++ b/src/main/java/fr/insee/protools/backend/service/utils/FlowableVariableUtils.java @@ -18,6 +18,9 @@ public static T getVariableOrThrow(DelegateExecution execution, String varia if(res==null){ throw new FlowableIllegalArgumentException(getMissingVariableMessage(variableName)); } + else if(!variableClass.isAssignableFrom(res.getClass())){ + throw new VariableClassCastException(String.format("Variable ID=[%s] val=[%s] cannot be casted to %s", variableName, res, variableClass)); + } } catch (ClassCastException e) { throw new VariableClassCastException(String.format("Variable ID=[%s] val=[%s] cannot be casted to %s", variableName, execution.getVariable(variableName), variableClass)); diff --git a/src/test/java/fr/insee/protools/backend/ProtoolsTestUtils.java b/src/test/java/fr/insee/protools/backend/ProtoolsTestUtils.java index 70e10019..d31ac997 100644 --- a/src/test/java/fr/insee/protools/backend/ProtoolsTestUtils.java +++ b/src/test/java/fr/insee/protools/backend/ProtoolsTestUtils.java @@ -76,10 +76,4 @@ public static Buffer fileToBytes(File file) throws IOException { return result; } - - public static JsonNode initContexteMockFromString(ContextService protoolsContext, String contextAsString) throws JsonProcessingException { - JsonNode contextRootNode = new ObjectMapper().readTree(contextAsString); - when(protoolsContext.getContextJsonNodeByProcessInstance(anyString())).thenReturn(contextRootNode); - return contextRootNode; - } } diff --git a/src/test/java/fr/insee/protools/backend/service/platine/delegate/pilotatage/PlatinePilotageCreateContextTaskRESTTest.java b/src/test/java/fr/insee/protools/backend/service/platine/delegate/pilotatage/PlatinePilotageCreateContextTaskRESTTest.java index 764bfef0..a20b12ee 100644 --- a/src/test/java/fr/insee/protools/backend/service/platine/delegate/pilotatage/PlatinePilotageCreateContextTaskRESTTest.java +++ b/src/test/java/fr/insee/protools/backend/service/platine/delegate/pilotatage/PlatinePilotageCreateContextTaskRESTTest.java @@ -4,6 +4,7 @@ import fr.insee.protools.backend.service.platine.service.PlatinePilotageService; import fr.insee.protools.backend.service.utils.TestWithContext; import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.JavaDelegate; import org.flowable.engine.test.FlowableTest; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; @@ -14,6 +15,7 @@ import org.mockito.junit.jupiter.MockitoExtension; import java.util.List; +import java.util.Map; import static fr.insee.protools.backend.utils.data.CtxExamples.ctx_empty; import static fr.insee.protools.backend.utils.data.CtxExamples.ctx_empty_id; @@ -32,12 +34,6 @@ class PlatinePilotageCreateContextTaskRESTTest extends TestWithContext { @InjectMocks PlatinePilotageCreateContextTaskREST platinePilotageTask; - - @Test - void execute_should_throwError_when_null_context(){ - assertThat_delegate_throwError_when_null_context(platinePilotageTask); - } - @Test void execute_should_work_when_contextOK() { DelegateExecution execution = createMockedExecution(); @@ -56,4 +52,13 @@ void execute_should_work_when_contextOK() { } + @Override + protected JavaDelegate getTaskUnderTest() { + return platinePilotageTask; + } + + @Override + protected Map getVariablesAndTypes() { + return Map.of(); + } } \ No newline at end of file diff --git a/src/test/java/fr/insee/protools/backend/service/platine/delegate/pilotatage/PlatinePilotageCreateInterrogationListTaskRESTTest.java b/src/test/java/fr/insee/protools/backend/service/platine/delegate/pilotatage/PlatinePilotageCreateInterrogationListTaskRESTTest.java new file mode 100644 index 00000000..17ac9d11 --- /dev/null +++ b/src/test/java/fr/insee/protools/backend/service/platine/delegate/pilotatage/PlatinePilotageCreateInterrogationListTaskRESTTest.java @@ -0,0 +1,78 @@ +package fr.insee.protools.backend.service.platine.delegate.pilotatage; + +import com.fasterxml.jackson.databind.JsonNode; +import fr.insee.protools.backend.dto.ContexteProcessus; +import fr.insee.protools.backend.service.platine.service.PlatinePilotageService; +import fr.insee.protools.backend.service.utils.FlowableVariableUtils; +import fr.insee.protools.backend.service.utils.TestWithContext; +import fr.insee.protools.backend.utils.data.InterroExamples; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.JavaDelegate; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.mockito.ArgumentCaptor; +import org.mockito.InjectMocks; +import org.mockito.Mock; + +import java.util.List; +import java.util.Map; +import java.util.UUID; +import java.util.stream.Collectors; +import java.util.stream.IntStream; + +import static fr.insee.protools.backend.service.FlowableVariableNameConstants.VARNAME_CURRENT_PARTITION_ID; +import static fr.insee.protools.backend.service.FlowableVariableNameConstants.VARNAME_REM_INTERRO_LIST; +import static fr.insee.protools.backend.utils.data.CtxExamples.ctx_empty; +import static fr.insee.protools.backend.utils.data.CtxExamples.ctx_empty_id; +import static fr.insee.protools.backend.utils.data.InterroExamples.generateEmptyInterro; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.*; + +class PlatinePilotageCreateInterrogationListTaskRESTTest extends TestWithContext { + + @Mock + PlatinePilotageService platinePilotageService; + + @InjectMocks + PlatinePilotageCreateInterrogationListTaskREST task; + + @Test + void execute_should_work_when_contextOKVarOK() { + DelegateExecution execution = createMockedExecution(); + JsonNode expectedContext = initContexteMockWithString(ctx_empty); + + //Process variables + lenient().doReturn(String.valueOf(UUID.randomUUID())).when(execution).getVariable(VARNAME_CURRENT_PARTITION_ID, String.class); + + List interroList = IntStream.range(0, 100) + .mapToObj(i -> generateEmptyInterro().interro()) // Call your function and get the JsonNode + .collect(Collectors.toList()); + lenient().doReturn(interroList).when(execution).getVariable(VARNAME_REM_INTERRO_LIST, List.class); + + //Execute the unit under test + task.execute(execution); + + //Verify postContext + final ArgumentCaptor > listCaptor + = ArgumentCaptor.forClass((Class) List.class); + + verify(platinePilotageService,times(1)).postInterrogations(eq(ctx_empty_id),listCaptor.capture()); + List> allValues = listCaptor.getAllValues(); + assertEquals(1, allValues.size(),"We should have exactly one value"); + + assertEquals(interroList,allValues.get(0),"Wrong list of interro passed"); + } + + @Override + protected JavaDelegate getTaskUnderTest() { + return task; + } + + @Override + protected Map getVariablesAndTypes() { + return Map.of( + VARNAME_CURRENT_PARTITION_ID,String.class, + VARNAME_REM_INTERRO_LIST,List.class); + } +} \ No newline at end of file diff --git a/src/test/java/fr/insee/protools/backend/service/platine/delegate/questionnaire/PlatineQuestionnaireCreateContextTaskRESTTest.java b/src/test/java/fr/insee/protools/backend/service/platine/delegate/questionnaire/PlatineQuestionnaireCreateContextTaskRESTTest.java index 6edc5e6d..0022292c 100644 --- a/src/test/java/fr/insee/protools/backend/service/platine/delegate/questionnaire/PlatineQuestionnaireCreateContextTaskRESTTest.java +++ b/src/test/java/fr/insee/protools/backend/service/platine/delegate/questionnaire/PlatineQuestionnaireCreateContextTaskRESTTest.java @@ -4,12 +4,14 @@ import fr.insee.protools.backend.service.platine.service.PlatineQuestionnaireService; import fr.insee.protools.backend.service.utils.TestWithContext; import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.JavaDelegate; import org.junit.jupiter.api.Test; import org.mockito.ArgumentCaptor; import org.mockito.InjectMocks; import org.mockito.Mock; import java.util.List; +import java.util.Map; import static fr.insee.protools.backend.utils.data.CtxExamples.ctx_empty; import static fr.insee.protools.backend.utils.data.CtxExamples.ctx_empty_id; @@ -27,9 +29,14 @@ class PlatineQuestionnaireCreateContextTaskRESTTest extends TestWithContext { PlatineQuestionnaireCreateContextTaskREST platineQuestionnaireTask; - @Test - void execute_should_throwError_when_null_context(){ - assertThat_delegate_throwError_when_null_context(platineQuestionnaireTask); + @Override + protected JavaDelegate getTaskUnderTest() { + return platineQuestionnaireTask; + } + + @Override + protected Map getVariablesAndTypes() { + return Map.of(); } @Test diff --git a/src/test/java/fr/insee/protools/backend/service/utils/TestWithContext.java b/src/test/java/fr/insee/protools/backend/service/utils/TestWithContext.java index e35a6d0f..76c0509c 100644 --- a/src/test/java/fr/insee/protools/backend/service/utils/TestWithContext.java +++ b/src/test/java/fr/insee/protools/backend/service/utils/TestWithContext.java @@ -2,15 +2,20 @@ import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.node.JsonNodeFactory; import fr.insee.protools.backend.ProtoolsTestUtils; import fr.insee.protools.backend.dto.ContexteProcessus; import fr.insee.protools.backend.service.context.ContextService; import fr.insee.protools.backend.service.context.exception.BadContexMissingBPMNError; -import fr.insee.protools.backend.service.context.exception.BadContextIncorrectBPMNError; +import fr.insee.protools.backend.service.exception.VariableClassCastException; import lombok.SneakyThrows; +import lombok.extern.slf4j.Slf4j; +import org.flowable.common.engine.api.FlowableIllegalArgumentException; import org.flowable.engine.delegate.DelegateExecution; import org.flowable.engine.delegate.JavaDelegate; import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.Mockito; import org.mockito.Spy; @@ -18,12 +23,20 @@ import java.io.IOException; import java.io.UncheckedIOException; +import java.util.*; +import java.util.function.Consumer; +import java.util.stream.Stream; +import java.util.stream.StreamSupport; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.containsString; import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.Mockito.*; @ExtendWith(MockitoExtension.class) +@Slf4j public abstract class TestWithContext { @Spy protected ContextService protoolsContext; @@ -33,37 +46,170 @@ public abstract class TestWithContext { @AfterEach void mockitoResetContext() { - Mockito.reset(protoolsContext); + reset(protoolsContext); } + @SneakyThrows protected JsonNode initContexteMockWithFile(String contexteToLoad) { JsonNode contextRootNode = ProtoolsTestUtils.asJsonNode(contexteToLoad); ContexteProcessus schema = objectMapper.readValue(contexteToLoad, ContexteProcessus.class); + doReturn(contextRootNode).when(protoolsContext).getContextJsonNodeByProcessInstance(anyString()); doReturn(schema).when(protoolsContext).getContextDtoByProcessInstance(anyString()); return contextRootNode; } + @SneakyThrows protected JsonNode initContexteMockWithString(String contexteAsString){ - try{ - return ProtoolsTestUtils.initContexteMockFromString(protoolsContext,contexteAsString); - } catch (IOException e) { - throw new UncheckedIOException(e); - } + JsonNode contextRootNode = new ObjectMapper().readTree(contexteAsString); + ContexteProcessus schema = objectMapper.readValue(contexteAsString, ContexteProcessus.class); + + doReturn(contextRootNode).when(protoolsContext).getContextJsonNodeByProcessInstance(anyString()); + doReturn(schema).when(protoolsContext).getContextDtoByProcessInstance(anyString()); + return contextRootNode; } + public DelegateExecution createMockedExecution(){ DelegateExecution execution = mock(DelegateExecution.class); doReturn(dumyId).when(execution).getProcessInstanceId(); return execution; } - protected void assertThat_delegate_throwError_when_null_context(JavaDelegate delegate) { + @Test + @DisplayName("execute should throw an error if the context is null") + void execute_should_throwError_when_null_context(){ //Precondition DelegateExecution execution = mock(DelegateExecution.class); lenient().when(execution.getProcessInstanceId()).thenReturn(dumyId); doThrow(new BadContexMissingBPMNError("Erreur")).when(protoolsContext).getContextDtoByProcessInstance(anyString()); doThrow(new BadContexMissingBPMNError("Erreur")).when(protoolsContext).getContextJsonNodeByProcessInstance(anyString()); - assertThrows(BadContexMissingBPMNError.class, () -> delegate.execute(execution)); + assertThrows(BadContexMissingBPMNError.class, () -> getTaskUnderTest().execute(execution)); + } + + @Test + protected void execute_should_throw_FlowableIllegalArgumentException_when_variables_notDefined(){ + Map typeByVariable = getVariablesAndTypes(); + //No variables==> No test + if(typeByVariable.isEmpty()){ + log.info("No variable configured as mandatory for this delegate"); + assertTrue(true); + return; + } + + //Precondition + DelegateExecution execution = mock(DelegateExecution.class); + lenient().when(execution.getProcessInstanceId()).thenReturn(dumyId); + + String[] variables=getVariablesAndTypes().keySet().toArray(new String[0]); + combinations(variables) + .forEach(variablesSubset -> { + log.info("subset of initialized variables: "+variablesSubset); + //Initailize the mocked variables + for (String variable :variablesSubset) { + Class clazz = typeByVariable.get(variable); + var dummyValue = initDefaultValue(clazz); + lenient().doReturn(dummyValue).when(execution).getVariable(eq(variable), eq(clazz)); + lenient().doReturn(dummyValue).when(execution).getVariableLocal(eq(variable), eq(clazz)); + + } + + //Run the test for this subset of initialized variables + //Verify + FlowableIllegalArgumentException exception = assertThrows(FlowableIllegalArgumentException.class, () -> getTaskUnderTest().execute(execution)); + assertThat(exception.getMessage(), containsString("was not found")); + // Reset the mock (this clears all stubbings and invocations) + Mockito.reset(execution); + } ); } + + + @Test + protected void execute_should_throw_FlowableIllegalArgumentException_when_variables_wrongType() { + Map typeByVariable = getVariablesAndTypes(); + //No variables==> No test + if(typeByVariable.isEmpty()){ + assertTrue(true); + log.info("No variable configured as mandatory for this delegate"); + return; + } + + + //Precondition + DelegateExecution execution = mock(DelegateExecution.class); + lenient().when(execution.getProcessInstanceId()).thenReturn(dumyId); + + typeByVariable + .keySet() + .forEach(variable -> { + Class clazzOriginal = typeByVariable.get(variable); + Class clazz; + if (clazzOriginal.equals(String.class)) { + clazz = List.class; + } else if (clazzOriginal.equals(List.class)) { + clazz = JsonNode.class; + } else { + clazz = String.class; + } + var dummyValue = initDefaultValue(clazz); + lenient().doReturn(dummyValue).when(execution).getVariable(eq(variable), eq(clazzOriginal)); + lenient().doReturn(dummyValue).when(execution).getVariableLocal(eq(variable), eq(clazzOriginal)); + }); + //Run the test + //Verify + assertThrows(VariableClassCastException.class, () -> getTaskUnderTest().execute(execution)); + } + + private T initDefaultValue(Class clazz){ + if(clazz.equals(List.class)){ + return (T) List.of(); + } + else if(clazz.equals(Map.class)){ + return (T) Map.of(); + } + else if(clazz.equals(Set.class)){ + return (T) Set.of(); + } + else if(clazz.equals(JsonNode.class)){ + return (T) JsonNodeFactory.instance.objectNode(); + } + + try { + return clazz.getDeclaredConstructor().newInstance(); + } catch (ReflectiveOperationException e) { + throw new RuntimeException(e); + } + } + + //Generate a Stream of all the combinaisons of elements of the array including an empty List but without the full list + private static Stream> combinations(T[] arr) { + final long N = (long) Math.pow(2, arr.length)-1; + return StreamSupport.stream(new Spliterators.AbstractSpliterator>(N, Spliterator.SIZED) { + long i = 0; + @Override + public boolean tryAdvance(Consumer> action) { + if(i < N) { + List out = new ArrayList(Long.bitCount(i)); + for (int bit = 0; bit < arr.length; bit++) { + if((i & (1< getVariablesAndTypes(); + + } diff --git a/src/test/java/fr/insee/protools/backend/utils/data/CtxExamples.java b/src/test/java/fr/insee/protools/backend/utils/data/CtxExamples.java index 7316f704..3f7f5f16 100644 --- a/src/test/java/fr/insee/protools/backend/utils/data/CtxExamples.java +++ b/src/test/java/fr/insee/protools/backend/utils/data/CtxExamples.java @@ -13,9 +13,5 @@ public class CtxExamples { """; public static final String ctx_empty_id="b958cfac-2bf3-478d-a97a-dda5e751898c"; - final static String ressourceFolder = ClassUtils.convertClassNameToResourcePath(CtxExamples.class.getPackageName()); - public final static String context_minimal = ressourceFolder+"/ctx_minimal.json"; - - private CtxExamples(){} } diff --git a/src/test/java/fr/insee/protools/backend/utils/data/InterroExamples.java b/src/test/java/fr/insee/protools/backend/utils/data/InterroExamples.java new file mode 100644 index 00000000..3b912182 --- /dev/null +++ b/src/test/java/fr/insee/protools/backend/utils/data/InterroExamples.java @@ -0,0 +1,30 @@ +package fr.insee.protools.backend.utils.data; + +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.node.JsonNodeFactory; +import com.fasterxml.jackson.databind.node.ObjectNode; +import org.apache.commons.lang3.tuple.Pair; +import org.springframework.util.ClassUtils; +import java.util.UUID; + +public class InterroExamples { + + + public record InterroWithId(String id, JsonNode interro){} + + public static InterroWithId generateEmptyInterro(){ + String uuid = UUID.randomUUID().toString(); + ObjectNode interro = JsonNodeFactory.instance.objectNode(); + interro.put("id", uuid); + return new InterroWithId(uuid, interro); + } + public static final String interro1_empty = + """ + { + "id": "b958cfac-2bf3-478d-a97a-dda5e751898c" + } + """; + public static final String interro1_empty_id="b958cfac-2bf3-478d-a97a-dda5e751898c"; + + private InterroExamples(){} +} From 87a59b3311ba354f9bd14f73aa2a918e5434976c Mon Sep 17 00:00:00 2001 From: SNDIL - Marc Date: Thu, 12 Sep 2024 10:00:41 +0200 Subject: [PATCH 59/75] tests: tests unitaires --- ...neQuestionnaireCreateInterrogationListTaskRESTTest.java | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 src/test/java/fr/insee/protools/backend/service/platine/delegate/questionnaire/PlatineQuestionnaireCreateInterrogationListTaskRESTTest.java diff --git a/src/test/java/fr/insee/protools/backend/service/platine/delegate/questionnaire/PlatineQuestionnaireCreateInterrogationListTaskRESTTest.java b/src/test/java/fr/insee/protools/backend/service/platine/delegate/questionnaire/PlatineQuestionnaireCreateInterrogationListTaskRESTTest.java new file mode 100644 index 00000000..fa934d60 --- /dev/null +++ b/src/test/java/fr/insee/protools/backend/service/platine/delegate/questionnaire/PlatineQuestionnaireCreateInterrogationListTaskRESTTest.java @@ -0,0 +1,7 @@ +package fr.insee.protools.backend.service.platine.delegate.questionnaire; + +import static org.junit.jupiter.api.Assertions.*; + +class PlatineQuestionnaireCreateInterrogationListTaskRESTTest { + +} \ No newline at end of file From c84e3e2a3b41d9185b5d7d7b12d6538196d44c28 Mon Sep 17 00:00:00 2001 From: SNDIL - Marc Date: Thu, 12 Sep 2024 15:11:44 +0200 Subject: [PATCH 60/75] en cours sur ce fichier --- ...otageCreateCommunicationEventTaskREST.java | 36 ++++++++++++++++--- 1 file changed, 32 insertions(+), 4 deletions(-) diff --git a/src/main/java/fr/insee/protools/backend/service/platine/delegate/pilotatage/PlatinePilotageCreateCommunicationEventTaskREST.java b/src/main/java/fr/insee/protools/backend/service/platine/delegate/pilotatage/PlatinePilotageCreateCommunicationEventTaskREST.java index cb4b69a7..83d57085 100644 --- a/src/main/java/fr/insee/protools/backend/service/platine/delegate/pilotatage/PlatinePilotageCreateCommunicationEventTaskREST.java +++ b/src/main/java/fr/insee/protools/backend/service/platine/delegate/pilotatage/PlatinePilotageCreateCommunicationEventTaskREST.java @@ -2,8 +2,7 @@ import com.fasterxml.jackson.databind.JsonNode; import fr.insee.protools.backend.dto.platine.pilotage.PlatinePilotageCommunicationEventDto; -import fr.insee.protools.backend.service.DelegateContextVerifier; -import fr.insee.protools.backend.service.context.ContextService; +import fr.insee.protools.backend.exception.ProtoolsProcessFlowBPMNError; import fr.insee.protools.backend.service.platine.service.PlatinePilotageService; import fr.insee.protools.backend.service.utils.FlowableVariableUtils; import lombok.RequiredArgsConstructor; @@ -21,7 +20,7 @@ @Slf4j @RequiredArgsConstructor @Component -public class PlatinePilotageCreateCommunicationEventTaskREST implements JavaDelegate, DelegateContextVerifier { +public class PlatinePilotageCreateCommunicationEventTaskREST implements JavaDelegate { private final PlatinePilotageService platinePilotageService; @@ -35,10 +34,38 @@ public void execute(DelegateExecution execution) { List contentList = FlowableVariableUtils.getVariableOrThrow(execution, VARNAME_REM_INTERRO_LIST, List.class); Map communicationRequestIdByInterroIdMap = FlowableVariableUtils.getVariableOrThrow(execution, VARNAME_COMMUNICATION_REQUEST_ID_FOR_INTERRO_ID_MAP, Map.class); - //TODO: put it at a single place ==> Maybe an helper to get the Id of an interro or of any json? + if(currentCommunicationId.isBlank()){ + log.error("ProcessInstanceId={} currentPartitionId={} - currentCommunicationId{} : currentCommunicationId cannot be blank", + execution.getProcessInstanceId(),currentPartitionId, currentCommunicationId); + throw new ProtoolsProcessFlowBPMNError("PlatinePilotageCreateCommunicationEventTaskREST: communicationId cannot be empty"); + } + + //If nothing to do ==> Directly return + if(contentList.isEmpty()){ + log.info("ProcessInstanceId={} currentPartitionId={} - currentCommunicationId{} - end : Nothing to do", + execution.getProcessInstanceId(),currentPartitionId, currentCommunicationId); + return; + } + + + //TODO: put it at a single place ==> Maybe an helper to get the Id of an interro or of any json? String jsonKeyId = "id"; List platinePilotageCommunicationEventList = contentList.stream() + .filter(jsonNode -> { + JsonNode node = jsonNode.get(jsonKeyId); + if(node==null || node.isMissingNode()|| node.asText().isBlank()){ + log.warn("ProcessInstanceId={} currentPartitionId={} : skipping an interro without id",execution.getProcessInstanceId(),currentPartitionId); + return false; + } + else if(!communicationRequestIdByInterroIdMap.containsKey(node.asText())){ + log.warn("ProcessInstanceId={} currentPartitionId={} - interroID={} : cannot retrieve communicationRequestId",execution.getProcessInstanceId(),currentPartitionId,node.asText()); + return false; + } + else{ + return true; + } + }) .map(jsonNode -> { String interroId = jsonNode.path(jsonKeyId).asText(); String communicationRequestId=communicationRequestIdByInterroIdMap.get(interroId); @@ -48,6 +75,7 @@ public void execute(DelegateExecution execution) { .interrogationId(interroId).state(COMMUNICATION_STATE_SENT).build(); }).toList(); + //Check ctx? platinePilotageService.postCommunicationEvent(platinePilotageCommunicationEventList); log.info("ProcessInstanceId={} end",execution.getProcessInstanceId()); From bf572db9b6163d40d8b806e1fe4253c6e60ed17f Mon Sep 17 00:00:00 2001 From: SNDIL - Marc Date: Mon, 16 Sep 2024 15:19:40 +0200 Subject: [PATCH 61/75] en cours sur ce fichier --- pom.xml | 16 +- .../dto/rem_tmp/InterrogationAccountDto.java | 8 +- .../ProtoolsProcessFlowBPMNError.java | 9 + .../backend/logging/LoggingHelper.java | 41 +++ .../backend/restclient/RestClientHelper.java | 247 +++++++------- .../restclient/keycloak/KeycloakResponse.java | 3 - .../restclient/keycloak/KeycloakService.java | 2 + ...unicationForInterrogationListTaskREST.java | 3 +- ...otageCreateCommunicationEventTaskREST.java | 36 +- .../PlatinePilotageCreateContextTaskREST.java | 5 +- ...tOfInterroToFollowUpPaginatedTaskREST.java | 8 +- ...ineQuestionnaireCreateContextTaskREST.java | 5 +- .../service/PlatinePilotageService.java | 29 +- .../service/PlatineQuestionnaireService.java | 11 +- .../backend/service/rem/RemService.java | 19 +- .../DefaultCallServiceInterroListTask.java | 53 --- .../utils/delegate/PaginationHelper.java | 2 +- src/main/resources/application-dev.properties | 1 + ...leProcessTest.testSimpleProcess.bpmn20.xml | 0 .../integration/collecte_web_no_com.json | 0 .../integration/noCTX_eraREM.bpmn20.xml | 0 .../context/protools-contexte-platine.json | 0 .../expected_post_questionnaire_metadata.json | 0 ...exte-platine-incorrect-no-campaign-id.json | 0 .../protools-contexte-platine-incorrect.json | 0 .../protools-contexte-platine-individu.json | 0 .../protools-contexte-platine-logement.json | 2 +- .../expected_post_questionnaire_metadata.json | 0 .../pilotage_expected_post_campaign.json | 0 .../protools-contexte-sabiane-incorrect.json | 0 .../delegate/protools-contexte-sabiane.json | 0 .../utils/data/rem-su-noMainOrSurveyed.json | 0 .../utils/data/rem-su-test-selection.json | 0 .../service/utils/data/rem-su_1personne.json | 0 .../service/utils/data/rem-su_3personnes.json | 0 .../protools/backend/ProtoolsTestUtils.java | 4 - .../controller/StarterControllerTest.java | 8 +- .../restclient/KeycloakServiceTest.java | 165 ++++++++++ .../restclient/RestClientHelperTest.java | 311 +++++++++++------- ...ommunicationEventTaskRESTTestDelegate.java | 157 +++++++++ ...ageCreateContextTaskRESTTestDelegate.java} | 9 +- ...nterrogationListTaskRESTTestDelegate.java} | 12 +- ...nterroToFollowUpPaginatedTaskRESTTest.java | 74 +++++ ...ireCreateContextTaskRESTTestDelegate.java} | 10 +- ...reCreateInterrogationListTaskRESTTest.java | 7 - ...InterrogationListTaskRESTTestDelegate.java | 74 +++++ .../service/PlatinePilotageServiceTest.java | 165 ++++++++-- .../PlatineQuestionnaireServiceTest.java | 52 +-- .../backend/service/rem/RemServiceTest.java | 125 +++++++ .../service/utils/CustomJWTHelper.java | 2 +- .../utils/TestServiceWithRestClient.java | 71 ++++ .../IDelegateWithVariableGetPaginated.java | 97 ++++++ .../IDelegateWithVariables.java} | 218 ++++++------ .../delegate/TestDelegateWithContext.java | 87 +++++ .../backend/utils/data/CtxExamples.java | 3 +- .../backend/utils/data/InterroExamples.java | 3 +- 56 files changed, 1584 insertions(+), 570 deletions(-) create mode 100644 src/main/java/fr/insee/protools/backend/exception/ProtoolsProcessFlowBPMNError.java create mode 100644 src/main/java/fr/insee/protools/backend/logging/LoggingHelper.java delete mode 100644 src/main/java/fr/insee/protools/backend/service/utils/delegate/DefaultCallServiceInterroListTask.java rename src/test/{resources/fr/insee/protools/backend => backup/ressources}/flowable/engine/SimpleProcessTest.testSimpleProcess.bpmn20.xml (100%) rename src/test/{resources/fr/insee/protools/backend => backup/ressources}/integration/collecte_web_no_com.json (100%) rename src/test/{resources/fr/insee/protools/backend => backup/ressources}/integration/noCTX_eraREM.bpmn20.xml (100%) rename src/test/{resources/fr/insee/protools/backend => backup/ressources}/service/context/protools-contexte-platine.json (100%) rename src/test/{resources/fr/insee/protools/backend => backup/ressources}/service/platine/delegate/expected_post_questionnaire_metadata.json (100%) rename src/test/{resources/fr/insee/protools/backend => backup/ressources}/service/platine/delegate/protools-contexte-platine-incorrect-no-campaign-id.json (100%) rename src/test/{resources/fr/insee/protools/backend => backup/ressources}/service/platine/delegate/protools-contexte-platine-incorrect.json (100%) rename src/test/{resources/fr/insee/protools/backend => backup/ressources}/service/platine/delegate/protools-contexte-platine-individu.json (100%) rename src/test/{resources/fr/insee/protools/backend => backup/ressources}/service/platine/delegate/protools-contexte-platine-logement.json (99%) rename src/test/{resources/fr/insee/protools/backend => backup/ressources}/service/sabiane/delegate/expected_post_questionnaire_metadata.json (100%) rename src/test/{resources/fr/insee/protools/backend => backup/ressources}/service/sabiane/delegate/pilotage_expected_post_campaign.json (100%) rename src/test/{resources/fr/insee/protools/backend => backup/ressources}/service/sabiane/delegate/protools-contexte-sabiane-incorrect.json (100%) rename src/test/{resources/fr/insee/protools/backend => backup/ressources}/service/sabiane/delegate/protools-contexte-sabiane.json (100%) rename src/test/{resources/fr/insee/protools/backend => backup/ressources}/service/utils/data/rem-su-noMainOrSurveyed.json (100%) rename src/test/{resources/fr/insee/protools/backend => backup/ressources}/service/utils/data/rem-su-test-selection.json (100%) rename src/test/{resources/fr/insee/protools/backend => backup/ressources}/service/utils/data/rem-su_1personne.json (100%) rename src/test/{resources/fr/insee/protools/backend => backup/ressources}/service/utils/data/rem-su_3personnes.json (100%) create mode 100644 src/test/java/fr/insee/protools/backend/restclient/KeycloakServiceTest.java create mode 100644 src/test/java/fr/insee/protools/backend/service/platine/delegate/pilotatage/PlatinePilotageCreateCommunicationEventTaskRESTTestDelegate.java rename src/test/java/fr/insee/protools/backend/service/platine/delegate/pilotatage/{PlatinePilotageCreateContextTaskRESTTest.java => PlatinePilotageCreateContextTaskRESTTestDelegate.java} (87%) rename src/test/java/fr/insee/protools/backend/service/platine/delegate/pilotatage/{PlatinePilotageCreateInterrogationListTaskRESTTest.java => PlatinePilotageCreateInterrogationListTaskRESTTestDelegate.java} (85%) create mode 100644 src/test/java/fr/insee/protools/backend/service/platine/delegate/pilotatage/PlatinePilotageGetListOfInterroToFollowUpPaginatedTaskRESTTest.java rename src/test/java/fr/insee/protools/backend/service/platine/delegate/questionnaire/{PlatineQuestionnaireCreateContextTaskRESTTest.java => PlatineQuestionnaireCreateContextTaskRESTTestDelegate.java} (84%) delete mode 100644 src/test/java/fr/insee/protools/backend/service/platine/delegate/questionnaire/PlatineQuestionnaireCreateInterrogationListTaskRESTTest.java create mode 100644 src/test/java/fr/insee/protools/backend/service/platine/delegate/questionnaire/PlatineQuestionnaireCreateInterrogationListTaskRESTTestDelegate.java create mode 100644 src/test/java/fr/insee/protools/backend/service/rem/RemServiceTest.java create mode 100644 src/test/java/fr/insee/protools/backend/service/utils/TestServiceWithRestClient.java create mode 100644 src/test/java/fr/insee/protools/backend/service/utils/delegate/IDelegateWithVariableGetPaginated.java rename src/test/java/fr/insee/protools/backend/service/utils/{TestWithContext.java => delegate/IDelegateWithVariables.java} (50%) create mode 100644 src/test/java/fr/insee/protools/backend/service/utils/delegate/TestDelegateWithContext.java diff --git a/pom.xml b/pom.xml index cf9a0752..3643a883 100644 --- a/pom.xml +++ b/pom.xml @@ -169,12 +169,24 @@ ${pitest.version} - fr.insee.protools.backend.service.* - fr.insee.protools.backend.controller.StarterController + fr.insee.protools.backend.* STRONGER + + java.util.logging + org.apache.log4j + org.slf4j + org.apache.commons.logging + fr.insee.protools.backend.logging + fr.insee.protools.backend.logging.LoggingHelper + + + fr.insee.protools.backend.logging.* + fr.insee.protools.backend.dto.* + *xxBPMNError + diff --git a/src/main/java/fr/insee/protools/backend/dto/rem_tmp/InterrogationAccountDto.java b/src/main/java/fr/insee/protools/backend/dto/rem_tmp/InterrogationAccountDto.java index 448e18ff..842e681f 100644 --- a/src/main/java/fr/insee/protools/backend/dto/rem_tmp/InterrogationAccountDto.java +++ b/src/main/java/fr/insee/protools/backend/dto/rem_tmp/InterrogationAccountDto.java @@ -1,14 +1,12 @@ package fr.insee.protools.backend.dto.rem_tmp; -import java.util.Objects; import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.annotation.JsonTypeName; -import java.util.UUID; - +import jakarta.annotation.Generated; import jakarta.validation.Valid; - -import jakarta.annotation.Generated; +import java.util.Objects; +import java.util.UUID; /** * InterrogationAccountDto diff --git a/src/main/java/fr/insee/protools/backend/exception/ProtoolsProcessFlowBPMNError.java b/src/main/java/fr/insee/protools/backend/exception/ProtoolsProcessFlowBPMNError.java new file mode 100644 index 00000000..da390eb4 --- /dev/null +++ b/src/main/java/fr/insee/protools/backend/exception/ProtoolsProcessFlowBPMNError.java @@ -0,0 +1,9 @@ +package fr.insee.protools.backend.exception; + +import static fr.insee.protools.backend.service.BPMNErrorCode.BPMNERROR_CODE_DEFAULT; + +public class ProtoolsProcessFlowBPMNError extends ProtoolsBpmnError { + public ProtoolsProcessFlowBPMNError(String message) { + super(BPMNERROR_CODE_DEFAULT, message); + } +} diff --git a/src/main/java/fr/insee/protools/backend/logging/LoggingHelper.java b/src/main/java/fr/insee/protools/backend/logging/LoggingHelper.java new file mode 100644 index 00000000..013e1f55 --- /dev/null +++ b/src/main/java/fr/insee/protools/backend/logging/LoggingHelper.java @@ -0,0 +1,41 @@ +package fr.insee.protools.backend.logging; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import org.slf4j.Logger; +import org.slf4j.event.Level; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + + + +public class LoggingHelper { + + @Retention(RetentionPolicy.RUNTIME) + @Target(ElementType.METHOD) + public @interface ExcludeFromJacocoGeneratedReport {} + + @ExcludeFromJacocoGeneratedReport + public static void logJson(String msg, Object dto, Logger logger, Level level) { + if (logger.isEnabledForLevel(level)) { + try { + String json = new ObjectMapper().writeValueAsString(dto); + String logLine = msg +" - " + json; + switch (level) { + case TRACE -> logger.trace(logLine); + case DEBUG -> logger.debug(logLine); + case INFO -> logger.info(logLine); + case WARN -> logger.warn(logLine); + case ERROR -> logger.error(logLine); + default -> logger.trace(logLine); + } + } catch (JsonProcessingException e) { + throw new RuntimeException("Failed to parse json"); + } + } + } + private LoggingHelper(){} +} diff --git a/src/main/java/fr/insee/protools/backend/restclient/RestClientHelper.java b/src/main/java/fr/insee/protools/backend/restclient/RestClientHelper.java index b7bfdac8..b7966cba 100644 --- a/src/main/java/fr/insee/protools/backend/restclient/RestClientHelper.java +++ b/src/main/java/fr/insee/protools/backend/restclient/RestClientHelper.java @@ -14,8 +14,6 @@ import fr.insee.protools.backend.restclient.keycloak.KeycloakService; import io.netty.handler.logging.LogLevel; import lombok.extern.slf4j.Slf4j; -import org.slf4j.Logger; -import org.slf4j.event.Level; import org.springframework.http.HttpRequest; import org.springframework.http.HttpStatus; import org.springframework.http.HttpStatusCode; @@ -23,7 +21,6 @@ import org.springframework.http.client.ReactorNettyClientRequestFactory; import org.springframework.lang.Nullable; import org.springframework.stereotype.Component; -import org.springframework.util.Base64Utils; import org.springframework.util.StreamUtils; import org.springframework.web.client.RestClient; import reactor.netty.http.client.HttpClient; @@ -40,165 +37,145 @@ @Slf4j public class RestClientHelper { private final KeycloakService keycloakService; - private final ApiConfigProperties apiConfigProperties; + private final ApiConfigProperties apiConfigProperties; - private final EnumMap initializedClients = new EnumMap<>(ApiConfigProperties.KNOWN_API.class); + private final EnumMap initializedClients = new EnumMap<>(ApiConfigProperties.KNOWN_API.class); - public RestClientHelper(KeycloakService keycloakService, ApiConfigProperties apiConfigProperties) { - this.keycloakService = keycloakService; - this.apiConfigProperties = apiConfigProperties; + public RestClientHelper(KeycloakService keycloakService, ApiConfigProperties apiConfigProperties) { + this.keycloakService = keycloakService; + this.apiConfigProperties = apiConfigProperties; + } + + //I cannot have a single builder and store it in a private variable because every call to .filter(...) append a new filter to the builder + //Still true for Restclient? + public RestClient.Builder getBuilder() { + return RestClient.builder() + .defaultStatusHandler(HttpStatusCode::isError, this::handleError) + .requestFactory(new ReactorNettyClientRequestFactory(HttpClient.create() + //Handles a proxy conf passed on system properties + .proxyWithSystemProperties() + //enable logging of request/responses + //configurable in properties as if it was this class logers + .wiretap(this.getClass().getCanonicalName(), LogLevel.DEBUG, AdvancedByteBufFormat.TEXTUAL))); + } + + private void handleError(HttpRequest httpRequest, ClientHttpResponse clientResponse) throws IOException { + String errorMsg = String.format("request=[%s %s] - statusCode=[%s]", + httpRequest.getMethod(),httpRequest.getURI(), clientResponse.getStatusCode()); + if (clientResponse.getStatusCode().equals(HttpStatusCode.valueOf(HttpStatus.UNAUTHORIZED.value()))) { + errorMsg = "HttpStatus.UNAUTHORIZED. WWW-Authenticate=[" + String.join("", clientResponse.getHeaders().get("WWW-Authenticate")) + "]"; } - //I cannot have a single builder and store it in a private variable because every call to .filter(...) append a new filter to the builder - //Still true for Restclient? - public RestClient.Builder getBuilder() { - return RestClient.builder() - .defaultStatusHandler(HttpStatusCode::isError, this::handleError) - .requestFactory(new ReactorNettyClientRequestFactory(HttpClient.create() - //Handles a proxy conf passed on system properties - .proxyWithSystemProperties() - //enable logging of request/responses - //configurable in properties as if it was this class logers - .wiretap(this.getClass().getCanonicalName(), LogLevel.DEBUG, AdvancedByteBufFormat.TEXTUAL))); + String finalErrorMsg = errorMsg; + String errorMessage = StreamUtils.copyToString(clientResponse.getBody(), StandardCharsets.UTF_8); + if(errorMessage.isBlank()){ + errorMessage= "No error message provided by API"; } + if (clientResponse.getStatusCode().is4xxClientError()) { + throw new HttpClient4xxBPMNError(finalErrorMsg + " - " + errorMessage, clientResponse.getStatusCode()); + } else { + throw new HttpClient5xxBPMNError(finalErrorMsg + " - " + errorMessage); + } + } - private void handleError(HttpRequest httpRequest, ClientHttpResponse clientResponse) throws IOException { - String errorMsg = String.format("request=[%s %s] - statusCode=[%s]", - httpRequest.getMethod(),httpRequest.getURI(), clientResponse.getStatusCode()); - if (clientResponse.getStatusCode().equals(HttpStatusCode.valueOf(HttpStatus.UNAUTHORIZED.value()))) { - errorMsg = "HttpStatus.UNAUTHORIZED. WWW-Authenticate=[" + String.join("", clientResponse.getHeaders().get("WWW-Authenticate")) + "]"; - } - String finalErrorMsg = errorMsg; - String errorMessage = StreamUtils.copyToString(clientResponse.getBody(), StandardCharsets.UTF_8); - if(errorMessage.isBlank()){ - errorMessage= "No error message provided by API"; - } - if (clientResponse.getStatusCode().is4xxClientError()) { - throw new HttpClient4xxBPMNError(finalErrorMsg + " - " + errorMessage, clientResponse.getStatusCode()); - } else { - throw new HttpClient5xxBPMNError(finalErrorMsg + " - " + errorMessage); - } - } + /** + * init a new RestClient proxy aware (default one ignore system proxy) + */ + public RestClient getRestClient() { + return getBuilder() + .build(); + } - /** - * init a new RestClient proxy aware (default one ignore system proxy) - */ - public RestClient getRestClient() { - return getBuilder() - .build(); + /** + * Get a RestClient preconfigured for proxy and able to get the JWT token required for authentication + * + * @param api the client will connect to this api + * @return preconfigured RestClient for the api + */ + public RestClient getRestClient(ApiConfigProperties.KNOWN_API api) { + APIProperties apiProperties = apiConfigProperties.getAPIProperties(api); + if (apiProperties == null) { + throw new ApiNotConfiguredBPMNError(String.format("API %s is not configured in properties", api)); + } else if (Boolean.FALSE.equals(apiProperties.getEnabled())) { + throw new ApiNotConfiguredBPMNError(String.format("API %s is disabled in properties", api)); } + return initializedClients.computeIfAbsent(api, + knownApi -> + getBuilder() + .baseUrl(apiProperties.getUrl()) + .requestInitializer(new RestClientKeycloakHeadersInitializer(keycloakService, apiProperties.getAuth())) + .build()); + } - /** - * Get a RestClient preconfigured for proxy and able to get the JWT token required for authentication - * - * @param api the client will connect to this api - * @return preconfigured RestClient for the api - */ - public RestClient getRestClient(ApiConfigProperties.KNOWN_API api) { + public Map getTokenDetailsByAPI(){ + Map result = new HashMap<>(); + for (var api :ApiConfigProperties.KNOWN_API.values() ) { + try { APIProperties apiProperties = apiConfigProperties.getAPIProperties(api); if (apiProperties == null) { - throw new ApiNotConfiguredBPMNError(String.format("API %s is not configured in properties", api)); + throw new ApiNotConfiguredBPMNError(String.format("API %s is not configured in properties", api)); } else if (Boolean.FALSE.equals(apiProperties.getEnabled())) { - throw new ApiNotConfiguredBPMNError(String.format("API %s is disabled in properties", api)); + throw new ApiNotConfiguredBPMNError(String.format("API %s is disabled in properties", api)); } - return initializedClients.computeIfAbsent(api, - knownApi -> - getBuilder() - .baseUrl(apiProperties.getUrl()) - .requestInitializer(new RestClientKeycloakHeadersInitializer(keycloakService, apiProperties.getAuth())) - .build()); - } - + var token = keycloakService.getToken(apiProperties.getAuth()); + if(token !=null && !token.isBlank()) { + String details = analyseToken(token); + result.put(api.name(),details); - public Map getTokenDetailsByAPI(){ - Map result = new HashMap<>(); - for (var api :ApiConfigProperties.KNOWN_API.values() ) { - try { - APIProperties apiProperties = apiConfigProperties.getAPIProperties(api); - if (apiProperties == null) { - throw new ApiNotConfiguredBPMNError(String.format("API %s is not configured in properties", api)); - } else if (Boolean.FALSE.equals(apiProperties.getEnabled())) { - throw new ApiNotConfiguredBPMNError(String.format("API %s is disabled in properties", api)); - } - var token = keycloakService.getToken(apiProperties.getAuth()); - if(token !=null && !token.isBlank()) { - String details = analyseToken(token); - result.put(api.name(),details); - - } - } catch (KeycloakTokenConfigBPMNError | ApiNotConfiguredBPMNError e) { - result.put(api.name(),e.getMessage()); - } - catch (Exception e){ - result.put(api.name(),"Internal error with token"); - } } - return result; + } catch (KeycloakTokenConfigBPMNError | ApiNotConfiguredBPMNError e) { + result.put(api.name(),e.getMessage()); + } + catch (Exception e){ + result.put(api.name(),"Internal error with token"); + } } + return result; + } - /** - * @return A json with the configuration of the APIs handled by protools - */ - public JsonNode getAPIConfigDetails(){ - ObjectMapper objectMapper = new ObjectMapper(); - ArrayNode rootNode = objectMapper.createArrayNode(); - for (var api :ApiConfigProperties.KNOWN_API.values() ) { - APIProperties apiProperties = apiConfigProperties.getAPIProperties(api); - ObjectNode apiNode = objectMapper.valueToTree(apiProperties); - apiNode.put("name",api.name()); - rootNode.add(apiNode); - } - return rootNode; + /** + * @return A json with the configuration of the APIs handled by protools + */ + public JsonNode getAPIConfigDetails(){ + ObjectMapper objectMapper = new ObjectMapper(); + ArrayNode rootNode = objectMapper.createArrayNode(); + for (var api :ApiConfigProperties.KNOWN_API.values() ) { + APIProperties apiProperties = apiConfigProperties.getAPIProperties(api); + ObjectNode apiNode = objectMapper.valueToTree(apiProperties); + apiNode.put("name",api.name()); + rootNode.add(apiNode); } + return rootNode; + } - //analyse a single token to retrieve roles - private static String analyseToken(String token) { - String result; - String[] chunks = token.split("\\."); - if(chunks.length<2){ - return "Token size is incorrect. It should contain at least one dot"; - } - Base64.Decoder decoder = Base64.getUrlDecoder(); - String payload = new String(decoder.decode(chunks[1])); - ObjectMapper objectMapper = new ObjectMapper(); - try { - JsonNode tokenPayloadNode = objectMapper.readTree(payload); - String roles = tokenPayloadNode.path("realm_access").path("roles").toString(); - if(roles==null || roles.isBlank()){ - result="No Role found in token"; - } - else{ - result= roles; - } - } catch (JsonProcessingException e) { - result=payload; - } - return result; + //analyse a single token to retrieve roles + private static String analyseToken(String token) { + String result; + String[] chunks = token.split("\\."); + if(chunks.length<2){ + return "Token size is incorrect. It should contain at least one dot"; } - - public static void logJson(String msg, Object dto, Logger logger, Level level) { - if (logger.isEnabledForLevel(level)) { - try { - String json = new ObjectMapper().writeValueAsString(dto); - String logLine = msg +" - " + json; - switch (level) { - case TRACE -> logger.trace(logLine); - case DEBUG -> logger.debug(logLine); - case INFO -> logger.info(logLine); - case WARN -> logger.warn(logLine); - case ERROR -> logger.error(logLine); - default -> logger.trace(logLine); - } - } catch (JsonProcessingException e) { - log.error("Could not parse json"); + Base64.Decoder decoder = Base64.getUrlDecoder(); + String payload = new String(decoder.decode(chunks[1])); + ObjectMapper objectMapper = new ObjectMapper(); + try { + JsonNode tokenPayloadNode = objectMapper.readTree(payload); + JsonNode roles = tokenPayloadNode.path("realm_access").path("roles"); + if(roles.isEmpty()){ + result="No Role found in token"; } + else{ + result= roles.toString(); + } + } catch (JsonProcessingException e) { + result="Exception during json token parsing"; } + return result; } - /** * special version of NestedRuntimeException.contains accepting a list of types : * Check whether the Ex exception contains an exception of the given list of types: diff --git a/src/main/java/fr/insee/protools/backend/restclient/keycloak/KeycloakResponse.java b/src/main/java/fr/insee/protools/backend/restclient/keycloak/KeycloakResponse.java index 626979f6..4563ce38 100644 --- a/src/main/java/fr/insee/protools/backend/restclient/keycloak/KeycloakResponse.java +++ b/src/main/java/fr/insee/protools/backend/restclient/keycloak/KeycloakResponse.java @@ -11,9 +11,6 @@ public class KeycloakResponse { @JsonProperty("expires_in") private Integer expiresIn; - public KeycloakResponse() { - } - public KeycloakResponse(String accesToken, Integer expiresIn) { this.accesToken = accesToken; this.expiresIn = expiresIn; diff --git a/src/main/java/fr/insee/protools/backend/restclient/keycloak/KeycloakService.java b/src/main/java/fr/insee/protools/backend/restclient/keycloak/KeycloakService.java index 08139a61..3061a160 100644 --- a/src/main/java/fr/insee/protools/backend/restclient/keycloak/KeycloakService.java +++ b/src/main/java/fr/insee/protools/backend/restclient/keycloak/KeycloakService.java @@ -1,5 +1,6 @@ package fr.insee.protools.backend.restclient.keycloak; +import fr.insee.protools.backend.configuration.testcoverage.ExcludeFromJacocoGeneratedReport; import fr.insee.protools.backend.restclient.configuration.APIProperties; import fr.insee.protools.backend.restclient.exception.KeycloakTokenConfigBPMNError; import io.netty.handler.logging.LogLevel; @@ -117,6 +118,7 @@ boolean isValidURL(String url) { } } + @ExcludeFromJacocoGeneratedReport private void logToken(Token token){ if(log.isTraceEnabled()){ var currentDt = Instant.now().toEpochMilli(); diff --git a/src/main/java/fr/insee/protools/backend/service/meshuggah/delegate/MeshuggahSendCommunicationForInterrogationListTaskREST.java b/src/main/java/fr/insee/protools/backend/service/meshuggah/delegate/MeshuggahSendCommunicationForInterrogationListTaskREST.java index 79884e19..b5160505 100644 --- a/src/main/java/fr/insee/protools/backend/service/meshuggah/delegate/MeshuggahSendCommunicationForInterrogationListTaskREST.java +++ b/src/main/java/fr/insee/protools/backend/service/meshuggah/delegate/MeshuggahSendCommunicationForInterrogationListTaskREST.java @@ -13,7 +13,8 @@ import java.util.List; -import static fr.insee.protools.backend.service.FlowableVariableNameConstants.*; +import static fr.insee.protools.backend.service.FlowableVariableNameConstants.VARNAME_CURRENT_COMMUNICATION_ID; +import static fr.insee.protools.backend.service.FlowableVariableNameConstants.VARNAME_REM_INTERRO_LIST; @Component @RequiredArgsConstructor diff --git a/src/main/java/fr/insee/protools/backend/service/platine/delegate/pilotatage/PlatinePilotageCreateCommunicationEventTaskREST.java b/src/main/java/fr/insee/protools/backend/service/platine/delegate/pilotatage/PlatinePilotageCreateCommunicationEventTaskREST.java index 83d57085..00ebe1ee 100644 --- a/src/main/java/fr/insee/protools/backend/service/platine/delegate/pilotatage/PlatinePilotageCreateCommunicationEventTaskREST.java +++ b/src/main/java/fr/insee/protools/backend/service/platine/delegate/pilotatage/PlatinePilotageCreateCommunicationEventTaskREST.java @@ -31,7 +31,6 @@ public void execute(DelegateExecution execution) { log.info("ProcessInstanceId={} currentPartitionId={} - currentCommunicationId{} - begin", execution.getProcessInstanceId(),currentPartitionId, currentCommunicationId); - List contentList = FlowableVariableUtils.getVariableOrThrow(execution, VARNAME_REM_INTERRO_LIST, List.class); Map communicationRequestIdByInterroIdMap = FlowableVariableUtils.getVariableOrThrow(execution, VARNAME_COMMUNICATION_REQUEST_ID_FOR_INTERRO_ID_MAP, Map.class); if(currentCommunicationId.isBlank()){ @@ -41,7 +40,7 @@ public void execute(DelegateExecution execution) { } //If nothing to do ==> Directly return - if(contentList.isEmpty()){ + if(communicationRequestIdByInterroIdMap.isEmpty()){ log.info("ProcessInstanceId={} currentPartitionId={} - currentCommunicationId{} - end : Nothing to do", execution.getProcessInstanceId(),currentPartitionId, currentCommunicationId); return; @@ -51,32 +50,17 @@ public void execute(DelegateExecution execution) { //TODO: put it at a single place ==> Maybe an helper to get the Id of an interro or of any json? String jsonKeyId = "id"; - List platinePilotageCommunicationEventList = contentList.stream() - .filter(jsonNode -> { - JsonNode node = jsonNode.get(jsonKeyId); - if(node==null || node.isMissingNode()|| node.asText().isBlank()){ - log.warn("ProcessInstanceId={} currentPartitionId={} : skipping an interro without id",execution.getProcessInstanceId(),currentPartitionId); - return false; - } - else if(!communicationRequestIdByInterroIdMap.containsKey(node.asText())){ - log.warn("ProcessInstanceId={} currentPartitionId={} - interroID={} : cannot retrieve communicationRequestId",execution.getProcessInstanceId(),currentPartitionId,node.asText()); - return false; - } - else{ - return true; - } - }) - .map(jsonNode -> { - String interroId = jsonNode.path(jsonKeyId).asText(); - String communicationRequestId=communicationRequestIdByInterroIdMap.get(interroId); - return PlatinePilotageCommunicationEventDto.builder() - .communcationId(currentCommunicationId) - .communicationRequestId(communicationRequestId) - .interrogationId(interroId).state(COMMUNICATION_STATE_SENT).build(); - }).toList(); + List platinePilotageCommunicationEventList = communicationRequestIdByInterroIdMap.entrySet() + .stream() + .map(entry -> + PlatinePilotageCommunicationEventDto.builder() + .communcationId(currentCommunicationId) + .communicationRequestId(entry.getValue()) + .interrogationId(entry.getKey()).state(COMMUNICATION_STATE_SENT).build()) + .toList(); //Check ctx? - platinePilotageService.postCommunicationEvent(platinePilotageCommunicationEventList); + platinePilotageService.postCommunicationEvents(platinePilotageCommunicationEventList); log.info("ProcessInstanceId={} end",execution.getProcessInstanceId()); diff --git a/src/main/java/fr/insee/protools/backend/service/platine/delegate/pilotatage/PlatinePilotageCreateContextTaskREST.java b/src/main/java/fr/insee/protools/backend/service/platine/delegate/pilotatage/PlatinePilotageCreateContextTaskREST.java index 7768e528..0847020d 100644 --- a/src/main/java/fr/insee/protools/backend/service/platine/delegate/pilotatage/PlatinePilotageCreateContextTaskREST.java +++ b/src/main/java/fr/insee/protools/backend/service/platine/delegate/pilotatage/PlatinePilotageCreateContextTaskREST.java @@ -1,7 +1,6 @@ package fr.insee.protools.backend.service.platine.delegate.pilotatage; import com.fasterxml.jackson.databind.JsonNode; -import fr.insee.protools.backend.service.DelegateContextVerifier; import fr.insee.protools.backend.service.context.ContextService; import fr.insee.protools.backend.service.platine.service.PlatinePilotageService; import lombok.RequiredArgsConstructor; @@ -15,7 +14,7 @@ @Slf4j @RequiredArgsConstructor @Component -public class PlatinePilotageCreateContextTaskREST implements JavaDelegate, DelegateContextVerifier { +public class PlatinePilotageCreateContextTaskREST implements JavaDelegate { private final ContextService protoolsContext; private final PlatinePilotageService platinePilotageService; @@ -26,7 +25,7 @@ public void execute(DelegateExecution execution) { JsonNode contextRootNode = protoolsContext.getContextJsonNodeByProcessInstance(execution.getProcessInstanceId()); String campainId = contextRootNode.path(CTX_CAMPAGNE_ID).asText(); - checkContextOrThrow(log,execution.getProcessInstanceId(), contextRootNode); + //No context used (only passed as json) platinePilotageService.postContext(campainId,contextRootNode); log.info("ProcessInstanceId={} end",execution.getProcessInstanceId()); diff --git a/src/main/java/fr/insee/protools/backend/service/platine/delegate/pilotatage/PlatinePilotageGetListOfInterroToFollowUpPaginatedTaskREST.java b/src/main/java/fr/insee/protools/backend/service/platine/delegate/pilotatage/PlatinePilotageGetListOfInterroToFollowUpPaginatedTaskREST.java index b6111eac..41ff7a9b 100644 --- a/src/main/java/fr/insee/protools/backend/service/platine/delegate/pilotatage/PlatinePilotageGetListOfInterroToFollowUpPaginatedTaskREST.java +++ b/src/main/java/fr/insee/protools/backend/service/platine/delegate/pilotatage/PlatinePilotageGetListOfInterroToFollowUpPaginatedTaskREST.java @@ -13,6 +13,7 @@ import org.slf4j.Logger; import org.springframework.stereotype.Component; +import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Optional; @@ -27,8 +28,8 @@ public class PlatinePilotageGetListOfInterroToFollowUpPaginatedTaskREST implemen private final PlatinePilotageService pilotageService; - private PageResponse readFunction(Integer pageToRead, Object... objects) { - Long partitionId = (Long) objects[0]; + protected PageResponse readFunction(Integer pageToRead, Object... objects) { + String partitionId = (String) objects[0]; return pilotageService.getInterrogationToFollowUpPaginated(partitionId, pageToRead, Optional.of(Boolean.TRUE)); } @@ -45,7 +46,8 @@ public Logger getLogger() { @Override public Map treatPage(DelegateExecution execution, List contentList) { - Map variables = Map.of(VARNAME_REM_INTERRO_LIST, contentList); + Map variables = new HashMap(); + variables.put(VARNAME_REM_INTERRO_LIST, contentList); return variables; } } \ No newline at end of file diff --git a/src/main/java/fr/insee/protools/backend/service/platine/delegate/questionnaire/PlatineQuestionnaireCreateContextTaskREST.java b/src/main/java/fr/insee/protools/backend/service/platine/delegate/questionnaire/PlatineQuestionnaireCreateContextTaskREST.java index a519db03..80fd83c8 100644 --- a/src/main/java/fr/insee/protools/backend/service/platine/delegate/questionnaire/PlatineQuestionnaireCreateContextTaskREST.java +++ b/src/main/java/fr/insee/protools/backend/service/platine/delegate/questionnaire/PlatineQuestionnaireCreateContextTaskREST.java @@ -1,7 +1,6 @@ package fr.insee.protools.backend.service.platine.delegate.questionnaire; import com.fasterxml.jackson.databind.JsonNode; -import fr.insee.protools.backend.service.DelegateContextVerifier; import fr.insee.protools.backend.service.context.ContextService; import fr.insee.protools.backend.service.platine.service.PlatineQuestionnaireService; import lombok.RequiredArgsConstructor; @@ -15,7 +14,7 @@ @Slf4j @RequiredArgsConstructor @Component -public class PlatineQuestionnaireCreateContextTaskREST implements JavaDelegate, DelegateContextVerifier { +public class PlatineQuestionnaireCreateContextTaskREST implements JavaDelegate { private final ContextService protoolsContext; private final PlatineQuestionnaireService platineQuestionnaireService; @@ -26,7 +25,7 @@ public void execute(DelegateExecution execution) { JsonNode contextRootNode = protoolsContext.getContextJsonNodeByProcessInstance(execution.getProcessInstanceId()); String campainId = contextRootNode.path(CTX_CAMPAGNE_ID).asText(); - checkContextOrThrow(log,execution.getProcessInstanceId(), contextRootNode); + //No context used (only passed as json) platineQuestionnaireService.postContext(campainId,contextRootNode); log.info("ProcessInstanceId={} end",execution.getProcessInstanceId()); diff --git a/src/main/java/fr/insee/protools/backend/service/platine/service/PlatinePilotageService.java b/src/main/java/fr/insee/protools/backend/service/platine/service/PlatinePilotageService.java index 5204086c..cdf8989f 100644 --- a/src/main/java/fr/insee/protools/backend/service/platine/service/PlatinePilotageService.java +++ b/src/main/java/fr/insee/protools/backend/service/platine/service/PlatinePilotageService.java @@ -3,6 +3,7 @@ import com.fasterxml.jackson.databind.JsonNode; import fr.insee.protools.backend.dto.platine.pilotage.PlatinePilotageCommunicationEventDto; import fr.insee.protools.backend.restclient.RestClientHelper; +import fr.insee.protools.backend.restclient.configuration.ApiConfigProperties; import fr.insee.protools.backend.restclient.exception.runtime.HttpClient4xxBPMNError; import fr.insee.protools.backend.restclient.pagination.PageResponse; import lombok.RequiredArgsConstructor; @@ -16,8 +17,9 @@ import java.util.List; import java.util.Optional; -import static fr.insee.protools.backend.restclient.RestClientHelper.logJson; +import static fr.insee.protools.backend.logging.LoggingHelper.logJson; import static fr.insee.protools.backend.restclient.configuration.ApiConfigProperties.KNOWN_API.KNOWN_API_PLATINE_PILOTAGE; +import static fr.insee.protools.backend.restclient.configuration.ApiConfigProperties.KNOWN_API.KNOWN_API_REM; @Service @Slf4j @@ -25,21 +27,22 @@ public class PlatinePilotageService { private final RestClientHelper restClientHelper; + private final ApiConfigProperties.KNOWN_API API= KNOWN_API_PLATINE_PILOTAGE; @Value("${fr.insee.protools.api.platine-pilotage.interrogation.page.size:5000}") private int pageSizeGetInterro; - public void postCommunicationEvent(List platinePilotageCommunicationEventList) { - log.trace("postCommunicationEvent: "); - logJson("postCommunicationEvent ",platinePilotageCommunicationEventList,log, Level.TRACE); + public void postCommunicationEvents(List platinePilotageCommunicationEventList) { + log.trace("postCommunicationEvents: "); + logJson("postCommunicationEvents ",platinePilotageCommunicationEventList,log, Level.TRACE); - var response = restClientHelper.getRestClient(KNOWN_API_PLATINE_PILOTAGE) + var response = restClientHelper.getRestClient(API) .post() .uri("/interrogations/communication-events") .body(platinePilotageCommunicationEventList) .retrieve() .body(String.class); - log.trace("postCommunicationEvent: response={} ",response); + log.trace("postCommunicationEvents: response={} ",response); } public void postContext(String campaignId, JsonNode contextRootNode) { @@ -56,8 +59,8 @@ public void postContext(String campaignId, JsonNode contextRootNode) { public void postInterrogations(String campaignId, List interrogations) { log.trace("postInterrogations: campaignId={}",campaignId); logJson("postInterrogations ",interrogations,log,Level.TRACE); - var response = restClientHelper.getRestClient(KNOWN_API_PLATINE_PILOTAGE) - .put() + var response = restClientHelper.getRestClient(API) + .post() .uri("/interrogations") .body(interrogations) .retrieve() @@ -66,22 +69,22 @@ public void postInterrogations(String campaignId, List interrogations) } - public PageResponse getInterrogationToFollowUpPaginated(Long partitionId, long page, Optional isToFollowUp) { + public PageResponse getInterrogationToFollowUpPaginated(String partitionId, long page, Optional isToFollowUp) { log.debug("partitionId={} - page={} - pageSizeGetInterro={} - isToFollowUp={}",partitionId,page,pageSizeGetInterro,isToFollowUp); ParameterizedTypeReference> typeReference = new ParameterizedTypeReference<>() { }; try { - PageResponse response = restClientHelper.getRestClient(KNOWN_API_PLATINE_PILOTAGE) + PageResponse response = restClientHelper.getRestClient(API) .get() .uri(uriBuilder -> uriBuilder - .path("interrogations") + .path("/interrogations") .queryParam("page", page) .queryParam("size", pageSizeGetInterro) .queryParam("partition_id", partitionId) .queryParamIfPresent("follow-up", isToFollowUp) - .build(partitionId)) + .build()) .retrieve() .body(typeReference); - log.trace("partitionId={} - page={} - pageSizeGetInterro={} - response={} ", partitionId,page,pageSizeGetInterro, response.getContent().size()); + log.trace("partitionId={} - page={} - pageSizeGetInterro={} - response={} ", partitionId,page,pageSizeGetInterro, (response==null)?0:response.getContent().size()); return response; } catch (HttpClient4xxBPMNError e){ diff --git a/src/main/java/fr/insee/protools/backend/service/platine/service/PlatineQuestionnaireService.java b/src/main/java/fr/insee/protools/backend/service/platine/service/PlatineQuestionnaireService.java index b9804eea..7aa46318 100644 --- a/src/main/java/fr/insee/protools/backend/service/platine/service/PlatineQuestionnaireService.java +++ b/src/main/java/fr/insee/protools/backend/service/platine/service/PlatineQuestionnaireService.java @@ -2,6 +2,7 @@ import com.fasterxml.jackson.databind.JsonNode; import fr.insee.protools.backend.restclient.RestClientHelper; +import fr.insee.protools.backend.restclient.configuration.ApiConfigProperties; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.slf4j.event.Level; @@ -9,7 +10,8 @@ import java.util.List; -import static fr.insee.protools.backend.restclient.RestClientHelper.logJson; +import static fr.insee.protools.backend.logging.LoggingHelper.logJson; +import static fr.insee.protools.backend.restclient.configuration.ApiConfigProperties.KNOWN_API.KNOWN_API_PLATINE_PILOTAGE; import static fr.insee.protools.backend.restclient.configuration.ApiConfigProperties.KNOWN_API.KNOWN_API_PLATINE_QUESTIONNAIRE; @Service @@ -18,10 +20,11 @@ public class PlatineQuestionnaireService { private final RestClientHelper restClientHelper; + private final ApiConfigProperties.KNOWN_API API= KNOWN_API_PLATINE_QUESTIONNAIRE; public void postContext(String campaignId, JsonNode contextRootNode) { log.trace("postContext: campaignId={}",campaignId); - var response = restClientHelper.getRestClient(KNOWN_API_PLATINE_QUESTIONNAIRE) + var response = restClientHelper.getRestClient(API) .post() .uri("/context") .body(contextRootNode) @@ -33,8 +36,8 @@ public void postContext(String campaignId, JsonNode contextRootNode) { public void postInterrogations(String campaignId, List interrogations) { log.trace("postInterrogations: campaignId={}",campaignId); logJson("putQuestionings ",interrogations,log,Level.TRACE); - var response = restClientHelper.getRestClient(KNOWN_API_PLATINE_QUESTIONNAIRE) - .put() + var response = restClientHelper.getRestClient(API) + .post() .uri("/interrogations") .body(interrogations) .retrieve() diff --git a/src/main/java/fr/insee/protools/backend/service/rem/RemService.java b/src/main/java/fr/insee/protools/backend/service/rem/RemService.java index 67ed7893..d559b592 100644 --- a/src/main/java/fr/insee/protools/backend/service/rem/RemService.java +++ b/src/main/java/fr/insee/protools/backend/service/rem/RemService.java @@ -1,10 +1,11 @@ package fr.insee.protools.backend.service.rem; import com.fasterxml.jackson.databind.JsonNode; +import fr.insee.protools.backend.dto.rem_tmp.InterrogationAccountDto; import fr.insee.protools.backend.restclient.RestClientHelper; +import fr.insee.protools.backend.restclient.configuration.ApiConfigProperties; import fr.insee.protools.backend.restclient.exception.runtime.HttpClient4xxBPMNError; import fr.insee.protools.backend.restclient.pagination.PageResponse; -import fr.insee.protools.backend.dto.rem_tmp.InterrogationAccountDto; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; @@ -23,6 +24,7 @@ @RequiredArgsConstructor public class RemService { + private final ApiConfigProperties.KNOWN_API API= KNOWN_API_REM; private final RestClientHelper restClientHelper; @Value("${fr.insee.protools.api.rem.interrogation.page.size:5000}") private int pageSizeGetInterro; @@ -31,7 +33,7 @@ public PageResponse getPartitionAllInterroPaginated(String partitionId log.debug("partitionId={} - page={} - pageSizeGetInterro={} }",partitionId,page,pageSizeGetInterro); ParameterizedTypeReference> typeReference = new ParameterizedTypeReference<>() { }; try { - PageResponse response = restClientHelper.getRestClient(KNOWN_API_REM) + PageResponse response = restClientHelper.getRestClient(API) .get() .uri(uriBuilder -> uriBuilder .path("interrogations") @@ -57,13 +59,12 @@ public PageResponse getPartitionAllInterroPaginated(String partitionId } } - //V2 public List getInterrogationIdsWithoutAccountForPartition(String partitionId) { log.debug("getSampleSuIds - partitionId={} ",partitionId); ParameterizedTypeReference> typeReference = new ParameterizedTypeReference>() {}; try { - List response = restClientHelper.getRestClient(KNOWN_API_REM) + List response = restClientHelper.getRestClient(API) .get() .uri(uriBuilder -> uriBuilder .path("/interrogations/ids") @@ -105,8 +106,8 @@ public void patchInterrogationsSetAccounts(Map userByInterroId) .build()) .toList(); - var response = restClientHelper.getRestClient(KNOWN_API_REM) - .post() + var response = restClientHelper.getRestClient(API) + .patch() .uri("/interrogations/account") .body(remDto) .retrieve() @@ -121,7 +122,7 @@ public void putContactsPlatine(List contactPlatineList) { } log.debug("putContactsPlatine - contactPlatineList.size={}", contactPlatineList); - var response = restClientHelper.getRestClient(KNOWN_API_REM) + var response = restClientHelper.getRestClient(API) .put() .uri("contacts-platine") .body(contactPlatineList) @@ -137,9 +138,9 @@ public void postRemiseEnCollecte(List interroRemiseEnCollecteList) { } log.debug("postRemiseEnCollecte - interroRemiseEnCollecteList.size={}", interroRemiseEnCollecteList); - var response = restClientHelper.getRestClient(KNOWN_API_REM) + var response = restClientHelper.getRestClient(API) .put() - .uri("remise-en-collecte") + .uri("/remise-en-collecte") .body(interroRemiseEnCollecteList) .retrieve() .body(String.class); diff --git a/src/main/java/fr/insee/protools/backend/service/utils/delegate/DefaultCallServiceInterroListTask.java b/src/main/java/fr/insee/protools/backend/service/utils/delegate/DefaultCallServiceInterroListTask.java deleted file mode 100644 index 2bb3de53..00000000 --- a/src/main/java/fr/insee/protools/backend/service/utils/delegate/DefaultCallServiceInterroListTask.java +++ /dev/null @@ -1,53 +0,0 @@ -package fr.insee.protools.backend.service.utils.delegate; - -import com.fasterxml.jackson.databind.JsonNode; -import fr.insee.protools.backend.dto.ContexteProcessus; -import fr.insee.protools.backend.dto.internal.ProtoolsInterrogationDto; -import fr.insee.protools.backend.service.DelegateContextVerifier; -import fr.insee.protools.backend.service.context.ContextService; -import fr.insee.protools.backend.service.utils.FlowableVariableUtils; -import lombok.NoArgsConstructor; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.flowable.engine.delegate.DelegateExecution; -import org.flowable.engine.delegate.JavaDelegate; -import org.springframework.stereotype.Component; - -import java.util.List; - -import static fr.insee.protools.backend.service.FlowableVariableNameConstants.VARNAME_CURRENT_PARTITION_ID; -import static fr.insee.protools.backend.service.FlowableVariableNameConstants.VARNAME_REM_INTERRO_LIST; - - -@Slf4j -@Component -@RequiredArgsConstructor -@NoArgsConstructor(force = true) -public abstract class DefaultCallServiceInterroListTask implements JavaDelegate, DelegateContextVerifier { - - private final ContextService protoolsContext; - - // Abstract method for the specific service action - protected abstract void serviceAction(ContexteProcessus context,List list,String ... params); - protected void callService(DelegateExecution execution, ContexteProcessus context, List list){ - serviceAction(context,list); - } - - @Override - public void execute(DelegateExecution execution) { - ContexteProcessus context = protoolsContext.getContextDtoByProcessInstance(execution.getProcessInstanceId()); - checkContextOrThrow(log,execution.getProcessInstanceId(), context); - - String currentPartitionId = FlowableVariableUtils.getVariableOrThrow(execution, VARNAME_CURRENT_PARTITION_ID, String.class); - List protoolsInterrogationList = FlowableVariableUtils.getVariableOrThrow(execution, VARNAME_REM_INTERRO_LIST, List.class); - - List interrogationList = protoolsInterrogationList.stream() - .map(protoolsInterrogationDto -> { - log.trace("ProcessInstanceId={} - campainId={} - currentPartitionId={} - idInterrogation={}", - execution.getProcessInstanceId(),context.getId(),currentPartitionId,protoolsInterrogationDto.getIdInterrogation()); - return protoolsInterrogationDto.getRemInterrogation(); - }) - .toList(); - callService(execution,context,interrogationList); - } -} diff --git a/src/main/java/fr/insee/protools/backend/service/utils/delegate/PaginationHelper.java b/src/main/java/fr/insee/protools/backend/service/utils/delegate/PaginationHelper.java index a0b10d67..cde842d7 100644 --- a/src/main/java/fr/insee/protools/backend/service/utils/delegate/PaginationHelper.java +++ b/src/main/java/fr/insee/protools/backend/service/utils/delegate/PaginationHelper.java @@ -58,7 +58,7 @@ default void getAndTreat(DelegateExecution execution, String varname_current_pag PageResponse pageResponse = getService.apply(expectedPage, getServiceParams); //Verify that we got the correct page with not null content - if (pageResponse.getCurrentPage() != expectedPage) { + if (!pageResponse.getCurrentPage().equals(expectedPage)) { throw new PageableAPIBPMNError(String.format("Error while reading interrogations from REM - expected page=%s got page=%s", expectedPage, pageResponse.getCurrentPage())); } else if (pageResponse.getContent() == null) { throw new PageableAPIBPMNError("Error while reading interrogations from REM - content is null"); diff --git a/src/main/resources/application-dev.properties b/src/main/resources/application-dev.properties index f118698d..6152e343 100644 --- a/src/main/resources/application-dev.properties +++ b/src/main/resources/application-dev.properties @@ -39,6 +39,7 @@ fr.insee.protools.api.platine-pilotage.auth.client-id=${fr.insee.protools.keyclo fr.insee.protools.api.platine-pilotage.auth.client-secret=${fr.insee.protools.token.provider.dmz-questionnaire-particuliers.client-secret} fr.insee.protools.api.platine-pilotage.auth.realm=questionnaire-particuliers fr.insee.protools.api.platine-pilotage.auth.url=${fr.insee.protools.keycloak-dmz-auth-url} +fr.insee.protools.api.platine-pilotage.interrogation.page.size=4 #platine questionnaire fr.insee.protools.api.platine-questionnaire.enabled=true diff --git a/src/test/resources/fr/insee/protools/backend/flowable/engine/SimpleProcessTest.testSimpleProcess.bpmn20.xml b/src/test/backup/ressources/flowable/engine/SimpleProcessTest.testSimpleProcess.bpmn20.xml similarity index 100% rename from src/test/resources/fr/insee/protools/backend/flowable/engine/SimpleProcessTest.testSimpleProcess.bpmn20.xml rename to src/test/backup/ressources/flowable/engine/SimpleProcessTest.testSimpleProcess.bpmn20.xml diff --git a/src/test/resources/fr/insee/protools/backend/integration/collecte_web_no_com.json b/src/test/backup/ressources/integration/collecte_web_no_com.json similarity index 100% rename from src/test/resources/fr/insee/protools/backend/integration/collecte_web_no_com.json rename to src/test/backup/ressources/integration/collecte_web_no_com.json diff --git a/src/test/resources/fr/insee/protools/backend/integration/noCTX_eraREM.bpmn20.xml b/src/test/backup/ressources/integration/noCTX_eraREM.bpmn20.xml similarity index 100% rename from src/test/resources/fr/insee/protools/backend/integration/noCTX_eraREM.bpmn20.xml rename to src/test/backup/ressources/integration/noCTX_eraREM.bpmn20.xml diff --git a/src/test/resources/fr/insee/protools/backend/service/context/protools-contexte-platine.json b/src/test/backup/ressources/service/context/protools-contexte-platine.json similarity index 100% rename from src/test/resources/fr/insee/protools/backend/service/context/protools-contexte-platine.json rename to src/test/backup/ressources/service/context/protools-contexte-platine.json diff --git a/src/test/resources/fr/insee/protools/backend/service/platine/delegate/expected_post_questionnaire_metadata.json b/src/test/backup/ressources/service/platine/delegate/expected_post_questionnaire_metadata.json similarity index 100% rename from src/test/resources/fr/insee/protools/backend/service/platine/delegate/expected_post_questionnaire_metadata.json rename to src/test/backup/ressources/service/platine/delegate/expected_post_questionnaire_metadata.json diff --git a/src/test/resources/fr/insee/protools/backend/service/platine/delegate/protools-contexte-platine-incorrect-no-campaign-id.json b/src/test/backup/ressources/service/platine/delegate/protools-contexte-platine-incorrect-no-campaign-id.json similarity index 100% rename from src/test/resources/fr/insee/protools/backend/service/platine/delegate/protools-contexte-platine-incorrect-no-campaign-id.json rename to src/test/backup/ressources/service/platine/delegate/protools-contexte-platine-incorrect-no-campaign-id.json diff --git a/src/test/resources/fr/insee/protools/backend/service/platine/delegate/protools-contexte-platine-incorrect.json b/src/test/backup/ressources/service/platine/delegate/protools-contexte-platine-incorrect.json similarity index 100% rename from src/test/resources/fr/insee/protools/backend/service/platine/delegate/protools-contexte-platine-incorrect.json rename to src/test/backup/ressources/service/platine/delegate/protools-contexte-platine-incorrect.json diff --git a/src/test/resources/fr/insee/protools/backend/service/platine/delegate/protools-contexte-platine-individu.json b/src/test/backup/ressources/service/platine/delegate/protools-contexte-platine-individu.json similarity index 100% rename from src/test/resources/fr/insee/protools/backend/service/platine/delegate/protools-contexte-platine-individu.json rename to src/test/backup/ressources/service/platine/delegate/protools-contexte-platine-individu.json diff --git a/src/test/resources/fr/insee/protools/backend/service/platine/delegate/protools-contexte-platine-logement.json b/src/test/backup/ressources/service/platine/delegate/protools-contexte-platine-logement.json similarity index 99% rename from src/test/resources/fr/insee/protools/backend/service/platine/delegate/protools-contexte-platine-logement.json rename to src/test/backup/ressources/service/platine/delegate/protools-contexte-platine-logement.json index c7072222..54c24fa8 100644 --- a/src/test/resources/fr/insee/protools/backend/service/platine/delegate/protools-contexte-platine-logement.json +++ b/src/test/backup/ressources/service/platine/delegate/protools-contexte-platine-logement.json @@ -1,7 +1,7 @@ { "id": "DEM2022X00", "label": "Enquête démo 2022 - séquence 1", - "contexte": "household", + "contexte": "menage", "metadonnees": { "annee": 2022, "periodicite": "X", diff --git a/src/test/resources/fr/insee/protools/backend/service/sabiane/delegate/expected_post_questionnaire_metadata.json b/src/test/backup/ressources/service/sabiane/delegate/expected_post_questionnaire_metadata.json similarity index 100% rename from src/test/resources/fr/insee/protools/backend/service/sabiane/delegate/expected_post_questionnaire_metadata.json rename to src/test/backup/ressources/service/sabiane/delegate/expected_post_questionnaire_metadata.json diff --git a/src/test/resources/fr/insee/protools/backend/service/sabiane/delegate/pilotage_expected_post_campaign.json b/src/test/backup/ressources/service/sabiane/delegate/pilotage_expected_post_campaign.json similarity index 100% rename from src/test/resources/fr/insee/protools/backend/service/sabiane/delegate/pilotage_expected_post_campaign.json rename to src/test/backup/ressources/service/sabiane/delegate/pilotage_expected_post_campaign.json diff --git a/src/test/resources/fr/insee/protools/backend/service/sabiane/delegate/protools-contexte-sabiane-incorrect.json b/src/test/backup/ressources/service/sabiane/delegate/protools-contexte-sabiane-incorrect.json similarity index 100% rename from src/test/resources/fr/insee/protools/backend/service/sabiane/delegate/protools-contexte-sabiane-incorrect.json rename to src/test/backup/ressources/service/sabiane/delegate/protools-contexte-sabiane-incorrect.json diff --git a/src/test/resources/fr/insee/protools/backend/service/sabiane/delegate/protools-contexte-sabiane.json b/src/test/backup/ressources/service/sabiane/delegate/protools-contexte-sabiane.json similarity index 100% rename from src/test/resources/fr/insee/protools/backend/service/sabiane/delegate/protools-contexte-sabiane.json rename to src/test/backup/ressources/service/sabiane/delegate/protools-contexte-sabiane.json diff --git a/src/test/resources/fr/insee/protools/backend/service/utils/data/rem-su-noMainOrSurveyed.json b/src/test/backup/ressources/service/utils/data/rem-su-noMainOrSurveyed.json similarity index 100% rename from src/test/resources/fr/insee/protools/backend/service/utils/data/rem-su-noMainOrSurveyed.json rename to src/test/backup/ressources/service/utils/data/rem-su-noMainOrSurveyed.json diff --git a/src/test/resources/fr/insee/protools/backend/service/utils/data/rem-su-test-selection.json b/src/test/backup/ressources/service/utils/data/rem-su-test-selection.json similarity index 100% rename from src/test/resources/fr/insee/protools/backend/service/utils/data/rem-su-test-selection.json rename to src/test/backup/ressources/service/utils/data/rem-su-test-selection.json diff --git a/src/test/resources/fr/insee/protools/backend/service/utils/data/rem-su_1personne.json b/src/test/backup/ressources/service/utils/data/rem-su_1personne.json similarity index 100% rename from src/test/resources/fr/insee/protools/backend/service/utils/data/rem-su_1personne.json rename to src/test/backup/ressources/service/utils/data/rem-su_1personne.json diff --git a/src/test/resources/fr/insee/protools/backend/service/utils/data/rem-su_3personnes.json b/src/test/backup/ressources/service/utils/data/rem-su_3personnes.json similarity index 100% rename from src/test/resources/fr/insee/protools/backend/service/utils/data/rem-su_3personnes.json rename to src/test/backup/ressources/service/utils/data/rem-su_3personnes.json diff --git a/src/test/java/fr/insee/protools/backend/ProtoolsTestUtils.java b/src/test/java/fr/insee/protools/backend/ProtoolsTestUtils.java index d31ac997..0e7270a5 100644 --- a/src/test/java/fr/insee/protools/backend/ProtoolsTestUtils.java +++ b/src/test/java/fr/insee/protools/backend/ProtoolsTestUtils.java @@ -1,10 +1,8 @@ package fr.insee.protools.backend; -import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.DeserializationFeature; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; -import fr.insee.protools.backend.service.context.ContextService; import okio.Buffer; import okio.Okio; import org.apache.commons.io.IOUtils; @@ -16,8 +14,6 @@ import java.io.UncheckedIOException; import static java.nio.charset.StandardCharsets.UTF_8; -import static org.mockito.ArgumentMatchers.anyString; -import static org.mockito.Mockito.when; /** * Utilitary class to load ressource files in String, POJO (using jackson) or JsonNode diff --git a/src/test/java/fr/insee/protools/backend/controller/StarterControllerTest.java b/src/test/java/fr/insee/protools/backend/controller/StarterControllerTest.java index 6367ebe2..1ab48345 100644 --- a/src/test/java/fr/insee/protools/backend/controller/StarterControllerTest.java +++ b/src/test/java/fr/insee/protools/backend/controller/StarterControllerTest.java @@ -4,7 +4,6 @@ import fr.insee.protools.backend.restclient.RestClientHelper; import fr.insee.protools.backend.restclient.configuration.APIProperties; import fr.insee.protools.backend.restclient.configuration.ApiConfigProperties; -import fr.insee.protools.backend.restclient.keycloak.KeycloakResponse; import fr.insee.protools.backend.restclient.keycloak.KeycloakService; import fr.insee.protools.backend.service.utils.CustomJWTHelper; import org.junit.jupiter.api.Test; @@ -17,13 +16,12 @@ import org.springframework.security.oauth2.jwt.JwtDecoder; import org.springframework.test.web.servlet.MockMvc; -import java.util.*; +import java.util.List; import static org.hamcrest.Matchers.containsString; -import static org.junit.Assert.assertNotNull; -import static org.mockito.AdditionalMatchers.not; import static org.mockito.ArgumentMatchers.any; -import static org.mockito.Mockito.*; +import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.eq; import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.jwt; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; diff --git a/src/test/java/fr/insee/protools/backend/restclient/KeycloakServiceTest.java b/src/test/java/fr/insee/protools/backend/restclient/KeycloakServiceTest.java new file mode 100644 index 00000000..798506df --- /dev/null +++ b/src/test/java/fr/insee/protools/backend/restclient/KeycloakServiceTest.java @@ -0,0 +1,165 @@ +package fr.insee.protools.backend.restclient; + +import com.fasterxml.jackson.databind.ObjectMapper; +import fr.insee.protools.backend.restclient.configuration.APIProperties; +import fr.insee.protools.backend.restclient.exception.KeycloakTokenConfigBPMNError; +import fr.insee.protools.backend.restclient.keycloak.KeycloakResponse; +import fr.insee.protools.backend.restclient.keycloak.KeycloakService; +import okhttp3.mockwebserver.MockResponse; +import okhttp3.mockwebserver.MockWebServer; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.InjectMocks; +import org.mockito.MockedStatic; +import org.mockito.Spy; +import org.mockito.junit.jupiter.MockitoExtension; +import org.springframework.core.env.Environment; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; + +import java.io.IOException; +import java.time.Instant; +import java.time.temporal.ChronoUnit; + +import static org.junit.Assert.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.mockito.Mockito.mockStatic; + +@ExtendWith(MockitoExtension.class) +class KeycloakServiceTest { + + @Spy + private Environment environment; + + @InjectMocks + private KeycloakService keycloakService; + + private MockWebServer mockWebServer; + private static final int port = 80; + private static String getDummyUriWithPort() { return getServerHostPort()+"/toto/test"; } + private static String getServerHostPort() { return "http://localhost:"+port; } + + @BeforeEach + public void prepare() { + this.keycloakService.initialize(); + } + + //close the mocked web server if it has been initialized + @AfterEach + void mockServerCleanup() throws IOException { + if(this.mockWebServer!=null){ + this.mockWebServer.close(); + } + } + + private void initMockWebServer() throws IOException { + this.mockWebServer = new MockWebServer(); + mockWebServer.start(port); + } + + @Test + void getToken_should_throw_when_authIncorrect(){ + //Missing realm + APIProperties.AuthProperties kcAuthNullRealm = new APIProperties.AuthProperties(getDummyUriWithPort(),null, "toto","toto"); + //Should throw an exception as the realm is missing + assertThrows(KeycloakTokenConfigBPMNError.class , () -> keycloakService.getToken(kcAuthNullRealm)); + + //Blank realm + APIProperties.AuthProperties kcAuthBlankRealm = new APIProperties.AuthProperties(getDummyUriWithPort()," ", "toto","toto"); + assertThrows(KeycloakTokenConfigBPMNError.class , () -> keycloakService.getToken(kcAuthBlankRealm)); + + //Missing url + APIProperties.AuthProperties kcAuthNullUrl = new APIProperties.AuthProperties(null,"realm", "toto","toto"); + assertThrows(KeycloakTokenConfigBPMNError.class , () -> keycloakService.getToken(kcAuthNullUrl)); + + //Blank url + APIProperties.AuthProperties kcAuthBlankUrl = new APIProperties.AuthProperties("","realm", "toto","toto"); + assertThrows(KeycloakTokenConfigBPMNError.class , () -> keycloakService.getToken(kcAuthBlankUrl)); + + //Incorrect Url + APIProperties.AuthProperties kcAuthWrongUrl = new APIProperties.AuthProperties("UrlError:::-*","realm", "toto","toto"); + assertThrows(KeycloakTokenConfigBPMNError.class , () -> keycloakService.getToken(kcAuthWrongUrl)); + + //Missing clientId + APIProperties.AuthProperties kcAuthNullClientId = new APIProperties.AuthProperties(getDummyUriWithPort(),"realm", null,"toto"); + assertThrows(KeycloakTokenConfigBPMNError.class , () -> keycloakService.getToken(kcAuthNullClientId)); + + //Blank ClientId + APIProperties.AuthProperties kcAuthBlanklClientId = new APIProperties.AuthProperties(getDummyUriWithPort(),"realm", " ","toto"); + assertThrows(KeycloakTokenConfigBPMNError.class , () -> keycloakService.getToken(kcAuthBlanklClientId)); + + + //Missing secret + APIProperties.AuthProperties kcAuthNullSecret = new APIProperties.AuthProperties(getDummyUriWithPort(),"realm", "toto",null); + assertThrows(KeycloakTokenConfigBPMNError.class , () -> keycloakService.getToken(kcAuthNullSecret)); + + //Blank secret + APIProperties.AuthProperties kcAuthBlankSecret = new APIProperties.AuthProperties(getDummyUriWithPort(),"realm", "toto",""); + assertThrows(KeycloakTokenConfigBPMNError.class , () -> keycloakService.getToken(kcAuthBlankSecret)); + } + + + @Test + @DisplayName("getToken should check if a token already exists for this AuthProperties and reuse the known token if it is not exipred") + void getToken_should_refreshTokenWhenNeeded() throws IOException, KeycloakTokenConfigBPMNError, InterruptedException { + APIProperties.AuthProperties kcAuth = new APIProperties.AuthProperties(getDummyUriWithPort(),"realm", "toto","toto"); + + //Prepare 2 KC responses + KeycloakResponse kcResponse1 = new KeycloakResponse("MYTOKEN-NB1",300 /*5 minutes*/); + MockResponse mockResponseKC1 = new MockResponse() + .addHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON) + .setResponseCode(HttpStatus.OK.value()) + .setBody(new ObjectMapper().writeValueAsString(kcResponse1)); + + KeycloakResponse kcResponse2 = new KeycloakResponse("MYTOKEN-NB2",300 /*5 minutes*/); + MockResponse mockResponseKC2 = new MockResponse() + .addHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON) + .setResponseCode(HttpStatus.OK.value()) + .setBody(new ObjectMapper().writeValueAsString(kcResponse2)); + + initMockWebServer(); + mockWebServer.enqueue(mockResponseKC1); + mockWebServer.enqueue(mockResponseKC2); + + //Test getToken + //We mock the Instant.now() method interally used by KeycloakService + Instant instant = Instant.now(); + Instant instant1 = instant.plus(1,ChronoUnit.MINUTES); + Instant instant2 = instant.plus(2,ChronoUnit.MINUTES); + Instant instant3 = instant.plus(3,ChronoUnit.MINUTES); + Instant instant4 = instant.plus(4,ChronoUnit.MINUTES); + Instant instant5 = instant.plus(5,ChronoUnit.MINUTES); + try (MockedStatic mockedStatic = mockStatic(Instant.class)) { + mockedStatic.when(Instant::now) + .thenReturn(instant); + assertEquals(kcResponse1.getAccesToken(), keycloakService.getToken(kcAuth)); + } + + //In 1-2-3-4 minute the token is not expired and we should get the same token + try (MockedStatic mockedStatic = mockStatic(Instant.class)) { + mockedStatic.when(Instant::now) + .thenReturn(instant1); + assertEquals(kcResponse1.getAccesToken(), keycloakService.getToken(kcAuth)); + mockedStatic.when(Instant::now) + .thenReturn(instant2); + assertEquals(kcResponse1.getAccesToken(), keycloakService.getToken(kcAuth)); + mockedStatic.when(Instant::now) + .thenReturn(instant3); + assertEquals(kcResponse1.getAccesToken(), keycloakService.getToken(kcAuth)); + mockedStatic.when(Instant::now) + .thenReturn(instant4); + assertEquals(kcResponse1.getAccesToken(), keycloakService.getToken(kcAuth)); + } + + //In 5 minutes the token is expired, we should get a refreshed one + try (MockedStatic mockedStatic = mockStatic(Instant.class)) { + mockedStatic.when(Instant::now) + .thenReturn(instant5); + assertEquals(kcResponse2.getAccesToken(), keycloakService.getToken(kcAuth)); + } + } +} diff --git a/src/test/java/fr/insee/protools/backend/restclient/RestClientHelperTest.java b/src/test/java/fr/insee/protools/backend/restclient/RestClientHelperTest.java index 7fc24027..d143b668 100644 --- a/src/test/java/fr/insee/protools/backend/restclient/RestClientHelperTest.java +++ b/src/test/java/fr/insee/protools/backend/restclient/RestClientHelperTest.java @@ -4,7 +4,6 @@ import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.node.ArrayNode; import com.fasterxml.jackson.databind.node.JsonNodeType; -import fr.insee.protools.backend.ProtoolsTestUtils; import fr.insee.protools.backend.restclient.configuration.APIProperties; import fr.insee.protools.backend.restclient.configuration.ApiConfigProperties; import fr.insee.protools.backend.restclient.exception.ApiNotConfiguredBPMNError; @@ -23,32 +22,24 @@ import org.mockito.Mock; import org.mockito.Spy; import org.mockito.junit.jupiter.MockitoExtension; -import org.springframework.boot.test.mock.mockito.SpyBean; import org.springframework.core.env.Environment; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import org.springframework.web.client.RestClient; -import java.io.File; import java.io.IOException; -import java.io.RandomAccessFile; +import java.nio.charset.StandardCharsets; +import java.util.Base64; import java.util.List; import java.util.Map; +import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.AssertionsForClassTypes.assertThatThrownBy; -import static org.hamcrest.Matchers.containsString; import static org.junit.jupiter.api.Assertions.*; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.eq; - -import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.Mockito.*; -import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.jwt; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; -import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; @ExtendWith(MockitoExtension.class) @@ -90,24 +81,6 @@ private void initMockWebServer() throws IOException { mockWebServer.start(port); } - - private File createDummyFile(int sizeInByte, String extension) throws IOException { - File file = File.createTempFile("tempFile", ".json"); - file.deleteOnExit(); - RandomAccessFile rafile; - rafile = new RandomAccessFile(file, "rw"); - //In Bytes ==> 1024 = 1Ko ==> 1024X1024 : 1Mo - rafile.setLength(sizeInByte); - return file; - } - - private MockResponse fileToResponse(String contentType, File file) throws IOException { - return new MockResponse() - .setResponseCode(HttpStatus.OK.value()) - .setBody(ProtoolsTestUtils.fileToBytes(file)) - .addHeader("content-type: " + contentType); - } - @Test @DisplayName("Test getRestClient method without specifying an API") void testgetRestClientWithoutApi() { @@ -144,7 +117,7 @@ void getRestClientWithIncompleteKCConfig() throws IOException { } @Test - void getRestClient() throws IOException { + void getRestClient_should_work_when_OK() throws IOException { APIProperties.AuthProperties kcAuth = new APIProperties.AuthProperties(); kcAuth.setClientId("clientId-toto"); @@ -157,9 +130,7 @@ void getRestClient() throws IOException { RestClient client = restClientHelper.getRestClient(ApiConfigProperties.KNOWN_API.KNOWN_API_ERA); assertThat(client).isNotNull(); - KeycloakResponse kcResponse = new KeycloakResponse(); - kcResponse.setAccesToken("MYTOKEN"); - kcResponse.setExpiresIn(5*60*1000); + KeycloakResponse kcResponse = new KeycloakResponse("MYTOKEN",5*60*1000); MockResponse mockResponseKC = new MockResponse() .addHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON) .setResponseCode(HttpStatus.OK.value()) @@ -175,111 +146,102 @@ void getRestClient() throws IOException { assertThat(client.get().uri(getDummyUriWithPort()).retrieve().toBodilessEntity().getStatusCode()).isEqualTo(HttpStatus.NO_CONTENT); } -/* - @Test - @DisplayName("Test getRestClientForFile method - get the client and download files of different sizes") - void getRestClientForFile() throws IOException { - RestClient client = restClientHelper.getRestClient(); - assertThat(client).isNotNull(); - - //Create a 1Mo File - File file1mo = createDummyFile(1024 * 1024 * 1,".json"); - File file19mo = createDummyFile(RestClientHelper.getDefaultFileBufferSize()-1024,".json"); - int tooBigSize=RestClientHelper.getDefaultFileBufferSize()+1024; - File fileTooBig = createDummyFile(tooBigSize,".json"); - MockResponse fileToResponse_1Mo = fileToResponse(MediaType.APPLICATION_JSON_VALUE, file1mo); - MockResponse fileToResponse_19Mo = fileToResponse(MediaType.APPLICATION_JSON_VALUE, file19mo); - MockResponse fileToResponseTooBig = fileToResponse(MediaType.APPLICATION_JSON_VALUE, fileTooBig); + @Test + void getRestClient_withInvalidApiConfig() { + when(apiConfigProperties.getAPIProperties(any())).thenReturn(null); + assertThatThrownBy(() -> restClientHelper.getRestClient(any())) + .isInstanceOf(ApiNotConfiguredBPMNError.class) + .hasMessageContaining("is not configured in properties"); + } + @Test + void getRestClient_withDisabledApiConfig() { + when(apiConfigProperties.getAPIProperties(any())).thenReturn(new APIProperties("http://localhost:8080", new APIProperties.AuthProperties(), false )); + assertThatThrownBy(() -> restClientHelper.getRestClient(any())) + .isInstanceOf(ApiNotConfiguredBPMNError.class) + .hasMessageContaining("is disabled in properties"); + } + @Test + void getTokenDetailsByAPI_should_workForOkNullAndNotConfiguredApi() throws Exception { + //Prepare : + // Platine pilotage is disabled + // Meshuggah is null + // All other are confired and returns the same token + APIProperties.AuthProperties kcAuth = new APIProperties.AuthProperties("https://test.test","realm", "client","xxx"); + APIProperties apiPropertiesAll = new APIProperties("url-all",kcAuth ,true); + APIProperties apiPropertiesPlatinePil = new APIProperties("url-platine",kcAuth ,false); + doReturn(apiPropertiesAll).when(apiConfigProperties).getAPIProperties(any()); + doReturn(apiPropertiesPlatinePil).when(apiConfigProperties).getAPIProperties(eq(ApiConfigProperties.KNOWN_API.KNOWN_API_PLATINE_PILOTAGE)); + doReturn(null).when(apiConfigProperties).getAPIProperties(eq(ApiConfigProperties.KNOWN_API.KNOWN_API_MESHUGGAH)); - KeycloakResponse kcResponse = new KeycloakResponse(); - kcResponse.setAccesToken("MYTOKEN"); - kcResponse.setExpiresIn(5*60*1000); + doReturn(CustomJWTHelper.getEncodedToken(List.of("ROLE_TOTO","ROLE_Administrateurs_BEATLES"))).when(keycloakService).getToken(eq(kcAuth)); - MockResponse mockResponseKC = new MockResponse() - .addHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON) - .setResponseCode(HttpStatus.OK.value()) - .setBody(new ObjectMapper().writeValueAsString(kcResponse)); + Map details = restClientHelper.getTokenDetailsByAPI(); - final Dispatcher dispatcher = new Dispatcher() { - public MockResponse dispatch(RecordedRequest request) { - switch (request.getPath()) { - case "/users/1": - return new MockResponse().setResponseCode(200); - case "/users/2": - return new MockResponse().setResponseCode(500); - case "/users/3": - return new MockResponse().setResponseCode(200).setBody("{\"id\": 1, \"name\":\"duke\"}"); - } - return new MockResponse().setResponseCode(404); - } + assertThat(details).containsEntry("KNOWN_API_PLATINE_PILOTAGE","API KNOWN_API_PLATINE_PILOTAGE is disabled in properties"); + assertThat(details).containsEntry("KNOWN_API_MESHUGGAH","API KNOWN_API_MESHUGGAH is not configured in properties"); + assertThat(details).containsEntry("KNOWN_API_REM","[\"ROLE_TOTO\",\"ROLE_Administrateurs_BEATLES\"]"); - mockWebServer.enqueue(mockResponseKC); + } + @Test + void getTokenDetailsByAPI_should_workWhenNoRoleInToken() throws Exception { + //Prepare : + // Platine pilotage is disabled + // Meshuggah is null + // All other are confired and returns the same token + APIProperties.AuthProperties kcAuth = new APIProperties.AuthProperties("https://test.test","realm", "client","xxx"); + APIProperties apiPropertiesAll = new APIProperties("url-all",kcAuth ,true); + APIProperties apiPropertiesPlatinePil = new APIProperties("url-platine",kcAuth ,false); + doReturn(apiPropertiesAll).when(apiConfigProperties).getAPIProperties(any()); + doReturn(apiPropertiesPlatinePil).when(apiConfigProperties).getAPIProperties(eq(ApiConfigProperties.KNOWN_API.KNOWN_API_PLATINE_PILOTAGE)); + doReturn(null).when(apiConfigProperties).getAPIProperties(eq(ApiConfigProperties.KNOWN_API.KNOWN_API_MESHUGGAH)); - initMockWebServer(); - mockWebServer.enqueue(fileToResponse_1Mo); - mockWebServer.enqueue(fileToResponse_19Mo); - mockWebServer.enqueue(fileToResponseTooBig); - mockWebServer.enqueue(fileToResponseTooBig); + doReturn(CustomJWTHelper.getEncodedToken(List.of())).when(keycloakService).getToken(eq(kcAuth)); - //Check for 1Mo file - assertDoesNotThrow(()-> restClientHelper.getRestClientForFile() - .get() - .uri(getDummyUriWithPort()) - .retrieve() - .bodyToMono(String.class) - .block()); - //Check for 19Mo file - assertDoesNotThrow(()-> restClientHelper.getRestClientForFile() - .get() - .uri(getDummyUriWithPort()) - .retrieve() - .bodyToMono(String.class) - .block()); + Map details = restClientHelper.getTokenDetailsByAPI(); - //Check for a too big file : Should throw and exception as default buffer is 20Mo - assertThrows(clientResponseException.class, () -> restClientHelper.getRestClientForFile() - .get() - .uri(getDummyUriWithPort()) - .retrieve() - .bodyToMono(String.class) - .block()); + assertThat(details).containsEntry("KNOWN_API_PLATINE_PILOTAGE","API KNOWN_API_PLATINE_PILOTAGE is disabled in properties"); + assertThat(details).containsEntry("KNOWN_API_MESHUGGAH","API KNOWN_API_MESHUGGAH is not configured in properties"); + assertThat(details).containsEntry("KNOWN_API_REM","No Role found in token"); - //Check for a too big file with a custom buffer ==> Should be ok - assertDoesNotThrow(() -> restClientHelper.getRestClientForFile(tooBigSize) - .get() - .uri(getDummyUriWithPort()) - .retrieve() - .bodyToMono(String.class) - .block()); } - };*/ - @Test - void getRestClient_withInvalidApiConfig() { - when(apiConfigProperties.getAPIProperties(any())).thenReturn(null); - assertThatThrownBy(() -> restClientHelper.getRestClient(any())) - .isInstanceOf(ApiNotConfiguredBPMNError.class) - .hasMessageContaining("is not configured in properties"); - } @Test - void getRestClient_withDisabledApiConfig() { - when(apiConfigProperties.getAPIProperties(any())).thenReturn(new APIProperties("http://localhost:8080", new APIProperties.AuthProperties(), false )); - assertThatThrownBy(() -> restClientHelper.getRestClient(any())) - .isInstanceOf(ApiNotConfiguredBPMNError.class) - .hasMessageContaining("is disabled in properties"); + void getTokenDetailsByAPI_should_workWhenNoDot() throws Exception { + //Prepare : + // Platine pilotage is disabled + // Meshuggah is null + // All other are confired and returns the same token + APIProperties.AuthProperties kcAuth = new APIProperties.AuthProperties("https://test.test","realm", "client","xxx"); + APIProperties apiPropertiesAll = new APIProperties("url-all",kcAuth ,true); + APIProperties apiPropertiesPlatinePil = new APIProperties("url-platine",kcAuth ,false); + + doReturn(apiPropertiesAll).when(apiConfigProperties).getAPIProperties(any()); + doReturn(apiPropertiesPlatinePil).when(apiConfigProperties).getAPIProperties(eq(ApiConfigProperties.KNOWN_API.KNOWN_API_PLATINE_PILOTAGE)); + doReturn(null).when(apiConfigProperties).getAPIProperties(eq(ApiConfigProperties.KNOWN_API.KNOWN_API_MESHUGGAH)); + + doReturn("{THIS TOKEN IS INCORRECT AND THERE IS NO DOT SEPARING HEADER}}}}").when(keycloakService).getToken(eq(kcAuth)); + + + Map details = restClientHelper.getTokenDetailsByAPI(); + + assertThat(details).containsEntry("KNOWN_API_PLATINE_PILOTAGE","API KNOWN_API_PLATINE_PILOTAGE is disabled in properties"); + assertThat(details).containsEntry("KNOWN_API_MESHUGGAH","API KNOWN_API_MESHUGGAH is not configured in properties"); + assertThat(details).containsEntry("KNOWN_API_REM","Token size is incorrect. It should contain at least one dot"); + } + @Test - void getTokenDetailsByAPI_should_workForOkNullAndNotConfiguredApi() throws Exception { + void getTokenDetailsByAPI_should_workWhenIncorrectJsonContent() throws Exception { //Prepare : // Platine pilotage is disabled // Meshuggah is null @@ -292,18 +254,24 @@ void getTokenDetailsByAPI_should_workForOkNullAndNotConfiguredApi() throws Excep doReturn(apiPropertiesPlatinePil).when(apiConfigProperties).getAPIProperties(eq(ApiConfigProperties.KNOWN_API.KNOWN_API_PLATINE_PILOTAGE)); doReturn(null).when(apiConfigProperties).getAPIProperties(eq(ApiConfigProperties.KNOWN_API.KNOWN_API_MESHUGGAH)); - doReturn(CustomJWTHelper.getEncodedToken(List.of("ROLE_TOTO","ROLE_Administrateurs_BEATLES"))).when(keycloakService).getToken(eq(kcAuth)); + String header= Base64.getEncoder().encodeToString("random header".getBytes(StandardCharsets.UTF_8)); + String incorrectPayload= Base64.getEncoder().encodeToString("incorrect json".getBytes(StandardCharsets.UTF_8)); + String signature=CustomJWTHelper.createSignature(header, incorrectPayload); + String signedToken = header + "." + incorrectPayload + "." + signature; + + doReturn(signedToken).when(keycloakService).getToken(eq(kcAuth)); Map details = restClientHelper.getTokenDetailsByAPI(); assertThat(details).containsEntry("KNOWN_API_PLATINE_PILOTAGE","API KNOWN_API_PLATINE_PILOTAGE is disabled in properties"); assertThat(details).containsEntry("KNOWN_API_MESHUGGAH","API KNOWN_API_MESHUGGAH is not configured in properties"); - assertThat(details).containsEntry("KNOWN_API_REM","[\"ROLE_TOTO\",\"ROLE_Administrateurs_BEATLES\"]"); + assertThat(details).containsEntry("KNOWN_API_REM","Exception during json token parsing"); } + @Test void getAPIConfigDetails_shouldNotThrow() { APIProperties.AuthProperties kcAuth = new APIProperties.AuthProperties("https://test.test","realm", "client","xxx"); @@ -383,4 +351,111 @@ void containsCauseOfType_shouldFindCauseIfExists() { assertFalse(found,"IOException should not be found"); } + /* + + + private MockResponse fileToResponse(String contentType, File file) throws IOException { + return new MockResponse() + .setResponseCode(HttpStatus.OK.value()) + .setBody(ProtoolsTestUtils.fileToBytes(file)) + .addHeader("content-type: " + contentType); + } + + private File createDummyFile(int sizeInByte, String extension) throws IOException { + File file = File.createTempFile("tempFile", ".json"); + file.deleteOnExit(); + RandomAccessFile rafile; + rafile = new RandomAccessFile(file, "rw"); + //In Bytes ==> 1024 = 1Ko ==> 1024X1024 : 1Mo + rafile.setLength(sizeInByte); + return file; + } + + @Test + @DisplayName("Test getRestClientForFile method - get the client and download files of different sizes") + void getRestClientForFile() throws IOException { + RestClient client = restClientHelper.getRestClient(); + assertThat(client).isNotNull(); + + //Create a 1Mo File + File file1mo = createDummyFile(1024 * 1024 * 1,".json"); + File file19mo = createDummyFile(RestClientHelper.getDefaultFileBufferSize()-1024,".json"); + int tooBigSize=RestClientHelper.getDefaultFileBufferSize()+1024; + File fileTooBig = createDummyFile(tooBigSize,".json"); + + MockResponse fileToResponse_1Mo = fileToResponse(MediaType.APPLICATION_JSON_VALUE, file1mo); + MockResponse fileToResponse_19Mo = fileToResponse(MediaType.APPLICATION_JSON_VALUE, file19mo); + MockResponse fileToResponseTooBig = fileToResponse(MediaType.APPLICATION_JSON_VALUE, fileTooBig); + + + + + KeycloakResponse kcResponse = new KeycloakResponse(); + kcResponse.setAccesToken("MYTOKEN"); + kcResponse.setExpiresIn(5*60*1000); + + + MockResponse mockResponseKC = new MockResponse() + .addHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON) + .setResponseCode(HttpStatus.OK.value()) + .setBody(new ObjectMapper().writeValueAsString(kcResponse)); + + final Dispatcher dispatcher = new Dispatcher() { + public MockResponse dispatch(RecordedRequest request) { + switch (request.getPath()) { + case "/users/1": + return new MockResponse().setResponseCode(200); + case "/users/2": + return new MockResponse().setResponseCode(500); + case "/users/3": + return new MockResponse().setResponseCode(200).setBody("{\"id\": 1, \"name\":\"duke\"}"); + } + return new MockResponse().setResponseCode(404); + } + + mockWebServer.enqueue(mockResponseKC); + + + + initMockWebServer(); + mockWebServer.enqueue(fileToResponse_1Mo); + mockWebServer.enqueue(fileToResponse_19Mo); + mockWebServer.enqueue(fileToResponseTooBig); + mockWebServer.enqueue(fileToResponseTooBig); + + //Check for 1Mo file + assertDoesNotThrow(()-> restClientHelper.getRestClientForFile() + .get() + .uri(getDummyUriWithPort()) + .retrieve() + .bodyToMono(String.class) + .block()); + + //Check for 19Mo file + assertDoesNotThrow(()-> restClientHelper.getRestClientForFile() + .get() + .uri(getDummyUriWithPort()) + .retrieve() + .bodyToMono(String.class) + .block()); + + //Check for a too big file : Should throw and exception as default buffer is 20Mo + assertThrows(clientResponseException.class, () -> restClientHelper.getRestClientForFile() + .get() + .uri(getDummyUriWithPort()) + .retrieve() + .bodyToMono(String.class) + .block()); + + //Check for a too big file with a custom buffer ==> Should be ok + assertDoesNotThrow(() -> restClientHelper.getRestClientForFile(tooBigSize) + .get() + .uri(getDummyUriWithPort()) + .retrieve() + .bodyToMono(String.class) + .block()); + } + + };*/ + } \ No newline at end of file diff --git a/src/test/java/fr/insee/protools/backend/service/platine/delegate/pilotatage/PlatinePilotageCreateCommunicationEventTaskRESTTestDelegate.java b/src/test/java/fr/insee/protools/backend/service/platine/delegate/pilotatage/PlatinePilotageCreateCommunicationEventTaskRESTTestDelegate.java new file mode 100644 index 00000000..5f30cd91 --- /dev/null +++ b/src/test/java/fr/insee/protools/backend/service/platine/delegate/pilotatage/PlatinePilotageCreateCommunicationEventTaskRESTTestDelegate.java @@ -0,0 +1,157 @@ +package fr.insee.protools.backend.service.platine.delegate.pilotatage; + +import com.fasterxml.jackson.databind.ObjectMapper; +import fr.insee.protools.backend.dto.platine.pilotage.PlatinePilotageCommunicationEventDto; +import fr.insee.protools.backend.exception.ProtoolsProcessFlowBPMNError; +import fr.insee.protools.backend.service.platine.service.PlatinePilotageService; +import fr.insee.protools.backend.service.utils.delegate.IDelegateWithVariables; +import fr.insee.protools.backend.utils.data.InterroExamples; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.JavaDelegate; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; +import org.mockito.ArgumentCaptor; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; + +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.stream.Stream; + +import static fr.insee.protools.backend.service.FlowableVariableNameConstants.*; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.mockito.Mockito.*; + +@ExtendWith(MockitoExtension.class) +@Slf4j +public class PlatinePilotageCreateCommunicationEventTaskRESTTestDelegate implements IDelegateWithVariables { + + @Mock + PlatinePilotageService platinePilotageService; + + @InjectMocks + PlatinePilotageCreateCommunicationEventTaskREST task; + + + @Override + public JavaDelegate getTaskUnderTest() { + return task; + } + + @Override + public Map getVariablesAndTypes() { + return Map.of( + VARNAME_CURRENT_COMMUNICATION_ID, String.class, + VARNAME_CURRENT_PARTITION_ID, String.class, + VARNAME_COMMUNICATION_REQUEST_ID_FOR_INTERRO_ID_MAP, Map.class + ); + } + + static Stream initExecuteParametersWarn() { + return Stream.of( + Arguments.of(List.of(InterroExamples.generateEmptyInterro().interro()), Map.of(), "differentComId")//The interro is unknown + ); + /* + Logger fooLogger = (Logger) LoggerFactory.getLogger(PlatinePilotageCreateCommunicationEventTaskREST.class); + // create and start a ListAppender + ListAppender listAppender = new ListAppender<>(); + listAppender.start(); + // call method under test + Foo foo = new Foo(); + foo.doThat(); + + // JUnit assertions + List logsList = listAppender.list; + assertEquals("start", logsList.get(0) + .getMessage()); + assertEquals(Level.INFO, logsList.get(0) + .getLevel()); + + assertEquals("finish", logsList.get(1) + .getMessage()); + assertEquals(Level.INFO, logsList.get(1) + .getLevel()); + */ + } + + static Stream initExecuteParametersOK() { + return Stream.of( + Arguments.of(Map.of(), "comId", Boolean.FALSE), + Arguments.of(Map.of("interroId1", "commReqId1"), "xxx", Boolean.TRUE), + Arguments.of(Map.of("interroId1", "commReqId1", "interroId2", "commReqId2", "interroId3", "commReqId3"), "xxx", Boolean.TRUE) + ); + } + + @ParameterizedTest + @MethodSource("initExecuteParametersOK") + @DisplayName("Test execute method - should work and make correct call to service") + void execute_should_work_whenEverythingOk(Map commIdByInterro, String communcationId, Boolean expectedCallToService) { + //Prepare + DelegateExecution execution = createMockedExecution(); + doReturn(communcationId).when(execution).getVariable(VARNAME_CURRENT_COMMUNICATION_ID, String.class); + doReturn(dumyId).when(execution).getVariable(VARNAME_CURRENT_PARTITION_ID, String.class); + doReturn(commIdByInterro).when(execution).getVariable(VARNAME_COMMUNICATION_REQUEST_ID_FOR_INTERRO_ID_MAP, Map.class); + + //Execute method under test + task.execute(execution); + + //verify + + //Case where the service is not supposed to be called + if (!expectedCallToService) { + verify(platinePilotageService, never()).postCommunicationEvents(any()); + return; + } + + + final ArgumentCaptor> listCaptor + = ArgumentCaptor.forClass((Class) List.class); + + verify(platinePilotageService, times(1)).postCommunicationEvents(listCaptor.capture()); + List> allValues = listCaptor.getAllValues(); + assertEquals(1, allValues.size(), "We should have exactly one value"); + + List actualArgument = listCaptor.getValue(); + assertEquals(commIdByInterro.size(), actualArgument.size(), "The passed list of events has an incorrect size"); + + //check that we passed the correct items + Set requiredInterroIds = new HashSet<>(commIdByInterro.keySet()); + for (var comEventDto : actualArgument) { + String idInterro = comEventDto.getInterrogationId(); + if (requiredInterroIds.contains(idInterro)) { + //ComRequestId is correct + String expectedCommId = commIdByInterro.get(idInterro); + String actualCommId = comEventDto.getCommunicationRequestId(); + assertEquals(expectedCommId, actualCommId, + "Communcation Request ID is not the one expected for idInterro=" + idInterro + " - "); + + assertEquals(communcationId,comEventDto.getCommuncationId()); + //CommId is + requiredInterroIds.remove(idInterro); //this id has correctly been sent + } + } + } + + @Test + @DisplayName("Test execute method - should throw ProtoolsProcessFlowBPMNError when communication Id is null") + public void execute_should_throw_when_varCommId_is_blank() { + String commId=""; + //Prepare + DelegateExecution execution = createMockedExecution(); + doReturn(commId).when(execution).getVariable(VARNAME_CURRENT_COMMUNICATION_ID, String.class); + doReturn(dumyId).when(execution).getVariable(VARNAME_CURRENT_PARTITION_ID, String.class); + doReturn(Map.of("interroId1", "commReqId1")).when(execution).getVariable(VARNAME_COMMUNICATION_REQUEST_ID_FOR_INTERRO_ID_MAP, Map.class); + + //Execute method under test + assertThrows(ProtoolsProcessFlowBPMNError.class, () -> task.execute(execution)); + } +} \ No newline at end of file diff --git a/src/test/java/fr/insee/protools/backend/service/platine/delegate/pilotatage/PlatinePilotageCreateContextTaskRESTTest.java b/src/test/java/fr/insee/protools/backend/service/platine/delegate/pilotatage/PlatinePilotageCreateContextTaskRESTTestDelegate.java similarity index 87% rename from src/test/java/fr/insee/protools/backend/service/platine/delegate/pilotatage/PlatinePilotageCreateContextTaskRESTTest.java rename to src/test/java/fr/insee/protools/backend/service/platine/delegate/pilotatage/PlatinePilotageCreateContextTaskRESTTestDelegate.java index a20b12ee..94d91aca 100644 --- a/src/test/java/fr/insee/protools/backend/service/platine/delegate/pilotatage/PlatinePilotageCreateContextTaskRESTTest.java +++ b/src/test/java/fr/insee/protools/backend/service/platine/delegate/pilotatage/PlatinePilotageCreateContextTaskRESTTestDelegate.java @@ -2,7 +2,7 @@ import com.fasterxml.jackson.databind.JsonNode; import fr.insee.protools.backend.service.platine.service.PlatinePilotageService; -import fr.insee.protools.backend.service.utils.TestWithContext; +import fr.insee.protools.backend.service.utils.delegate.TestDelegateWithContext; import org.flowable.engine.delegate.DelegateExecution; import org.flowable.engine.delegate.JavaDelegate; import org.flowable.engine.test.FlowableTest; @@ -11,7 +11,6 @@ import org.mockito.ArgumentCaptor; import org.mockito.InjectMocks; import org.mockito.Mock; -import org.mockito.Spy; import org.mockito.junit.jupiter.MockitoExtension; import java.util.List; @@ -26,7 +25,7 @@ @ExtendWith(MockitoExtension.class) @FlowableTest -class PlatinePilotageCreateContextTaskRESTTest extends TestWithContext { +class PlatinePilotageCreateContextTaskRESTTestDelegate extends TestDelegateWithContext { @Mock PlatinePilotageService platinePilotageService; @@ -53,12 +52,12 @@ void execute_should_work_when_contextOK() { } @Override - protected JavaDelegate getTaskUnderTest() { + public JavaDelegate getTaskUnderTest() { return platinePilotageTask; } @Override - protected Map getVariablesAndTypes() { + public Map getVariablesAndTypes() { return Map.of(); } } \ No newline at end of file diff --git a/src/test/java/fr/insee/protools/backend/service/platine/delegate/pilotatage/PlatinePilotageCreateInterrogationListTaskRESTTest.java b/src/test/java/fr/insee/protools/backend/service/platine/delegate/pilotatage/PlatinePilotageCreateInterrogationListTaskRESTTestDelegate.java similarity index 85% rename from src/test/java/fr/insee/protools/backend/service/platine/delegate/pilotatage/PlatinePilotageCreateInterrogationListTaskRESTTest.java rename to src/test/java/fr/insee/protools/backend/service/platine/delegate/pilotatage/PlatinePilotageCreateInterrogationListTaskRESTTestDelegate.java index 17ac9d11..90783c64 100644 --- a/src/test/java/fr/insee/protools/backend/service/platine/delegate/pilotatage/PlatinePilotageCreateInterrogationListTaskRESTTest.java +++ b/src/test/java/fr/insee/protools/backend/service/platine/delegate/pilotatage/PlatinePilotageCreateInterrogationListTaskRESTTestDelegate.java @@ -1,14 +1,10 @@ package fr.insee.protools.backend.service.platine.delegate.pilotatage; import com.fasterxml.jackson.databind.JsonNode; -import fr.insee.protools.backend.dto.ContexteProcessus; import fr.insee.protools.backend.service.platine.service.PlatinePilotageService; -import fr.insee.protools.backend.service.utils.FlowableVariableUtils; -import fr.insee.protools.backend.service.utils.TestWithContext; -import fr.insee.protools.backend.utils.data.InterroExamples; +import fr.insee.protools.backend.service.utils.delegate.TestDelegateWithContext; import org.flowable.engine.delegate.DelegateExecution; import org.flowable.engine.delegate.JavaDelegate; -import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.mockito.ArgumentCaptor; import org.mockito.InjectMocks; @@ -29,7 +25,7 @@ import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.*; -class PlatinePilotageCreateInterrogationListTaskRESTTest extends TestWithContext { +class PlatinePilotageCreateInterrogationListTaskRESTTestDelegate extends TestDelegateWithContext { @Mock PlatinePilotageService platinePilotageService; @@ -65,12 +61,12 @@ void execute_should_work_when_contextOKVarOK() { } @Override - protected JavaDelegate getTaskUnderTest() { + public JavaDelegate getTaskUnderTest() { return task; } @Override - protected Map getVariablesAndTypes() { + public Map getVariablesAndTypes() { return Map.of( VARNAME_CURRENT_PARTITION_ID,String.class, VARNAME_REM_INTERRO_LIST,List.class); diff --git a/src/test/java/fr/insee/protools/backend/service/platine/delegate/pilotatage/PlatinePilotageGetListOfInterroToFollowUpPaginatedTaskRESTTest.java b/src/test/java/fr/insee/protools/backend/service/platine/delegate/pilotatage/PlatinePilotageGetListOfInterroToFollowUpPaginatedTaskRESTTest.java new file mode 100644 index 00000000..435633a6 --- /dev/null +++ b/src/test/java/fr/insee/protools/backend/service/platine/delegate/pilotatage/PlatinePilotageGetListOfInterroToFollowUpPaginatedTaskRESTTest.java @@ -0,0 +1,74 @@ +package fr.insee.protools.backend.service.platine.delegate.pilotatage; + +import com.fasterxml.jackson.databind.ObjectMapper; +import fr.insee.protools.backend.restclient.pagination.PageResponse; +import fr.insee.protools.backend.service.platine.service.PlatinePilotageService; +import fr.insee.protools.backend.service.utils.delegate.IDelegateWithVariableGetPaginated; +import fr.insee.protools.backend.service.utils.delegate.PaginationHelper; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.JavaDelegate; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.ArgumentCaptor; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; + +import java.util.List; +import java.util.Map; +import java.util.Optional; + +import static fr.insee.protools.backend.service.FlowableVariableNameConstants.*; +import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.mockito.Mockito.*; + +@ExtendWith(MockitoExtension.class) +class PlatinePilotageGetListOfInterroToFollowUpPaginatedTaskRESTTest + implements IDelegateWithVariableGetPaginated { + + + @Mock + PlatinePilotageService platinePilotageService; + @InjectMocks + PlatinePilotageGetListOfInterroToFollowUpPaginatedTaskREST task; + + @Override + public JavaDelegate getTaskUnderTest() { + return task; + } + + @Override + public void initReadValueMock(PageResponse expectedPageResponse) { + lenient().doReturn(expectedPageResponse).when(platinePilotageService).getInterrogationToFollowUpPaginated(anyString(), anyLong(),any()); + } + + @Override + public void initExtraMocks(DelegateExecution execution){ + lenient().doReturn(PageResponse.builder().currentPage(0).content(List.of()).pageSize(10).build()).when(platinePilotageService).getInterrogationToFollowUpPaginated(anyString(), anyLong(),any()); + } + + @Override + public Map getVariablesAndTypes() { + return Map.of( + VARNAME_CURRENT_PARTITION_ID, String.class + ); + } + + @Override + public String getOutListVariableName() { + return VARNAME_REM_INTERRO_LIST; + } + + @Override + public PaginationHelper.IGetFromService getServiceMock() { + return spy(PaginationHelper.IGetFromService.class); + } + + @Override + public Object[] getServiceParams() { + Object[] ret = new Object[1]; + ret[0] = "Default_partition_id"; + return ret; + } +} \ No newline at end of file diff --git a/src/test/java/fr/insee/protools/backend/service/platine/delegate/questionnaire/PlatineQuestionnaireCreateContextTaskRESTTest.java b/src/test/java/fr/insee/protools/backend/service/platine/delegate/questionnaire/PlatineQuestionnaireCreateContextTaskRESTTestDelegate.java similarity index 84% rename from src/test/java/fr/insee/protools/backend/service/platine/delegate/questionnaire/PlatineQuestionnaireCreateContextTaskRESTTest.java rename to src/test/java/fr/insee/protools/backend/service/platine/delegate/questionnaire/PlatineQuestionnaireCreateContextTaskRESTTestDelegate.java index 0022292c..3da3b0d5 100644 --- a/src/test/java/fr/insee/protools/backend/service/platine/delegate/questionnaire/PlatineQuestionnaireCreateContextTaskRESTTest.java +++ b/src/test/java/fr/insee/protools/backend/service/platine/delegate/questionnaire/PlatineQuestionnaireCreateContextTaskRESTTestDelegate.java @@ -2,7 +2,7 @@ import com.fasterxml.jackson.databind.JsonNode; import fr.insee.protools.backend.service.platine.service.PlatineQuestionnaireService; -import fr.insee.protools.backend.service.utils.TestWithContext; +import fr.insee.protools.backend.service.utils.delegate.TestDelegateWithContext; import org.flowable.engine.delegate.DelegateExecution; import org.flowable.engine.delegate.JavaDelegate; import org.junit.jupiter.api.Test; @@ -15,12 +15,12 @@ import static fr.insee.protools.backend.utils.data.CtxExamples.ctx_empty; import static fr.insee.protools.backend.utils.data.CtxExamples.ctx_empty_id; -import static org.junit.jupiter.api.Assertions.*; +import static org.junit.jupiter.api.Assertions.assertEquals; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; -class PlatineQuestionnaireCreateContextTaskRESTTest extends TestWithContext { +class PlatineQuestionnaireCreateContextTaskRESTTestDelegate extends TestDelegateWithContext { @Mock PlatineQuestionnaireService platineQuestionnaireService; @@ -30,12 +30,12 @@ class PlatineQuestionnaireCreateContextTaskRESTTest extends TestWithContext { @Override - protected JavaDelegate getTaskUnderTest() { + public JavaDelegate getTaskUnderTest() { return platineQuestionnaireTask; } @Override - protected Map getVariablesAndTypes() { + public Map getVariablesAndTypes() { return Map.of(); } diff --git a/src/test/java/fr/insee/protools/backend/service/platine/delegate/questionnaire/PlatineQuestionnaireCreateInterrogationListTaskRESTTest.java b/src/test/java/fr/insee/protools/backend/service/platine/delegate/questionnaire/PlatineQuestionnaireCreateInterrogationListTaskRESTTest.java deleted file mode 100644 index fa934d60..00000000 --- a/src/test/java/fr/insee/protools/backend/service/platine/delegate/questionnaire/PlatineQuestionnaireCreateInterrogationListTaskRESTTest.java +++ /dev/null @@ -1,7 +0,0 @@ -package fr.insee.protools.backend.service.platine.delegate.questionnaire; - -import static org.junit.jupiter.api.Assertions.*; - -class PlatineQuestionnaireCreateInterrogationListTaskRESTTest { - -} \ No newline at end of file diff --git a/src/test/java/fr/insee/protools/backend/service/platine/delegate/questionnaire/PlatineQuestionnaireCreateInterrogationListTaskRESTTestDelegate.java b/src/test/java/fr/insee/protools/backend/service/platine/delegate/questionnaire/PlatineQuestionnaireCreateInterrogationListTaskRESTTestDelegate.java new file mode 100644 index 00000000..a2c49c67 --- /dev/null +++ b/src/test/java/fr/insee/protools/backend/service/platine/delegate/questionnaire/PlatineQuestionnaireCreateInterrogationListTaskRESTTestDelegate.java @@ -0,0 +1,74 @@ +package fr.insee.protools.backend.service.platine.delegate.questionnaire; + +import com.fasterxml.jackson.databind.JsonNode; +import fr.insee.protools.backend.service.platine.service.PlatineQuestionnaireService; +import fr.insee.protools.backend.service.utils.delegate.TestDelegateWithContext; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.JavaDelegate; +import org.junit.jupiter.api.Test; +import org.mockito.ArgumentCaptor; +import org.mockito.InjectMocks; +import org.mockito.Mock; + +import java.util.List; +import java.util.Map; +import java.util.UUID; +import java.util.stream.Collectors; +import java.util.stream.IntStream; + +import static fr.insee.protools.backend.service.FlowableVariableNameConstants.VARNAME_CURRENT_PARTITION_ID; +import static fr.insee.protools.backend.service.FlowableVariableNameConstants.VARNAME_REM_INTERRO_LIST; +import static fr.insee.protools.backend.utils.data.CtxExamples.ctx_empty; +import static fr.insee.protools.backend.utils.data.CtxExamples.ctx_empty_id; +import static fr.insee.protools.backend.utils.data.InterroExamples.generateEmptyInterro; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.*; + +class PlatineQuestionnaireCreateInterrogationListTaskRESTTestDelegate extends TestDelegateWithContext { + + @Mock + PlatineQuestionnaireService platineQuestionnaireService; + + @InjectMocks + PlatineQuestionnaireCreateInterrogationListTaskREST task; + + @Test + void execute_should_work_when_contextOKVarOK() { + DelegateExecution execution = createMockedExecution(); + JsonNode expectedContext = initContexteMockWithString(ctx_empty); + + //Process variables + lenient().doReturn(String.valueOf(UUID.randomUUID())).when(execution).getVariable(VARNAME_CURRENT_PARTITION_ID, String.class); + + List interroList = IntStream.range(0, 100) + .mapToObj(i -> generateEmptyInterro().interro()) // Call your function and get the JsonNode + .collect(Collectors.toList()); + lenient().doReturn(interroList).when(execution).getVariable(VARNAME_REM_INTERRO_LIST, List.class); + + //Execute the unit under test + task.execute(execution); + + //Verify postContext + final ArgumentCaptor > listCaptor + = ArgumentCaptor.forClass((Class) List.class); + + verify(platineQuestionnaireService,times(1)).postInterrogations(eq(ctx_empty_id),listCaptor.capture()); + List> allValues = listCaptor.getAllValues(); + assertEquals(1, allValues.size(),"We should have exactly one value"); + + assertEquals(interroList,allValues.get(0),"Wrong list of interro passed"); + } + + @Override + public JavaDelegate getTaskUnderTest() { + return task; + } + + @Override + public Map getVariablesAndTypes() { + return Map.of( + VARNAME_CURRENT_PARTITION_ID,String.class, + VARNAME_REM_INTERRO_LIST,List.class); + } +} \ No newline at end of file diff --git a/src/test/java/fr/insee/protools/backend/service/platine/service/PlatinePilotageServiceTest.java b/src/test/java/fr/insee/protools/backend/service/platine/service/PlatinePilotageServiceTest.java index 4f0607e5..ebf3eb96 100644 --- a/src/test/java/fr/insee/protools/backend/service/platine/service/PlatinePilotageServiceTest.java +++ b/src/test/java/fr/insee/protools/backend/service/platine/service/PlatinePilotageServiceTest.java @@ -1,42 +1,55 @@ package fr.insee.protools.backend.service.platine.service; import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.node.JsonNodeFactory; -import fr.insee.protools.backend.restclient.RestClientHelper; +import fr.insee.protools.backend.dto.platine.pilotage.PlatinePilotageCommunicationEventDto; +import fr.insee.protools.backend.dto.platine.pilotage.PlatinePilotageCommunicationEventType; +import fr.insee.protools.backend.restclient.exception.runtime.HttpClient4xxBPMNError; +import fr.insee.protools.backend.restclient.pagination.PageResponse; +import fr.insee.protools.backend.service.utils.TestServiceWithRestClient; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.ArgumentCaptor; +import org.mockito.ArgumentMatchers; import org.mockito.InjectMocks; -import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; -import org.springframework.web.client.RestClient; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.http.HttpStatus; +import org.springframework.http.HttpStatusCode; +import org.springframework.web.util.UriBuilder; -import static org.mockito.ArgumentMatchers.any; +import java.net.URI; +import java.util.List; +import java.util.Optional; +import java.util.UUID; +import java.util.function.Function; +import java.util.stream.Collectors; +import java.util.stream.IntStream; + +import static fr.insee.protools.backend.restclient.configuration.ApiConfigProperties.KNOWN_API.KNOWN_API_PLATINE_PILOTAGE; +import static fr.insee.protools.backend.restclient.configuration.ApiConfigProperties.KNOWN_API.KNOWN_API_PLATINE_QUESTIONNAIRE; +import static fr.insee.protools.backend.utils.data.InterroExamples.generateEmptyInterro; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.containsString; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; import static org.mockito.Mockito.*; @ExtendWith(MockitoExtension.class) -class PlatinePilotageServiceTest { - - @Mock - RestClientHelper restClientHelper; - @Mock - private RestClient.RequestBodyUriSpec requestBodyUriSpec; // Mock post() call - @Mock - private RestClient.ResponseSpec responseSpec; // Mock retrieve() call +class PlatinePilotageServiceTest extends TestServiceWithRestClient { @InjectMocks PlatinePilotageService service; + @Value("${fr.insee.protools.api.platine-pilotage.interrogation.page.size:5000}") + private int pageSizeGetInterro; + + private static ObjectMapper objectMapper=new ObjectMapper(); + @Test - void postContext_should_call_correctURIAndBody(){ + void postContext_should_call_correctURIAndBody() { //Prepare - RestClient mockRestClient = mock(RestClient.class); - doReturn(mockRestClient).when(restClientHelper).getRestClient(any()); - // Mock the chaining of RestClient calls - when(mockRestClient.post()).thenReturn(requestBodyUriSpec); - when(requestBodyUriSpec.uri(anyString(), any(Object[].class))).thenReturn(requestBodyUriSpec); - when(requestBodyUriSpec.body(any(Object.class))).thenReturn(requestBodyUriSpec); - when(requestBodyUriSpec.retrieve()).thenReturn(responseSpec); - JsonNode contextNode = JsonNodeFactory.instance.objectNode(); //Call method under test @@ -44,9 +57,119 @@ void postContext_should_call_correctURIAndBody(){ //Verifications // Then - Verify that the uri method was called with "/context" + verify(restClientHelper).getRestClient(KNOWN_API_PLATINE_PILOTAGE); + verify(restClient).post(); verify(requestBodyUriSpec).uri("/context"); // and with expected body verify(requestBodyUriSpec).body(contextNode); } + + @Test + void postInterrogations_should_makeCorrectCall() { + //Prepare + List interroList = IntStream.range(0, 100) + .mapToObj(i -> generateEmptyInterro().interro()) // Call your function and get the JsonNode + .collect(Collectors.toList()); + + //Call method under tests + service.postInterrogations("TOTO", interroList); + + //Verify + verify(restClientHelper).getRestClient(KNOWN_API_PLATINE_PILOTAGE); + verify(restClient).post(); + verify(requestBodyUriSpec).uri("/interrogations"); + // and with expected body + verify(requestBodyUriSpec).body(interroList); + } + + @Test + void postCommunicationEvents_should_makeCorrectCall() { + //Prepare + List eventList = IntStream.range(0, 10) + .mapToObj(i -> + PlatinePilotageCommunicationEventDto.builder() + .interrogationId(UUID.randomUUID().toString()) + .state(PlatinePilotageCommunicationEventType.COMMUNICATION_STATE_SENT) + .communcationId(UUID.randomUUID().toString()).build() + ) // Call your function and get the JsonNode + .collect(Collectors.toList()); + + //Call method under tests + service.postCommunicationEvents(eventList); + + //Verify + verify(restClient).post(); + verify(requestBodyUriSpec).uri("/interrogations/communication-events"); + // and with expected body + verify(requestBodyUriSpec).body(eventList); + } + + + @Test + void getInterrogationToFollowUpPaginated_shouldMakeCorrectCalls() { + //Prepare + String partitionId="PartitionIDXX"; + long page=69; + Optional isToFollowUp = Optional.of(Boolean.FALSE); + + List mockedResponse = List.of(objectMapper.createObjectNode().put("id",1).put("id","toto")); + mockGetPageableBodyResponse(mockedResponse); + //Call method under tests + PageResponse response = service.getInterrogationToFollowUpPaginated(partitionId,page,isToFollowUp); + + //Verify + verify(restClientHelper).getRestClient(KNOWN_API_PLATINE_PILOTAGE); + verify(restClient).get(); + + // Now let's manually build a URI using the captured function and a mock UriBuilder + ArgumentCaptor> uriCaptor = ArgumentCaptor.forClass(Function.class); + verify(requestHeadersUriSpec).uri(uriCaptor.capture()); + UriBuilder mockUriBuilder = mock(UriBuilder.class); + when(mockUriBuilder.path(anyString())).thenReturn(mockUriBuilder); + when(mockUriBuilder.queryParam(anyString(), ArgumentMatchers.any())).thenReturn(mockUriBuilder); + when(mockUriBuilder.queryParamIfPresent(anyString(), ArgumentMatchers.>any())).thenReturn(mockUriBuilder); + + + when(mockUriBuilder.build()).thenReturn(URI.create("http://mockeduri")); + + // Call the captured function with the mocked UriBuilder + uriCaptor.getValue().apply(mockUriBuilder); + + // Verify that the correct path and query parameters were used + verify(mockUriBuilder).path("/interrogations"); + verify(mockUriBuilder).queryParam("page", page); + verify(mockUriBuilder).queryParam("size", pageSizeGetInterro); + verify(mockUriBuilder).queryParam("partition_id", partitionId); + verify(mockUriBuilder).queryParamIfPresent(eq("follow-up"), eq(isToFollowUp)); + + assertEquals(mockedResponse, response.getContent(),"The response is not what was expected/mocked"); + } + + + @Test + void getInterrogationToFollowUpPaginated_shouldCatch() { + //Prepare + String partitionId="PartitionIDYY"; + long page=0; + Optional isToFollowUp = Optional.of(Boolean.TRUE); + + mockMakeRetrieveThrow(HttpStatusCode.valueOf(HttpStatus.BAD_REQUEST.value())); + //Call method under tests + assertThrows(HttpClient4xxBPMNError.class, () -> service.getInterrogationToFollowUpPaginated(partitionId,page,isToFollowUp)); + } + + @Test + void getInterrogationToFollowUpPaginated_shouldCatch_404() { + //Prepare + String partitionId="PartitionIDYY"; + long page=0; + Optional isToFollowUp = Optional.of(Boolean.TRUE); + + mockMakeRetrieveThrow(HttpStatusCode.valueOf(HttpStatus.NOT_FOUND.value())); + //Call method under tests + HttpClient4xxBPMNError exception = assertThrows(HttpClient4xxBPMNError.class, () -> service.getInterrogationToFollowUpPaginated(partitionId, page, isToFollowUp)); + assertThat(exception.getMessage(), containsString("404")); + + } } \ No newline at end of file diff --git a/src/test/java/fr/insee/protools/backend/service/platine/service/PlatineQuestionnaireServiceTest.java b/src/test/java/fr/insee/protools/backend/service/platine/service/PlatineQuestionnaireServiceTest.java index 8c505cc5..479600c1 100644 --- a/src/test/java/fr/insee/protools/backend/service/platine/service/PlatineQuestionnaireServiceTest.java +++ b/src/test/java/fr/insee/protools/backend/service/platine/service/PlatineQuestionnaireServiceTest.java @@ -2,29 +2,23 @@ import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.node.JsonNodeFactory; -import fr.insee.protools.backend.restclient.RestClientHelper; +import fr.insee.protools.backend.service.utils.TestServiceWithRestClient; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.InjectMocks; -import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; -import org.springframework.web.client.RestClient; -import static org.junit.jupiter.api.Assertions.*; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.ArgumentMatchers.anyString; -import static org.mockito.Mockito.*; +import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.IntStream; + +import static fr.insee.protools.backend.restclient.configuration.ApiConfigProperties.KNOWN_API.KNOWN_API_PLATINE_QUESTIONNAIRE; +import static fr.insee.protools.backend.restclient.configuration.ApiConfigProperties.KNOWN_API.KNOWN_API_REM; +import static fr.insee.protools.backend.utils.data.InterroExamples.generateEmptyInterro; import static org.mockito.Mockito.verify; @ExtendWith(MockitoExtension.class) -class PlatineQuestionnaireServiceTest { - - @Mock - RestClientHelper restClientHelper; - @Mock - private RestClient.RequestBodyUriSpec requestBodyUriSpec; // Mock post() call - @Mock - private RestClient.ResponseSpec responseSpec; // Mock retrieve() call +class PlatineQuestionnaireServiceTest extends TestServiceWithRestClient { @InjectMocks PlatineQuestionnaireService service; @@ -32,24 +26,36 @@ class PlatineQuestionnaireServiceTest { @Test void postContext_should_call_correctURIAndBody(){ //Prepare - RestClient mockRestClient = mock(RestClient.class); - doReturn(mockRestClient).when(restClientHelper).getRestClient(any()); - // Mock the chaining of RestClient calls - when(mockRestClient.post()).thenReturn(requestBodyUriSpec); - when(requestBodyUriSpec.uri(anyString(), any(Object[].class))).thenReturn(requestBodyUriSpec); - when(requestBodyUriSpec.body(any(Object.class))).thenReturn(requestBodyUriSpec); - when(requestBodyUriSpec.retrieve()).thenReturn(responseSpec); - JsonNode contextNode = JsonNodeFactory.instance.objectNode(); //Call method under test service.postContext("TOTO", contextNode); //Verifications + verify(restClientHelper).getRestClient(KNOWN_API_PLATINE_QUESTIONNAIRE); + verify(restClient).post(); // Then - Verify that the uri method was called with "/context" verify(requestBodyUriSpec).uri("/context"); // and with expected body verify(requestBodyUriSpec).body(contextNode); } + @Test + void postInterrogations_should_makeCorrectCall() { + //Prepare + List interroList = IntStream.range(0, 100) + .mapToObj(i -> generateEmptyInterro().interro()) // Call your function and get the JsonNode + .collect(Collectors.toList()); + + //Call method under tests + service.postInterrogations("TOTO", interroList); + + //Verify + verify(restClientHelper).getRestClient(KNOWN_API_PLATINE_QUESTIONNAIRE); + verify(restClient).post(); + verify(requestBodyUriSpec).uri("/interrogations"); + // and with expected body + verify(requestBodyUriSpec).body(interroList); + } + } \ No newline at end of file diff --git a/src/test/java/fr/insee/protools/backend/service/rem/RemServiceTest.java b/src/test/java/fr/insee/protools/backend/service/rem/RemServiceTest.java new file mode 100644 index 00000000..9ef67a47 --- /dev/null +++ b/src/test/java/fr/insee/protools/backend/service/rem/RemServiceTest.java @@ -0,0 +1,125 @@ +package fr.insee.protools.backend.service.rem; + +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; +import fr.insee.protools.backend.dto.rem_tmp.InterrogationAccountDto; +import fr.insee.protools.backend.service.utils.TestServiceWithRestClient; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.ArgumentCaptor; +import org.mockito.InjectMocks; +import org.mockito.junit.jupiter.MockitoExtension; + +import java.util.List; +import java.util.Map; +import java.util.UUID; +import java.util.stream.Collectors; +import java.util.stream.IntStream; + +import static fr.insee.protools.backend.restclient.configuration.ApiConfigProperties.KNOWN_API.KNOWN_API_REM; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.Mockito.never; +import static org.mockito.Mockito.verify; + +@ExtendWith(MockitoExtension.class) +class RemServiceTest extends TestServiceWithRestClient { + static ObjectMapper objectMapper = new ObjectMapper(); + @InjectMocks + RemService service; + + @Test + void getPartitionAllInterroPaginated_should_call_correctURIAndBody() { + } + + @Test + void getInterrogationIdsWithoutAccountForPartition() { + } + + @Test + void patchInterrogationsSetAccounts() { + //Prepare + Map userByInterroId = Map.of( + UUID.randomUUID().toString(), "USER1", + UUID.randomUUID().toString(), "USER2", + UUID.randomUUID().toString(), "USER3", + UUID.randomUUID().toString(), "USER4"); + + //Call method under tests + service.patchInterrogationsSetAccounts(userByInterroId); + + //Verify + verify(restClientHelper).getRestClient(KNOWN_API_REM); + verify(restClient).patch(); + verify(requestBodyUriSpec).uri("/interrogations/account"); + // and with expected body + final ArgumentCaptor> bodyCaptor + = ArgumentCaptor.forClass((Class) List.class); + verify(requestBodyUriSpec).body(bodyCaptor.capture()); + + List> bodyValues = bodyCaptor.getAllValues(); + assertEquals(1, bodyValues.size(), "We should have exactly one value"); + List bodyListDto = bodyValues.get(0); + + assertEquals(userByInterroId.size(), bodyListDto.size(), "Wrong number of elements in the body"); + + boolean allMatch = userByInterroId.entrySet().stream() + .allMatch(entry -> + bodyListDto.stream().anyMatch(dto -> + dto.getInterrogationId().toString().equals(entry.getKey()) && + dto.getAccount().equals(entry.getValue()) + ) + ); + assertTrue(allMatch, "Body does not match the input"); + } + + @Test + void putContactsPlatine_should_call_correctURIAndBody() { + //Prepare + List contacts = IntStream.range(0, 25) + .mapToObj(i -> + objectMapper.createObjectNode().put("id", UUID.randomUUID().toString()).put("toto", i) + ) + .collect(Collectors.toList()); + + //Call method under tests + service.putContactsPlatine(contacts); + + //Verify + verify(requestBodyUriSpec).uri("contacts-platine"); + verify(restClient).put(); + // and with expected body + verify(requestBodyUriSpec).body(contacts); + } + + @Test + void putContactsPlatine_should_NotCallIfEmpty() { + //Prepare + List contacts = List.of(); + + //Call method under tests + service.putContactsPlatine(contacts); + + //Verify + verify(restClient,never()).put(); + verify(requestBodyUriSpec, never()).uri(anyString()); + } + + @Test + void putContactsPlatine_should_NotCallIfNull() { + //Prepare + List contacts = null; + + //Call method under tests + service.putContactsPlatine(contacts); + + //Verify + verify(restClient,never()).put(); + verify(requestBodyUriSpec, never()).uri(anyString()); + } + + @Test + void postRemiseEnCollecte() { + } +} \ No newline at end of file diff --git a/src/test/java/fr/insee/protools/backend/service/utils/CustomJWTHelper.java b/src/test/java/fr/insee/protools/backend/service/utils/CustomJWTHelper.java index 78c2e589..9bca3949 100644 --- a/src/test/java/fr/insee/protools/backend/service/utils/CustomJWTHelper.java +++ b/src/test/java/fr/insee/protools/backend/service/utils/CustomJWTHelper.java @@ -53,7 +53,7 @@ public static String getEncodedToken(Jwt token) throws Exception { } - private static String createSignature(String header, String payload) throws Exception { + public static String createSignature(String header, String payload) throws Exception { String data = header + "." + payload; Mac sha256Hmac = Mac.getInstance("HmacSHA256"); SecretKeySpec secretKeySpec = new SecretKeySpec(SECRET_KEY.getBytes(StandardCharsets.UTF_8), ALGO); diff --git a/src/test/java/fr/insee/protools/backend/service/utils/TestServiceWithRestClient.java b/src/test/java/fr/insee/protools/backend/service/utils/TestServiceWithRestClient.java new file mode 100644 index 00000000..13c749a8 --- /dev/null +++ b/src/test/java/fr/insee/protools/backend/service/utils/TestServiceWithRestClient.java @@ -0,0 +1,71 @@ +package fr.insee.protools.backend.service.utils; + +import com.fasterxml.jackson.databind.JsonNode; +import fr.insee.protools.backend.restclient.RestClientHelper; +import fr.insee.protools.backend.restclient.exception.runtime.HttpClient4xxBPMNError; +import fr.insee.protools.backend.restclient.pagination.PageResponse; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.ArgumentMatchers; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.mockito.junit.jupiter.MockitoExtension; +import org.springframework.core.ParameterizedTypeReference; +import org.springframework.http.HttpStatusCode; +import org.springframework.web.client.RestClient; +import org.springframework.web.util.UriBuilder; + +import java.net.URI; +import java.util.List; +import java.util.function.Function; + +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.Mockito.*; + +@ExtendWith(MockitoExtension.class) +public class TestServiceWithRestClient { + @Mock + protected RestClient restClient; + @Mock + protected RestClientHelper restClientHelper; + @Mock + protected RestClient.RequestBodyUriSpec requestBodyUriSpec; // Mock post() call + @Mock + protected RestClient.ResponseSpec responseSpec; // Mock retrieve() call + @Mock + protected RestClient.RequestHeadersUriSpec requestHeadersUriSpec; + + @BeforeEach + void initRestClientMock() { + //Prepare + lenient().doReturn(restClient).when(restClientHelper).getRestClient(any()); + // Mock the chaining of RestClient calls for post/put/patch + lenient().when(restClient.post()).thenReturn(requestBodyUriSpec); + lenient().when(restClient.put()).thenReturn(requestBodyUriSpec); + lenient().when(restClient.patch()).thenReturn(requestBodyUriSpec); + lenient().when(requestBodyUriSpec.uri(anyString(), any(Object[].class))).thenReturn(requestBodyUriSpec); + lenient().when(requestHeadersUriSpec.uri(ArgumentMatchers.>any())).thenReturn(requestBodyUriSpec); + lenient().when(requestBodyUriSpec.body(any(Object.class))).thenReturn(requestBodyUriSpec); + lenient().when(requestBodyUriSpec.retrieve()).thenReturn(responseSpec); + + //Specific for get + lenient().when(restClient.get()).thenReturn(requestHeadersUriSpec); + lenient().when(requestHeadersUriSpec.retrieve()).thenReturn(responseSpec); + } + + + public void mockGetPageableBodyResponse(List l){ + PageResponse mockResponse = PageResponse.builder().content(l).build(); + lenient().when(responseSpec.body(ArgumentMatchers.any())).thenReturn(mockResponse); + lenient().when(responseSpec.body(ArgumentMatchers.any())).thenReturn(mockResponse); + } + + public void mockMakeRetrieveThrow(HttpStatusCode errorCode){ + HttpClient4xxBPMNError ex = new HttpClient4xxBPMNError("msg",errorCode); + lenient().when(requestBodyUriSpec.retrieve()).thenThrow(ex); + //Specific for get + lenient().when(requestHeadersUriSpec.retrieve()).thenThrow(ex); + } + +} diff --git a/src/test/java/fr/insee/protools/backend/service/utils/delegate/IDelegateWithVariableGetPaginated.java b/src/test/java/fr/insee/protools/backend/service/utils/delegate/IDelegateWithVariableGetPaginated.java new file mode 100644 index 00000000..95a8efe6 --- /dev/null +++ b/src/test/java/fr/insee/protools/backend/service/utils/delegate/IDelegateWithVariableGetPaginated.java @@ -0,0 +1,97 @@ +package fr.insee.protools.backend.service.utils.delegate; + +import com.fasterxml.jackson.databind.ObjectMapper; +import fr.insee.protools.backend.restclient.pagination.PageResponse; +import org.flowable.engine.delegate.DelegateExecution; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; +import org.mockito.ArgumentCaptor; + +import java.util.List; +import java.util.Map; +import java.util.stream.Stream; + +import static fr.insee.protools.backend.service.FlowableVariableNameConstants.*; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.*; + +public interface IDelegateWithVariableGetPaginated extends IDelegateWithVariables { + + ObjectMapper objectMapper = new ObjectMapper(); + + void initReadValueMock(PageResponse pageResponse); + String getOutListVariableName(); + + static Stream executeParamProvider() { + return Stream.of( + Arguments.of(null, true), + Arguments.of(null, false), + Arguments.of(0, true), + Arguments.of(0, false), + Arguments.of(1, true), + Arguments.of(1, false), + Arguments.of(99, true), + Arguments.of(1011, false) + ); + } + + @ParameterizedTest + @MethodSource("executeParamProvider") + default void execute_should_work_when_params_notNullWithPaginated(Integer currentPage,boolean isLastPage) { + //Preconditions + DelegateExecution execution = mock(DelegateExecution.class); + lenient().when(execution.getProcessInstanceId()).thenReturn(dumyId); + lenient().when(execution.getParent()).thenReturn(execution); + + initDefaultVariables(execution); + + //Pages data + lenient().doReturn(currentPage).when(execution).getVariable(eq(VARNAME_INTERRO_LIST_PAGEABLE_CURRENT_PAGE), eq(Integer.class)); + lenient().doReturn(currentPage).when(execution).getVariableLocal(eq(VARNAME_INTERRO_LIST_PAGEABLE_CURRENT_PAGE), eq(Integer.class)); + + lenient().doReturn(isLastPage).when(execution).getVariable(eq(VARNAME_INTERRO_LIST_PAGEABLE_IS_LAST_PAGE), eq(Boolean.class)); + lenient().doReturn(isLastPage).when(execution).getVariableLocal(eq(VARNAME_INTERRO_LIST_PAGEABLE_IS_LAST_PAGE), eq(Boolean.class)); + + + //PageResponse + Integer expectedPageToRead=(currentPage==null)?0:currentPage+1; + PageResponse exepectedPageResponse = PageResponse.builder().currentPage(expectedPageToRead).pageCount(1).content(List.of(objectMapper.createObjectNode().put("xx","yyy"))).build(); + initReadValueMock(exepectedPageResponse); + //Call method under test + getTaskUnderTest().execute(execution); + + + if(!isLastPage) { + // Verify the flowable utils are called to get and treat variables + verify(execution, times(1)).getVariable(VARNAME_CURRENT_PARTITION_ID, String.class); + + ArgumentCaptor> variablesMapCaptor = ArgumentCaptor.forClass(Map.class); + + + verify(execution).setVariablesLocal(variablesMapCaptor.capture()); + Map capturedMap = variablesMapCaptor.getValue(); + assertEquals(exepectedPageResponse.getContent(), capturedMap.get(getOutListVariableName())); + } + else{ + //ArgumentCaptor> variablesMapCaptor = ArgumentCaptor.forClass(Map.class); + verify(execution,never()).setVariablesLocal(any()); + } + } + + PaginationHelper.IGetFromService getServiceMock(); + Object[] getServiceParams(); + + default void initDefaultVariables(DelegateExecution execution) { + Map typeByVariable = getVariablesAndTypes(); + typeByVariable + .keySet() + .forEach(variable -> { + Class clazz = typeByVariable.get(variable); + var dummyValue = getDefaultValue(clazz); + lenient().doReturn(dummyValue).when(execution).getVariable(eq(variable), eq(clazz)); + lenient().doReturn(dummyValue).when(execution).getVariableLocal(eq(variable), eq(clazz)); + }); + } +} diff --git a/src/test/java/fr/insee/protools/backend/service/utils/TestWithContext.java b/src/test/java/fr/insee/protools/backend/service/utils/delegate/IDelegateWithVariables.java similarity index 50% rename from src/test/java/fr/insee/protools/backend/service/utils/TestWithContext.java rename to src/test/java/fr/insee/protools/backend/service/utils/delegate/IDelegateWithVariables.java index 76c0509c..59f1e02f 100644 --- a/src/test/java/fr/insee/protools/backend/service/utils/TestWithContext.java +++ b/src/test/java/fr/insee/protools/backend/service/utils/delegate/IDelegateWithVariables.java @@ -1,28 +1,15 @@ -package fr.insee.protools.backend.service.utils; +package fr.insee.protools.backend.service.utils.delegate; import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.node.JsonNodeFactory; -import fr.insee.protools.backend.ProtoolsTestUtils; -import fr.insee.protools.backend.dto.ContexteProcessus; -import fr.insee.protools.backend.service.context.ContextService; -import fr.insee.protools.backend.service.context.exception.BadContexMissingBPMNError; +import fr.insee.protools.backend.restclient.pagination.PageResponse; import fr.insee.protools.backend.service.exception.VariableClassCastException; -import lombok.SneakyThrows; -import lombok.extern.slf4j.Slf4j; import org.flowable.common.engine.api.FlowableIllegalArgumentException; import org.flowable.engine.delegate.DelegateExecution; import org.flowable.engine.delegate.JavaDelegate; -import org.junit.jupiter.api.AfterEach; -import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.Mockito; -import org.mockito.Spy; -import org.mockito.junit.jupiter.MockitoExtension; -import java.io.IOException; -import java.io.UncheckedIOException; import java.util.*; import java.util.function.Consumer; import java.util.stream.Stream; @@ -30,69 +17,92 @@ import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.containsString; -import static org.junit.jupiter.api.Assertions.assertThrows; -import static org.junit.jupiter.api.Assertions.assertTrue; -import static org.mockito.ArgumentMatchers.anyString; +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.*; -@ExtendWith(MockitoExtension.class) -@Slf4j -public abstract class TestWithContext { +public interface IDelegateWithVariables { - @Spy protected ContextService protoolsContext; + org.slf4j.Logger ilogger = org.slf4j.LoggerFactory.getLogger(IDelegateWithVariables.class); + String dumyId = "ID1"; - protected final String dumyId="ID1"; - private ObjectMapper objectMapper=new ObjectMapper(); + //TODO: activer ce test pour que tous les delegates le prennent en compte + //void execute_should_throw_BadContext_when_contextIncorrect(String context_json); - @AfterEach - void mockitoResetContext() { - reset(protoolsContext); - } + JavaDelegate getTaskUnderTest(); + Map getVariablesAndTypes(); - @SneakyThrows - protected JsonNode initContexteMockWithFile(String contexteToLoad) { - JsonNode contextRootNode = ProtoolsTestUtils.asJsonNode(contexteToLoad); - ContexteProcessus schema = objectMapper.readValue(contexteToLoad, ContexteProcessus.class); + // extra mocked needed so that it works + default void initExtraMocks(DelegateExecution execution) {} - doReturn(contextRootNode).when(protoolsContext).getContextJsonNodeByProcessInstance(anyString()); - doReturn(schema).when(protoolsContext).getContextDtoByProcessInstance(anyString()); - return contextRootNode; - } - @SneakyThrows - protected JsonNode initContexteMockWithString(String contexteAsString){ - JsonNode contextRootNode = new ObjectMapper().readTree(contexteAsString); - ContexteProcessus schema = objectMapper.readValue(contexteAsString, ContexteProcessus.class); + @Test + default void execute_should_work_when_params_notNull(){ + //Preconditions + DelegateExecution execution = mock(DelegateExecution.class); + lenient().when(execution.getProcessInstanceId()).thenReturn(dumyId); + lenient().when(execution.getParent()).thenReturn(execution); - doReturn(contextRootNode).when(protoolsContext).getContextJsonNodeByProcessInstance(anyString()); - doReturn(schema).when(protoolsContext).getContextDtoByProcessInstance(anyString()); - return contextRootNode; - } + Map typeByVariable = getVariablesAndTypes(); + typeByVariable + .keySet() + .forEach(variable -> { + Class clazz = typeByVariable.get(variable); + var dummyValue = getDefaultValue(clazz); + lenient().doReturn(dummyValue).when(execution).getVariable(eq(variable), eq(clazz)); + lenient().doReturn(dummyValue).when(execution).getVariableLocal(eq(variable), eq(clazz)); + }); - public DelegateExecution createMockedExecution(){ - DelegateExecution execution = mock(DelegateExecution.class); - doReturn(dumyId).when(execution).getProcessInstanceId(); - return execution; + //Extra mocks (ex: read) + initExtraMocks(execution); + + //Call method under test + assertDoesNotThrow(() -> getTaskUnderTest().execute(execution)); } @Test - @DisplayName("execute should throw an error if the context is null") - void execute_should_throwError_when_null_context(){ + default void execute_should_throw_FlowableIllegalArgumentException_when_variables_wrongType() { + Map typeByVariable = getVariablesAndTypes(); + //No variables==> No test + if(typeByVariable.isEmpty()){ + assertTrue(true); + ilogger.info("No variable configured as mandatory for this delegate"); + return; + } + + //Precondition DelegateExecution execution = mock(DelegateExecution.class); lenient().when(execution.getProcessInstanceId()).thenReturn(dumyId); - doThrow(new BadContexMissingBPMNError("Erreur")).when(protoolsContext).getContextDtoByProcessInstance(anyString()); - doThrow(new BadContexMissingBPMNError("Erreur")).when(protoolsContext).getContextJsonNodeByProcessInstance(anyString()); - assertThrows(BadContexMissingBPMNError.class, () -> getTaskUnderTest().execute(execution)); + typeByVariable + .keySet() + .forEach(variable -> { + Class clazzOriginal = typeByVariable.get(variable); + Class clazz; + if (clazzOriginal.equals(String.class)) { + clazz = List.class; + } else if (clazzOriginal.equals(List.class)) { + clazz = JsonNode.class; + } else { + clazz = String.class; + } + var dummyValue = getDefaultValue(clazz); + lenient().doReturn(dummyValue).when(execution).getVariable(eq(variable), eq(clazzOriginal)); + lenient().doReturn(dummyValue).when(execution).getVariableLocal(eq(variable), eq(clazzOriginal)); + }); + //Run the test + //Verify + assertThrows(VariableClassCastException.class, () -> getTaskUnderTest().execute(execution)); } + @Test - protected void execute_should_throw_FlowableIllegalArgumentException_when_variables_notDefined(){ + default void execute_should_throw_FlowableIllegalArgumentException_when_variables_notDefined(){ Map typeByVariable = getVariablesAndTypes(); //No variables==> No test if(typeByVariable.isEmpty()){ - log.info("No variable configured as mandatory for this delegate"); + ilogger.info("No variable configured as mandatory for this delegate"); assertTrue(true); return; } @@ -100,80 +110,74 @@ protected void execute_should_throw_FlowableIllegalArgumentException_when_variab //Precondition DelegateExecution execution = mock(DelegateExecution.class); lenient().when(execution.getProcessInstanceId()).thenReturn(dumyId); - +// String[] variables=getVariablesAndTypes().keySet().toArray(new String[0]); combinations(variables) .forEach(variablesSubset -> { - log.info("subset of initialized variables: "+variablesSubset); + ilogger.info("subset of initialized variables: "+variablesSubset); //Initailize the mocked variables + Set intializedVars=new HashSet<>(); + + //The one not defined ==> Throw for (String variable :variablesSubset) { Class clazz = typeByVariable.get(variable); - var dummyValue = initDefaultValue(clazz); - lenient().doReturn(dummyValue).when(execution).getVariable(eq(variable), eq(clazz)); - lenient().doReturn(dummyValue).when(execution).getVariableLocal(eq(variable), eq(clazz)); - + lenient().doThrow(new FlowableIllegalArgumentException("Variable "+variable+" not exists")).when(execution).getVariable(eq(variable), eq(clazz)); + lenient().doThrow(new FlowableIllegalArgumentException("Variable "+variable+" not exists")).when(execution).getVariableLocal(eq(variable), eq(clazz)); + ilogger.info("mock getVariable Throw : variable="+variable+" - class="+clazz); + intializedVars.add(variable); } + //The others + getVariablesAndTypes().entrySet() + .stream().filter(entry -> !intializedVars.contains(entry.getKey())) + .forEach(entry -> { + String variable=entry.getKey(); + Class clazz = typeByVariable.get(variable); + var dummyValue = getDefaultValue(clazz); + lenient().doReturn(dummyValue).when(execution).getVariable(eq(variable), eq(clazz)); + lenient().doReturn(dummyValue).when(execution).getVariableLocal(eq(variable), eq(clazz)); + ilogger.info("mock getVariable VALUE: variable="+variable+" - class="+clazz); + }); //Run the test for this subset of initialized variables //Verify FlowableIllegalArgumentException exception = assertThrows(FlowableIllegalArgumentException.class, () -> getTaskUnderTest().execute(execution)); - assertThat(exception.getMessage(), containsString("was not found")); + assertThat(exception.getMessage(), containsString(" not exists")); // Reset the mock (this clears all stubbings and invocations) Mockito.reset(execution); } ); } - @Test - protected void execute_should_throw_FlowableIllegalArgumentException_when_variables_wrongType() { - Map typeByVariable = getVariablesAndTypes(); - //No variables==> No test - if(typeByVariable.isEmpty()){ - assertTrue(true); - log.info("No variable configured as mandatory for this delegate"); - return; - } - - //Precondition + default DelegateExecution createMockedExecution(){ DelegateExecution execution = mock(DelegateExecution.class); - lenient().when(execution.getProcessInstanceId()).thenReturn(dumyId); - - typeByVariable - .keySet() - .forEach(variable -> { - Class clazzOriginal = typeByVariable.get(variable); - Class clazz; - if (clazzOriginal.equals(String.class)) { - clazz = List.class; - } else if (clazzOriginal.equals(List.class)) { - clazz = JsonNode.class; - } else { - clazz = String.class; - } - var dummyValue = initDefaultValue(clazz); - lenient().doReturn(dummyValue).when(execution).getVariable(eq(variable), eq(clazzOriginal)); - lenient().doReturn(dummyValue).when(execution).getVariableLocal(eq(variable), eq(clazzOriginal)); - }); - //Run the test - //Verify - assertThrows(VariableClassCastException.class, () -> getTaskUnderTest().execute(execution)); + lenient().doReturn(dumyId).when(execution).getProcessInstanceId(); + return execution; } - private T initDefaultValue(Class clazz){ + //Init an object of clazz type with default value + default T getDefaultValue(Class clazz){ if(clazz.equals(List.class)){ - return (T) List.of(); + return (T) new ArrayList<>(); } else if(clazz.equals(Map.class)){ - return (T) Map.of(); + return (T) new HashMap<>(); } else if(clazz.equals(Set.class)){ - return (T) Set.of(); + return (T) new HashSet<>(); } else if(clazz.equals(JsonNode.class)){ return (T) JsonNodeFactory.instance.objectNode(); } - + else if(clazz.equals(String.class)) { + return (T) "1"; + } + else if(clazz.equals(Long.class)) { + return (T) Long.valueOf(1); + } + else if(clazz.equals(Integer.class)) { + return (T) Integer.valueOf(1); + } try { return clazz.getDeclaredConstructor().newInstance(); } catch (ReflectiveOperationException e) { @@ -181,35 +185,35 @@ else if(clazz.equals(JsonNode.class)){ } } - //Generate a Stream of all the combinaisons of elements of the array including an empty List but without the full list + //Generate a Stream of all the combinaisons of elements of the array including the full list (but no empty set) private static Stream> combinations(T[] arr) { - final long N = (long) Math.pow(2, arr.length)-1; + final long N = (long) Math.pow(2, arr.length); return StreamSupport.stream(new Spliterators.AbstractSpliterator>(N, Spliterator.SIZED) { - long i = 0; + long i = 1; @Override public boolean tryAdvance(Consumer> action) { if(i < N) { - List out = new ArrayList(Long.bitCount(i)); + List out = new ArrayList<>(Long.bitCount(i) ); for (int bit = 0; bit < arr.length; bit++) { if((i & (1< allElements = Arrays.asList(arr); + action.accept(allElements); // Return the full set return false; } } }, false); } - //protected abstract void execute_should_throw_BadContext_when_contextIncorrect(String context_json); - - protected abstract JavaDelegate getTaskUnderTest(); - protected abstract Map getVariablesAndTypes(); } diff --git a/src/test/java/fr/insee/protools/backend/service/utils/delegate/TestDelegateWithContext.java b/src/test/java/fr/insee/protools/backend/service/utils/delegate/TestDelegateWithContext.java new file mode 100644 index 00000000..7c1da89a --- /dev/null +++ b/src/test/java/fr/insee/protools/backend/service/utils/delegate/TestDelegateWithContext.java @@ -0,0 +1,87 @@ +package fr.insee.protools.backend.service.utils.delegate; + +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; +import fr.insee.protools.backend.ProtoolsTestUtils; +import fr.insee.protools.backend.dto.ContexteProcessus; +import fr.insee.protools.backend.service.context.ContextService; +import fr.insee.protools.backend.service.context.exception.BadContexMissingBPMNError; +import lombok.SneakyThrows; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.delegate.DelegateExecution; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.Spy; +import org.mockito.junit.jupiter.MockitoExtension; + +import static fr.insee.protools.backend.utils.data.CtxExamples.ctx_empty; +import static fr.insee.protools.backend.utils.data.CtxExamples.ctx_empty_id; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.Mockito.*; + +@ExtendWith(MockitoExtension.class) +@Slf4j +public abstract class TestDelegateWithContext implements IDelegateWithVariables{ + + @Spy protected ContextService protoolsContext; + + private ObjectMapper objectMapper=new ObjectMapper(); + + @AfterEach + void mockitoResetContext() { + reset(protoolsContext); + } + + @Test + @Override + public void execute_should_work_when_params_notNull() { + initContexteMockWithString(ctx_empty); + IDelegateWithVariables.super.execute_should_work_when_params_notNull(); + } + + + @Override + @Test + public void execute_should_throw_FlowableIllegalArgumentException_when_variables_notDefined(){ + initContexteMockWithString(ctx_empty); + IDelegateWithVariables.super.execute_should_throw_FlowableIllegalArgumentException_when_variables_notDefined(); + } + + @SneakyThrows + protected JsonNode initContexteMockWithFile(String contexteToLoad) { + JsonNode contextRootNode = ProtoolsTestUtils.asJsonNode(contexteToLoad); + ContexteProcessus schema = objectMapper.readValue(contexteToLoad, ContexteProcessus.class); + + doReturn(contextRootNode).when(protoolsContext).getContextJsonNodeByProcessInstance(anyString()); + doReturn(schema).when(protoolsContext).getContextDtoByProcessInstance(anyString()); + return contextRootNode; + } + + @SneakyThrows + protected JsonNode initContexteMockWithString(String contexteAsString){ + JsonNode contextRootNode = new ObjectMapper().readTree(contexteAsString); + ContexteProcessus schema = objectMapper.readValue(contexteAsString, ContexteProcessus.class); + + doReturn(contextRootNode).when(protoolsContext).getContextJsonNodeByProcessInstance(anyString()); + doReturn(schema).when(protoolsContext).getContextDtoByProcessInstance(anyString()); + return contextRootNode; + } + + @Test + @DisplayName("execute should throw an error if the context is null") + void execute_should_throwError_when_null_context(){ + //Precondition + DelegateExecution execution = mock(DelegateExecution.class); + lenient().when(execution.getProcessInstanceId()).thenReturn(dumyId); + doThrow(new BadContexMissingBPMNError("Erreur")).when(protoolsContext).getContextDtoByProcessInstance(anyString()); + doThrow(new BadContexMissingBPMNError("Erreur")).when(protoolsContext).getContextJsonNodeByProcessInstance(anyString()); + + assertThrows(BadContexMissingBPMNError.class, () -> getTaskUnderTest().execute(execution)); + } + + + +} diff --git a/src/test/java/fr/insee/protools/backend/utils/data/CtxExamples.java b/src/test/java/fr/insee/protools/backend/utils/data/CtxExamples.java index 3f7f5f16..8e229dc2 100644 --- a/src/test/java/fr/insee/protools/backend/utils/data/CtxExamples.java +++ b/src/test/java/fr/insee/protools/backend/utils/data/CtxExamples.java @@ -1,7 +1,5 @@ package fr.insee.protools.backend.utils.data; -import org.springframework.util.ClassUtils; - public class CtxExamples { @@ -13,5 +11,6 @@ public class CtxExamples { """; public static final String ctx_empty_id="b958cfac-2bf3-478d-a97a-dda5e751898c"; + private CtxExamples(){} } diff --git a/src/test/java/fr/insee/protools/backend/utils/data/InterroExamples.java b/src/test/java/fr/insee/protools/backend/utils/data/InterroExamples.java index 3b912182..afd80878 100644 --- a/src/test/java/fr/insee/protools/backend/utils/data/InterroExamples.java +++ b/src/test/java/fr/insee/protools/backend/utils/data/InterroExamples.java @@ -3,8 +3,7 @@ import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.node.JsonNodeFactory; import com.fasterxml.jackson.databind.node.ObjectNode; -import org.apache.commons.lang3.tuple.Pair; -import org.springframework.util.ClassUtils; + import java.util.UUID; public class InterroExamples { From 719213ab65ca9e90e03aa55780b522416323f4be Mon Sep 17 00:00:00 2001 From: SNDIL - Marc Date: Wed, 18 Sep 2024 09:46:10 +0200 Subject: [PATCH 62/75] en cours TU --- ...ommunicationEventTaskRESTTestDelegate.java | 66 ++++++----- ...nterroToFollowUpPaginatedTaskRESTTest.java | 9 +- ...rtitionListOfInterroPaginatedTaskTest.java | 59 ++++++++++ .../RemPutContactPlatineTaskRESTTest.java | 111 ++++++++++++++++++ .../IDelegateWithVariableGetPaginated.java | 11 -- .../delegate/IDelegateWithVariables.java | 11 ++ 6 files changed, 220 insertions(+), 47 deletions(-) create mode 100644 src/test/java/fr/insee/protools/backend/service/rem/delegate/RemGetPartitionListOfInterroPaginatedTaskTest.java create mode 100644 src/test/java/fr/insee/protools/backend/service/rem/delegate/RemPutContactPlatineTaskRESTTest.java diff --git a/src/test/java/fr/insee/protools/backend/service/platine/delegate/pilotatage/PlatinePilotageCreateCommunicationEventTaskRESTTestDelegate.java b/src/test/java/fr/insee/protools/backend/service/platine/delegate/pilotatage/PlatinePilotageCreateCommunicationEventTaskRESTTestDelegate.java index 5f30cd91..33776af8 100644 --- a/src/test/java/fr/insee/protools/backend/service/platine/delegate/pilotatage/PlatinePilotageCreateCommunicationEventTaskRESTTestDelegate.java +++ b/src/test/java/fr/insee/protools/backend/service/platine/delegate/pilotatage/PlatinePilotageCreateCommunicationEventTaskRESTTestDelegate.java @@ -1,11 +1,14 @@ package fr.insee.protools.backend.service.platine.delegate.pilotatage; -import com.fasterxml.jackson.databind.ObjectMapper; +import ch.qos.logback.classic.Level; +import ch.qos.logback.classic.spi.ILoggingEvent; +import ch.qos.logback.core.read.ListAppender; +import ch.qos.logback.classic.Logger; + import fr.insee.protools.backend.dto.platine.pilotage.PlatinePilotageCommunicationEventDto; import fr.insee.protools.backend.exception.ProtoolsProcessFlowBPMNError; import fr.insee.protools.backend.service.platine.service.PlatinePilotageService; import fr.insee.protools.backend.service.utils.delegate.IDelegateWithVariables; -import fr.insee.protools.backend.utils.data.InterroExamples; import lombok.extern.slf4j.Slf4j; import org.flowable.engine.delegate.DelegateExecution; import org.flowable.engine.delegate.JavaDelegate; @@ -19,6 +22,7 @@ import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; +import org.slf4j.LoggerFactory; import java.util.HashSet; import java.util.List; @@ -27,6 +31,7 @@ import java.util.stream.Stream; import static fr.insee.protools.backend.service.FlowableVariableNameConstants.*; +import static org.assertj.core.api.Assertions.assertThat; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertThrows; import static org.mockito.Mockito.*; @@ -56,33 +61,6 @@ public Map getVariablesAndTypes() { ); } - static Stream initExecuteParametersWarn() { - return Stream.of( - Arguments.of(List.of(InterroExamples.generateEmptyInterro().interro()), Map.of(), "differentComId")//The interro is unknown - ); - /* - Logger fooLogger = (Logger) LoggerFactory.getLogger(PlatinePilotageCreateCommunicationEventTaskREST.class); - // create and start a ListAppender - ListAppender listAppender = new ListAppender<>(); - listAppender.start(); - // call method under test - Foo foo = new Foo(); - foo.doThat(); - - // JUnit assertions - List logsList = listAppender.list; - assertEquals("start", logsList.get(0) - .getMessage()); - assertEquals(Level.INFO, logsList.get(0) - .getLevel()); - - assertEquals("finish", logsList.get(1) - .getMessage()); - assertEquals(Level.INFO, logsList.get(1) - .getLevel()); - */ - } - static Stream initExecuteParametersOK() { return Stream.of( Arguments.of(Map.of(), "comId", Boolean.FALSE), @@ -154,4 +132,34 @@ public void execute_should_throw_when_varCommId_is_blank() { //Execute method under test assertThrows(ProtoolsProcessFlowBPMNError.class, () -> task.execute(execution)); } + + @Test + @DisplayName("Test execute method - should write a log and not call service when the communication Request Map is empty ") + public void execute_should_writeLog_and_notCallService_when_comReqByIdMapIsEmpty() { + //Prepare + DelegateExecution execution = createMockedExecution(); + initDefaultVariables(execution); + + // create and start a ListAppender to capture logs + Logger fooLogger = (Logger) LoggerFactory.getLogger(PlatinePilotageCreateCommunicationEventTaskREST.class); + ListAppender listAppender = new ListAppender<>(); + fooLogger.addAppender(listAppender); + listAppender.start(); + + //Execute method under test + task.execute(execution); + + //Verify + List logsList = listAppender.list; + assertThat(logsList.get(0).getFormattedMessage()) + .contains("begin") + .contains(execution.getProcessInstanceId()); + + assertEquals(Level.INFO, logsList.get(1) + .getLevel()); + assertThat(logsList.get(1).getFormattedMessage()) + .contains("end") + .contains(execution.getProcessInstanceId()) + .contains("Nothing to do"); + } } \ No newline at end of file diff --git a/src/test/java/fr/insee/protools/backend/service/platine/delegate/pilotatage/PlatinePilotageGetListOfInterroToFollowUpPaginatedTaskRESTTest.java b/src/test/java/fr/insee/protools/backend/service/platine/delegate/pilotatage/PlatinePilotageGetListOfInterroToFollowUpPaginatedTaskRESTTest.java index 435633a6..dc178175 100644 --- a/src/test/java/fr/insee/protools/backend/service/platine/delegate/pilotatage/PlatinePilotageGetListOfInterroToFollowUpPaginatedTaskRESTTest.java +++ b/src/test/java/fr/insee/protools/backend/service/platine/delegate/pilotatage/PlatinePilotageGetListOfInterroToFollowUpPaginatedTaskRESTTest.java @@ -1,26 +1,21 @@ package fr.insee.protools.backend.service.platine.delegate.pilotatage; -import com.fasterxml.jackson.databind.ObjectMapper; import fr.insee.protools.backend.restclient.pagination.PageResponse; import fr.insee.protools.backend.service.platine.service.PlatinePilotageService; import fr.insee.protools.backend.service.utils.delegate.IDelegateWithVariableGetPaginated; import fr.insee.protools.backend.service.utils.delegate.PaginationHelper; import org.flowable.engine.delegate.DelegateExecution; import org.flowable.engine.delegate.JavaDelegate; -import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; -import org.mockito.ArgumentCaptor; import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; import java.util.List; import java.util.Map; -import java.util.Optional; -import static fr.insee.protools.backend.service.FlowableVariableNameConstants.*; -import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; -import static org.junit.jupiter.api.Assertions.assertEquals; +import static fr.insee.protools.backend.service.FlowableVariableNameConstants.VARNAME_CURRENT_PARTITION_ID; +import static fr.insee.protools.backend.service.FlowableVariableNameConstants.VARNAME_REM_INTERRO_LIST; import static org.mockito.Mockito.*; @ExtendWith(MockitoExtension.class) diff --git a/src/test/java/fr/insee/protools/backend/service/rem/delegate/RemGetPartitionListOfInterroPaginatedTaskTest.java b/src/test/java/fr/insee/protools/backend/service/rem/delegate/RemGetPartitionListOfInterroPaginatedTaskTest.java new file mode 100644 index 00000000..13f9268c --- /dev/null +++ b/src/test/java/fr/insee/protools/backend/service/rem/delegate/RemGetPartitionListOfInterroPaginatedTaskTest.java @@ -0,0 +1,59 @@ +package fr.insee.protools.backend.service.rem.delegate; + +import fr.insee.protools.backend.restclient.pagination.PageResponse; +import fr.insee.protools.backend.service.platine.delegate.pilotatage.PlatinePilotageGetListOfInterroToFollowUpPaginatedTaskREST; +import fr.insee.protools.backend.service.platine.service.PlatinePilotageService; +import fr.insee.protools.backend.service.rem.RemService; +import fr.insee.protools.backend.service.utils.delegate.IDelegateWithVariableGetPaginated; +import fr.insee.protools.backend.service.utils.delegate.PaginationHelper; +import org.flowable.engine.delegate.JavaDelegate; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; + +import java.util.Map; + +import static fr.insee.protools.backend.service.FlowableVariableNameConstants.VARNAME_CURRENT_PARTITION_ID; +import static fr.insee.protools.backend.service.FlowableVariableNameConstants.VARNAME_REM_INTERRO_LIST; + +@ExtendWith(MockitoExtension.class) +class RemGetPartitionListOfInterroPaginatedTaskTest implements IDelegateWithVariableGetPaginated { + + @Mock + RemService remService; + @InjectMocks + RemGetPartitionListOfInterroPaginatedTask task; + + @Override + public JavaDelegate getTaskUnderTest() { + return task; + } + + @Override + public Map getVariablesAndTypes() { + return Map.of( + VARNAME_CURRENT_PARTITION_ID, String.class + ); + } + + @Override + public void initReadValueMock(PageResponse pageResponse) { + + } + + @Override + public String getOutListVariableName() { + return VARNAME_REM_INTERRO_LIST; + } + + @Override + public PaginationHelper.IGetFromService getServiceMock() { + return null; + } + + @Override + public Object[] getServiceParams() { + return new Object[0]; + } +} \ No newline at end of file diff --git a/src/test/java/fr/insee/protools/backend/service/rem/delegate/RemPutContactPlatineTaskRESTTest.java b/src/test/java/fr/insee/protools/backend/service/rem/delegate/RemPutContactPlatineTaskRESTTest.java new file mode 100644 index 00000000..8d3723cc --- /dev/null +++ b/src/test/java/fr/insee/protools/backend/service/rem/delegate/RemPutContactPlatineTaskRESTTest.java @@ -0,0 +1,111 @@ +package fr.insee.protools.backend.service.rem.delegate; + +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.nimbusds.jose.shaded.gson.JsonObject; +import fr.insee.protools.backend.exception.ProtoolsProcessFlowBPMNError; +import fr.insee.protools.backend.service.rem.RemService; +import fr.insee.protools.backend.service.utils.delegate.IDelegateWithVariables; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.JavaDelegate; +import org.hamcrest.collection.IsIterableContainingInAnyOrder; +import org.hamcrest.collection.IsIterableContainingInOrder; +import org.junit.Assert; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; +import org.mockito.ArgumentCaptor; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; + +import java.util.*; +import java.util.stream.Stream; + +import static fr.insee.protools.backend.service.FlowableVariableNameConstants.*; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.mockito.Mockito.*; + +@ExtendWith(MockitoExtension.class) +class RemPutContactPlatineTaskRESTTest implements IDelegateWithVariables { + + @Mock + RemService remService; + + @InjectMocks + RemPutContactPlatineTaskREST task; + + private static ObjectMapper objectMapper=new ObjectMapper(); + static Stream initExecuteParametersOK() { + List list1node = List.of(objectMapper.createObjectNode().put("id",1).put("id","toto")); + List list2node = List.of( + objectMapper.createObjectNode().put("id",1).put("id","toto"), + objectMapper.createObjectNode().put("identifier",1).put("tata","toto")); + + return Stream.of( + Arguments.of(List.of()), + Arguments.of(list1node), + Arguments.of(list2node)); + } + + @Override + public JavaDelegate getTaskUnderTest() { + return task; + } + + @Override + public Map getVariablesAndTypes() { + return Map.of(VARNAME_PLATINE_CONTACT_LIST, List.class); + } + + @ParameterizedTest + @MethodSource("initExecuteParametersOK") + @DisplayName("Test execute method - should work and make correct call to service") + void execute_should_work_whenEverythingOk(List contacts) { + //Prepare + DelegateExecution execution = createMockedExecution(); + doReturn(contacts).when(execution).getVariable(VARNAME_PLATINE_CONTACT_LIST, List.class); + + //Execute method under test + task.execute(execution); + + //verify + final ArgumentCaptor> listCaptor = ArgumentCaptor.forClass((Class) List.class); + + verify(remService, times(1)).putContactsPlatine(listCaptor.capture()); + List> allValues = listCaptor.getAllValues(); + assertEquals(1, allValues.size(), "We should have exactly one value"); + + List actualArgument = listCaptor.getValue(); + assertEquals(contacts.size(), actualArgument.size(), "The passed list of contacts has an incorrect size : Exepected " + contacts.size() + " - actual:" + actualArgument.size()); + + //check that we passed the correct items + if (contacts.isEmpty()) { + assertThat("If no contacts (empty List) ==> should pass an empty list", actualArgument.isEmpty()); + } + else + { + assertThat(actualArgument, + IsIterableContainingInAnyOrder.containsInAnyOrder(contacts.toArray(new Object[0]))); + } + } + + @Test + @DisplayName("Test execute method - should throw ProtoolsProcessFlowBPMNError when communication Id is null") + public void execute_should_throw_when_varCommId_is_blank() { + String commId = ""; + //Prepare + DelegateExecution execution = createMockedExecution(); + doReturn(commId).when(execution).getVariable(VARNAME_CURRENT_COMMUNICATION_ID, String.class); + doReturn(dumyId).when(execution).getVariable(VARNAME_CURRENT_PARTITION_ID, String.class); + doReturn(Map.of("interroId1", "commReqId1")).when(execution).getVariable(VARNAME_COMMUNICATION_REQUEST_ID_FOR_INTERRO_ID_MAP, Map.class); + + //Execute method under test + assertThrows(ProtoolsProcessFlowBPMNError.class, () -> task.execute(execution)); + } +} \ No newline at end of file diff --git a/src/test/java/fr/insee/protools/backend/service/utils/delegate/IDelegateWithVariableGetPaginated.java b/src/test/java/fr/insee/protools/backend/service/utils/delegate/IDelegateWithVariableGetPaginated.java index 95a8efe6..0f6338f9 100644 --- a/src/test/java/fr/insee/protools/backend/service/utils/delegate/IDelegateWithVariableGetPaginated.java +++ b/src/test/java/fr/insee/protools/backend/service/utils/delegate/IDelegateWithVariableGetPaginated.java @@ -83,15 +83,4 @@ default void execute_should_work_when_params_notNullWithPaginated(Integer curren PaginationHelper.IGetFromService getServiceMock(); Object[] getServiceParams(); - default void initDefaultVariables(DelegateExecution execution) { - Map typeByVariable = getVariablesAndTypes(); - typeByVariable - .keySet() - .forEach(variable -> { - Class clazz = typeByVariable.get(variable); - var dummyValue = getDefaultValue(clazz); - lenient().doReturn(dummyValue).when(execution).getVariable(eq(variable), eq(clazz)); - lenient().doReturn(dummyValue).when(execution).getVariableLocal(eq(variable), eq(clazz)); - }); - } } diff --git a/src/test/java/fr/insee/protools/backend/service/utils/delegate/IDelegateWithVariables.java b/src/test/java/fr/insee/protools/backend/service/utils/delegate/IDelegateWithVariables.java index 59f1e02f..042342be 100644 --- a/src/test/java/fr/insee/protools/backend/service/utils/delegate/IDelegateWithVariables.java +++ b/src/test/java/fr/insee/protools/backend/service/utils/delegate/IDelegateWithVariables.java @@ -35,6 +35,17 @@ public interface IDelegateWithVariables { // extra mocked needed so that it works default void initExtraMocks(DelegateExecution execution) {} + default void initDefaultVariables(DelegateExecution execution) { + Map typeByVariable = getVariablesAndTypes(); + typeByVariable + .keySet() + .forEach(variable -> { + Class clazz = typeByVariable.get(variable); + var dummyValue = getDefaultValue(clazz); + lenient().doReturn(dummyValue).when(execution).getVariable(eq(variable), eq(clazz)); + lenient().doReturn(dummyValue).when(execution).getVariableLocal(eq(variable), eq(clazz)); + }); + } @Test default void execute_should_work_when_params_notNull(){ From bcfed281ad04e9f562f9ee2bd64986637623d205 Mon Sep 17 00:00:00 2001 From: SNDIL - Marc Date: Thu, 19 Sep 2024 22:56:24 +0200 Subject: [PATCH 63/75] en cours TU --- .../rem_tmp/InterrogationIdentifiersDto.java | 199 +++++++++++++++++ .../restclient/pagination/PageResponse.java | 12 +- .../service/DelegateContextVerifier.java | 41 +--- .../service/context/ContextService.java | 5 +- .../service/context/ContextServiceImpl.java | 19 +- .../MeshuggahCreateContextTaskREST.java | 8 +- ...tOfInterroToFollowUpPaginatedTaskREST.java | 2 +- .../service/PlatinePilotageService.java | 5 +- .../backend/service/rem/RemService.java | 74 ++++--- ...etPartitionListOfInterroPaginatedTask.java | 4 +- .../RemPostResmiseEnCollecteTaskREST.java | 8 +- .../RemPutContactPlatineTaskREST.java | 7 + .../backend/service/sugoi/SugoiService.java | 12 +- .../SugoiREMCreateMissingAccountListTask.java | 35 ++- .../traiterXXXX/TraiterXXXService.java | 2 +- .../TraiterXXXCreateContextTaskREST.java | 8 +- .../utils/delegate/PaginationHelper.java | 2 +- ...ommunicationEventTaskRESTTestDelegate.java | 12 +- ...tageCreateContextTaskRESTTestDelegate.java | 5 + ...InterrogationListTaskRESTTestDelegate.java | 5 + ...nterroToFollowUpPaginatedTaskRESTTest.java | 16 -- ...aireCreateContextTaskRESTTestDelegate.java | 5 + ...InterrogationListTaskRESTTestDelegate.java | 5 + .../service/PlatinePilotageServiceTest.java | 70 +++--- .../backend/service/rem/RemServiceTest.java | 203 ++++++++++++++++-- ...rtitionListOfInterroPaginatedTaskTest.java | 16 +- .../RemPostResmiseEnCollecteTaskRESTTest.java | 130 +++++++++++ .../RemPutContactPlatineTaskRESTTest.java | 66 +++--- .../service/sugoi/SugoiServiceTest.java | 133 ++++++++++++ ...oiREMCreateMissingAccountListTaskTest.java | 179 +++++++++++++++ .../utils/TestServiceWithRestClient.java | 66 +++++- .../IDelegateWithVariableGetPaginated.java | 11 +- .../delegate/IDelegateWithVariables.java | 19 +- .../delegate/TestDelegateWithContext.java | 77 ++++++- .../backend/utils/data/CtxExamples.java | 21 +- .../resources/application-test.properties | 2 +- 36 files changed, 1224 insertions(+), 260 deletions(-) create mode 100644 src/main/java/fr/insee/protools/backend/dto/rem_tmp/InterrogationIdentifiersDto.java create mode 100644 src/test/java/fr/insee/protools/backend/service/rem/delegate/RemPostResmiseEnCollecteTaskRESTTest.java create mode 100644 src/test/java/fr/insee/protools/backend/service/sugoi/SugoiServiceTest.java create mode 100644 src/test/java/fr/insee/protools/backend/service/sugoi_rem/delegate/SugoiREMCreateMissingAccountListTaskTest.java diff --git a/src/main/java/fr/insee/protools/backend/dto/rem_tmp/InterrogationIdentifiersDto.java b/src/main/java/fr/insee/protools/backend/dto/rem_tmp/InterrogationIdentifiersDto.java new file mode 100644 index 00000000..d328d761 --- /dev/null +++ b/src/main/java/fr/insee/protools/backend/dto/rem_tmp/InterrogationIdentifiersDto.java @@ -0,0 +1,199 @@ +package fr.insee.protools.backend.dto.rem_tmp; + +import java.net.URI; +import java.util.Objects; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonTypeName; +import java.util.UUID; +import java.time.OffsetDateTime; +import jakarta.validation.Valid; +import jakarta.validation.constraints.*; + + +import java.util.*; +import jakarta.annotation.Generated; + +/** + * InterrogationIdentifiersDto + */ + +@JsonTypeName("InterrogationIdentifiers") +@Generated(value = "org.openapitools.codegen.languages.SpringCodegen", date = "2024-08-30T10:25:29.966974800+02:00[Europe/Paris]", comments = "Generator version: 7.8.0") +public class InterrogationIdentifiersDto { + + private UUID interrogationId; + + private UUID surveyUnitId; + + private String originId; + + public InterrogationIdentifiersDto interrogationId(UUID interrogationId) { + this.interrogationId = interrogationId; + return this; + } + + /** + * Get interrogationId + * @return interrogationId + */ + @Valid + @JsonProperty("interrogationId") + public UUID getInterrogationId() { + return interrogationId; + } + + public void setInterrogationId(UUID interrogationId) { + this.interrogationId = interrogationId; + } + + public InterrogationIdentifiersDto surveyUnitId(UUID surveyUnitId) { + this.surveyUnitId = surveyUnitId; + return this; + } + + /** + * Get surveyUnitId + * @return surveyUnitId + */ + @Valid + @JsonProperty("surveyUnitId") + public UUID getSurveyUnitId() { + return surveyUnitId; + } + + public void setSurveyUnitId(UUID surveyUnitId) { + this.surveyUnitId = surveyUnitId; + } + + public InterrogationIdentifiersDto originId(String originId) { + this.originId = originId; + return this; + } + + /** + * Get originId + * @return originId + */ + + @JsonProperty("originId") + public String getOriginId() { + return originId; + } + + public void setOriginId(String originId) { + this.originId = originId; + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + InterrogationIdentifiersDto interrogationIdentifiers = (InterrogationIdentifiersDto) o; + return Objects.equals(this.interrogationId, interrogationIdentifiers.interrogationId) && + Objects.equals(this.surveyUnitId, interrogationIdentifiers.surveyUnitId) && + Objects.equals(this.originId, interrogationIdentifiers.originId); + } + + @Override + public int hashCode() { + return Objects.hash(interrogationId, surveyUnitId, originId); + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("class InterrogationIdentifiersDto {\n"); + sb.append(" interrogationId: ").append(toIndentedString(interrogationId)).append("\n"); + sb.append(" surveyUnitId: ").append(toIndentedString(surveyUnitId)).append("\n"); + sb.append(" originId: ").append(toIndentedString(originId)).append("\n"); + sb.append("}"); + return sb.toString(); + } + + /** + * Convert the given object to string with each line indented by 4 spaces + * (except the first line). + */ + private String toIndentedString(Object o) { + if (o == null) { + return "null"; + } + return o.toString().replace("\n", "\n "); + } + + public static class Builder { + + private InterrogationIdentifiersDto instance; + + public Builder() { + this(new InterrogationIdentifiersDto()); + } + + protected Builder(InterrogationIdentifiersDto instance) { + this.instance = instance; + } + + protected Builder copyOf(InterrogationIdentifiersDto value) { + this.instance.setInterrogationId(value.interrogationId); + this.instance.setSurveyUnitId(value.surveyUnitId); + this.instance.setOriginId(value.originId); + return this; + } + + public Builder interrogationId(UUID interrogationId) { + this.instance.interrogationId(interrogationId); + return this; + } + + public Builder surveyUnitId(UUID surveyUnitId) { + this.instance.surveyUnitId(surveyUnitId); + return this; + } + + public Builder originId(String originId) { + this.instance.originId(originId); + return this; + } + + /** + * returns a built InterrogationIdentifiersDto instance. + * + * The builder is not reusable (NullPointerException) + */ + public InterrogationIdentifiersDto build() { + try { + return this.instance; + } finally { + // ensure that this.instance is not reused + this.instance = null; + } + } + + @Override + public String toString() { + return getClass() + "=(" + instance + ")"; + } + } + + /** + * Create a builder with no initialized field (except for the default values). + */ + public static Builder builder() { + return new Builder(); + } + + /** + * Create a builder with a shallow copy of this instance. + */ + public Builder toBuilder() { + Builder builder = new Builder(); + return builder.copyOf(this); + } + +} + diff --git a/src/main/java/fr/insee/protools/backend/restclient/pagination/PageResponse.java b/src/main/java/fr/insee/protools/backend/restclient/pagination/PageResponse.java index 795e50ea..1e925ad3 100644 --- a/src/main/java/fr/insee/protools/backend/restclient/pagination/PageResponse.java +++ b/src/main/java/fr/insee/protools/backend/restclient/pagination/PageResponse.java @@ -15,10 +15,14 @@ public class PageResponse { @Builder.Default private List content = new ArrayList<>(); - private Integer currentPage; - private Integer pageSize; - private Long totalElements; - private Integer pageCount; + @Builder.Default + private Integer currentPage=0; + @Builder.Default + private Integer pageSize=5000; + @Builder.Default + private Long totalElements=0L; + @Builder.Default + private Integer pageCount=0; public Boolean isLastPage(){ if(currentPage==null || pageCount==null){ diff --git a/src/main/java/fr/insee/protools/backend/service/DelegateContextVerifier.java b/src/main/java/fr/insee/protools/backend/service/DelegateContextVerifier.java index 2e2c9ad9..84cccda1 100644 --- a/src/main/java/fr/insee/protools/backend/service/DelegateContextVerifier.java +++ b/src/main/java/fr/insee/protools/backend/service/DelegateContextVerifier.java @@ -2,6 +2,7 @@ import com.fasterxml.jackson.databind.JsonNode; import fr.insee.protools.backend.dto.ContexteProcessus; +import fr.insee.protools.backend.service.context.exception.BadContexMissingBPMNError; import fr.insee.protools.backend.service.context.exception.BadContextIncorrectBPMNError; import org.slf4j.Logger; @@ -14,10 +15,15 @@ */ public interface DelegateContextVerifier { - default Set getContextErrors(JsonNode contextRootNode) {return Set.of();} - - default Set getContextErrors(ContexteProcessus context) {return Set.of();} - + default Set getContextErrors(ContexteProcessus context) { + if(context==null){ + return Set.of("Context is null"); + } + if(context.getId()==null){ + return Set.of(computeMissingMessage("Context Id",this.getClass())); + } + return Set.of(); + } static String computeMissingMessage(String missingElement, Class classUsingThisElement){ return String.format("Class=%s : Missing Context element name=%s ", classUsingThisElement.getSimpleName(),missingElement); @@ -33,35 +39,10 @@ static String computeIncorrectEnumMessage(String incorrectElement,String value, , value ,enumValues); } - static Set computeMissingChildrenMessages(Set requiredChildren, JsonNode parentNode, Class classUsingThisElement){ - if(parentNode == null){ - return new HashSet<>(); - } - Set missingNodes = new HashSet<>(); - for (String child: requiredChildren ) { - if(parentNode.get(child) == null){ - missingNodes.add(computeMissingMessage(child,classUsingThisElement)); - } - } - return missingNodes; - } - - default void checkContextOrThrow(Logger log,String processInstanceId, JsonNode contextRootNode) { - if(contextRootNode==null) - throw new BadContextIncorrectBPMNError(String.format("ProcessInstanceId=%s - context is missing", processInstanceId)); - - var errors = getContextErrors(contextRootNode); - if(!errors.isEmpty()){ - for (var msg: errors) { - log.error(msg); - } - throw new BadContextIncorrectBPMNError(String.format("ProcessInstanceId=%s - context is incorrect missingNodes=%s", processInstanceId,errors)); - } - } default void checkContextOrThrow(Logger log,String processInstanceId, ContexteProcessus context) { if(context==null) - throw new BadContextIncorrectBPMNError(String.format("ProcessInstanceId=%s - context is missing", processInstanceId)); + throw new BadContexMissingBPMNError(String.format("ProcessInstanceId=%s - context is missing", processInstanceId)); var errors = getContextErrors(context); if(!errors.isEmpty()){ diff --git a/src/main/java/fr/insee/protools/backend/service/context/ContextService.java b/src/main/java/fr/insee/protools/backend/service/context/ContextService.java index 315ea025..d0fd6b00 100644 --- a/src/main/java/fr/insee/protools/backend/service/context/ContextService.java +++ b/src/main/java/fr/insee/protools/backend/service/context/ContextService.java @@ -2,6 +2,7 @@ import com.fasterxml.jackson.databind.JsonNode; import fr.insee.protools.backend.dto.ContexteProcessus; +import fr.insee.protools.backend.service.context.exception.BadContexMissingBPMNError; import org.springframework.web.multipart.MultipartFile; public interface ContextService { @@ -29,7 +30,7 @@ public interface ContextService { * * @param processInstanceId * @return the Json context of the process associated with process Instance - * @throws + * @throws BadContexMissingBPMNError */ JsonNode getContextJsonNodeByProcessInstance(String processInstanceId); @@ -38,7 +39,7 @@ public interface ContextService { * * @param processInstanceId * @return the Dto context of the process associated with process Instance - * @throws + * @throws BadContexMissingBPMNError */ ContexteProcessus getContextDtoByProcessInstance(String processInstanceId); diff --git a/src/main/java/fr/insee/protools/backend/service/context/ContextServiceImpl.java b/src/main/java/fr/insee/protools/backend/service/context/ContextServiceImpl.java index 344acf9a..536352c2 100644 --- a/src/main/java/fr/insee/protools/backend/service/context/ContextServiceImpl.java +++ b/src/main/java/fr/insee/protools/backend/service/context/ContextServiceImpl.java @@ -229,7 +229,7 @@ private ContextPair processContextFile(MultipartFile file, String processDefinit JsonNode rootContext = defaultReader.readTree(content); ContexteProcessus contexte = jsonReadAndSchemaValidation(rootContext); - Set contextErrors = isContextOKForBPMN(processDefinitionKey, rootContext); + Set contextErrors = isContextOKForBPMN(processDefinitionKey, contexte); if (!contextErrors.isEmpty()) { throw new BadContextIncorrectBPMNError(contextErrors.toString()); } @@ -251,13 +251,16 @@ private Optional getFileExtension(String filename) { * Check if protoolsContextRootNode allows every Task implementing {@link fr.insee.protools.backend.service.DelegateContextVerifier#getContextErrors DelegateContextVerifier} interface to run correctly * * @param processDefinitionKey The process (BPMN) identifier - * @param protoolsContextRootNode The context to check + * @param contexteProcessus The context to check * @return A list of the problems found * @throws FlowableObjectNotFoundException if no process definition (BPMN) matches processDefinitionKey */ - public Set isContextOKForBPMN(String processDefinitionKey, JsonNode protoolsContextRootNode) { + public Set isContextOKForBPMN(String processDefinitionKey, ContexteProcessus contexteProcessus) { //At least, the campaign ID should be defined so we can write it on process variables to be used un groovy scripts - Set errors = DelegateContextVerifier.computeMissingChildrenMessages(Set.of(CTX_CAMPAGNE_ID), protoolsContextRootNode, getClass()); + Set errors = new HashSet<>(); + if(contexteProcessus.getId()==null){ + errors.add("id is missing"); + } ProcessDefinitionQuery processDefinitionQuery = repositoryService.createProcessDefinitionQuery(); processDefinitionQuery.processDefinitionKey(processDefinitionKey); @@ -278,18 +281,18 @@ public Set isContextOKForBPMN(String processDefinitionKey, JsonNode prot processModel.getFlowElements().stream() .filter(flowElement -> (flowElement instanceof ServiceTask || flowElement instanceof SubProcess)) - .forEach(flowElement -> errors.addAll(analyseProcess(flowElement, protoolsContextRootNode))); + .forEach(flowElement -> errors.addAll(analyseProcess(flowElement, contexteProcessus))); return errors; } - private Set analyseProcess(FlowElement flowElement, JsonNode protoolsContextRootNode) { + private Set analyseProcess(FlowElement flowElement, ContexteProcessus contexteProcessus) { if (flowElement instanceof ServiceTask serviceTask) { if (serviceTask.getImplementationType().equals("delegateExpression")) { String delegateExpression = serviceTask.getImplementation().replace("${", "").replace("}", ""); try { Object bean = springApplicationContext.getBean(delegateExpression); if (bean instanceof DelegateContextVerifier beanDelegateCtxVerifier) { - return beanDelegateCtxVerifier.getContextErrors(protoolsContextRootNode); + return beanDelegateCtxVerifier.getContextErrors(contexteProcessus); } } catch (NoSuchBeanDefinitionException e) { } @@ -297,7 +300,7 @@ private Set analyseProcess(FlowElement flowElement, JsonNode protoolsCon } else if (flowElement instanceof SubProcess subProcessFlowElement) { Set errors = new HashSet<>(); subProcessFlowElement.getFlowElements().stream() - .forEach(subFlowElement -> errors.addAll(analyseProcess(subFlowElement, protoolsContextRootNode))); + .forEach(subFlowElement -> errors.addAll(analyseProcess(subFlowElement, contexteProcessus))); return errors; } return Set.of(); diff --git a/src/main/java/fr/insee/protools/backend/service/meshuggah/delegate/MeshuggahCreateContextTaskREST.java b/src/main/java/fr/insee/protools/backend/service/meshuggah/delegate/MeshuggahCreateContextTaskREST.java index cc5a9b04..eeadaa10 100644 --- a/src/main/java/fr/insee/protools/backend/service/meshuggah/delegate/MeshuggahCreateContextTaskREST.java +++ b/src/main/java/fr/insee/protools/backend/service/meshuggah/delegate/MeshuggahCreateContextTaskREST.java @@ -1,6 +1,7 @@ package fr.insee.protools.backend.service.meshuggah.delegate; import com.fasterxml.jackson.databind.JsonNode; +import fr.insee.protools.backend.dto.ContexteProcessus; import fr.insee.protools.backend.service.DelegateContextVerifier; import fr.insee.protools.backend.service.context.ContextService; import fr.insee.protools.backend.service.meshuggah.MeshuggahService; @@ -23,12 +24,13 @@ public class MeshuggahCreateContextTaskREST implements JavaDelegate, DelegateCon public void execute(DelegateExecution execution) { log.info("ProcessInstanceId={} begin",execution.getProcessInstanceId()); JsonNode contextRootNode = protoolsContext.getContextJsonNodeByProcessInstance(execution.getProcessInstanceId()); - String campainId = contextRootNode.path(CTX_CAMPAGNE_ID).asText(); + ContexteProcessus contexteProcessus = protoolsContext.getContextDtoByProcessInstance(execution.getProcessInstanceId()); + + checkContextOrThrow(log,execution.getProcessInstanceId(), contexteProcessus); + String campainId = contexteProcessus.getId().toString(); - checkContextOrThrow(log,execution.getProcessInstanceId(), contextRootNode); service.postContext(campainId,contextRootNode); log.info("ProcessInstanceId={} end",execution.getProcessInstanceId()); - } } diff --git a/src/main/java/fr/insee/protools/backend/service/platine/delegate/pilotatage/PlatinePilotageGetListOfInterroToFollowUpPaginatedTaskREST.java b/src/main/java/fr/insee/protools/backend/service/platine/delegate/pilotatage/PlatinePilotageGetListOfInterroToFollowUpPaginatedTaskREST.java index 41ff7a9b..fbeaa53a 100644 --- a/src/main/java/fr/insee/protools/backend/service/platine/delegate/pilotatage/PlatinePilotageGetListOfInterroToFollowUpPaginatedTaskREST.java +++ b/src/main/java/fr/insee/protools/backend/service/platine/delegate/pilotatage/PlatinePilotageGetListOfInterroToFollowUpPaginatedTaskREST.java @@ -46,7 +46,7 @@ public Logger getLogger() { @Override public Map treatPage(DelegateExecution execution, List contentList) { - Map variables = new HashMap(); + Map variables = new HashMap<>(); variables.put(VARNAME_REM_INTERRO_LIST, contentList); return variables; } diff --git a/src/main/java/fr/insee/protools/backend/service/platine/service/PlatinePilotageService.java b/src/main/java/fr/insee/protools/backend/service/platine/service/PlatinePilotageService.java index cdf8989f..e1bbde07 100644 --- a/src/main/java/fr/insee/protools/backend/service/platine/service/PlatinePilotageService.java +++ b/src/main/java/fr/insee/protools/backend/service/platine/service/PlatinePilotageService.java @@ -84,7 +84,10 @@ public PageResponse getInterrogationToFollowUpPaginated(String partiti .build()) .retrieve() .body(typeReference); - log.trace("partitionId={} - page={} - pageSizeGetInterro={} - response={} ", partitionId,page,pageSizeGetInterro, (response==null)?0:response.getContent().size()); + if(response==null){ + response=new PageResponse<>(); + } + log.trace("partitionId={} - page={} - pageSizeGetInterro={} - response={} ", partitionId,page,pageSizeGetInterro, response.getContent().size()); return response; } catch (HttpClient4xxBPMNError e){ diff --git a/src/main/java/fr/insee/protools/backend/service/rem/RemService.java b/src/main/java/fr/insee/protools/backend/service/rem/RemService.java index d559b592..134b2233 100644 --- a/src/main/java/fr/insee/protools/backend/service/rem/RemService.java +++ b/src/main/java/fr/insee/protools/backend/service/rem/RemService.java @@ -2,6 +2,7 @@ import com.fasterxml.jackson.databind.JsonNode; import fr.insee.protools.backend.dto.rem_tmp.InterrogationAccountDto; +import fr.insee.protools.backend.dto.rem_tmp.InterrogationIdentifiersDto; import fr.insee.protools.backend.restclient.RestClientHelper; import fr.insee.protools.backend.restclient.configuration.ApiConfigProperties; import fr.insee.protools.backend.restclient.exception.runtime.HttpClient4xxBPMNError; @@ -24,35 +25,38 @@ @RequiredArgsConstructor public class RemService { - private final ApiConfigProperties.KNOWN_API API= KNOWN_API_REM; + private final ApiConfigProperties.KNOWN_API API = KNOWN_API_REM; private final RestClientHelper restClientHelper; @Value("${fr.insee.protools.api.rem.interrogation.page.size:5000}") private int pageSizeGetInterro; public PageResponse getPartitionAllInterroPaginated(String partitionId, long page) { - log.debug("partitionId={} - page={} - pageSizeGetInterro={} }",partitionId,page,pageSizeGetInterro); - ParameterizedTypeReference> typeReference = new ParameterizedTypeReference<>() { }; + log.debug("partitionId={} - page={} - pageSizeGetInterro={} }", partitionId, page, pageSizeGetInterro); + ParameterizedTypeReference> typeReference = new ParameterizedTypeReference<>() { + }; try { - PageResponse response = restClientHelper.getRestClient(API) - .get() - .uri(uriBuilder -> uriBuilder - .path("interrogations") - .queryParam("page", page) - .queryParam("size", pageSizeGetInterro) - .queryParam("partition_id", partitionId) - .build()) - .retrieve() - .body(typeReference); - log.trace("partitionId={} - page={} - pageSizeGetInterro={} - response={} ", partitionId,page,pageSizeGetInterro, response.getContent().size()); + PageResponse response = restClientHelper.getRestClient(API) + .get() + .uri(uriBuilder -> uriBuilder + .path("/interrogations") + .queryParam("page", page) + .queryParam("size", pageSizeGetInterro) + .queryParam("partition_id", partitionId) + .build()) + .retrieve() + .body(typeReference); + if(response==null){ + response=new PageResponse<>(); + } + log.trace("partitionId={} - page={} - pageSizeGetInterro={} - response={} ", partitionId, page, pageSizeGetInterro, response.getContent().size()); return response; - } - catch (HttpClient4xxBPMNError e){ - if(e.getHttpStatusCodeError().equals(HttpStatus.NOT_FOUND)){ - String msg= - "Error 404/NOT_FOUND during get sample on REM with partitionId="+partitionId - + " - msg="+e.getMessage(); + } catch (HttpClient4xxBPMNError e) { + if (e.getHttpStatusCodeError().equals(HttpStatus.NOT_FOUND)) { + String msg = + "Error 404/NOT_FOUND during get sample on REM with partitionId=" + partitionId + + " - msg=" + e.getMessage(); log.error(msg); - throw new HttpClient4xxBPMNError(msg,e.getHttpStatusCodeError()); + throw new HttpClient4xxBPMNError(msg, e.getHttpStatusCodeError()); } //Currently no remediation so just rethrow throw e; @@ -60,35 +64,35 @@ public PageResponse getPartitionAllInterroPaginated(String partitionId } public List getInterrogationIdsWithoutAccountForPartition(String partitionId) { - log.debug("getSampleSuIds - partitionId={} ",partitionId); - ParameterizedTypeReference> typeReference = new ParameterizedTypeReference>() {}; + log.debug("getSampleSuIds - partitionId={} ", partitionId); + ParameterizedTypeReference> typeReference = new ParameterizedTypeReference>() { + }; try { - List response = restClientHelper.getRestClient(API) + List response = restClientHelper.getRestClient(API) .get() .uri(uriBuilder -> uriBuilder .path("/interrogations/ids") .queryParam("partition_id", partitionId) - .queryParam("hasAccount",false) + .queryParam("hasAccount", false) .build()) .retrieve() .body(typeReference); List interrogationIdsWithoutAccount = response.stream() - .map(InterrogationAccountDto::getInterrogationId) + .map(InterrogationIdentifiersDto::getInterrogationId) .map(UUID::toString).toList(); log.trace("partitionId={} - interrogationIdsWithoutAccount={} ", partitionId, interrogationIdsWithoutAccount); return interrogationIdsWithoutAccount; - } - catch (HttpClient4xxBPMNError e){ - if(e.getHttpStatusCodeError().equals(HttpStatus.NOT_FOUND)){ - String msg= - "Error 404/NOT_FOUND during get lot interrogations ids on REM with partitionId="+partitionId - + " - msg="+e.getMessage(); + } catch (HttpClient4xxBPMNError e) { + if (e.getHttpStatusCodeError().equals(HttpStatus.NOT_FOUND)) { + String msg = + "Error 404/NOT_FOUND during get lot interrogations ids on REM with partitionId=" + partitionId + + " - msg=" + e.getMessage(); log.error(msg); - throw new HttpClient4xxBPMNError(msg,e.getHttpStatusCodeError()); + throw new HttpClient4xxBPMNError(msg, e.getHttpStatusCodeError()); } //Currently no remediation so just rethrow throw e; @@ -124,7 +128,7 @@ public void putContactsPlatine(List contactPlatineList) { log.debug("putContactsPlatine - contactPlatineList.size={}", contactPlatineList); var response = restClientHelper.getRestClient(API) .put() - .uri("contacts-platine") + .uri("/contacts-platine") .body(contactPlatineList) .retrieve() .body(String.class); @@ -139,7 +143,7 @@ public void postRemiseEnCollecte(List interroRemiseEnCollecteList) { log.debug("postRemiseEnCollecte - interroRemiseEnCollecteList.size={}", interroRemiseEnCollecteList); var response = restClientHelper.getRestClient(API) - .put() + .post() .uri("/remise-en-collecte") .body(interroRemiseEnCollecteList) .retrieve() diff --git a/src/main/java/fr/insee/protools/backend/service/rem/delegate/RemGetPartitionListOfInterroPaginatedTask.java b/src/main/java/fr/insee/protools/backend/service/rem/delegate/RemGetPartitionListOfInterroPaginatedTask.java index 1d98250a..f3e42c70 100644 --- a/src/main/java/fr/insee/protools/backend/service/rem/delegate/RemGetPartitionListOfInterroPaginatedTask.java +++ b/src/main/java/fr/insee/protools/backend/service/rem/delegate/RemGetPartitionListOfInterroPaginatedTask.java @@ -13,6 +13,7 @@ import org.slf4j.Logger; import org.springframework.stereotype.Component; +import java.util.HashMap; import java.util.List; import java.util.Map; @@ -44,7 +45,8 @@ public Logger getLogger() { @Override public Map treatPage(DelegateExecution execution, List contentList) { - Map variables = Map.of(VARNAME_REM_INTERRO_LIST, contentList); + Map variables = new HashMap<>(); + variables.put(VARNAME_REM_INTERRO_LIST, contentList); return variables; } } \ No newline at end of file diff --git a/src/main/java/fr/insee/protools/backend/service/rem/delegate/RemPostResmiseEnCollecteTaskREST.java b/src/main/java/fr/insee/protools/backend/service/rem/delegate/RemPostResmiseEnCollecteTaskREST.java index 5fa163a4..2ef84388 100644 --- a/src/main/java/fr/insee/protools/backend/service/rem/delegate/RemPostResmiseEnCollecteTaskREST.java +++ b/src/main/java/fr/insee/protools/backend/service/rem/delegate/RemPostResmiseEnCollecteTaskREST.java @@ -27,8 +27,14 @@ public void execute(DelegateExecution execution) { //Get the contacts List interroRemiseEnCollecteList = FlowableVariableUtils.getVariableOrThrow(execution, VARNAME_INTERRO_REMISE_EN_COLLECTE_LIST, List.class); - remService.postRemiseEnCollecte(interroRemiseEnCollecteList); + //If nothing to do ==> Directly return + if(interroRemiseEnCollecteList.isEmpty()){ + log.info("ProcessInstanceId={} - end : Nothing to do", + execution.getProcessInstanceId()); + return; + } + remService.postRemiseEnCollecte(interroRemiseEnCollecteList); log.info("ProcessInstanceId={} end", execution.getProcessInstanceId()); } diff --git a/src/main/java/fr/insee/protools/backend/service/rem/delegate/RemPutContactPlatineTaskREST.java b/src/main/java/fr/insee/protools/backend/service/rem/delegate/RemPutContactPlatineTaskREST.java index 70e28fc1..b0c81caf 100644 --- a/src/main/java/fr/insee/protools/backend/service/rem/delegate/RemPutContactPlatineTaskREST.java +++ b/src/main/java/fr/insee/protools/backend/service/rem/delegate/RemPutContactPlatineTaskREST.java @@ -27,6 +27,13 @@ public void execute(DelegateExecution execution) { //Get the contacts List contactPlatineList = FlowableVariableUtils.getVariableOrThrow(execution, VARNAME_PLATINE_CONTACT_LIST, List.class); + //If nothing to do ==> Directly return + if(contactPlatineList.isEmpty()){ + log.info("ProcessInstanceId={} - end : Nothing to do", + execution.getProcessInstanceId()); + return; + } + remService.putContactsPlatine(contactPlatineList); log.info("ProcessInstanceId={} end", execution.getProcessInstanceId()); diff --git a/src/main/java/fr/insee/protools/backend/service/sugoi/SugoiService.java b/src/main/java/fr/insee/protools/backend/service/sugoi/SugoiService.java index d38ba651..970161fe 100644 --- a/src/main/java/fr/insee/protools/backend/service/sugoi/SugoiService.java +++ b/src/main/java/fr/insee/protools/backend/service/sugoi/SugoiService.java @@ -4,6 +4,7 @@ import com.fasterxml.jackson.databind.node.ObjectNode; import fr.insee.protools.backend.dto.sugoi.User; import fr.insee.protools.backend.restclient.RestClientHelper; +import fr.insee.protools.backend.restclient.configuration.ApiConfigProperties; import fr.insee.protools.backend.restclient.exception.runtime.HttpClient4xxBPMNError; import fr.insee.protools.backend.service.exception.UsernameAlreadyExistsSugoiBPMNError; import lombok.RequiredArgsConstructor; @@ -20,16 +21,18 @@ public class SugoiService { //TODO: a quel niveau configure on ça? + private final ApiConfigProperties.KNOWN_API API = KNOWN_API_SUGOI; + + static final String STORAGE = "default"; private final RestClientHelper restClientHelper; private final ObjectMapper objectMapper; @Value("${fr.insee.protools.api.sugoi.dmz-account-creation-realm:questionnaire-particuliers}") private String realm; - public User postCreateUsers(User userBody) { - log.debug("postCreateUsers"); + public User postCreateUser(User userBody) { try { - User userCreated = restClientHelper.getRestClient(KNOWN_API_SUGOI) + User userCreated = restClientHelper.getRestClient(API) .post() .uri(uriBuilder -> uriBuilder .path("/realms/{realm}/storages/{storage}/users") @@ -52,12 +55,11 @@ public User postCreateUsers(User userBody) { } } - public void postInitPassword(String userId, String password) { log.debug("postInitPassword - userId={} begin", userId); ObjectNode body = objectMapper.createObjectNode(); body.put("password", password); - restClientHelper.getRestClient(KNOWN_API_SUGOI) + restClientHelper.getRestClient(API) .post() .uri(uriBuilder -> uriBuilder .path("/realms/{realm}/users/{id}/init-password") diff --git a/src/main/java/fr/insee/protools/backend/service/sugoi_rem/delegate/SugoiREMCreateMissingAccountListTask.java b/src/main/java/fr/insee/protools/backend/service/sugoi_rem/delegate/SugoiREMCreateMissingAccountListTask.java index 0e5dfbce..c5d0fc9f 100644 --- a/src/main/java/fr/insee/protools/backend/service/sugoi_rem/delegate/SugoiREMCreateMissingAccountListTask.java +++ b/src/main/java/fr/insee/protools/backend/service/sugoi_rem/delegate/SugoiREMCreateMissingAccountListTask.java @@ -44,9 +44,10 @@ public class SugoiREMCreateMissingAccountListTask implements JavaDelegate, Deleg @Override public void execute(DelegateExecution execution) { log.debug("ProcessInstanceId={} begin", execution.getProcessInstanceId()); - var context = protoolsContext.getContextDtoByProcessInstance(execution.getProcessInstanceId()); - String currentPartitionId = FlowableVariableUtils.getVariableOrThrow(execution, VARNAME_CURRENT_PARTITION_ID, String.class); + ContexteProcessus context = protoolsContext.getContextDtoByProcessInstance(execution.getProcessInstanceId()); checkContextOrThrow(log,execution.getProcessInstanceId(), context); + + String currentPartitionId = FlowableVariableUtils.getVariableOrThrow(execution, VARNAME_CURRENT_PARTITION_ID, String.class); List interrogationIdsWithoutAccount = remService.getInterrogationIdsWithoutAccountForPartition(currentPartitionId); Map userByInterroId = new LinkedHashMap<>(interrogationIdsWithoutAccount.size()); @@ -55,7 +56,7 @@ public void execute(DelegateExecution execution) { int passwordSize = getPasswordSize(context); for (String interrogationId : interrogationIdsWithoutAccount){ //Create User - User createdUser = sugoiService.postCreateUsers(createSugoiUserBody); + User createdUser = sugoiService.postCreateUser(createSugoiUserBody); //init password String userPassword = passwordService.generatePassword(passwordSize); sugoiService.postInitPassword(createdUser.getUsername(), userPassword); @@ -71,32 +72,22 @@ public void execute(DelegateExecution execution) { } public static int getPasswordSize(ContexteProcessus context){ - if(context.getContexte().equals(ContexteProcessus.Contexte.MENAGE)){ + if(context!=null && context.getContexte()!=null && context.getContexte().equals(ContexteProcessus.Contexte.MENAGE)){ return HOUSEHOLD_PASSWORD_SIZE; } return DEFAULT_PASSWORD_SIZE; } @Override - public Set getContextErrors(JsonNode contextRootNode) { - if(contextRootNode==null){ - return Set.of("Context is missing"); + public Set getContextErrors(ContexteProcessus contexteProcessus) { + if(contexteProcessus==null){ + return Set.of("Context is null"); + } else if (contexteProcessus.getContexte()==null) { + return Set.of("Contexte is missing"); } - Set results=new HashSet<>(); - Set requiredNodes = - Set.of( - //Global & Campaign - CTX_CAMPAGNE_CONTEXTE - ); - - results.addAll(DelegateContextVerifier.computeMissingChildrenMessages(requiredNodes,contextRootNode,getClass())); - - String contexte = contextRootNode.path(CTX_CAMPAGNE_CONTEXTE).asText(); - if(! EnumUtils.isValidEnumIgnoreCase(CampaignContextEnum.class, contexte)){ - results.add(DelegateContextVerifier.computeIncorrectEnumMessage(CTX_CAMPAGNE_CONTEXTE,contexte, Arrays.toString(CampaignContextEnum.values()),getClass())); + else if (contexteProcessus.getId()==null) { + return Set.of("Context Id"); } - - return results; + return Set.of(); } - } diff --git a/src/main/java/fr/insee/protools/backend/service/traiterXXXX/TraiterXXXService.java b/src/main/java/fr/insee/protools/backend/service/traiterXXXX/TraiterXXXService.java index 65e52300..daa29bfa 100644 --- a/src/main/java/fr/insee/protools/backend/service/traiterXXXX/TraiterXXXService.java +++ b/src/main/java/fr/insee/protools/backend/service/traiterXXXX/TraiterXXXService.java @@ -25,7 +25,7 @@ public List getRemiseEnCollecteForPartition(String partitionId) { List response = restClientHelper.getRestClient(KNOWN_API_TRAITERXXX) .get() .uri(uriBuilder -> uriBuilder - .path("remise-en-collecte") + .path("/remise-en-collecte") .queryParam("partition_id", partitionId) .build()) .retrieve() diff --git a/src/main/java/fr/insee/protools/backend/service/traiterXXXX/delegate/TraiterXXXCreateContextTaskREST.java b/src/main/java/fr/insee/protools/backend/service/traiterXXXX/delegate/TraiterXXXCreateContextTaskREST.java index 9d890c3f..abaa08f9 100644 --- a/src/main/java/fr/insee/protools/backend/service/traiterXXXX/delegate/TraiterXXXCreateContextTaskREST.java +++ b/src/main/java/fr/insee/protools/backend/service/traiterXXXX/delegate/TraiterXXXCreateContextTaskREST.java @@ -1,6 +1,7 @@ package fr.insee.protools.backend.service.traiterXXXX.delegate; import com.fasterxml.jackson.databind.JsonNode; +import fr.insee.protools.backend.dto.ContexteProcessus; import fr.insee.protools.backend.service.DelegateContextVerifier; import fr.insee.protools.backend.service.context.ContextService; import fr.insee.protools.backend.service.traiterXXXX.TraiterXXXService; @@ -23,12 +24,13 @@ public class TraiterXXXCreateContextTaskREST implements JavaDelegate, DelegateC public void execute(DelegateExecution execution) { log.info("ProcessInstanceId={} begin",execution.getProcessInstanceId()); JsonNode contextRootNode = protoolsContext.getContextJsonNodeByProcessInstance(execution.getProcessInstanceId()); - String campainId = contextRootNode.path(CTX_CAMPAGNE_ID).asText(); + ContexteProcessus contexteProcessus = protoolsContext.getContextDtoByProcessInstance(execution.getProcessInstanceId()); + + checkContextOrThrow(log,execution.getProcessInstanceId(), contexteProcessus); + String campainId = contexteProcessus.getId().toString(); - checkContextOrThrow(log,execution.getProcessInstanceId(), contextRootNode); service.postContext(campainId,contextRootNode); log.info("ProcessInstanceId={} end",execution.getProcessInstanceId()); - } } diff --git a/src/main/java/fr/insee/protools/backend/service/utils/delegate/PaginationHelper.java b/src/main/java/fr/insee/protools/backend/service/utils/delegate/PaginationHelper.java index cde842d7..ab3194d1 100644 --- a/src/main/java/fr/insee/protools/backend/service/utils/delegate/PaginationHelper.java +++ b/src/main/java/fr/insee/protools/backend/service/utils/delegate/PaginationHelper.java @@ -17,7 +17,7 @@ public interface PaginationHelper { /** * Custom Treatment for the page * - * @return a Map with variables to update on the process instance (so we can make a single setVariablesLocal in getAndTreat) + * @return a Modifiable MAP with variables to update on the process instance (so we can make a single setVariablesLocal in getAndTreat) */ Map treatPage(DelegateExecution execution, List contentList); diff --git a/src/test/java/fr/insee/protools/backend/service/platine/delegate/pilotatage/PlatinePilotageCreateCommunicationEventTaskRESTTestDelegate.java b/src/test/java/fr/insee/protools/backend/service/platine/delegate/pilotatage/PlatinePilotageCreateCommunicationEventTaskRESTTestDelegate.java index 33776af8..d8eef3e1 100644 --- a/src/test/java/fr/insee/protools/backend/service/platine/delegate/pilotatage/PlatinePilotageCreateCommunicationEventTaskRESTTestDelegate.java +++ b/src/test/java/fr/insee/protools/backend/service/platine/delegate/pilotatage/PlatinePilotageCreateCommunicationEventTaskRESTTestDelegate.java @@ -46,7 +46,6 @@ public class PlatinePilotageCreateCommunicationEventTaskRESTTestDelegate impleme @InjectMocks PlatinePilotageCreateCommunicationEventTaskREST task; - @Override public JavaDelegate getTaskUnderTest() { return task; @@ -141,7 +140,7 @@ public void execute_should_writeLog_and_notCallService_when_comReqByIdMapIsEmpty initDefaultVariables(execution); // create and start a ListAppender to capture logs - Logger fooLogger = (Logger) LoggerFactory.getLogger(PlatinePilotageCreateCommunicationEventTaskREST.class); + Logger fooLogger = (Logger) LoggerFactory.getLogger(task.getClass()); ListAppender listAppender = new ListAppender<>(); fooLogger.addAppender(listAppender); listAppender.start(); @@ -152,14 +151,13 @@ public void execute_should_writeLog_and_notCallService_when_comReqByIdMapIsEmpty //Verify List logsList = listAppender.list; assertThat(logsList.get(0).getFormattedMessage()) - .contains("begin") - .contains(execution.getProcessInstanceId()); + .contains("begin",execution.getProcessInstanceId()); assertEquals(Level.INFO, logsList.get(1) .getLevel()); assertThat(logsList.get(1).getFormattedMessage()) - .contains("end") - .contains(execution.getProcessInstanceId()) - .contains("Nothing to do"); + .contains("end",execution.getProcessInstanceId(),"Nothing to do"); + + verify(platinePilotageService,never()).postCommunicationEvents(any()); } } \ No newline at end of file diff --git a/src/test/java/fr/insee/protools/backend/service/platine/delegate/pilotatage/PlatinePilotageCreateContextTaskRESTTestDelegate.java b/src/test/java/fr/insee/protools/backend/service/platine/delegate/pilotatage/PlatinePilotageCreateContextTaskRESTTestDelegate.java index 94d91aca..25a70aee 100644 --- a/src/test/java/fr/insee/protools/backend/service/platine/delegate/pilotatage/PlatinePilotageCreateContextTaskRESTTestDelegate.java +++ b/src/test/java/fr/insee/protools/backend/service/platine/delegate/pilotatage/PlatinePilotageCreateContextTaskRESTTestDelegate.java @@ -60,4 +60,9 @@ public JavaDelegate getTaskUnderTest() { public Map getVariablesAndTypes() { return Map.of(); } + + @Override + protected String minimalValidCtxt() { + return ctx_empty; + } } \ No newline at end of file diff --git a/src/test/java/fr/insee/protools/backend/service/platine/delegate/pilotatage/PlatinePilotageCreateInterrogationListTaskRESTTestDelegate.java b/src/test/java/fr/insee/protools/backend/service/platine/delegate/pilotatage/PlatinePilotageCreateInterrogationListTaskRESTTestDelegate.java index 90783c64..75e47b1f 100644 --- a/src/test/java/fr/insee/protools/backend/service/platine/delegate/pilotatage/PlatinePilotageCreateInterrogationListTaskRESTTestDelegate.java +++ b/src/test/java/fr/insee/protools/backend/service/platine/delegate/pilotatage/PlatinePilotageCreateInterrogationListTaskRESTTestDelegate.java @@ -71,4 +71,9 @@ public Map getVariablesAndTypes() { VARNAME_CURRENT_PARTITION_ID,String.class, VARNAME_REM_INTERRO_LIST,List.class); } + + @Override + protected String minimalValidCtxt() { + return ctx_empty; + } } \ No newline at end of file diff --git a/src/test/java/fr/insee/protools/backend/service/platine/delegate/pilotatage/PlatinePilotageGetListOfInterroToFollowUpPaginatedTaskRESTTest.java b/src/test/java/fr/insee/protools/backend/service/platine/delegate/pilotatage/PlatinePilotageGetListOfInterroToFollowUpPaginatedTaskRESTTest.java index dc178175..8b12e87e 100644 --- a/src/test/java/fr/insee/protools/backend/service/platine/delegate/pilotatage/PlatinePilotageGetListOfInterroToFollowUpPaginatedTaskRESTTest.java +++ b/src/test/java/fr/insee/protools/backend/service/platine/delegate/pilotatage/PlatinePilotageGetListOfInterroToFollowUpPaginatedTaskRESTTest.java @@ -38,11 +38,6 @@ public void initReadValueMock(PageResponse expectedPageResponse) { lenient().doReturn(expectedPageResponse).when(platinePilotageService).getInterrogationToFollowUpPaginated(anyString(), anyLong(),any()); } - @Override - public void initExtraMocks(DelegateExecution execution){ - lenient().doReturn(PageResponse.builder().currentPage(0).content(List.of()).pageSize(10).build()).when(platinePilotageService).getInterrogationToFollowUpPaginated(anyString(), anyLong(),any()); - } - @Override public Map getVariablesAndTypes() { return Map.of( @@ -55,15 +50,4 @@ public String getOutListVariableName() { return VARNAME_REM_INTERRO_LIST; } - @Override - public PaginationHelper.IGetFromService getServiceMock() { - return spy(PaginationHelper.IGetFromService.class); - } - - @Override - public Object[] getServiceParams() { - Object[] ret = new Object[1]; - ret[0] = "Default_partition_id"; - return ret; - } } \ No newline at end of file diff --git a/src/test/java/fr/insee/protools/backend/service/platine/delegate/questionnaire/PlatineQuestionnaireCreateContextTaskRESTTestDelegate.java b/src/test/java/fr/insee/protools/backend/service/platine/delegate/questionnaire/PlatineQuestionnaireCreateContextTaskRESTTestDelegate.java index 3da3b0d5..60328284 100644 --- a/src/test/java/fr/insee/protools/backend/service/platine/delegate/questionnaire/PlatineQuestionnaireCreateContextTaskRESTTestDelegate.java +++ b/src/test/java/fr/insee/protools/backend/service/platine/delegate/questionnaire/PlatineQuestionnaireCreateContextTaskRESTTestDelegate.java @@ -56,4 +56,9 @@ void execute_should_work_when_contextOK() { assertEquals(expectedContext,allValues.get(0),"Wrong context passed"); } + + @Override + protected String minimalValidCtxt() { + return ctx_empty; + } } \ No newline at end of file diff --git a/src/test/java/fr/insee/protools/backend/service/platine/delegate/questionnaire/PlatineQuestionnaireCreateInterrogationListTaskRESTTestDelegate.java b/src/test/java/fr/insee/protools/backend/service/platine/delegate/questionnaire/PlatineQuestionnaireCreateInterrogationListTaskRESTTestDelegate.java index a2c49c67..db6821d6 100644 --- a/src/test/java/fr/insee/protools/backend/service/platine/delegate/questionnaire/PlatineQuestionnaireCreateInterrogationListTaskRESTTestDelegate.java +++ b/src/test/java/fr/insee/protools/backend/service/platine/delegate/questionnaire/PlatineQuestionnaireCreateInterrogationListTaskRESTTestDelegate.java @@ -71,4 +71,9 @@ public Map getVariablesAndTypes() { VARNAME_CURRENT_PARTITION_ID,String.class, VARNAME_REM_INTERRO_LIST,List.class); } + + @Override + protected String minimalValidCtxt() { + return ctx_empty; + } } \ No newline at end of file diff --git a/src/test/java/fr/insee/protools/backend/service/platine/service/PlatinePilotageServiceTest.java b/src/test/java/fr/insee/protools/backend/service/platine/service/PlatinePilotageServiceTest.java index ebf3eb96..0cdfbc22 100644 --- a/src/test/java/fr/insee/protools/backend/service/platine/service/PlatinePilotageServiceTest.java +++ b/src/test/java/fr/insee/protools/backend/service/platine/service/PlatinePilotageServiceTest.java @@ -10,8 +10,6 @@ import fr.insee.protools.backend.service.utils.TestServiceWithRestClient; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; -import org.mockito.ArgumentCaptor; -import org.mockito.ArgumentMatchers; import org.mockito.InjectMocks; import org.mockito.junit.jupiter.MockitoExtension; import org.springframework.beans.factory.annotation.Value; @@ -19,34 +17,31 @@ import org.springframework.http.HttpStatusCode; import org.springframework.web.util.UriBuilder; -import java.net.URI; import java.util.List; import java.util.Optional; import java.util.UUID; -import java.util.function.Function; import java.util.stream.Collectors; import java.util.stream.IntStream; import static fr.insee.protools.backend.restclient.configuration.ApiConfigProperties.KNOWN_API.KNOWN_API_PLATINE_PILOTAGE; -import static fr.insee.protools.backend.restclient.configuration.ApiConfigProperties.KNOWN_API.KNOWN_API_PLATINE_QUESTIONNAIRE; import static fr.insee.protools.backend.utils.data.InterroExamples.generateEmptyInterro; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.containsString; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertThrows; -import static org.mockito.Mockito.*; +import static org.mockito.Mockito.eq; +import static org.mockito.Mockito.verify; @ExtendWith(MockitoExtension.class) class PlatinePilotageServiceTest extends TestServiceWithRestClient { + private static ObjectMapper objectMapper = new ObjectMapper(); + @InjectMocks PlatinePilotageService service; - @Value("${fr.insee.protools.api.platine-pilotage.interrogation.page.size:5000}") private int pageSizeGetInterro; - private static ObjectMapper objectMapper=new ObjectMapper(); - @Test void postContext_should_call_correctURIAndBody() { //Prepare @@ -88,10 +83,10 @@ void postCommunicationEvents_should_makeCorrectCall() { //Prepare List eventList = IntStream.range(0, 10) .mapToObj(i -> - PlatinePilotageCommunicationEventDto.builder() - .interrogationId(UUID.randomUUID().toString()) - .state(PlatinePilotageCommunicationEventType.COMMUNICATION_STATE_SENT) - .communcationId(UUID.randomUUID().toString()).build() + PlatinePilotageCommunicationEventDto.builder() + .interrogationId(UUID.randomUUID().toString()) + .state(PlatinePilotageCommunicationEventType.COMMUNICATION_STATE_SENT) + .communcationId(UUID.randomUUID().toString()).build() ) // Call your function and get the JsonNode .collect(Collectors.toList()); @@ -109,32 +104,20 @@ void postCommunicationEvents_should_makeCorrectCall() { @Test void getInterrogationToFollowUpPaginated_shouldMakeCorrectCalls() { //Prepare - String partitionId="PartitionIDXX"; - long page=69; + String partitionId = "PartitionIDXX"; + long page = 69; Optional isToFollowUp = Optional.of(Boolean.FALSE); - List mockedResponse = List.of(objectMapper.createObjectNode().put("id",1).put("id","toto")); - mockGetPageableBodyResponse(mockedResponse); + List mockedResponse = List.of(objectMapper.createObjectNode().put("id", 1).put("id", "toto")); + mockRetrieveBodyResponse(mockedResponse); //Call method under tests - PageResponse response = service.getInterrogationToFollowUpPaginated(partitionId,page,isToFollowUp); + PageResponse response = service.getInterrogationToFollowUpPaginated(partitionId, page, isToFollowUp); //Verify verify(restClientHelper).getRestClient(KNOWN_API_PLATINE_PILOTAGE); verify(restClient).get(); - // Now let's manually build a URI using the captured function and a mock UriBuilder - ArgumentCaptor> uriCaptor = ArgumentCaptor.forClass(Function.class); - verify(requestHeadersUriSpec).uri(uriCaptor.capture()); - UriBuilder mockUriBuilder = mock(UriBuilder.class); - when(mockUriBuilder.path(anyString())).thenReturn(mockUriBuilder); - when(mockUriBuilder.queryParam(anyString(), ArgumentMatchers.any())).thenReturn(mockUriBuilder); - when(mockUriBuilder.queryParamIfPresent(anyString(), ArgumentMatchers.>any())).thenReturn(mockUriBuilder); - - - when(mockUriBuilder.build()).thenReturn(URI.create("http://mockeduri")); - - // Call the captured function with the mocked UriBuilder - uriCaptor.getValue().apply(mockUriBuilder); + UriBuilder mockUriBuilder = mockGETURIBuilderAndPrepareForTest(); // Verify that the correct path and query parameters were used verify(mockUriBuilder).path("/interrogations"); @@ -143,33 +126,46 @@ void getInterrogationToFollowUpPaginated_shouldMakeCorrectCalls() { verify(mockUriBuilder).queryParam("partition_id", partitionId); verify(mockUriBuilder).queryParamIfPresent(eq("follow-up"), eq(isToFollowUp)); - assertEquals(mockedResponse, response.getContent(),"The response is not what was expected/mocked"); + assertEquals(mockedResponse, response.getContent(), "The response is not what was expected/mocked"); } @Test void getInterrogationToFollowUpPaginated_shouldCatch() { //Prepare - String partitionId="PartitionIDYY"; - long page=0; + String partitionId = "PartitionIDYY"; + long page = 0; Optional isToFollowUp = Optional.of(Boolean.TRUE); mockMakeRetrieveThrow(HttpStatusCode.valueOf(HttpStatus.BAD_REQUEST.value())); //Call method under tests - assertThrows(HttpClient4xxBPMNError.class, () -> service.getInterrogationToFollowUpPaginated(partitionId,page,isToFollowUp)); + assertThrows(HttpClient4xxBPMNError.class, () -> service.getInterrogationToFollowUpPaginated(partitionId, page, isToFollowUp)); } @Test void getInterrogationToFollowUpPaginated_shouldCatch_404() { //Prepare - String partitionId="PartitionIDYY"; - long page=0; + String partitionId = "PartitionIDYY"; + long page = 0; Optional isToFollowUp = Optional.of(Boolean.TRUE); mockMakeRetrieveThrow(HttpStatusCode.valueOf(HttpStatus.NOT_FOUND.value())); //Call method under tests HttpClient4xxBPMNError exception = assertThrows(HttpClient4xxBPMNError.class, () -> service.getInterrogationToFollowUpPaginated(partitionId, page, isToFollowUp)); assertThat(exception.getMessage(), containsString("404")); + } + + @Test + void getInterrogationToFollowUpPaginated_shouldWork_when_responseIsNull() { + //Prepare + String partitionId = "PartitionIDXX77"; + long page = 68; + Optional isToFollowUp = Optional.of(Boolean.TRUE); + + mockRetrieveBody(null); + //Call method under tests + PageResponse response = service.getInterrogationToFollowUpPaginated(partitionId, page, isToFollowUp); + assertCorrectPageResponseForNull(response); } } \ No newline at end of file diff --git a/src/test/java/fr/insee/protools/backend/service/rem/RemServiceTest.java b/src/test/java/fr/insee/protools/backend/service/rem/RemServiceTest.java index 9ef67a47..7e53c389 100644 --- a/src/test/java/fr/insee/protools/backend/service/rem/RemServiceTest.java +++ b/src/test/java/fr/insee/protools/backend/service/rem/RemServiceTest.java @@ -3,22 +3,32 @@ import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import fr.insee.protools.backend.dto.rem_tmp.InterrogationAccountDto; +import fr.insee.protools.backend.dto.rem_tmp.InterrogationIdentifiersDto; +import fr.insee.protools.backend.restclient.exception.runtime.HttpClient4xxBPMNError; +import fr.insee.protools.backend.restclient.pagination.PageResponse; import fr.insee.protools.backend.service.utils.TestServiceWithRestClient; +import org.hamcrest.collection.IsIterableContainingInAnyOrder; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.ArgumentCaptor; import org.mockito.InjectMocks; import org.mockito.junit.jupiter.MockitoExtension; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.http.HttpStatus; +import org.springframework.http.HttpStatusCode; +import org.springframework.web.util.UriBuilder; import java.util.List; import java.util.Map; +import java.util.Optional; import java.util.UUID; import java.util.stream.Collectors; import java.util.stream.IntStream; import static fr.insee.protools.backend.restclient.configuration.ApiConfigProperties.KNOWN_API.KNOWN_API_REM; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.containsString; +import static org.junit.jupiter.api.Assertions.*; import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.Mockito.never; import static org.mockito.Mockito.verify; @@ -29,12 +39,131 @@ class RemServiceTest extends TestServiceWithRestClient { @InjectMocks RemService service; + @Value("${fr.insee.protools.api.rem.interrogation.page.size:5000}") + private int pageSizeGetInterro; + + @Test + void getPartitionAllInterroPaginated_should_makeCorrectCalls() { + //Prepare + String partitionId = "PartitionIDXXREM"; + long page = 1024; + + List mockedResponse = List.of(objectMapper.createObjectNode().put("xxx", 1).put("66969jj", "toto")); + mockRetrieveBodyResponse(mockedResponse); + //Call method under tests + PageResponse response = service.getPartitionAllInterroPaginated(partitionId, page); + + //Verify + verify(restClientHelper).getRestClient(KNOWN_API_REM); + verify(restClient).get(); + + UriBuilder mockUriBuilder = mockGETURIBuilderAndPrepareForTest(); + + // Verify that the correct path and query parameters were used + verify(mockUriBuilder).path("/interrogations"); + verify(mockUriBuilder).queryParam("page", page); + verify(mockUriBuilder).queryParam("size", pageSizeGetInterro); + verify(mockUriBuilder).queryParam("partition_id", partitionId); + + assertEquals(mockedResponse, response.getContent(), "The response is not what was expected/mocked"); + } + + + @Test + void getPartitionAllInterroPaginated_shouldCatch() { + //Prepare + String partitionId = "PartitionIDYY"; + long page = 0; + + mockMakeRetrieveThrow(HttpStatusCode.valueOf(HttpStatus.BAD_REQUEST.value())); + //Call method under tests + assertThrows(HttpClient4xxBPMNError.class, () -> service.getPartitionAllInterroPaginated(partitionId, page)); + } + + @Test + void getPartitionAllInterroPaginated_shouldCatch_404() { + //Prepare + String partitionId = "PartitionIDYY"; + long page = 0; + + mockMakeRetrieveThrow(HttpStatusCode.valueOf(HttpStatus.NOT_FOUND.value())); + //Call method under tests + HttpClient4xxBPMNError exception = assertThrows(HttpClient4xxBPMNError.class, () -> service.getPartitionAllInterroPaginated(partitionId, page)); + assertThat(exception.getMessage(), containsString("404")); + } + + + @Test + void getPartitionAllInterroPaginated_shouldWork_when_responseIsNull() { + //Prepare + String partitionId = "PartitionIDYY"; + long page = 0; + + mockRetrieveBody(null); + //Call method under tests + PageResponse response = service.getPartitionAllInterroPaginated(partitionId, page); + + assertCorrectPageResponseForNull(response); + } + + @Test + void getInterrogationIdsWithoutAccountForPartition_should_makeCorrectCalls() { + //Prepare + String partitionId = "PartitionIDXXREM"; + UUID expectedID1=UUID.randomUUID(); + UUID expectedID2=UUID.randomUUID(); + + + List mockedResponse = + List.of( + InterrogationIdentifiersDto.builder() + .interrogationId(expectedID1).surveyUnitId(UUID.randomUUID()).originId(UUID.randomUUID().toString()) + .build() + , + InterrogationIdentifiersDto.builder() + .interrogationId(expectedID2).surveyUnitId(UUID.randomUUID()).originId(UUID.randomUUID().toString()) + .build() + ); + mockRetrieveBody(mockedResponse); + + //Call method under tests + List response = service.getInterrogationIdsWithoutAccountForPartition(partitionId); + + //Verify + verify(restClientHelper).getRestClient(KNOWN_API_REM); + verify(restClient).get(); + + UriBuilder mockUriBuilder = mockGETURIBuilderAndPrepareForTest(); + + // Verify that the correct path and query parameters were used + verify(mockUriBuilder).path("/interrogations/ids"); + verify(mockUriBuilder).queryParam("hasAccount", false); + verify(mockUriBuilder).queryParam("partition_id", partitionId); + + assertThat(response, + IsIterableContainingInAnyOrder.containsInAnyOrder(expectedID1.toString(),expectedID2.toString())); + } + + @Test - void getPartitionAllInterroPaginated_should_call_correctURIAndBody() { + void getInterrogationIdsWithoutAccountForPartition_shouldCatch() { + //Prepare + String partitionId = "PartitionIDYY"; + + mockMakeRetrieveThrow(HttpStatusCode.valueOf(HttpStatus.BAD_REQUEST.value())); + //Call method under tests + assertThrows(HttpClient4xxBPMNError.class, () -> service.getInterrogationIdsWithoutAccountForPartition(partitionId)); } @Test - void getInterrogationIdsWithoutAccountForPartition() { + void getInterrogationIdsWithoutAccountForPartition_shouldCatch_404() { + //Prepare + String partitionId = "PartitionIDYxY"; + + mockMakeRetrieveThrow(HttpStatusCode.valueOf(HttpStatus.NOT_FOUND.value())); + //Call method under tests + HttpClient4xxBPMNError exception = assertThrows(HttpClient4xxBPMNError.class, () -> service.getInterrogationIdsWithoutAccountForPartition(partitionId)); + assertThat(exception.getMessage(), containsString("404")); } @Test @@ -74,52 +203,96 @@ void patchInterrogationsSetAccounts() { assertTrue(allMatch, "Body does not match the input"); } + @Test void putContactsPlatine_should_call_correctURIAndBody() { //Prepare - List contacts = IntStream.range(0, 25) + List listNodes = IntStream.range(0, 25) .mapToObj(i -> objectMapper.createObjectNode().put("id", UUID.randomUUID().toString()).put("toto", i) ) .collect(Collectors.toList()); //Call method under tests - service.putContactsPlatine(contacts); + service.putContactsPlatine(listNodes); //Verify - verify(requestBodyUriSpec).uri("contacts-platine"); + verify(restClientHelper).getRestClient(KNOWN_API_REM); verify(restClient).put(); verify(restClient).put(); + + verify(requestBodyUriSpec).uri("/contacts-platine"); // and with expected body - verify(requestBodyUriSpec).body(contacts); + verify(requestBodyUriSpec).body(listNodes); } @Test void putContactsPlatine_should_NotCallIfEmpty() { //Prepare - List contacts = List.of(); + List listNodes = List.of(); //Call method under tests - service.putContactsPlatine(contacts); + service.putContactsPlatine(listNodes); //Verify - verify(restClient,never()).put(); + verify(restClient, never()).put(); verify(requestBodyUriSpec, never()).uri(anyString()); } @Test void putContactsPlatine_should_NotCallIfNull() { //Prepare - List contacts = null; + List listNodes = null; //Call method under tests - service.putContactsPlatine(contacts); + service.putContactsPlatine(listNodes); //Verify - verify(restClient,never()).put(); + verify(restClient, never()).put(); verify(requestBodyUriSpec, never()).uri(anyString()); } @Test - void postRemiseEnCollecte() { + void postRemiseEnCollecte_should_call_correctURIAndBody() { + //Prepare + List listNodes = IntStream.range(0, 69) + .mapToObj(i -> + objectMapper.createObjectNode().put("id", UUID.randomUUID().toString()).put("toto", i) + ) + .collect(Collectors.toList()); + + //Call method under tests + service.postRemiseEnCollecte(listNodes); + + //Verify + verify(requestBodyUriSpec).uri("/remise-en-collecte"); + verify(restClient).post(); + // and with expected body + verify(requestBodyUriSpec).body(listNodes); + } + + @Test + void postRemiseEnCollecte_should_NotCallIfEmpty() { + //Prepare + List listNodes = List.of(); + + //Call method under tests + service.postRemiseEnCollecte(listNodes); + + //Verify + verify(restClient, never()).post(); + verify(requestBodyUriSpec, never()).uri(anyString()); + } + + @Test + void postRemiseEnCollecte_should_NotCallIfNull() { + //Prepare + List listNodes = null; + + //Call method under tests + service.postRemiseEnCollecte(listNodes); + + //Verify + verify(restClient, never()).post(); + verify(requestBodyUriSpec, never()).uri(anyString()); } } \ No newline at end of file diff --git a/src/test/java/fr/insee/protools/backend/service/rem/delegate/RemGetPartitionListOfInterroPaginatedTaskTest.java b/src/test/java/fr/insee/protools/backend/service/rem/delegate/RemGetPartitionListOfInterroPaginatedTaskTest.java index 13f9268c..2d737a0e 100644 --- a/src/test/java/fr/insee/protools/backend/service/rem/delegate/RemGetPartitionListOfInterroPaginatedTaskTest.java +++ b/src/test/java/fr/insee/protools/backend/service/rem/delegate/RemGetPartitionListOfInterroPaginatedTaskTest.java @@ -16,6 +16,8 @@ import static fr.insee.protools.backend.service.FlowableVariableNameConstants.VARNAME_CURRENT_PARTITION_ID; import static fr.insee.protools.backend.service.FlowableVariableNameConstants.VARNAME_REM_INTERRO_LIST; +import static org.mockito.ArgumentMatchers.*; +import static org.mockito.Mockito.lenient; @ExtendWith(MockitoExtension.class) class RemGetPartitionListOfInterroPaginatedTaskTest implements IDelegateWithVariableGetPaginated { @@ -38,22 +40,12 @@ public Map getVariablesAndTypes() { } @Override - public void initReadValueMock(PageResponse pageResponse) { - + public void initReadValueMock(PageResponse expectedPageResponse) { + lenient().doReturn(expectedPageResponse).when(remService).getPartitionAllInterroPaginated(anyString(), anyLong()); } @Override public String getOutListVariableName() { return VARNAME_REM_INTERRO_LIST; } - - @Override - public PaginationHelper.IGetFromService getServiceMock() { - return null; - } - - @Override - public Object[] getServiceParams() { - return new Object[0]; - } } \ No newline at end of file diff --git a/src/test/java/fr/insee/protools/backend/service/rem/delegate/RemPostResmiseEnCollecteTaskRESTTest.java b/src/test/java/fr/insee/protools/backend/service/rem/delegate/RemPostResmiseEnCollecteTaskRESTTest.java new file mode 100644 index 00000000..c7da1274 --- /dev/null +++ b/src/test/java/fr/insee/protools/backend/service/rem/delegate/RemPostResmiseEnCollecteTaskRESTTest.java @@ -0,0 +1,130 @@ +package fr.insee.protools.backend.service.rem.delegate; + +import ch.qos.logback.classic.Level; +import ch.qos.logback.classic.Logger; +import ch.qos.logback.classic.spi.ILoggingEvent; +import ch.qos.logback.core.read.ListAppender; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; +import fr.insee.protools.backend.exception.ProtoolsProcessFlowBPMNError; +import fr.insee.protools.backend.service.platine.delegate.pilotatage.PlatinePilotageCreateCommunicationEventTaskREST; +import fr.insee.protools.backend.service.rem.RemService; +import fr.insee.protools.backend.service.utils.delegate.IDelegateWithVariables; +import org.assertj.core.api.Assertions; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.JavaDelegate; +import org.hamcrest.collection.IsIterableContainingInAnyOrder; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; +import org.mockito.ArgumentCaptor; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; +import org.slf4j.LoggerFactory; + +import java.util.List; +import java.util.Map; +import java.util.stream.Stream; + +import static fr.insee.protools.backend.service.FlowableVariableNameConstants.*; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.mockito.Mockito.*; + + +@ExtendWith(MockitoExtension.class) +class RemPostResmiseEnCollecteTaskRESTTest implements IDelegateWithVariables { + + private static ObjectMapper objectMapper = new ObjectMapper(); + @Mock + RemService remService; + @InjectMocks + RemPostResmiseEnCollecteTaskREST task; + + static Stream initExecuteParametersOK() { + List list1node = List.of(objectMapper.createObjectNode().put("id", 1).put("id", "toto")); + List list2node = List.of( + objectMapper.createObjectNode().put("id", 1).put("id", "toto"), + objectMapper.createObjectNode().put("identifier", 1).put("tata", "toto")); + + return Stream.of( + Arguments.of(list1node), + Arguments.of(list2node)); + } + + @Override + public JavaDelegate getTaskUnderTest() { + return task; + } + + @Override + public Map getVariablesAndTypes() { + return Map.of(VARNAME_INTERRO_REMISE_EN_COLLECTE_LIST, List.class); + } + + @ParameterizedTest + @MethodSource("initExecuteParametersOK") + @DisplayName("Test execute method - should work and make correct call to service") + void execute_should_work_whenEverythingOk(List interros) { + //Prepare + DelegateExecution execution = createMockedExecution(); + doReturn(interros).when(execution).getVariable(VARNAME_INTERRO_REMISE_EN_COLLECTE_LIST, List.class); + + //Execute method under test + task.execute(execution); + + //verify + final ArgumentCaptor> listCaptor = ArgumentCaptor.forClass((Class) List.class); + + verify(remService, times(1)).postRemiseEnCollecte(listCaptor.capture()); + List> allValues = listCaptor.getAllValues(); + assertEquals(1, allValues.size(), "We should have exactly one value"); + + List actualArgument = listCaptor.getValue(); + assertEquals(interros.size(), actualArgument.size(), "The passed list of interros has an incorrect size : Exepected " + interros.size() + " - actual:" + actualArgument.size()); + + //check that we passed the correct items + if (interros.isEmpty()) { + assertThat("If no interro (empty List) ==> should pass an empty list", actualArgument.isEmpty()); + } else { + assertThat(actualArgument, + IsIterableContainingInAnyOrder.containsInAnyOrder(interros.toArray(new Object[0]))); + } + } + + + @Test + @DisplayName("Test execute method - should write a log and not call service when the interro list is empty ") + public void execute_should_writeLog_and_notCallService_when_interroListIsEmpty() { + //Prepare + DelegateExecution execution = createMockedExecution(); + //empty list + doReturn(List.of()).when(execution).getVariable(VARNAME_INTERRO_REMISE_EN_COLLECTE_LIST, List.class); + + // create and start a ListAppender to capture logs + Logger fooLogger = (Logger) LoggerFactory.getLogger(task.getClass()); + ListAppender listAppender = new ListAppender<>(); + fooLogger.addAppender(listAppender); + listAppender.start(); + + //Execute method under test + task.execute(execution); + + //Verify + List logsList = listAppender.list; + Assertions.assertThat(logsList.get(0).getFormattedMessage()) + .contains("begin",execution.getProcessInstanceId()); + + assertEquals(Level.INFO, logsList.get(1) + .getLevel()); + Assertions.assertThat(logsList.get(1).getFormattedMessage()) + .contains("end",execution.getProcessInstanceId(),"Nothing to do"); + + verify(remService,never()).postRemiseEnCollecte(any()); + } +} \ No newline at end of file diff --git a/src/test/java/fr/insee/protools/backend/service/rem/delegate/RemPutContactPlatineTaskRESTTest.java b/src/test/java/fr/insee/protools/backend/service/rem/delegate/RemPutContactPlatineTaskRESTTest.java index 8d3723cc..1a435665 100644 --- a/src/test/java/fr/insee/protools/backend/service/rem/delegate/RemPutContactPlatineTaskRESTTest.java +++ b/src/test/java/fr/insee/protools/backend/service/rem/delegate/RemPutContactPlatineTaskRESTTest.java @@ -1,16 +1,19 @@ package fr.insee.protools.backend.service.rem.delegate; +import ch.qos.logback.classic.Level; +import ch.qos.logback.classic.Logger; +import ch.qos.logback.classic.spi.ILoggingEvent; +import ch.qos.logback.core.read.ListAppender; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; -import com.nimbusds.jose.shaded.gson.JsonObject; import fr.insee.protools.backend.exception.ProtoolsProcessFlowBPMNError; +import fr.insee.protools.backend.service.platine.delegate.pilotatage.PlatinePilotageCreateCommunicationEventTaskREST; import fr.insee.protools.backend.service.rem.RemService; import fr.insee.protools.backend.service.utils.delegate.IDelegateWithVariables; +import org.assertj.core.api.Assertions; import org.flowable.engine.delegate.DelegateExecution; import org.flowable.engine.delegate.JavaDelegate; import org.hamcrest.collection.IsIterableContainingInAnyOrder; -import org.hamcrest.collection.IsIterableContainingInOrder; -import org.junit.Assert; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; @@ -21,8 +24,10 @@ import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; +import org.slf4j.LoggerFactory; -import java.util.*; +import java.util.List; +import java.util.Map; import java.util.stream.Stream; import static fr.insee.protools.backend.service.FlowableVariableNameConstants.*; @@ -34,21 +39,19 @@ @ExtendWith(MockitoExtension.class) class RemPutContactPlatineTaskRESTTest implements IDelegateWithVariables { + private static ObjectMapper objectMapper = new ObjectMapper(); @Mock RemService remService; - @InjectMocks RemPutContactPlatineTaskREST task; - private static ObjectMapper objectMapper=new ObjectMapper(); static Stream initExecuteParametersOK() { - List list1node = List.of(objectMapper.createObjectNode().put("id",1).put("id","toto")); + List list1node = List.of(objectMapper.createObjectNode().put("id", 1).put("id", "toto")); List list2node = List.of( - objectMapper.createObjectNode().put("id",1).put("id","toto"), - objectMapper.createObjectNode().put("identifier",1).put("tata","toto")); + objectMapper.createObjectNode().put("id", 1).put("id", "toto"), + objectMapper.createObjectNode().put("identifier", 1).put("tata", "toto")); return Stream.of( - Arguments.of(List.of()), Arguments.of(list1node), Arguments.of(list2node)); } @@ -83,29 +86,38 @@ void execute_should_work_whenEverythingOk(List contacts) { List actualArgument = listCaptor.getValue(); assertEquals(contacts.size(), actualArgument.size(), "The passed list of contacts has an incorrect size : Exepected " + contacts.size() + " - actual:" + actualArgument.size()); - - //check that we passed the correct items - if (contacts.isEmpty()) { - assertThat("If no contacts (empty List) ==> should pass an empty list", actualArgument.isEmpty()); - } - else - { - assertThat(actualArgument, - IsIterableContainingInAnyOrder.containsInAnyOrder(contacts.toArray(new Object[0]))); - } + assertThat(actualArgument, + IsIterableContainingInAnyOrder.containsInAnyOrder(contacts.toArray(new Object[0]))); } @Test - @DisplayName("Test execute method - should throw ProtoolsProcessFlowBPMNError when communication Id is null") - public void execute_should_throw_when_varCommId_is_blank() { - String commId = ""; + @DisplayName("Test execute method - should write a log and not call service when List of contacts is empty ") + public void execute_should_writeLog_and_notCallService_when_interroListIsEmpty() { //Prepare DelegateExecution execution = createMockedExecution(); - doReturn(commId).when(execution).getVariable(VARNAME_CURRENT_COMMUNICATION_ID, String.class); - doReturn(dumyId).when(execution).getVariable(VARNAME_CURRENT_PARTITION_ID, String.class); - doReturn(Map.of("interroId1", "commReqId1")).when(execution).getVariable(VARNAME_COMMUNICATION_REQUEST_ID_FOR_INTERRO_ID_MAP, Map.class); + doReturn(List.of()).when(execution).getVariable(VARNAME_PLATINE_CONTACT_LIST, List.class); + + // create and start a ListAppender to capture logs + Logger fooLogger = (Logger) LoggerFactory.getLogger(task.getClass()); + ListAppender listAppender = new ListAppender<>(); + fooLogger.addAppender(listAppender); + listAppender.start(); //Execute method under test - assertThrows(ProtoolsProcessFlowBPMNError.class, () -> task.execute(execution)); + task.execute(execution); + + //Verify + List logsList = listAppender.list; + Assertions.assertThat(logsList.get(0).getFormattedMessage()) + .contains("begin") + .contains(execution.getProcessInstanceId()); + + assertEquals(Level.INFO, logsList.get(1) + .getLevel()); + Assertions.assertThat(logsList.get(1).getFormattedMessage()) + .contains("end",execution.getProcessInstanceId(),"Nothing to do"); + + verify(remService,never()).putContactsPlatine(any()); + } } \ No newline at end of file diff --git a/src/test/java/fr/insee/protools/backend/service/sugoi/SugoiServiceTest.java b/src/test/java/fr/insee/protools/backend/service/sugoi/SugoiServiceTest.java new file mode 100644 index 00000000..c77891b4 --- /dev/null +++ b/src/test/java/fr/insee/protools/backend/service/sugoi/SugoiServiceTest.java @@ -0,0 +1,133 @@ +package fr.insee.protools.backend.service.sugoi; + +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; +import fr.insee.protools.backend.dto.sugoi.Habilitation; +import fr.insee.protools.backend.dto.sugoi.User; +import fr.insee.protools.backend.restclient.exception.runtime.HttpClient4xxBPMNError; +import fr.insee.protools.backend.service.exception.UsernameAlreadyExistsSugoiBPMNError; +import fr.insee.protools.backend.service.utils.TestServiceWithRestClient; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.ArgumentCaptor; +import org.mockito.InjectMocks; +import org.mockito.Spy; +import org.mockito.junit.jupiter.MockitoExtension; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.http.HttpStatus; +import org.springframework.http.HttpStatusCode; +import org.springframework.web.util.UriBuilder; + +import java.util.List; + +import static fr.insee.protools.backend.restclient.configuration.ApiConfigProperties.KNOWN_API.KNOWN_API_SUGOI; +import static fr.insee.protools.backend.service.sugoi.SugoiService.STORAGE; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.containsString; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.verify; + +@ExtendWith(MockitoExtension.class) +class SugoiServiceTest extends TestServiceWithRestClient { + + @Spy + private ObjectMapper objectMapper; // Mock the ObjectMapper + + + @InjectMocks + SugoiService service; + + @Value("${fr.insee.protools.api.sugoi.dmz-account-creation-realm:questionnaire-particuliers}") + private String realm; + + @Test + void postCreateUser_should_call_correctURIAndBody() { + //Prepare + Habilitation PLATINE_HABILITATION = new Habilitation("platine", "repondant", null); + User createSugoiUserBody = User.builder().habilitations(List.of(PLATINE_HABILITATION)).build(); + User mockedResponse = User.builder().username("TOTO").habilitations(List.of(PLATINE_HABILITATION)).build(); + mockRetrieveBody(mockedResponse); + + //Call method under tests + User returnerUser = service.postCreateUser(createSugoiUserBody); + + //Verify + verify(restClientHelper).getRestClient(KNOWN_API_SUGOI); + verify(restClient).post(); + + UriBuilder mockUriBuilder = mockPostPutPatchURIBuilderAndPrepareForTest(); + + // Verify that the correct path and query parameters were used + verify(mockUriBuilder).path(eq("/realms/{realm}/storages/{storage}/users")); + verify(mockUriBuilder).build(eq(realm), eq(STORAGE)); + + // and with expected body + verify(requestBodyUriSpec).body(createSugoiUserBody); + } + + @Test + void postCreateUsers_shouldCatch() { + //Prepare + Habilitation PLATINE_HABILITATION = new Habilitation("platine", "repondant", null); + User createSugoiUserBody = User.builder().habilitations(List.of(PLATINE_HABILITATION)).build(); + + mockMakeRetrieveThrow(HttpStatusCode.valueOf(HttpStatus.BAD_REQUEST.value())); + //Call method under tests + assertThrows(HttpClient4xxBPMNError.class, () -> service.postCreateUser(createSugoiUserBody)); + + //Call method under tests + createSugoiUserBody.setUsername(null); + assertThrows(HttpClient4xxBPMNError.class, () -> service.postCreateUser(createSugoiUserBody)); + } + + + @Test + void postCreateUser_shouldCatch_409Conflict() { + //Prepare + Habilitation PLATINE_HABILITATION = new Habilitation("platine", "repondant", null); + User createSugoiUserBody = User.builder().habilitations(List.of(PLATINE_HABILITATION)).build(); + + + mockMakeRetrieveThrow(HttpStatusCode.valueOf(HttpStatus.CONFLICT.value())); + //Call method under tests + UsernameAlreadyExistsSugoiBPMNError exception = assertThrows(UsernameAlreadyExistsSugoiBPMNError.class, () -> service.postCreateUser(createSugoiUserBody)); + assertThat(exception.getMessage(), containsString("during SUGOI post create users")); + + + //Call method under tests + createSugoiUserBody.setUsername(null); + UsernameAlreadyExistsSugoiBPMNError exception2 = assertThrows(UsernameAlreadyExistsSugoiBPMNError.class, () -> service.postCreateUser(createSugoiUserBody)); + assertThat(exception.getMessage(), containsString("during SUGOI post create users")); + assertThat(exception.getMessage(), containsString("null")); + + + } + + @Test + void postInitPassword_should_call_correctURIAndBody() { + //Prepare + String userId="GéGé"; + String pwd = "****"; + + //Call method under tests + service.postInitPassword(userId,pwd); + + //Verify + verify(restClientHelper).getRestClient(KNOWN_API_SUGOI); + verify(restClient).post(); + + UriBuilder mockUriBuilder = mockPostPutPatchURIBuilderAndPrepareForTest(); + + // Verify that the correct path and query parameters were used + verify(mockUriBuilder).path(eq("/realms/{realm}/users/{id}/init-password")); + verify(mockUriBuilder).build(eq(realm), eq(userId)); + ArgumentCaptor bodyCaptor = ArgumentCaptor.forClass(JsonNode.class); + verify(requestBodyUriSpec).body(bodyCaptor.capture()); + + assertEquals(1, bodyCaptor.getAllValues().size(),"We should have exactly one body"); + JsonNode body=bodyCaptor.getValue(); + assertEquals(pwd,body.path("password").asText(),"The passed password is incorrect"); + } +} \ No newline at end of file diff --git a/src/test/java/fr/insee/protools/backend/service/sugoi_rem/delegate/SugoiREMCreateMissingAccountListTaskTest.java b/src/test/java/fr/insee/protools/backend/service/sugoi_rem/delegate/SugoiREMCreateMissingAccountListTaskTest.java new file mode 100644 index 00000000..8d661ecf --- /dev/null +++ b/src/test/java/fr/insee/protools/backend/service/sugoi_rem/delegate/SugoiREMCreateMissingAccountListTaskTest.java @@ -0,0 +1,179 @@ +package fr.insee.protools.backend.service.sugoi_rem.delegate; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; +import fr.insee.protools.backend.dto.ContexteProcessus; +import fr.insee.protools.backend.dto.sugoi.Habilitation; +import fr.insee.protools.backend.dto.sugoi.User; +import fr.insee.protools.backend.service.rem.RemService; +import fr.insee.protools.backend.service.sugoi.SugoiService; +import fr.insee.protools.backend.service.utils.delegate.TestDelegateWithContext; +import fr.insee.protools.backend.service.utils.password.PasswordService; +import org.apache.commons.lang3.RandomStringUtils; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.JavaDelegate; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; +import org.mockito.AdditionalAnswers; +import org.mockito.ArgumentCaptor; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; + +import java.util.List; +import java.util.Map; +import java.util.UUID; +import java.util.stream.IntStream; +import java.util.stream.Stream; + +import static fr.insee.protools.backend.service.FlowableVariableNameConstants.VARNAME_CURRENT_PARTITION_ID; +import static fr.insee.protools.backend.utils.data.CtxExamples.*; +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.Mockito.*; + +@ExtendWith(MockitoExtension.class) +class SugoiREMCreateMissingAccountListTaskTest extends TestDelegateWithContext { + + @Mock + RemService remService; + + @Mock + SugoiService sugoiService; + + @Mock + PasswordService passwordService; + + @InjectMocks + SugoiREMCreateMissingAccountListTask task; + + @Override + public JavaDelegate getTaskUnderTest() { + return task; + } + + ///provide ctx and expected password length and list of rem Ids for which we need to init a username/pwd + private static Stream executeContextOKArgs() { + return Stream.of("menage", "entreprise") + .flatMap(contexte -> + IntStream.rangeClosed(0, 10) + .mapToObj(size -> Arguments.of(contexte, + IntStream.rangeClosed(1, 1+10*size) + .mapToObj(i -> "ID_" + i) + .toList() + )) + ); + } + + @ParameterizedTest + @MethodSource("executeContextOKArgs") + public void execute_should_work_whenEverythingOk(String context,List remIdInterroWithoutAccount) { + record MockData(String idInterro, String sugoiResponseUserName, User createdUser, String pwd) { + } + Habilitation PLATINE_HABILITATION = new Habilitation("platine", "repondant", null); + User expectedCreateSugoiUserBody = User.builder().habilitations(List.of(PLATINE_HABILITATION)).build(); + String partitionId = UUID.randomUUID().toString(); + + int tmpexpectedPwdSize=-1; + String contexts_as_string; + if(context.equals("menage")) + { + contexts_as_string=ctx_contexte_menage; + tmpexpectedPwdSize=8; + } + else if(context.equals("entreprise")){ + contexts_as_string=ctx_contexte_entreprise; + tmpexpectedPwdSize=12; + } + else { + assertFalse(Boolean.TRUE,"Tests parameters are incorrects"); + return; + } + final int expectedPwdSize=tmpexpectedPwdSize; + + //Prepare + DelegateExecution execution = createMockedExecution(); + JsonNode expectedContext = initContexteMockWithString(contexts_as_string); + + List mockDataList = remIdInterroWithoutAccount.stream() + .map(id -> { + String pwd = RandomStringUtils.randomAlphanumeric(expectedPwdSize); + String userName = "USER_" + RandomStringUtils.randomAlphanumeric(10); + User sugoiUserResponse = User.builder().username(userName).habilitations(List.of(PLATINE_HABILITATION)).build(); + return new MockData(id, userName, sugoiUserResponse, pwd); + }) + .toList(); + + when(sugoiService.postCreateUser(any())).thenAnswer(AdditionalAnswers.returnsElementsOf(mockDataList.stream().map(MockData::createdUser).toList())); + when(passwordService.generatePassword(expectedPwdSize)).thenAnswer(AdditionalAnswers.returnsElementsOf(mockDataList.stream().map(MockData::pwd).toList())); + + doReturn(partitionId).when(execution).getVariable(VARNAME_CURRENT_PARTITION_ID, String.class); + doReturn(remIdInterroWithoutAccount).when(remService).getInterrogationIdsWithoutAccountForPartition(partitionId); + + //Call method under test + task.execute(execution); + + //Verify + verify(remService, times(1)).getInterrogationIdsWithoutAccountForPartition(eq(partitionId)); + verify(passwordService, times(remIdInterroWithoutAccount.size())).generatePassword(eq(expectedPwdSize)); + verify(sugoiService, times(remIdInterroWithoutAccount.size())).postCreateUser(eq(expectedCreateSugoiUserBody)); + + // Verification that postInitPassword was called once for each element in mockDataList + for (MockData mockData : mockDataList) { + verify(sugoiService, times(1)).postInitPassword(mockData.sugoiResponseUserName(), mockData.pwd()); + } + + ArgumentCaptor patchArgs = ArgumentCaptor.forClass(Map.class); + verify(remService, times(1)).patchInterrogationsSetAccounts(patchArgs.capture()); + var args = patchArgs.getValue(); + for (MockData mockData : mockDataList) { + assertTrue(args.containsKey(mockData.idInterro), "Arguments passed to patchInterrogationsSetAccounts are incorrect"); + assertEquals(args.get(mockData.idInterro), mockData.sugoiResponseUserName, "Arguments passed to patchInterrogationsSetAccounts are incorrect"); + } + assertEquals(mockDataList.size(), args.size(), "Arguments passed to patchInterrogationsSetAccounts are incorrect (wrong number)"); + } + + @Override + public Map getVariablesAndTypes() { + return Map.of( + VARNAME_CURRENT_PARTITION_ID, String.class + ); + } + + @Override + protected String minimalValidCtxt() { + return ctx_contexte_menage; + } + + @Test + void getPasswordSize_should_return8_for_menage() throws JsonProcessingException { + //prepare + ContexteProcessus schema = new ObjectMapper().readValue(ctx_contexte_menage, ContexteProcessus.class); + //Call method under tests + int pwdSize=task.getPasswordSize(schema); + //Verify + assertEquals(8,pwdSize,"Expected password size of 8 for menage"); + } + + @Test + void getPasswordSize_should_return_12_for_not_menage() throws JsonProcessingException { + //prepare + ContexteProcessus schema = new ObjectMapper().readValue(ctx_contexte_entreprise, ContexteProcessus.class); + //Call method under tests + int pwdSize=task.getPasswordSize(schema); + //Verify + assertEquals(12,pwdSize,"Expected password size of 12 for entreprise"); + + //prepare + schema = new ObjectMapper().readValue(ctx_empty, ContexteProcessus.class); + //Call method under tests + pwdSize=task.getPasswordSize(schema); + //Verify + assertEquals(12,pwdSize,"Expected password size of 12 for undef"); + } + + +} \ No newline at end of file diff --git a/src/test/java/fr/insee/protools/backend/service/utils/TestServiceWithRestClient.java b/src/test/java/fr/insee/protools/backend/service/utils/TestServiceWithRestClient.java index 13c749a8..8fe60184 100644 --- a/src/test/java/fr/insee/protools/backend/service/utils/TestServiceWithRestClient.java +++ b/src/test/java/fr/insee/protools/backend/service/utils/TestServiceWithRestClient.java @@ -6,9 +6,9 @@ import fr.insee.protools.backend.restclient.pagination.PageResponse; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.ArgumentCaptor; import org.mockito.ArgumentMatchers; import org.mockito.Mock; -import org.mockito.Mockito; import org.mockito.junit.jupiter.MockitoExtension; import org.springframework.core.ParameterizedTypeReference; import org.springframework.http.HttpStatusCode; @@ -17,8 +17,12 @@ import java.net.URI; import java.util.List; +import java.util.Optional; import java.util.function.Function; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.Mockito.*; @@ -44,28 +48,80 @@ void initRestClientMock() { lenient().when(restClient.post()).thenReturn(requestBodyUriSpec); lenient().when(restClient.put()).thenReturn(requestBodyUriSpec); lenient().when(restClient.patch()).thenReturn(requestBodyUriSpec); + lenient().when(requestBodyUriSpec.uri(anyString(), any(Object[].class))).thenReturn(requestBodyUriSpec); - lenient().when(requestHeadersUriSpec.uri(ArgumentMatchers.>any())).thenReturn(requestBodyUriSpec); + lenient().when(requestBodyUriSpec.uri(ArgumentMatchers.>any())).thenReturn(requestBodyUriSpec); + lenient().when(requestBodyUriSpec.body(any(Object.class))).thenReturn(requestBodyUriSpec); lenient().when(requestBodyUriSpec.retrieve()).thenReturn(responseSpec); //Specific for get lenient().when(restClient.get()).thenReturn(requestHeadersUriSpec); + lenient().when(requestHeadersUriSpec.uri(anyString(), any(Object[].class))).thenReturn(requestBodyUriSpec); + lenient().when(requestHeadersUriSpec.uri(ArgumentMatchers.>any())).thenReturn(requestBodyUriSpec); lenient().when(requestHeadersUriSpec.retrieve()).thenReturn(responseSpec); } + public UriBuilder mockPostPutPatchURIBuilderAndPrepareForTest() { + // let's manually build a URI using the captured function and a mock UriBuilder + ArgumentCaptor> uriCaptor = ArgumentCaptor.forClass(Function.class); + verify(requestBodyUriSpec).uri(uriCaptor.capture()); + UriBuilder mockUriBuilder = mock(UriBuilder.class); + lenient().when(mockUriBuilder.path(anyString())).thenReturn(mockUriBuilder); + lenient().when(mockUriBuilder.queryParam(anyString(), ArgumentMatchers.any())).thenReturn(mockUriBuilder); + lenient().when(mockUriBuilder.queryParamIfPresent(anyString(), ArgumentMatchers.>any())).thenReturn(mockUriBuilder); + + lenient().when(mockUriBuilder.build(ArgumentMatchers.any())).thenReturn(URI.create("http://mockeduri")); + + // Call the captured function with the mocked UriBuilder + uriCaptor.getValue().apply(mockUriBuilder); + + return mockUriBuilder; + } + - public void mockGetPageableBodyResponse(List l){ + public UriBuilder mockGETURIBuilderAndPrepareForTest() { + // let's manually build a URI using the captured function and a mock UriBuilder + ArgumentCaptor> uriCaptor = ArgumentCaptor.forClass(Function.class); + verify(requestHeadersUriSpec).uri(uriCaptor.capture()); + UriBuilder mockUriBuilder = mock(UriBuilder.class); + when(mockUriBuilder.path(anyString())).thenReturn(mockUriBuilder); + when(mockUriBuilder.queryParam(anyString(), ArgumentMatchers.any())).thenReturn(mockUriBuilder); + lenient().when(mockUriBuilder.queryParamIfPresent(anyString(), ArgumentMatchers.>any())).thenReturn(mockUriBuilder); + + when(mockUriBuilder.build()).thenReturn(URI.create("http://mockeduri")); + + // Call the captured function with the mocked UriBuilder + uriCaptor.getValue().apply(mockUriBuilder); + + return mockUriBuilder; + } + + public void mockRetrieveBodyResponse(List l) { PageResponse mockResponse = PageResponse.builder().content(l).build(); lenient().when(responseSpec.body(ArgumentMatchers.any())).thenReturn(mockResponse); lenient().when(responseSpec.body(ArgumentMatchers.any())).thenReturn(mockResponse); } - public void mockMakeRetrieveThrow(HttpStatusCode errorCode){ - HttpClient4xxBPMNError ex = new HttpClient4xxBPMNError("msg",errorCode); + public void mockRetrieveBody(Object l) { + lenient().when(responseSpec.body(ArgumentMatchers.any())).thenReturn(l); + lenient().when(responseSpec.body(ArgumentMatchers.any())).thenReturn(l); + } + + public void mockMakeRetrieveThrow(HttpStatusCode errorCode) { + HttpClient4xxBPMNError ex = new HttpClient4xxBPMNError("msg", errorCode); lenient().when(requestBodyUriSpec.retrieve()).thenThrow(ex); //Specific for get lenient().when(requestHeadersUriSpec.retrieve()).thenThrow(ex); } + public void assertCorrectPageResponseForNull(PageResponse pageResponse){ + assertNotNull(pageResponse,"The response should not be null"); + assertThat("The response should have empty content",pageResponse.getContent().isEmpty()); + assertEquals(5000,pageResponse.getPageSize(),"The response should have pageSize == 5000"); + assertEquals(0,pageResponse.getPageCount(),"The response should have pageCount == 0"); + assertEquals(0,pageResponse.getCurrentPage(),"The response should have currentPage == 0"); + assertEquals(0,pageResponse.getTotalElements(),"The response should have totalElements == 0"); + } + } diff --git a/src/test/java/fr/insee/protools/backend/service/utils/delegate/IDelegateWithVariableGetPaginated.java b/src/test/java/fr/insee/protools/backend/service/utils/delegate/IDelegateWithVariableGetPaginated.java index 0f6338f9..3ec413f8 100644 --- a/src/test/java/fr/insee/protools/backend/service/utils/delegate/IDelegateWithVariableGetPaginated.java +++ b/src/test/java/fr/insee/protools/backend/service/utils/delegate/IDelegateWithVariableGetPaginated.java @@ -24,6 +24,14 @@ public interface IDelegateWithVariableGetPaginated extends IDelegateWithVariable void initReadValueMock(PageResponse pageResponse); String getOutListVariableName(); + + @Override + default void initExtraMocks(DelegateExecution execution) { + IDelegateWithVariables.super.initExtraMocks(execution); + PageResponse exepectedPageResponse = PageResponse.builder().currentPage(0).pageCount(1).content(List.of(objectMapper.createObjectNode().put("xx","yyy"))).build(); + initReadValueMock(exepectedPageResponse); + } + static Stream executeParamProvider() { return Stream.of( Arguments.of(null, true), @@ -80,7 +88,4 @@ default void execute_should_work_when_params_notNullWithPaginated(Integer curren } } - PaginationHelper.IGetFromService getServiceMock(); - Object[] getServiceParams(); - } diff --git a/src/test/java/fr/insee/protools/backend/service/utils/delegate/IDelegateWithVariables.java b/src/test/java/fr/insee/protools/backend/service/utils/delegate/IDelegateWithVariables.java index 042342be..ffbe9680 100644 --- a/src/test/java/fr/insee/protools/backend/service/utils/delegate/IDelegateWithVariables.java +++ b/src/test/java/fr/insee/protools/backend/service/utils/delegate/IDelegateWithVariables.java @@ -2,7 +2,6 @@ import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.node.JsonNodeFactory; -import fr.insee.protools.backend.restclient.pagination.PageResponse; import fr.insee.protools.backend.service.exception.VariableClassCastException; import org.flowable.common.engine.api.FlowableIllegalArgumentException; import org.flowable.engine.delegate.DelegateExecution; @@ -19,7 +18,8 @@ import static org.hamcrest.Matchers.containsString; import static org.junit.jupiter.api.Assertions.*; import static org.mockito.ArgumentMatchers.eq; -import static org.mockito.Mockito.*; +import static org.mockito.Mockito.lenient; +import static org.mockito.Mockito.mock; public interface IDelegateWithVariables { @@ -32,8 +32,8 @@ public interface IDelegateWithVariables { JavaDelegate getTaskUnderTest(); Map getVariablesAndTypes(); - // extra mocked needed so that it works - default void initExtraMocks(DelegateExecution execution) {} + // extra mocked needed to make some tests work + default void initExtraMocks(DelegateExecution execution) { } default void initDefaultVariables(DelegateExecution execution) { Map typeByVariable = getVariablesAndTypes(); @@ -102,6 +102,9 @@ default void execute_should_throw_FlowableIllegalArgumentException_when_variable lenient().doReturn(dummyValue).when(execution).getVariable(eq(variable), eq(clazzOriginal)); lenient().doReturn(dummyValue).when(execution).getVariableLocal(eq(variable), eq(clazzOriginal)); }); + + initExtraMocks(execution); + //Run the test //Verify assertThrows(VariableClassCastException.class, () -> getTaskUnderTest().execute(execution)); @@ -120,8 +123,7 @@ default void execute_should_throw_FlowableIllegalArgumentException_when_variable //Precondition DelegateExecution execution = mock(DelegateExecution.class); - lenient().when(execution.getProcessInstanceId()).thenReturn(dumyId); -// + String[] variables=getVariablesAndTypes().keySet().toArray(new String[0]); combinations(variables) .forEach(variablesSubset -> { @@ -129,6 +131,9 @@ default void execute_should_throw_FlowableIllegalArgumentException_when_variable //Initailize the mocked variables Set intializedVars=new HashSet<>(); + //Reinit + lenient().when(execution.getProcessInstanceId()).thenReturn(dumyId); + //The one not defined ==> Throw for (String variable :variablesSubset) { Class clazz = typeByVariable.get(variable); @@ -158,8 +163,6 @@ default void execute_should_throw_FlowableIllegalArgumentException_when_variable } ); } - - default DelegateExecution createMockedExecution(){ DelegateExecution execution = mock(DelegateExecution.class); lenient().doReturn(dumyId).when(execution).getProcessInstanceId(); diff --git a/src/test/java/fr/insee/protools/backend/service/utils/delegate/TestDelegateWithContext.java b/src/test/java/fr/insee/protools/backend/service/utils/delegate/TestDelegateWithContext.java index 7c1da89a..ca2a3cb0 100644 --- a/src/test/java/fr/insee/protools/backend/service/utils/delegate/TestDelegateWithContext.java +++ b/src/test/java/fr/insee/protools/backend/service/utils/delegate/TestDelegateWithContext.java @@ -1,9 +1,11 @@ package fr.insee.protools.backend.service.utils.delegate; +import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import fr.insee.protools.backend.ProtoolsTestUtils; import fr.insee.protools.backend.dto.ContexteProcessus; +import fr.insee.protools.backend.service.DelegateContextVerifier; import fr.insee.protools.backend.service.context.ContextService; import fr.insee.protools.backend.service.context.exception.BadContexMissingBPMNError; import lombok.SneakyThrows; @@ -16,9 +18,10 @@ import org.mockito.Spy; import org.mockito.junit.jupiter.MockitoExtension; -import static fr.insee.protools.backend.utils.data.CtxExamples.ctx_empty; -import static fr.insee.protools.backend.utils.data.CtxExamples.ctx_empty_id; -import static org.junit.jupiter.api.Assertions.assertThrows; +import java.util.Set; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.*; import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.Mockito.*; @@ -35,18 +38,25 @@ void mockitoResetContext() { reset(protoolsContext); } + protected abstract String minimalValidCtxt(); + @Test @Override public void execute_should_work_when_params_notNull() { - initContexteMockWithString(ctx_empty); + initContexteMockWithString(minimalValidCtxt()); IDelegateWithVariables.super.execute_should_work_when_params_notNull(); } + @Override + public void initExtraMocks(DelegateExecution execution) { + initContexteMockWithString(minimalValidCtxt()); + IDelegateWithVariables.super.initExtraMocks(execution); + } @Override @Test public void execute_should_throw_FlowableIllegalArgumentException_when_variables_notDefined(){ - initContexteMockWithString(ctx_empty); + initContexteMockWithString(minimalValidCtxt()); IDelegateWithVariables.super.execute_should_throw_FlowableIllegalArgumentException_when_variables_notDefined(); } @@ -55,8 +65,8 @@ protected JsonNode initContexteMockWithFile(String contexteToLoad) { JsonNode contextRootNode = ProtoolsTestUtils.asJsonNode(contexteToLoad); ContexteProcessus schema = objectMapper.readValue(contexteToLoad, ContexteProcessus.class); - doReturn(contextRootNode).when(protoolsContext).getContextJsonNodeByProcessInstance(anyString()); - doReturn(schema).when(protoolsContext).getContextDtoByProcessInstance(anyString()); + lenient().doReturn(contextRootNode).when(protoolsContext).getContextJsonNodeByProcessInstance(anyString()); + lenient().doReturn(schema).when(protoolsContext).getContextDtoByProcessInstance(anyString()); return contextRootNode; } @@ -65,8 +75,8 @@ protected JsonNode initContexteMockWithString(String contexteAsString){ JsonNode contextRootNode = new ObjectMapper().readTree(contexteAsString); ContexteProcessus schema = objectMapper.readValue(contexteAsString, ContexteProcessus.class); - doReturn(contextRootNode).when(protoolsContext).getContextJsonNodeByProcessInstance(anyString()); - doReturn(schema).when(protoolsContext).getContextDtoByProcessInstance(anyString()); + lenient().doReturn(contextRootNode).when(protoolsContext).getContextJsonNodeByProcessInstance(anyString()); + lenient().doReturn(schema).when(protoolsContext).getContextDtoByProcessInstance(anyString()); return contextRootNode; } @@ -82,6 +92,55 @@ void execute_should_throwError_when_null_context(){ assertThrows(BadContexMissingBPMNError.class, () -> getTaskUnderTest().execute(execution)); } + @Test + @DisplayName("execute should throw an error if the context is null") + void execute_should_throwError_when_null_context_2() { + if (getTaskUnderTest() instanceof DelegateContextVerifier) { + //Precondition + DelegateExecution execution = mock(DelegateExecution.class); + lenient().when(execution.getProcessInstanceId()).thenReturn(dumyId); + lenient().doReturn(null).when(protoolsContext).getContextDtoByProcessInstance(anyString()); + lenient().doReturn(null).when(protoolsContext).getContextJsonNodeByProcessInstance(anyString()); + + assertThrows(BadContexMissingBPMNError.class, () -> getTaskUnderTest().execute(execution)); + } + } + @Test + void getContextErrors_should_work_when_valid_contexte() throws JsonProcessingException { + ContexteProcessus schema = objectMapper.readValue(minimalValidCtxt(), ContexteProcessus.class); + if(getTaskUnderTest() instanceof DelegateContextVerifier){ + Set errors=((DelegateContextVerifier) getTaskUnderTest()).getContextErrors(schema); + assertTrue(errors.isEmpty(),"We should not have any error in a valid contexte"); + } + } + + @Test + void getContextErrors_should_return_error_when_null_context() { + if(getTaskUnderTest() instanceof DelegateContextVerifier){ + Set errors=((DelegateContextVerifier) getTaskUnderTest()).getContextErrors(null); + assertEquals(1,errors.size(),"We should have 1 error with a null contexte"); + assertTrue(errors.contains("Context is null")); + } + } + @Test + void getContextErrors_should_return_error_when_no_id() throws JsonProcessingException { + ContexteProcessus schema = objectMapper.readValue(minimalValidCtxt(), ContexteProcessus.class); + schema.setId(null); + if(getTaskUnderTest() instanceof DelegateContextVerifier){ + Set errors=((DelegateContextVerifier) getTaskUnderTest()).getContextErrors(schema); + assertTrue(errors.contains("Context Id")); + } + } + + @Test + void getContextErrors_should_return_error_when_no_contexte() throws JsonProcessingException { + ContexteProcessus schema = objectMapper.readValue(minimalValidCtxt(), ContexteProcessus.class); + schema.setContexte(null); + if(getTaskUnderTest() instanceof DelegateContextVerifier){ + Set errors=((DelegateContextVerifier) getTaskUnderTest()).getContextErrors(schema); + assertTrue(errors.contains("Contexte is missing")); + } + } } diff --git a/src/test/java/fr/insee/protools/backend/utils/data/CtxExamples.java b/src/test/java/fr/insee/protools/backend/utils/data/CtxExamples.java index 8e229dc2..5d996b19 100644 --- a/src/test/java/fr/insee/protools/backend/utils/data/CtxExamples.java +++ b/src/test/java/fr/insee/protools/backend/utils/data/CtxExamples.java @@ -6,11 +6,28 @@ public class CtxExamples { public static final String ctx_empty = """ { - "id": "b958cfac-2bf3-478d-a97a-dda5e751898c" + "id": "a958cfac-2bf3-478d-a97a-dda5e751898c" } """; - public static final String ctx_empty_id="b958cfac-2bf3-478d-a97a-dda5e751898c"; + public static final String ctx_empty_id="a958cfac-2bf3-478d-a97a-dda5e751898c"; + public static final String ctx_contexte_menage = + """ + { + "id": "b958cfac-2bf3-478d-a97a-dda5e751898c", + "contexte": "menage" + } + """; + public static final String ctx_contexte_menage_id="b958cfac-2bf3-478d-a97a-dda5e751898c"; + + public static final String ctx_contexte_entreprise = + """ + { + "id": "c958cfac-2bf3-478d-a97a-dda5e751898c", + "contexte": "entreprise" + } + """; + public static final String ctx_contexte_entreprise_id="c958cfac-2bf3-478d-a97a-dda5e751898c"; private CtxExamples(){} } diff --git a/src/test/resources/application-test.properties b/src/test/resources/application-test.properties index ac174907..12dcca23 100644 --- a/src/test/resources/application-test.properties +++ b/src/test/resources/application-test.properties @@ -101,5 +101,5 @@ fr.insee.protools.api.era.auth.url=${fr.insee.protools.keycloak-interne-auth-url #fr.insee.properties.log.key.prefixes=fr.pwd,fr.insee #Log -logging.level.fr.insee.protools=WARN +logging.level.fr.insee.protools=DEBUG logging.level.org.springframework.web.filter.CommonsRequestLoggingFilter=WARN From 39c79a02c51e6e743def2b6c29b8a9e4a0fc1162 Mon Sep 17 00:00:00 2001 From: SNDIL - Marc Date: Fri, 20 Sep 2024 00:06:45 +0200 Subject: [PATCH 64/75] en cours TU --- .../service/DelegateContextVerifier.java | 6 -- .../service/context/ContextServiceImpl.java | 3 + .../exception/SugoiServiceCallBPMNError.java | 12 +++ .../backend/service/sugoi/SugoiService.java | 9 ++- .../SugoiREMCreateMissingAccountListTask.java | 24 ++---- .../traiterXXXX/TraiterXXXService.java | 6 +- ...TraiterXXXGetRemiseEnCollecteTaskREST.java | 6 +- .../service/sugoi/SugoiServiceTest.java | 8 ++ ...oiREMCreateMissingAccountListTaskTest.java | 9 --- .../traiterXXXX/TraiterXXXServiceTest.java | 77 +++++++++++++++++++ .../TraiterXXXCreateContextTaskRESTTest.java | 64 +++++++++++++++ ...terXXXGetRemiseEnCollecteTaskRESTTest.java | 68 ++++++++++++++++ .../utils/TestServiceWithRestClient.java | 3 + .../delegate/TestDelegateWithContext.java | 28 ------- 14 files changed, 254 insertions(+), 69 deletions(-) create mode 100644 src/main/java/fr/insee/protools/backend/service/exception/SugoiServiceCallBPMNError.java create mode 100644 src/test/java/fr/insee/protools/backend/service/traiterXXXX/TraiterXXXServiceTest.java create mode 100644 src/test/java/fr/insee/protools/backend/service/traiterXXXX/delegate/TraiterXXXCreateContextTaskRESTTest.java create mode 100644 src/test/java/fr/insee/protools/backend/service/traiterXXXX/delegate/TraiterXXXGetRemiseEnCollecteTaskRESTTest.java diff --git a/src/main/java/fr/insee/protools/backend/service/DelegateContextVerifier.java b/src/main/java/fr/insee/protools/backend/service/DelegateContextVerifier.java index 84cccda1..fcc3e49c 100644 --- a/src/main/java/fr/insee/protools/backend/service/DelegateContextVerifier.java +++ b/src/main/java/fr/insee/protools/backend/service/DelegateContextVerifier.java @@ -16,12 +16,6 @@ public interface DelegateContextVerifier { default Set getContextErrors(ContexteProcessus context) { - if(context==null){ - return Set.of("Context is null"); - } - if(context.getId()==null){ - return Set.of(computeMissingMessage("Context Id",this.getClass())); - } return Set.of(); } diff --git a/src/main/java/fr/insee/protools/backend/service/context/ContextServiceImpl.java b/src/main/java/fr/insee/protools/backend/service/context/ContextServiceImpl.java index 536352c2..b49a84d5 100644 --- a/src/main/java/fr/insee/protools/backend/service/context/ContextServiceImpl.java +++ b/src/main/java/fr/insee/protools/backend/service/context/ContextServiceImpl.java @@ -261,6 +261,9 @@ public Set isContextOKForBPMN(String processDefinitionKey, ContexteProce if(contexteProcessus.getId()==null){ errors.add("id is missing"); } + if(contexteProcessus.getMetadonnees()==null){ + errors.add("metadonnees is missing"); + } ProcessDefinitionQuery processDefinitionQuery = repositoryService.createProcessDefinitionQuery(); processDefinitionQuery.processDefinitionKey(processDefinitionKey); diff --git a/src/main/java/fr/insee/protools/backend/service/exception/SugoiServiceCallBPMNError.java b/src/main/java/fr/insee/protools/backend/service/exception/SugoiServiceCallBPMNError.java new file mode 100644 index 00000000..f58d72f8 --- /dev/null +++ b/src/main/java/fr/insee/protools/backend/service/exception/SugoiServiceCallBPMNError.java @@ -0,0 +1,12 @@ +package fr.insee.protools.backend.service.exception; + +import fr.insee.protools.backend.exception.ProtoolsBpmnError; + +import static fr.insee.protools.backend.service.BPMNErrorCode.BPMNERROR_CODE_DEFAULT; + +public class SugoiServiceCallBPMNError extends ProtoolsBpmnError { + + public SugoiServiceCallBPMNError(String message) { + super(BPMNERROR_CODE_DEFAULT,message); + } +} diff --git a/src/main/java/fr/insee/protools/backend/service/sugoi/SugoiService.java b/src/main/java/fr/insee/protools/backend/service/sugoi/SugoiService.java index 970161fe..6ec1a420 100644 --- a/src/main/java/fr/insee/protools/backend/service/sugoi/SugoiService.java +++ b/src/main/java/fr/insee/protools/backend/service/sugoi/SugoiService.java @@ -6,6 +6,7 @@ import fr.insee.protools.backend.restclient.RestClientHelper; import fr.insee.protools.backend.restclient.configuration.ApiConfigProperties; import fr.insee.protools.backend.restclient.exception.runtime.HttpClient4xxBPMNError; +import fr.insee.protools.backend.service.exception.SugoiServiceCallBPMNError; import fr.insee.protools.backend.service.exception.UsernameAlreadyExistsSugoiBPMNError; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -31,6 +32,12 @@ public class SugoiService { private String realm; public User postCreateUser(User userBody) { + if(userBody==null){ + String msg="called SUGOI postCreateUser with empty userBody"; + log.error(msg); + throw new SugoiServiceCallBPMNError(msg); + } + try { User userCreated = restClientHelper.getRestClient(API) .post() @@ -45,7 +52,7 @@ public User postCreateUser(User userBody) { } catch (HttpClient4xxBPMNError e) { if (e.getHttpStatusCodeError().equals(HttpStatus.CONFLICT)) { String msg = - "Error 409/CONFLICT during SUGOI post create users userBody.username=" + ((userBody == null) ? "null" : userBody.getUsername()) + "Error 409/CONFLICT during SUGOI post create users userBody.username=" + userBody.getUsername() + " (check that the username already exists in SUGOI) - msg=" + e.getMessage(); log.error(msg); throw new UsernameAlreadyExistsSugoiBPMNError(msg); diff --git a/src/main/java/fr/insee/protools/backend/service/sugoi_rem/delegate/SugoiREMCreateMissingAccountListTask.java b/src/main/java/fr/insee/protools/backend/service/sugoi_rem/delegate/SugoiREMCreateMissingAccountListTask.java index c5d0fc9f..3c7658e4 100644 --- a/src/main/java/fr/insee/protools/backend/service/sugoi_rem/delegate/SugoiREMCreateMissingAccountListTask.java +++ b/src/main/java/fr/insee/protools/backend/service/sugoi_rem/delegate/SugoiREMCreateMissingAccountListTask.java @@ -1,28 +1,27 @@ package fr.insee.protools.backend.service.sugoi_rem.delegate; -import com.fasterxml.jackson.databind.JsonNode; import fr.insee.protools.backend.dto.ContexteProcessus; import fr.insee.protools.backend.dto.sugoi.Habilitation; import fr.insee.protools.backend.dto.sugoi.User; import fr.insee.protools.backend.service.DelegateContextVerifier; import fr.insee.protools.backend.service.context.ContextService; -import fr.insee.protools.backend.service.context.enums.CampaignContextEnum; import fr.insee.protools.backend.service.rem.RemService; import fr.insee.protools.backend.service.sugoi.SugoiService; import fr.insee.protools.backend.service.utils.FlowableVariableUtils; import fr.insee.protools.backend.service.utils.password.PasswordService; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.EnumUtils; import org.flowable.engine.delegate.DelegateExecution; import org.flowable.engine.delegate.JavaDelegate; import org.springframework.stereotype.Component; -import java.util.*; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; import static fr.insee.protools.backend.service.FlowableVariableNameConstants.VARNAME_CURRENT_PARTITION_ID; import static fr.insee.protools.backend.service.FlowableVariableNameConstants.VARNAME_DIRECTORYACCESS_PWD_FOR_INTERRO_ID_MAP; -import static fr.insee.protools.backend.service.context.ContextConstants.CTX_CAMPAGNE_CONTEXTE; @Slf4j @Component @@ -72,22 +71,9 @@ public void execute(DelegateExecution execution) { } public static int getPasswordSize(ContexteProcessus context){ - if(context!=null && context.getContexte()!=null && context.getContexte().equals(ContexteProcessus.Contexte.MENAGE)){ + if(context.getContexte().equals(ContexteProcessus.Contexte.MENAGE)){ return HOUSEHOLD_PASSWORD_SIZE; } return DEFAULT_PASSWORD_SIZE; } - - @Override - public Set getContextErrors(ContexteProcessus contexteProcessus) { - if(contexteProcessus==null){ - return Set.of("Context is null"); - } else if (contexteProcessus.getContexte()==null) { - return Set.of("Contexte is missing"); - } - else if (contexteProcessus.getId()==null) { - return Set.of("Context Id"); - } - return Set.of(); - } } diff --git a/src/main/java/fr/insee/protools/backend/service/traiterXXXX/TraiterXXXService.java b/src/main/java/fr/insee/protools/backend/service/traiterXXXX/TraiterXXXService.java index daa29bfa..f0ecdf10 100644 --- a/src/main/java/fr/insee/protools/backend/service/traiterXXXX/TraiterXXXService.java +++ b/src/main/java/fr/insee/protools/backend/service/traiterXXXX/TraiterXXXService.java @@ -2,6 +2,7 @@ import com.fasterxml.jackson.databind.JsonNode; import fr.insee.protools.backend.restclient.RestClientHelper; +import fr.insee.protools.backend.restclient.configuration.ApiConfigProperties; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.core.ParameterizedTypeReference; @@ -17,12 +18,13 @@ public class TraiterXXXService { private final RestClientHelper restClientHelper; + private final ApiConfigProperties.KNOWN_API API = KNOWN_API_TRAITERXXX; public List getRemiseEnCollecteForPartition(String partitionId) { log.debug("getRemiseEnCollecteForPartition - partitionId={} ",partitionId); ParameterizedTypeReference> typeReference = new ParameterizedTypeReference<>() { }; - List response = restClientHelper.getRestClient(KNOWN_API_TRAITERXXX) + List response = restClientHelper.getRestClient(API) .get() .uri(uriBuilder -> uriBuilder .path("/remise-en-collecte") @@ -36,7 +38,7 @@ public List getRemiseEnCollecteForPartition(String partitionId) { public void postContext(String campaignId,JsonNode contextRootNode) { log.trace("postContext: campaignId={}",campaignId); - var response = restClientHelper.getRestClient(KNOWN_API_TRAITERXXX) + var response = restClientHelper.getRestClient(API) .post() .uri("/context") .body(contextRootNode) diff --git a/src/main/java/fr/insee/protools/backend/service/traiterXXXX/delegate/TraiterXXXGetRemiseEnCollecteTaskREST.java b/src/main/java/fr/insee/protools/backend/service/traiterXXXX/delegate/TraiterXXXGetRemiseEnCollecteTaskREST.java index 1e1d44e3..7aae4046 100644 --- a/src/main/java/fr/insee/protools/backend/service/traiterXXXX/delegate/TraiterXXXGetRemiseEnCollecteTaskREST.java +++ b/src/main/java/fr/insee/protools/backend/service/traiterXXXX/delegate/TraiterXXXGetRemiseEnCollecteTaskREST.java @@ -24,13 +24,11 @@ public class TraiterXXXGetRemiseEnCollecteTaskREST implements JavaDelegate, Del @Override public void execute(DelegateExecution execution) { String currentPartitionId = FlowableVariableUtils.getVariableOrThrow(execution, VARNAME_CURRENT_PARTITION_ID, String.class); - log.info("ProcessInstanceId={} begin",execution.getProcessInstanceId()); - + log.info("ProcessInstanceId={} - currentPartitionId={} begin",execution.getProcessInstanceId(),currentPartitionId); List interroRemiseEnCollecteList = service.getRemiseEnCollecteForPartition(currentPartitionId); execution.getParent().setVariableLocal(VARNAME_INTERRO_REMISE_EN_COLLECTE_LIST,interroRemiseEnCollecteList); - log.info("ProcessInstanceId={} end",execution.getProcessInstanceId()); - + log.info("ProcessInstanceId={} - currentPartitionId={} - end",execution.getProcessInstanceId(),currentPartitionId); } } diff --git a/src/test/java/fr/insee/protools/backend/service/sugoi/SugoiServiceTest.java b/src/test/java/fr/insee/protools/backend/service/sugoi/SugoiServiceTest.java index c77891b4..2bee71a1 100644 --- a/src/test/java/fr/insee/protools/backend/service/sugoi/SugoiServiceTest.java +++ b/src/test/java/fr/insee/protools/backend/service/sugoi/SugoiServiceTest.java @@ -5,6 +5,7 @@ import fr.insee.protools.backend.dto.sugoi.Habilitation; import fr.insee.protools.backend.dto.sugoi.User; import fr.insee.protools.backend.restclient.exception.runtime.HttpClient4xxBPMNError; +import fr.insee.protools.backend.service.exception.SugoiServiceCallBPMNError; import fr.insee.protools.backend.service.exception.UsernameAlreadyExistsSugoiBPMNError; import fr.insee.protools.backend.service.utils.TestServiceWithRestClient; import org.junit.jupiter.api.Test; @@ -67,6 +68,13 @@ void postCreateUser_should_call_correctURIAndBody() { verify(requestBodyUriSpec).body(createSugoiUserBody); } + @Test + void postCreateUser_should_throw_when_param_is_null(){ + assertThrows(SugoiServiceCallBPMNError.class, () -> service.postCreateUser(null)); + } + + + @Test void postCreateUsers_shouldCatch() { //Prepare diff --git a/src/test/java/fr/insee/protools/backend/service/sugoi_rem/delegate/SugoiREMCreateMissingAccountListTaskTest.java b/src/test/java/fr/insee/protools/backend/service/sugoi_rem/delegate/SugoiREMCreateMissingAccountListTaskTest.java index 8d661ecf..2704708f 100644 --- a/src/test/java/fr/insee/protools/backend/service/sugoi_rem/delegate/SugoiREMCreateMissingAccountListTaskTest.java +++ b/src/test/java/fr/insee/protools/backend/service/sugoi_rem/delegate/SugoiREMCreateMissingAccountListTaskTest.java @@ -166,14 +166,5 @@ void getPasswordSize_should_return_12_for_not_menage() throws JsonProcessingExce int pwdSize=task.getPasswordSize(schema); //Verify assertEquals(12,pwdSize,"Expected password size of 12 for entreprise"); - - //prepare - schema = new ObjectMapper().readValue(ctx_empty, ContexteProcessus.class); - //Call method under tests - pwdSize=task.getPasswordSize(schema); - //Verify - assertEquals(12,pwdSize,"Expected password size of 12 for undef"); } - - } \ No newline at end of file diff --git a/src/test/java/fr/insee/protools/backend/service/traiterXXXX/TraiterXXXServiceTest.java b/src/test/java/fr/insee/protools/backend/service/traiterXXXX/TraiterXXXServiceTest.java new file mode 100644 index 00000000..eafb08fd --- /dev/null +++ b/src/test/java/fr/insee/protools/backend/service/traiterXXXX/TraiterXXXServiceTest.java @@ -0,0 +1,77 @@ +package fr.insee.protools.backend.service.traiterXXXX; + +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.node.JsonNodeFactory; +import fr.insee.protools.backend.service.utils.TestServiceWithRestClient; +import org.hamcrest.collection.IsIterableContainingInAnyOrder; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.InjectMocks; +import org.mockito.junit.jupiter.MockitoExtension; +import org.springframework.web.util.UriBuilder; + +import java.util.List; +import java.util.UUID; + +import static fr.insee.protools.backend.restclient.configuration.ApiConfigProperties.KNOWN_API.KNOWN_API_REM; +import static fr.insee.protools.backend.restclient.configuration.ApiConfigProperties.KNOWN_API.KNOWN_API_TRAITERXXX; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.mockito.Mockito.verify; + +@ExtendWith(MockitoExtension.class) +class TraiterXXXServiceTest extends TestServiceWithRestClient { + + private static ObjectMapper objectMapper = new ObjectMapper(); + + @InjectMocks + TraiterXXXService service; + + @Test + void postContext_should_call_correctURIAndBody() { + //Prepare + JsonNode contextNode = JsonNodeFactory.instance.objectNode(); + + //Call method under test + service.postContext("TOTO", contextNode); + + //Verifications + // Then - Verify that the uri method was called with "/context" + verify(restClientHelper).getRestClient(KNOWN_API_TRAITERXXX); + verify(restClient).post(); + verify(requestBodyUriSpec).uri("/context"); + // and with expected body + verify(requestBodyUriSpec).body(contextNode); + } + + @Test + void getRemiseEnCollecteForPartition_should_makeCorrectCalls() { + //Prepare + String partitionId = "PartitionIDXXREM"; + String expectedID1 = UUID.randomUUID().toString(); + String expectedID2 = UUID.randomUUID().toString(); + + + List mockedResponse = List.of( + objectMapper.createObjectNode().put("id", expectedID1).put("count", "1"), + objectMapper.createObjectNode().put("id", expectedID2).put("compta", "2") + ); + mockRetrieveBody(mockedResponse); + + //Call method under tests + List response = service.getRemiseEnCollecteForPartition(partitionId); + + //Verify + verify(restClientHelper).getRestClient(KNOWN_API_TRAITERXXX); + verify(restClient).get(); + + UriBuilder mockUriBuilder = mockGETURIBuilderAndPrepareForTest(); + + // Verify that the correct path and query parameters were used + verify(mockUriBuilder).path("/remise-en-collecte"); + verify(mockUriBuilder).queryParam("partition_id", partitionId); + + assertThat(response, + IsIterableContainingInAnyOrder.containsInAnyOrder(mockedResponse.toArray())); + } +} \ No newline at end of file diff --git a/src/test/java/fr/insee/protools/backend/service/traiterXXXX/delegate/TraiterXXXCreateContextTaskRESTTest.java b/src/test/java/fr/insee/protools/backend/service/traiterXXXX/delegate/TraiterXXXCreateContextTaskRESTTest.java new file mode 100644 index 00000000..4ee864e3 --- /dev/null +++ b/src/test/java/fr/insee/protools/backend/service/traiterXXXX/delegate/TraiterXXXCreateContextTaskRESTTest.java @@ -0,0 +1,64 @@ +package fr.insee.protools.backend.service.traiterXXXX.delegate; + +import com.fasterxml.jackson.databind.JsonNode; +import fr.insee.protools.backend.service.traiterXXXX.TraiterXXXService; +import fr.insee.protools.backend.service.utils.delegate.TestDelegateWithContext; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.JavaDelegate; +import org.junit.jupiter.api.Test; +import org.mockito.ArgumentCaptor; +import org.mockito.InjectMocks; +import org.mockito.Mock; + +import java.util.List; +import java.util.Map; + +import static fr.insee.protools.backend.utils.data.CtxExamples.ctx_empty; +import static fr.insee.protools.backend.utils.data.CtxExamples.ctx_empty_id; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; + +public class TraiterXXXCreateContextTaskRESTTest extends TestDelegateWithContext { + + @Mock + TraiterXXXService traiterService; + + @InjectMocks + TraiterXXXCreateContextTaskREST traiterCreateContextTask; + + + @Override + public JavaDelegate getTaskUnderTest() { + return traiterCreateContextTask; + } + + @Override + public Map getVariablesAndTypes() { + return Map.of(); + } + + @Test + void execute_should_work_when_contextOK() { + DelegateExecution execution = createMockedExecution(); + JsonNode expectedContext = initContexteMockWithString(ctx_empty); + + //Execute the unit under test + traiterCreateContextTask.execute(execution); + + //Verify postContext + ArgumentCaptor acCtx = ArgumentCaptor.forClass(JsonNode.class); + verify(traiterService, times(1)).postContext(eq(ctx_empty_id), acCtx.capture()); + List allValues = acCtx.getAllValues(); + assertEquals(1, allValues.size(), "We should have exactly one value"); + + assertEquals(expectedContext, allValues.get(0), "Wrong context passed"); + + } + + @Override + protected String minimalValidCtxt() { + return ctx_empty; + } +} \ No newline at end of file diff --git a/src/test/java/fr/insee/protools/backend/service/traiterXXXX/delegate/TraiterXXXGetRemiseEnCollecteTaskRESTTest.java b/src/test/java/fr/insee/protools/backend/service/traiterXXXX/delegate/TraiterXXXGetRemiseEnCollecteTaskRESTTest.java new file mode 100644 index 00000000..112e08f8 --- /dev/null +++ b/src/test/java/fr/insee/protools/backend/service/traiterXXXX/delegate/TraiterXXXGetRemiseEnCollecteTaskRESTTest.java @@ -0,0 +1,68 @@ +package fr.insee.protools.backend.service.traiterXXXX.delegate; + +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; +import fr.insee.protools.backend.service.traiterXXXX.TraiterXXXService; +import fr.insee.protools.backend.service.utils.delegate.IDelegateWithVariables; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.JavaDelegate; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; + +import java.util.List; +import java.util.Map; +import java.util.UUID; + +import static fr.insee.protools.backend.service.FlowableVariableNameConstants.VARNAME_CURRENT_PARTITION_ID; +import static fr.insee.protools.backend.service.FlowableVariableNameConstants.VARNAME_INTERRO_REMISE_EN_COLLECTE_LIST; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.*; + +@ExtendWith(MockitoExtension.class) +class TraiterXXXGetRemiseEnCollecteTaskRESTTest implements IDelegateWithVariables { + + private static ObjectMapper objectMapper = new ObjectMapper(); + + @Mock + TraiterXXXService service; + + @InjectMocks + TraiterXXXGetRemiseEnCollecteTaskREST task; + + @Override + public JavaDelegate getTaskUnderTest() { + return task; + } + + @Override + public Map getVariablesAndTypes() { + return Map.of( + VARNAME_CURRENT_PARTITION_ID, String.class + ); + } + + @Test + @DisplayName("Test execute method - should work and make correct call to service") + void execute_should_work_whenEverythingOk() { + //Prepare + String currentPartitionId = UUID.randomUUID().toString(); + DelegateExecution execution = createMockedExecution(); + doReturn(execution).when(execution).getParent(); + doReturn(currentPartitionId).when(execution).getVariable(VARNAME_CURRENT_PARTITION_ID,String.class); + + List mockedResponse = List.of( + objectMapper.createObjectNode().put("id", 1).put("id", "toto"), + objectMapper.createObjectNode().put("identifier", 1).put("tatxa", "toto")); + + doReturn(mockedResponse).when(service).getRemiseEnCollecteForPartition(eq(currentPartitionId)); + //Call method under tests + task.execute(execution); + + //Verify + verify(execution).setVariableLocal(eq(VARNAME_INTERRO_REMISE_EN_COLLECTE_LIST), eq(mockedResponse)); + } +} \ No newline at end of file diff --git a/src/test/java/fr/insee/protools/backend/service/utils/TestServiceWithRestClient.java b/src/test/java/fr/insee/protools/backend/service/utils/TestServiceWithRestClient.java index 8fe60184..b2637908 100644 --- a/src/test/java/fr/insee/protools/backend/service/utils/TestServiceWithRestClient.java +++ b/src/test/java/fr/insee/protools/backend/service/utils/TestServiceWithRestClient.java @@ -1,10 +1,12 @@ package fr.insee.protools.backend.service.utils; import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.node.JsonNodeFactory; import fr.insee.protools.backend.restclient.RestClientHelper; import fr.insee.protools.backend.restclient.exception.runtime.HttpClient4xxBPMNError; import fr.insee.protools.backend.restclient.pagination.PageResponse; import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.ArgumentCaptor; import org.mockito.ArgumentMatchers; @@ -20,6 +22,7 @@ import java.util.Optional; import java.util.function.Function; +import static fr.insee.protools.backend.restclient.configuration.ApiConfigProperties.KNOWN_API.KNOWN_API_TRAITERXXX; import static org.hamcrest.MatcherAssert.assertThat; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotNull; diff --git a/src/test/java/fr/insee/protools/backend/service/utils/delegate/TestDelegateWithContext.java b/src/test/java/fr/insee/protools/backend/service/utils/delegate/TestDelegateWithContext.java index ca2a3cb0..97e51f5c 100644 --- a/src/test/java/fr/insee/protools/backend/service/utils/delegate/TestDelegateWithContext.java +++ b/src/test/java/fr/insee/protools/backend/service/utils/delegate/TestDelegateWithContext.java @@ -115,32 +115,4 @@ void getContextErrors_should_work_when_valid_contexte() throws JsonProcessingExc assertTrue(errors.isEmpty(),"We should not have any error in a valid contexte"); } } - - @Test - void getContextErrors_should_return_error_when_null_context() { - if(getTaskUnderTest() instanceof DelegateContextVerifier){ - Set errors=((DelegateContextVerifier) getTaskUnderTest()).getContextErrors(null); - assertEquals(1,errors.size(),"We should have 1 error with a null contexte"); - assertTrue(errors.contains("Context is null")); - } - } - @Test - void getContextErrors_should_return_error_when_no_id() throws JsonProcessingException { - ContexteProcessus schema = objectMapper.readValue(minimalValidCtxt(), ContexteProcessus.class); - schema.setId(null); - if(getTaskUnderTest() instanceof DelegateContextVerifier){ - Set errors=((DelegateContextVerifier) getTaskUnderTest()).getContextErrors(schema); - assertTrue(errors.contains("Context Id")); - } - } - - @Test - void getContextErrors_should_return_error_when_no_contexte() throws JsonProcessingException { - ContexteProcessus schema = objectMapper.readValue(minimalValidCtxt(), ContexteProcessus.class); - schema.setContexte(null); - if(getTaskUnderTest() instanceof DelegateContextVerifier){ - Set errors=((DelegateContextVerifier) getTaskUnderTest()).getContextErrors(schema); - assertTrue(errors.contains("Contexte is missing")); - } - } } From 321ee47d2117ffca36e2c94d67eba7359eade4fb Mon Sep 17 00:00:00 2001 From: SNDIL - Marc Date: Fri, 20 Sep 2024 13:48:29 +0200 Subject: [PATCH 65/75] en cours TU --- pom.xml | 5 + .../service/utils/ContextUtils.java | 30 -- .../restclient/keycloak/KeycloakService.java | 1 + .../service/context/ContextConstants.java | 134 ------- .../service/context/ContextServiceImpl.java | 57 +-- .../MeshuggahCreateContextTaskREST.java | 2 - .../PlatinePilotageCreateContextTaskREST.java | 7 +- ...ineQuestionnaireCreateContextTaskREST.java | 7 +- .../TraiterXXXCreateContextTaskREST.java | 2 - .../resources/schema/contexte-processus.json | 96 +---- .../restclient/RestClientHelperTest.java | 187 ---------- .../webclient/KeycloakServiceTest.java | 169 --------- .../webclient/RestClientHelperTest.java | 336 ------------------ ...aneQuestionnaireCreateContextTaskTest.java | 2 +- .../restclient/KeycloakServiceTest.java | 1 - .../context/ContextServiceImplTest.java | 310 ++++++++++++++++ ...rtitionListOfInterroPaginatedTaskTest.java | 8 +- .../password/PasswordServiceImplTest.java} | 11 +- 18 files changed, 351 insertions(+), 1014 deletions(-) delete mode 100644 src/main/java/fr/insee/protools/backend/deprecated/service/utils/ContextUtils.java delete mode 100644 src/test/backup/java/fr/insee/protools/backend/restclient/restclient/RestClientHelperTest.java delete mode 100644 src/test/backup/java/fr/insee/protools/backend/restclient/webclient/KeycloakServiceTest.java delete mode 100644 src/test/backup/java/fr/insee/protools/backend/restclient/webclient/RestClientHelperTest.java create mode 100644 src/test/java/fr/insee/protools/backend/service/context/ContextServiceImplTest.java rename src/test/{backup/java/fr/insee/protools/backend/service/utils/password/PasswordServiceTest.java => java/fr/insee/protools/backend/service/utils/password/PasswordServiceImplTest.java} (89%) diff --git a/pom.xml b/pom.xml index 3643a883..7cf4356b 100644 --- a/pom.xml +++ b/pom.xml @@ -140,6 +140,11 @@ 1.5.1 + + + com.fasterxml.jackson.datatype + jackson-datatype-jsr310 + diff --git a/src/main/java/fr/insee/protools/backend/deprecated/service/utils/ContextUtils.java b/src/main/java/fr/insee/protools/backend/deprecated/service/utils/ContextUtils.java deleted file mode 100644 index 621de018..00000000 --- a/src/main/java/fr/insee/protools/backend/deprecated/service/utils/ContextUtils.java +++ /dev/null @@ -1,30 +0,0 @@ -package fr.insee.protools.backend.deprecated.service.utils; - -import com.fasterxml.jackson.databind.JsonNode; -import org.flowable.common.engine.api.FlowableIllegalArgumentException; - -import static fr.insee.protools.backend.service.context.ContextConstants.CTX_PARTITIONS; -import static fr.insee.protools.backend.service.context.ContextConstants.CTX_PARTITION_ID; - -//TODO : à déplacer dans ContextService?? A supprimer intégralement -public class ContextUtils { - - //TODO: supprimer?? - //Search for the current partition in the contexte. - public static JsonNode getCurrentPartitionNode(JsonNode contextRootNode, String currentPartitionId) { - JsonNode currentPartitionNode=null; - // Search for the correct partition based on it's ID - for (JsonNode subNode : contextRootNode.path(CTX_PARTITIONS)) { - if (subNode.has(CTX_PARTITION_ID) && subNode.get(CTX_PARTITION_ID).asText().equals(currentPartitionId)) { - currentPartitionNode = subNode; - break; - } - } - if (currentPartitionNode == null) { - throw new FlowableIllegalArgumentException(String.format("Partition id=[%s] not found in contexte", currentPartitionId)); - } - return currentPartitionNode; - } - - private ContextUtils(){} -} diff --git a/src/main/java/fr/insee/protools/backend/restclient/keycloak/KeycloakService.java b/src/main/java/fr/insee/protools/backend/restclient/keycloak/KeycloakService.java index 3061a160..075fa09e 100644 --- a/src/main/java/fr/insee/protools/backend/restclient/keycloak/KeycloakService.java +++ b/src/main/java/fr/insee/protools/backend/restclient/keycloak/KeycloakService.java @@ -68,6 +68,7 @@ private void refreshToken(APIProperties.AuthProperties authProperties) throws Ke try { uri = new URI(uri).normalize().toString(); } catch (URISyntaxException e) { + //Will probably never be reached if URL is tests before throw new KeycloakTokenConfigBPMNError(String.format("Auth is not correctly configured for [%s]",authProperties)); } MultiValueMap requestBody = new LinkedMultiValueMap<>(); diff --git a/src/main/java/fr/insee/protools/backend/service/context/ContextConstants.java b/src/main/java/fr/insee/protools/backend/service/context/ContextConstants.java index f729c3e0..1d26e651 100644 --- a/src/main/java/fr/insee/protools/backend/service/context/ContextConstants.java +++ b/src/main/java/fr/insee/protools/backend/service/context/ContextConstants.java @@ -2,138 +2,4 @@ public final class ContextConstants { - // Campaign context constants - Metadata - public static final String CTX_CAMPAGNE_ID = "id"; - public static final String CTX_CAMPAGNE_LABEL = "label"; - public static final String CTX_CAMPAGNE_CONTEXTE = "contexte"; //Values: Enum CampaignContext... - - - //Metadonnees Part - public static final String CTX_METADONNEES = "metadonnees"; - public static final String CTX_META_OPERATION_ID = "operationId";//== platine : Survey - public static final String CTX_META_SERIE_ID = "serieId"; //== platine : source - public static final String CTX_META_ANNEE = "annee"; - public static final String CTX_META_PERIODE = "periode"; - public static final String CTX_META_PERIODICITE = "periodicite"; - - public static final String CTX_META_LABEL_COURT_OPERATION = "operationLabelCourt"; - public static final String CTX_META_LABEL_LONG_OPERATION = "operationLabelLong"; - public static final String CTX_META_SERIE_LABEL_COURT = "serieLabelCourt"; - public static final String CTX_META_SERIE_LABEL_LONG = "serieLabelLong"; - public static final String CTX_META_PORTAIL_MES_ENQUETE_OPERATION = "portailMesEnquetesOperation"; - public static final String CTX_META_OBJECTIFS_COURTS = "objectifsCourts"; - public static final String CTX_META_OBJECTIFS_LONGS = "objectifsLongs"; - public static final String CTX_META_CARACTERE_OBLIGATOIRE = "caractereObligatoire"; - public static final String CTX_META_QUALITE_STATISTIQUE = "qualiteStatistique"; - public static final String CTX_META_TEST_NON_LABELLISE = "testNonLabellise"; - public static final String CTX_META_ANNEE_VISA = "anneeVisa"; - public static final String CTX_META_NUMERO_VISA = "numeroVisa"; - public static final String CTX_META_MINISTERE_TUTELLE = "ministereTutelle"; - public static final String CTX_META_PARUTION_JO = "parutionJo"; - public static final String CTX_META_DATE_PARUTION_JO = "dateParutionJo"; - public static final String CTX_META_RESPONSABLE_OPERATIONNEL = "responsableOperationnel"; - public static final String CTX_META_RESPONSABLE_TRAITEMENT = "responsableTraitement"; - public static final String CTX_META_CNIS_URL = "cnisUrl"; - public static final String CTX_META_DIFFUSION_URL = "diffusionUrl"; - public static final String CTX_META_NOTICE_URL = "noticeUrl"; - public static final String CTX_META_SPECIMENT_URL = "specimenUrl"; - //Metadonnees proprietaire (platine) - public static final String CTX_META_PROPRIETAIRE_ID = "proprietaireId"; - public static final String CTX_META_PROPRIETAIRE_LABEL = "proprietaireLabel"; - public static final String CTX_META_PROPRIETAIRE_LOGO = "proprietaireLogo"; - //Metadonnees assistance (platine) - public static final String CTX_META_ASSISTANCE_NIVO2_ID = "assistanceNiveau2Id"; - public static final String CTX_META_ASSISTANCE_NIVO2_LABEL = "assistanceNiveau2Label"; - public static final String CTX_META_ASSISTANCE_NIVO2_TEL = "assistanceNiveau2Tel"; - public static final String CTX_META_ASSISTANCE_NIVO2_MAIL = "assitanceNiveau2Mail"; - public static final String CTX_META_ASSISTANCE_NIVO2_PAYS = "asssistanceNiveau2Pays"; - public static final String CTX_META_ASSISTANCE_NIVO2_NUMERO_VOIE = "assistanceNiveau2NumeroVoie"; - public static final String CTX_META_ASSISTANCE_NIVO2_NOM_VOIE = "assistanceNiveau2NomVoie"; - public static final String CTX_META_ASSISTANCE_NIVO2_COMMUNE = "assistanceNiveau2Commune"; - public static final String CTX_META_ASSISTANCE_NIVO2_CODE_POSTAL = "assistanceNiveau2CodePostal"; - public static final String CTX_META_MAIL_BOITE_RETOUR = "mailBoiteRetour"; - public static final String CTX_META_URL_ENQUETE = "urlEnquete"; - public static final String CTX_META_THEME_MIEUX_CONNAITRE_MAIL = "themeMieuxConnaitreMail"; - public static final String CTX_META_SRVC_COL_SIGN_FONCTION = "serviceCollecteurSignataireFonction"; - public static final String CTX_META_SRVC_COL_SIGN_NOM = "serviceCollecteurSignataireNom"; - public static final String CTX_META_PRESTATAIRE = "prestataire"; - public static final String CTX_META_MAIL_RESP_OPERATIONNEL = "mailResponsableOperationnel"; - public static final String CTX_META_LOGO_PRESTATAIRE = "logoPrestataire"; - //Metadonnes platine - public static final String CTX_META_URL_LOI_RGPD = "urlLoiRGPD"; - public static final String CTX_META_URL_LOI_STATISTIQUE = "urlLoiStatistique"; - public static final String CTX_META_URL_LOI_INFORMATIQUE = "urlLoiInformatique"; - - - //Pour sabiane - public static final String CTX_META_REPERAGE = "reperage"; - public static final String CTX_META_ESSAIS_CONTACT = "essaisContact"; - public static final String CTX_META_BILAN_CONTACT = "bilanContact"; - public static final String CTX_META_REFERENTS_PRINCIPAUX = "referentsPrincipaux"; - public static final String CTX_META_REFERENTS_SECONDAIRES = "referentsSecondaires"; - public static final String CTX_META_SITES_GESTION = "sitesGestion"; - //Referents principaux et secondaires (sabiane) - public static final String CTX_META_REFERENT_NOM = "nom"; - public static final String CTX_META_REFERENT_PRENOM = "prenom"; - public static final String CTX_META_REFERENT_TELEPHONE = "telephone"; - - // Partitions - public static final String CTX_PARTITIONS = "partitions"; - public static final String CTX_PARTITION_ID = "id"; - public static final String CTX_PARTITION_LABEL = "label"; - public static final String CTX_PARTITION_TYPE_ECHANTILLON = "typeEchantillon"; - public static final String CTX_PARTITION_DATE_DEBUT_COLLECTE = "dateDebutCollecte"; - public static final String CTX_PARTITION_DATE_FIN_COLLECTE = "dateFinCollecte"; - public static final String CTX_PARTITION_DATE_RETOUR = "dateRetour"; - public static final String CTX_PARTITION_QUESTIONNAIRE_MODEL = "questionnaireModel"; - public static final String CTX_PARTITION_QUIREPOND1 = "quiRepond1"; - public static final String CTX_PARTITION_QUIREPOND2 = "quiRepond2"; - public static final String CTX_PARTITION_QUIREPOND3 = "quiRepond3"; - public static final String CTX_PARTITION_PRIORITAIRE = "prioritaire"; - - // Partitions Communications - public static final String CTX_PARTITION_COMMUNICATIONS = "communications"; - public static final String CTX_PARTITION_COMMUNICATION_ID = "id"; - public static final String CTX_PARTITION_COMMUNICATION_ECHEANCE = "echeance"; - - public static final String CTX_PARTITION_COMMUNICATION_MOYEN = "moyenCommunication"; - public static final String CTX_PARTITION_COMMUNICATION_PHASE = "phaseCommunication"; - public static final String CTX_PARTITION_COMMUNICATION_AVEC_QUESTIONNAIRE_PAPIER = "avecQuestionnairePapier"; - public static final String CTX_PARTITION_COMMUNICATION_PROTOCOLE = "protocole"; - public static final String CTX_PARTITION_COMMUNICATION_MODE = "mode"; - public static final String CTX_PARTITION_COMMUNICATION_TYPE_MODELE = "typeModele"; - public static final String CTX_PARTITION_COMMUNICATION_OBJET_MAIL = "objetMail"; - public static final String CTX_PARTITION_COMMUNICATION_RELANCE_LIBRE_PARAGRAPHE1 = "relanceLibreMailParagraphe1"; - public static final String CTX_PARTITION_COMMUNICATION_RELANCE_LIBRE_PARAGRAPHE2 = "relanceLibreMailParagraphe2"; - public static final String CTX_PARTITION_COMMUNICATION_RELANCE_LIBRE_PARAGRAPHE3 = "relanceLibreMailParagraphe3"; - public static final String CTX_PARTITION_COMMUNICATION_RELANCE_LIBRE_PARAGRAPHE4 = "relanceLibreMailParagraphe4"; - public static final String CTX_PARTITION_COMMUNICATION_COMPLEMENT_CONNEXION = "complementConnexion"; - public static final String CTX_PARTITION_COMMUNICATION_TYPE = "typeCommunication"; - - - - //Partitions, specific sabiane - public static final String CTX_PARTITION_SABIANE_DATE_DEBUT_VISIBILITE_GESTIONNAIRE = "dateDebutVisibiliteGestionnaire"; - public static final String CTX_PARTITION_SABIANE_DATE_DEBUT_VISIBILITE_ENQUETEUR = "dateDebutVisibiliteEnqueteur"; - public static final String CTX_PARTITION_SABIANE_DATE_DEBUT_REPERAGE = "dateDebutReperage"; - public static final String CTX_PARTITION_SABIANE_DATE_FIN_TRAITEMENT = "dateFinTraitement"; - - //Partitions, specific ERA - public static final String CTX_PARTITION_ERA_SEXE = "sexe"; - - // QuestionnaireModels - public static final String CTX_QUESTIONNAIRE_MODELS = "questionnaireModels"; - public static final String CTX_QUESTIONNAIRE_MODEL_ID = "id"; - public static final String CTX_QUESTIONNAIRE_MODEL_CHEMIN_REPERTOIRE = "cheminRepertoire"; - public static final String CTX_QUESTIONNAIRE_MODEL_LABEL = "label"; - public static final String CTX_QUESTIONNAIRE_MODEL_REQUIRED_NOMENCLATURES = "requiredNomenclatureIds"; - - // Nomenclatures - public static final String CTX_NOMENCLATURES = "nomenclatures"; - public static final String CTX_NOMENCLATURE_ID = "id"; - public static final String CTX_NOMENCLATURE_CHEMIN_REPERTOIRE = "cheminRepertoire"; - public static final String CTX_NOMENCLATURE_LABEL = "label"; - //Constants class should not be initialized - private ContextConstants() { - } } \ No newline at end of file diff --git a/src/main/java/fr/insee/protools/backend/service/context/ContextServiceImpl.java b/src/main/java/fr/insee/protools/backend/service/context/ContextServiceImpl.java index b49a84d5..78e88301 100644 --- a/src/main/java/fr/insee/protools/backend/service/context/ContextServiceImpl.java +++ b/src/main/java/fr/insee/protools/backend/service/context/ContextServiceImpl.java @@ -4,20 +4,22 @@ import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.ObjectReader; +import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; import com.networknt.schema.JsonSchema; import com.networknt.schema.JsonSchemaFactory; import com.networknt.schema.SpecVersion; import com.networknt.schema.ValidationMessage; import fr.insee.protools.backend.dto.ContexteProcessus; import fr.insee.protools.backend.service.DelegateContextVerifier; -import fr.insee.protools.backend.service.context.exception.*; +import fr.insee.protools.backend.service.context.exception.BadContexMissingBPMNError; +import fr.insee.protools.backend.service.context.exception.BadContextIOException; +import fr.insee.protools.backend.service.context.exception.BadContextIncorrectBPMNError; +import fr.insee.protools.backend.service.context.exception.BadContextNotJSONBPMNError; import fr.insee.protools.backend.service.exception.ProcessDefinitionNotFoundException; import fr.insee.protools.backend.service.exception.TaskNotFoundException; -import fr.insee.protools.backend.service.utils.log.TimeLogUtils; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.apache.commons.lang3.tuple.Pair; import org.flowable.bpmn.model.BpmnModel; import org.flowable.bpmn.model.FlowElement; import org.flowable.bpmn.model.ServiceTask; @@ -37,20 +39,17 @@ import java.io.IOException; import java.nio.charset.StandardCharsets; -import java.time.Instant; -import java.time.format.DateTimeParseException; import java.util.*; import java.util.concurrent.ConcurrentHashMap; import static fr.insee.protools.backend.service.FlowableVariableNameConstants.VARNAME_CONTEXT; -import static fr.insee.protools.backend.service.context.ContextConstants.*; @Service @Slf4j @RequiredArgsConstructor public class ContextServiceImpl implements ContextService { - private static final ObjectReader defaultReader = new ObjectMapper().reader(); // maybe with configs + private static final ObjectReader defaultReader = new ObjectMapper().registerModule(new JavaTimeModule()).reader(); // maybe with configs //Key : processInstanceID //Value: Pair private static final Map contextCache = new ConcurrentHashMap<>(); @@ -64,44 +63,6 @@ public class ContextServiceImpl implements ContextService { .getInstance(SpecVersion.VersionFlag.V202012) .getSchema(ContextServiceImpl.class.getResourceAsStream(SCHEMA_VALIDATION_FILE)); - //TODO : soit les json schema permettent de valider les dates, soit il faudra valider toutes les dates comme ça - public static Pair getCollectionStartAndEndFromPartition(JsonNode partitionNode) { - String start = partitionNode.get(CTX_PARTITION_DATE_DEBUT_COLLECTE).asText(); - String end = partitionNode.get(CTX_PARTITION_DATE_FIN_COLLECTE).asText(); - - if (start == null || end == null) { - throw new BadContextIncorrectBPMNError(String.format("%s and %s must be defined on every partition", CTX_PARTITION_DATE_DEBUT_COLLECTE, CTX_PARTITION_DATE_FIN_COLLECTE)); - } - - try { - Instant collectionStart = Instant.parse(start); - Instant collectionEnd = Instant.parse(end); - log.info("partition_id={} - CollectionStartDate={} - CollectionEndDate={}", partitionNode.path(CTX_PARTITION_ID), TimeLogUtils.format(collectionStart), TimeLogUtils.format(collectionEnd)); - return Pair.of(collectionStart, - collectionEnd); - - } catch (DateTimeParseException e) { - throw new BadContextIncorrectBPMNError(String.format("%s or %s cannot be read as Instant : %s", CTX_PARTITION_DATE_DEBUT_COLLECTE, CTX_PARTITION_DATE_FIN_COLLECTE, e.getMessage())); - } - } - - public static Instant getInstantFromPartition(JsonNode partitionNode, String subnode) throws BadContextDateTimeParseBPMNError { - JsonNode instantNode = partitionNode.get(subnode); - if (instantNode == null) { - throw new BadContextDateTimeParseBPMNError(String.format("node %s of partition %s does not exists", subnode, partitionNode.path(CTX_PARTITION_ID).asText())); - } - String valueTxt = partitionNode.path(subnode).asText(); - if (valueTxt.isBlank()) { - throw new BadContextDateTimeParseBPMNError(String.format("node %s of partition %s is blank", subnode, partitionNode.path(CTX_PARTITION_ID).asText())); - } - - try { - return Instant.parse(valueTxt); - } catch (DateTimeParseException e) { - throw new BadContextDateTimeParseBPMNError(String.format("node %s of partition %s having value [%s] cannot be parsed : %s", subnode, partitionNode.path(CTX_PARTITION_ID).asText(), valueTxt, e.getMessage())); - } - } - @Override public void processContextFileAndCompleteTask(MultipartFile file, String taskId) { //Check if task exists @@ -195,7 +156,7 @@ private ContextPair getContextByProcessInstance(String processInstanceId) { return result; } - private ContexteProcessus jsonReadAndSchemaValidation(JsonNode rootContext) { + protected ContexteProcessus jsonReadAndSchemaValidation(JsonNode rootContext) { //Validate that the Json is valid regarding the json-schema Set jsonValidationErrors = contextJsonSchema.validate(rootContext); if (!jsonValidationErrors.isEmpty()) { @@ -213,7 +174,7 @@ private ContexteProcessus jsonReadAndSchemaValidation(JsonNode rootContext) { } } - private ContextPair processContextFile(MultipartFile file, String processDefinitionKey) { + protected ContextPair processContextFile(MultipartFile file, String processDefinitionKey) { //Validate file name (JSON) var fileExtension = getFileExtension(file.getOriginalFilename()); if (fileExtension.isEmpty()) { @@ -309,6 +270,6 @@ private Set analyseProcess(FlowElement flowElement, ContexteProcessus co return Set.of(); } - private record ContextPair(String contextAsString, ContexteProcessus contextSchema) { + protected record ContextPair(String contextAsString, ContexteProcessus contextSchema) { } } diff --git a/src/main/java/fr/insee/protools/backend/service/meshuggah/delegate/MeshuggahCreateContextTaskREST.java b/src/main/java/fr/insee/protools/backend/service/meshuggah/delegate/MeshuggahCreateContextTaskREST.java index eeadaa10..f33c17a3 100644 --- a/src/main/java/fr/insee/protools/backend/service/meshuggah/delegate/MeshuggahCreateContextTaskREST.java +++ b/src/main/java/fr/insee/protools/backend/service/meshuggah/delegate/MeshuggahCreateContextTaskREST.java @@ -11,8 +11,6 @@ import org.flowable.engine.delegate.JavaDelegate; import org.springframework.stereotype.Component; -import static fr.insee.protools.backend.service.context.ContextConstants.CTX_CAMPAGNE_ID; - @Slf4j @RequiredArgsConstructor @Component diff --git a/src/main/java/fr/insee/protools/backend/service/platine/delegate/pilotatage/PlatinePilotageCreateContextTaskREST.java b/src/main/java/fr/insee/protools/backend/service/platine/delegate/pilotatage/PlatinePilotageCreateContextTaskREST.java index 0847020d..a822eb45 100644 --- a/src/main/java/fr/insee/protools/backend/service/platine/delegate/pilotatage/PlatinePilotageCreateContextTaskREST.java +++ b/src/main/java/fr/insee/protools/backend/service/platine/delegate/pilotatage/PlatinePilotageCreateContextTaskREST.java @@ -1,6 +1,7 @@ package fr.insee.protools.backend.service.platine.delegate.pilotatage; import com.fasterxml.jackson.databind.JsonNode; +import fr.insee.protools.backend.dto.ContexteProcessus; import fr.insee.protools.backend.service.context.ContextService; import fr.insee.protools.backend.service.platine.service.PlatinePilotageService; import lombok.RequiredArgsConstructor; @@ -9,8 +10,6 @@ import org.flowable.engine.delegate.JavaDelegate; import org.springframework.stereotype.Component; -import static fr.insee.protools.backend.service.context.ContextConstants.CTX_CAMPAGNE_ID; - @Slf4j @RequiredArgsConstructor @Component @@ -23,10 +22,10 @@ public class PlatinePilotageCreateContextTaskREST implements JavaDelegate { public void execute(DelegateExecution execution) { log.info("ProcessInstanceId={} begin",execution.getProcessInstanceId()); JsonNode contextRootNode = protoolsContext.getContextJsonNodeByProcessInstance(execution.getProcessInstanceId()); - String campainId = contextRootNode.path(CTX_CAMPAGNE_ID).asText(); + ContexteProcessus contexteProcessus = protoolsContext.getContextDtoByProcessInstance(execution.getProcessInstanceId()); //No context used (only passed as json) - platinePilotageService.postContext(campainId,contextRootNode); + platinePilotageService.postContext(contexteProcessus.getId().toString(),contextRootNode); log.info("ProcessInstanceId={} end",execution.getProcessInstanceId()); diff --git a/src/main/java/fr/insee/protools/backend/service/platine/delegate/questionnaire/PlatineQuestionnaireCreateContextTaskREST.java b/src/main/java/fr/insee/protools/backend/service/platine/delegate/questionnaire/PlatineQuestionnaireCreateContextTaskREST.java index 80fd83c8..1ae39ddb 100644 --- a/src/main/java/fr/insee/protools/backend/service/platine/delegate/questionnaire/PlatineQuestionnaireCreateContextTaskREST.java +++ b/src/main/java/fr/insee/protools/backend/service/platine/delegate/questionnaire/PlatineQuestionnaireCreateContextTaskREST.java @@ -1,6 +1,7 @@ package fr.insee.protools.backend.service.platine.delegate.questionnaire; import com.fasterxml.jackson.databind.JsonNode; +import fr.insee.protools.backend.dto.ContexteProcessus; import fr.insee.protools.backend.service.context.ContextService; import fr.insee.protools.backend.service.platine.service.PlatineQuestionnaireService; import lombok.RequiredArgsConstructor; @@ -9,8 +10,6 @@ import org.flowable.engine.delegate.JavaDelegate; import org.springframework.stereotype.Component; -import static fr.insee.protools.backend.service.context.ContextConstants.CTX_CAMPAGNE_ID; - @Slf4j @RequiredArgsConstructor @Component @@ -23,10 +22,10 @@ public class PlatineQuestionnaireCreateContextTaskREST implements JavaDelegate { public void execute(DelegateExecution execution) { log.info("ProcessInstanceId={} begin",execution.getProcessInstanceId()); JsonNode contextRootNode = protoolsContext.getContextJsonNodeByProcessInstance(execution.getProcessInstanceId()); - String campainId = contextRootNode.path(CTX_CAMPAGNE_ID).asText(); + ContexteProcessus contexteProcessus = protoolsContext.getContextDtoByProcessInstance(execution.getProcessInstanceId()); //No context used (only passed as json) - platineQuestionnaireService.postContext(campainId,contextRootNode); + platineQuestionnaireService.postContext(contexteProcessus.getId().toString(),contextRootNode); log.info("ProcessInstanceId={} end",execution.getProcessInstanceId()); diff --git a/src/main/java/fr/insee/protools/backend/service/traiterXXXX/delegate/TraiterXXXCreateContextTaskREST.java b/src/main/java/fr/insee/protools/backend/service/traiterXXXX/delegate/TraiterXXXCreateContextTaskREST.java index abaa08f9..0a6d2aab 100644 --- a/src/main/java/fr/insee/protools/backend/service/traiterXXXX/delegate/TraiterXXXCreateContextTaskREST.java +++ b/src/main/java/fr/insee/protools/backend/service/traiterXXXX/delegate/TraiterXXXCreateContextTaskREST.java @@ -11,8 +11,6 @@ import org.flowable.engine.delegate.JavaDelegate; import org.springframework.stereotype.Component; -import static fr.insee.protools.backend.service.context.ContextConstants.CTX_CAMPAGNE_ID; - @Slf4j @RequiredArgsConstructor @Component diff --git a/src/main/resources/schema/contexte-processus.json b/src/main/resources/schema/contexte-processus.json index d421870d..1c8f32ad 100644 --- a/src/main/resources/schema/contexte-processus.json +++ b/src/main/resources/schema/contexte-processus.json @@ -436,6 +436,7 @@ }, "lots": { "type": "array", + "minItems": 1, "items": { "type": "object", "properties": { @@ -601,10 +602,7 @@ } }, "required": [ - "idSite", - "assistanceMail", - "assistanceTel", - "envoiCourrier" + "idSite" ] } }, @@ -863,92 +861,16 @@ }, "required": [ "id", - "label", - "echeance", "moyenCommunication", - "typeCommunication", - "modeleCommunication", - "questionnairePapier", - "objetMail", - "dateEdition", - "moisEditionOuverture", - "moisEditionOuvertureTelephone", - "relanceLibreParagraphe1", - "relanceLibreParagraphe2", - "relanceLibreParagraphe3", - "relanceLibreParagraphe4", - "complementConnexion", - "typeQuestionnaire", - "idOperationEditique", - "partieNomFichierLibreZip", - "bat", - "rnvp", - "accuseReception", - "introMail" + "typeCommunication" ] } } }, "required": [ "id", - "label", - "lotsEnLien", "typeEchantillon", - "modesCollecte", - "dateDebutVisibiliteGestionnaire", - "dateDebutVisibiliteEnqueteur", - "dateDebutReperage", - "dateDebutCollecte", - "dateFinCollecte", - "dateFinTraitementGestionnaire", - "dateFinTraitementReprise", - "dateRetour", - "questionnairesModeles", - "moduleCommentaire", - "svi", - "codeEnquete", - "rangInterrogation", - "reperage", - "essaisContact", - "bilanContact", - "sitesGestion", - "dureeQuestionnaire", - "pasAccesInternet", - "numeroSequence", - "themeSequence", - "documentsPourRepondre", - "partieDeroulementEnquete", - "deroulementEnquete", - "imageDeroulementEnquete", - "periodePrecedenteInterrogation", - "relanceNonRepondantsWeb", - "utilisationInfo", - "utilisationInfoExemple", - "postEnquete", - "postEnqueteParagraphe", - "rapprochement", - "courrierConsigneWeb1", - "courrierConsigneWeb2", - "imageCommentRepondre", - "imageCommentRepondreSansMDP", - "imageRepondreInternet", - "papierNombre", - "papierConsigne", - "papierNombreQuest", - "consigne1", - "consigne2", - "consigne3", - "imageQrCode", - "repriseManuelle", - "quiRepondPageDeGarde1", - "quiRepondPageDeGarde2", - "quiRepondPageDeGarde3", - "quiRepondCommunication", - "quiRepondCommunication1", - "quiRepondCommunication2", - "quiRepondCommunication3", - "relanceQuiSollicite", - "communications" + "modesCollecte" ] } }, @@ -987,7 +909,6 @@ "id", "modeCollecte", "url", - "label", "nomenclaturesReferencees" ] }, @@ -1012,12 +933,17 @@ }, "required": [ "id", - "url", - "label" + "url" ] } } }, + "required": [ + "id", + "labelCourt", + "metadonnees", + "lots" + ], "$defs": { "annee4digit": { "type": "integer", diff --git a/src/test/backup/java/fr/insee/protools/backend/restclient/restclient/RestClientHelperTest.java b/src/test/backup/java/fr/insee/protools/backend/restclient/restclient/RestClientHelperTest.java deleted file mode 100644 index 5bf2cb74..00000000 --- a/src/test/backup/java/fr/insee/protools/backend/restclient/restclient/RestClientHelperTest.java +++ /dev/null @@ -1,187 +0,0 @@ -package fr.insee.protools.backend.restclient.restclient; - -import com.fasterxml.jackson.databind.ObjectMapper; -import fr.insee.protools.backend.restclient.RestClientHelper; -import fr.insee.protools.backend.restclient.configuration.APIProperties; -import fr.insee.protools.backend.restclient.configuration.ApiConfigProperties; -import fr.insee.protools.backend.restclient.exception.ApiNotConfiguredBPMNError; -import fr.insee.protools.backend.restclient.exception.KeycloakTokenConfigUncheckedBPMNError; -import fr.insee.protools.backend.restclient.exception.runtime.HttpClient4xxBPMNError; -import fr.insee.protools.backend.restclient.keycloak.KeycloakResponse; -import fr.insee.protools.backend.restclient.keycloak.KeycloakService; -import okhttp3.mockwebserver.MockResponse; -import okhttp3.mockwebserver.MockWebServer; -import org.junit.jupiter.api.AfterEach; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; -import org.mockito.Mock; -import org.mockito.Spy; -import org.mockito.junit.jupiter.MockitoExtension; -import org.springframework.core.env.Environment; -import org.springframework.http.HttpHeaders; -import org.springframework.http.HttpStatus; -import org.springframework.http.MediaType; -import org.springframework.web.client.RestClient; - -import java.io.IOException; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.Assertions.assertThatThrownBy; -import static org.junit.jupiter.api.Assertions.*; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.Mockito.when; - -@ExtendWith(MockitoExtension.class) -public class RestClientHelperTest { - - @Spy - private Environment environment; - - private KeycloakService keycloakService; - - @Mock - private ApiConfigProperties apiConfigProperties; - - private RestClientHelper restClientHelper; - - - private MockWebServer mockWebServer; - private static final int port = 80; - private static String getDummyUriWithPort() { return getServerHostPort()+"/api/test"; } - private static String getServerHostPort() { return "http://localhost:"+port; } - - @BeforeEach - public void prepare() { - keycloakService= new KeycloakService(environment); - restClientHelper = new RestClientHelper(keycloakService,apiConfigProperties); - this.keycloakService.initialize(); - } - - //close the mocked web server if it has been initialized - @AfterEach - void mockServerCleanup() throws Exception { - if(this.mockWebServer!=null){ - this.mockWebServer.close(); - } - } - - private void initMockWebServer() throws IOException { - this.mockWebServer = new MockWebServer(); - mockWebServer.start(port); - } - - @Test - @DisplayName("Test getRestClient method without specifying an API") - void testGetRestClientWithoutApi() { - RestClient client = restClientHelper.getRestClient(); - assertThat(client).isNotNull(); - } - - private void testGetRestClientWithIncompleteKCConfig(APIProperties.AuthProperties kcAuth){ - when(apiConfigProperties.getAPIProperties(any())).thenReturn(new APIProperties(getServerHostPort(), kcAuth, true)); - var restClient = restClientHelper.getRestClient(ApiConfigProperties.KNOWN_API.KNOWN_API_ERA); - assertThat(restClient).isNotNull(); - //Should throw an exception as the realm is missing - assertThrows(KeycloakTokenConfigUncheckedBPMNError.class , () -> restClient.get().uri(getDummyUriWithPort()).retrieve()); - } - @Test - @DisplayName("Test getRestClient method without incomplete keycloak configuration") - void getRestClientWithIncompleteKCConfig() throws IOException { - //Missing realm - APIProperties.AuthProperties kcAuth = new APIProperties.AuthProperties(getDummyUriWithPort(),null, "toto","toto"); - //Should throw an exception as the realm is missing - testGetRestClientWithIncompleteKCConfig(kcAuth); - - //Missing url - kcAuth = new APIProperties.AuthProperties("null","realm", "toto","toto"); - testGetRestClientWithIncompleteKCConfig(kcAuth); - - //Missing clientId - kcAuth = new APIProperties.AuthProperties(getDummyUriWithPort(),"realm", null,"toto"); - testGetRestClientWithIncompleteKCConfig(kcAuth); - - //Missing secret - kcAuth = new APIProperties.AuthProperties(getDummyUriWithPort(),"realm", "toto",null); - testGetRestClientWithIncompleteKCConfig(kcAuth); - } - - @Test - void getRestClient() throws IOException { - - APIProperties.AuthProperties kcAuth = new APIProperties.AuthProperties(); - kcAuth.setClientId("clientId-toto"); - kcAuth.setClientSecret("client-pwd-toto"); - kcAuth.setRealm("realm-toto"); - kcAuth.setUrl(getDummyUriWithPort()); - - - when(apiConfigProperties.getAPIProperties(any())).thenReturn(new APIProperties(getServerHostPort(), kcAuth, true)); - RestClient restClient = restClientHelper.getRestClient(ApiConfigProperties.KNOWN_API.KNOWN_API_ERA); - assertThat(restClient).isNotNull(); - - KeycloakResponse kcResponse = new KeycloakResponse(); - kcResponse.setAccesToken("MYTOKEN"); - kcResponse.setExpiresIn(5*60*1000); - MockResponse mockResponseKC = new MockResponse() - .addHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON) - .setResponseCode(HttpStatus.OK.value()) - .setBody(new ObjectMapper().writeValueAsString(kcResponse)); - - MockResponse mockResponse = new MockResponse() - .setResponseCode(HttpStatus.NO_CONTENT.value()) - .setBody("XXX"); - - initMockWebServer(); - mockWebServer.enqueue(mockResponseKC); - mockWebServer.enqueue(mockResponse); - - - - assertThat(restClient.get().uri(getDummyUriWithPort()).retrieve().toBodilessEntity().getStatusCode()).isEqualTo(HttpStatus.NO_CONTENT); - } - - @Test - void getRestClient_withInvalidApiConfig() { - when(apiConfigProperties.getAPIProperties(any())).thenReturn(null); - assertThatThrownBy(() -> restClientHelper.getRestClient(any())) - .isInstanceOf(ApiNotConfiguredBPMNError.class) - .hasMessageContaining("is not configured in properties"); - } - - @Test - void getRestClient_withDisabledApiConfig() { - when(apiConfigProperties.getAPIProperties(any())).thenReturn(new APIProperties("http://localhost:8080", new APIProperties.AuthProperties(), false )); - assertThatThrownBy(() -> restClientHelper.getRestClient(any())) - .isInstanceOf(ApiNotConfiguredBPMNError.class) - .hasMessageContaining("is disabled in properties"); - } - - @Test - @DisplayName("Test that the retrieval of spring private field still works") - void extractClientResponseRequestDescriptionPrivateFiledUsingReflexion_shouldWork() throws IOException { - RestClient restClient = restClientHelper.getRestClient(); - assertThat(restClient).isNotNull(); - - //Mock an error response - MockResponse mockResponse = new MockResponse() - .setResponseCode(HttpStatus.BAD_REQUEST.value()) - .setBody("XXX"); - - initMockWebServer(); - mockWebServer.enqueue(mockResponse); - - //Call method under test - HttpClient4xxBPMNError exception = assertThrows(HttpClient4xxBPMNError.class , () ->restClient.get().uri(getDummyUriWithPort()).retrieve() - .toBodilessEntity()); - - //Post call conditions (we get more or less the expected message with the original request) - //IF it is not the case, check that the spring private field has not changed or been renamed - String actualMessage = exception.getMessage(); - assertThat(actualMessage) - .contains("GET") - .contains(getDummyUriWithPort()) - .contains(String.valueOf(HttpStatus.BAD_REQUEST.value())); - } -} \ No newline at end of file diff --git a/src/test/backup/java/fr/insee/protools/backend/restclient/webclient/KeycloakServiceTest.java b/src/test/backup/java/fr/insee/protools/backend/restclient/webclient/KeycloakServiceTest.java deleted file mode 100644 index 3f7fdf29..00000000 --- a/src/test/backup/java/fr/insee/protools/backend/restclient/webclient/KeycloakServiceTest.java +++ /dev/null @@ -1,169 +0,0 @@ -package fr.insee.protools.backend.restclient.webclient; - -import com.fasterxml.jackson.databind.ObjectMapper; -import fr.insee.protools.backend.restclient.keycloak.KeycloakResponse; -import fr.insee.protools.backend.restclient.keycloak.KeycloakService; -import fr.insee.protools.backend.restclient.configuration.APIProperties; -import fr.insee.protools.backend.restclient.exception.KeycloakTokenConfigBPMNError; -import okhttp3.mockwebserver.MockResponse; -import okhttp3.mockwebserver.MockWebServer; -import org.junit.jupiter.api.AfterEach; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; -import org.mockito.InjectMocks; -import org.mockito.MockedStatic; -import org.mockito.Spy; -import org.mockito.junit.jupiter.MockitoExtension; -import org.springframework.core.env.Environment; -import org.springframework.http.HttpHeaders; -import org.springframework.http.HttpStatus; -import org.springframework.http.MediaType; - -import java.io.IOException; -import java.time.Instant; -import java.time.temporal.ChronoUnit; - -import static org.junit.Assert.assertEquals; -import static org.junit.jupiter.api.Assertions.assertThrows; -import static org.mockito.Mockito.mockStatic; - -@ExtendWith(MockitoExtension.class) -class KeycloakServiceTest { - - @Spy - private Environment environment; - - @InjectMocks - private KeycloakService keycloakService; - - private MockWebServer mockWebServer; - private static final int port = 80; - private static String getDummyUriWithPort() { return getServerHostPort()+"/toto/test"; } - private static String getServerHostPort() { return "http://localhost:"+port; } - - @BeforeEach - public void prepare() { - this.keycloakService.initialize(); - } - - //close the mocked web server if it has been initialized - @AfterEach - void mockServerCleanup() throws IOException { - if(this.mockWebServer!=null){ - this.mockWebServer.close(); - } - } - - private void initMockWebServer() throws IOException { - this.mockWebServer = new MockWebServer(); - mockWebServer.start(port); - } - - @Test - void getToken_should_throw_when_authIncorrect(){ - //Missing realm - APIProperties.AuthProperties kcAuthNullRealm = new APIProperties.AuthProperties(getDummyUriWithPort(),null, "toto","toto"); - //Should throw an exception as the realm is missing - assertThrows(KeycloakTokenConfigBPMNError.class , () -> keycloakService.getToken(kcAuthNullRealm)); - - //Blank realm - APIProperties.AuthProperties kcAuthBlankRealm = new APIProperties.AuthProperties(getDummyUriWithPort()," ", "toto","toto"); - assertThrows(KeycloakTokenConfigBPMNError.class , () -> keycloakService.getToken(kcAuthBlankRealm)); - - //Missing url - APIProperties.AuthProperties kcAuthNullUrl = new APIProperties.AuthProperties(null,"realm", "toto","toto"); - assertThrows(KeycloakTokenConfigBPMNError.class , () -> keycloakService.getToken(kcAuthNullUrl)); - - //Blank url - APIProperties.AuthProperties kcAuthBlankUrl = new APIProperties.AuthProperties("","realm", "toto","toto"); - assertThrows(KeycloakTokenConfigBPMNError.class , () -> keycloakService.getToken(kcAuthBlankUrl)); - - //Incorrect Url - APIProperties.AuthProperties kcAuthWrongUrl = new APIProperties.AuthProperties("UrlError:::-*","realm", "toto","toto"); - assertThrows(KeycloakTokenConfigBPMNError.class , () -> keycloakService.getToken(kcAuthWrongUrl)); - - //Missing clientId - APIProperties.AuthProperties kcAuthNullClientId = new APIProperties.AuthProperties(getDummyUriWithPort(),"realm", null,"toto"); - assertThrows(KeycloakTokenConfigBPMNError.class , () -> keycloakService.getToken(kcAuthNullClientId)); - - //Blank ClientId - APIProperties.AuthProperties kcAuthBlanklClientId = new APIProperties.AuthProperties(getDummyUriWithPort(),"realm", " ","toto"); - assertThrows(KeycloakTokenConfigBPMNError.class , () -> keycloakService.getToken(kcAuthBlanklClientId)); - - - //Missing secret - APIProperties.AuthProperties kcAuthNullSecret = new APIProperties.AuthProperties(getDummyUriWithPort(),"realm", "toto",null); - assertThrows(KeycloakTokenConfigBPMNError.class , () -> keycloakService.getToken(kcAuthNullSecret)); - - //Blank secret - APIProperties.AuthProperties kcAuthBlankSecret = new APIProperties.AuthProperties(getDummyUriWithPort(),"realm", "toto",""); - assertThrows(KeycloakTokenConfigBPMNError.class , () -> keycloakService.getToken(kcAuthBlankSecret)); - } - - - @Test - @DisplayName("getToken should check if a token already exists for this AuthProperties and reuse the known token if it is not exipred") - void getToken_should_refreshTokenWhenNeeded() throws IOException, KeycloakTokenConfigBPMNError, InterruptedException { - APIProperties.AuthProperties kcAuth = new APIProperties.AuthProperties(getDummyUriWithPort(),"realm", "toto","toto"); - - //Prepare 2 KC responses - KeycloakResponse kcResponse1 = new KeycloakResponse(); - kcResponse1.setAccesToken("MYTOKEN-NB1"); - kcResponse1.setExpiresIn(300); // 5 minutes - MockResponse mockResponseKC1 = new MockResponse() - .addHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON) - .setResponseCode(HttpStatus.OK.value()) - .setBody(new ObjectMapper().writeValueAsString(kcResponse1)); - - KeycloakResponse kcResponse2 = new KeycloakResponse(); - kcResponse2.setAccesToken("MYTOKEN-NB2"); - kcResponse2.setExpiresIn(300); - MockResponse mockResponseKC2 = new MockResponse() - .addHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON) - .setResponseCode(HttpStatus.OK.value()) - .setBody(new ObjectMapper().writeValueAsString(kcResponse2)); - - initMockWebServer(); - mockWebServer.enqueue(mockResponseKC1); - mockWebServer.enqueue(mockResponseKC2); - - //Test getToken - //We mock the Instant.now() method interally used by KeycloakService - Instant instant = Instant.now(); - Instant instant1 = instant.plus(1,ChronoUnit.MINUTES); - Instant instant2 = instant.plus(2,ChronoUnit.MINUTES); - Instant instant3 = instant.plus(3,ChronoUnit.MINUTES); - Instant instant4 = instant.plus(4,ChronoUnit.MINUTES); - Instant instant5 = instant.plus(5,ChronoUnit.MINUTES); - try (MockedStatic mockedStatic = mockStatic(Instant.class)) { - mockedStatic.when(Instant::now) - .thenReturn(instant); - assertEquals(kcResponse1.getAccesToken(), keycloakService.getToken(kcAuth)); - } - - //In 1-2-3-4 minute the token is not expired and we should get the same token - try (MockedStatic mockedStatic = mockStatic(Instant.class)) { - mockedStatic.when(Instant::now) - .thenReturn(instant1); - assertEquals(kcResponse1.getAccesToken(), keycloakService.getToken(kcAuth)); - mockedStatic.when(Instant::now) - .thenReturn(instant2); - assertEquals(kcResponse1.getAccesToken(), keycloakService.getToken(kcAuth)); - mockedStatic.when(Instant::now) - .thenReturn(instant3); - assertEquals(kcResponse1.getAccesToken(), keycloakService.getToken(kcAuth)); - mockedStatic.when(Instant::now) - .thenReturn(instant4); - assertEquals(kcResponse1.getAccesToken(), keycloakService.getToken(kcAuth)); - } - - //In 5 minutes the token is expired, we should get a refreshed one - try (MockedStatic mockedStatic = mockStatic(Instant.class)) { - mockedStatic.when(Instant::now) - .thenReturn(instant5); - assertEquals(kcResponse2.getAccesToken(), keycloakService.getToken(kcAuth)); - } - } -} diff --git a/src/test/backup/java/fr/insee/protools/backend/restclient/webclient/RestClientHelperTest.java b/src/test/backup/java/fr/insee/protools/backend/restclient/webclient/RestClientHelperTest.java deleted file mode 100644 index 7a2656fd..00000000 --- a/src/test/backup/java/fr/insee/protools/backend/restclient/webclient/RestClientHelperTest.java +++ /dev/null @@ -1,336 +0,0 @@ -package fr.insee.protools.backend.restclient.webclient; - -import com.fasterxml.jackson.databind.ObjectMapper; -import fr.insee.protools.backend.ProtoolsTestUtils; -import fr.insee.protools.backend.restclient.RestClientHelper; -import fr.insee.protools.backend.restclient.keycloak.KeycloakResponse; -import fr.insee.protools.backend.restclient.keycloak.KeycloakService; -import fr.insee.protools.backend.restclient.configuration.APIProperties; -import fr.insee.protools.backend.restclient.configuration.ApiConfigProperties; -import fr.insee.protools.backend.restclient.exception.ApiNotConfiguredBPMNError; -import fr.insee.protools.backend.restclient.exception.KeycloakTokenConfigUncheckedBPMNError; -import fr.insee.protools.backend.restclient.exception.runtime.HttpClient4xxBPMNError; -import okhttp3.mockwebserver.MockResponse; -import okhttp3.mockwebserver.MockWebServer; -import org.junit.jupiter.api.AfterEach; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; -import org.mockito.Mock; -import org.mockito.Spy; -import org.mockito.junit.jupiter.MockitoExtension; -import org.springframework.core.env.Environment; -import org.springframework.http.HttpHeaders; -import org.springframework.http.HttpStatus; -import org.springframework.http.MediaType; -import org.springframework.web.client.RestClient; -import org.springframework.web.reactive.function.client.WebClient; -import org.springframework.web.reactive.function.client.WebClientResponseException; - -import java.io.File; -import java.io.IOException; -import java.io.RandomAccessFile; -import java.util.List; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.Assertions.assertThatThrownBy; -import static org.junit.jupiter.api.Assertions.*; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.Mockito.when; - -@ExtendWith(MockitoExtension.class) -class RestClientHelperTest { - - @Spy - private Environment environment; - - private KeycloakService keycloakService; - - @Mock - private ApiConfigProperties apiConfigProperties; - - private RestClientHelper restClientHelper; - - - private MockWebServer mockWebServer; - private static final int port = 80; - private static String getDummyUriWithPort() { return getServerHostPort()+"/api/test"; } - private static String getServerHostPort() { return "http://localhost:"+port; } - - @BeforeEach - public void prepare() { - keycloakService= new KeycloakService(environment); - restClientHelper = new RestClientHelper(keycloakService,apiConfigProperties); - this.keycloakService.initialize(); - } - - //close the mocked web server if it has been initialized - @AfterEach - void mockServerCleanup() throws Exception { - if(this.mockWebServer!=null){ - this.mockWebServer.close(); - } - } - - private void initMockWebServer() throws IOException { - this.mockWebServer = new MockWebServer(); - mockWebServer.start(port); - } - - - private File createDummyFile(int sizeInByte, String extension) throws IOException { - File file = File.createTempFile("tempFile", ".json"); - file.deleteOnExit(); - RandomAccessFile rafile; - rafile = new RandomAccessFile(file, "rw"); - //In Bytes ==> 1024 = 1Ko ==> 1024X1024 : 1Mo - rafile.setLength(sizeInByte); - return file; - } - - private MockResponse fileToResponse(String contentType, File file) throws IOException { - return new MockResponse() - .setResponseCode(HttpStatus.OK.value()) - .setBody(ProtoolsTestUtils.fileToBytes(file)) - .addHeader("content-type: " + contentType); - } - - @Test - @DisplayName("Test getRestClient method without specifying an API") - void testgetRestClientWithoutApi() { - RestClient client = restClientHelper.getRestClient(); - assertThat(client).isNotNull(); - } - - private void testgetRestClientWithIncompleteKCConfig(APIProperties.AuthProperties kcAuth){ - when(apiConfigProperties.getAPIProperties(any())).thenReturn(new APIProperties(getServerHostPort(), kcAuth, true)); - var webClient = restClientHelper.getRestClient(ApiConfigProperties.KNOWN_API.KNOWN_API_ERA); - assertThat(webClient).isNotNull(); - //Should throw an exception as the realm is missing - assertThrows(KeycloakTokenConfigUncheckedBPMNError.class , () -> webClient.get().uri(getDummyUriWithPort()).exchange().block()); - } - @Test - @DisplayName("Test getRestClient method without incomplete keycloak configuration") - void getRestClientWithIncompleteKCConfig() throws IOException { - //Missing realm - APIProperties.AuthProperties kcAuth = new APIProperties.AuthProperties(getDummyUriWithPort(),null, "toto","toto"); - //Should throw an exception as the realm is missing - testgetRestClientWithIncompleteKCConfig(kcAuth); - - //Missing url - kcAuth = new APIProperties.AuthProperties("null","realm", "toto","toto"); - testgetRestClientWithIncompleteKCConfig(kcAuth); - - //Missing clientId - kcAuth = new APIProperties.AuthProperties(getDummyUriWithPort(),"realm", null,"toto"); - testgetRestClientWithIncompleteKCConfig(kcAuth); - - //Missing secret - kcAuth = new APIProperties.AuthProperties(getDummyUriWithPort(),"realm", "toto",null); - testgetRestClientWithIncompleteKCConfig(kcAuth); - } - - @Test - void getRestClient() throws IOException { - - APIProperties.AuthProperties kcAuth = new APIProperties.AuthProperties(); - kcAuth.setClientId("clientId-toto"); - kcAuth.setClientSecret("client-pwd-toto"); - kcAuth.setRealm("realm-toto"); - kcAuth.setUrl(getDummyUriWithPort()); - - - when(apiConfigProperties.getAPIProperties(any())).thenReturn(new APIProperties(getServerHostPort(), kcAuth, true)); - RestClient client = restClientHelper.getRestClient(ApiConfigProperties.KNOWN_API.KNOWN_API_ERA); - assertThat(client).isNotNull(); - - KeycloakResponse kcResponse = new KeycloakResponse(); - kcResponse.setAccesToken("MYTOKEN"); - kcResponse.setExpiresIn(5*60*1000); - MockResponse mockResponseKC = new MockResponse() - .addHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON) - .setResponseCode(HttpStatus.OK.value()) - .setBody(new ObjectMapper().writeValueAsString(kcResponse)); - - MockResponse mockResponse = new MockResponse() - .setResponseCode(HttpStatus.NO_CONTENT.value()) - .setBody("XXX"); - - initMockWebServer(); - mockWebServer.enqueue(mockResponseKC); - mockWebServer.enqueue(mockResponse); - - assertThat(client.get().uri(getDummyUriWithPort()).exchange().block().statusCode()).isEqualTo(HttpStatus.NO_CONTENT); - } - - @Test - @DisplayName("Test getRestClientForFile method - get the webclient and download files of different sizes") - void getRestClientForFile() throws IOException { - WebClient webClient = restClientHelper.getRestClientForFile(); - assertThat(webClient).isNotNull(); - - //Create a 1Mo File - File file1mo = createDummyFile(1024 * 1024 * 1,".json"); - File file19mo = createDummyFile(RestClientHelper.getDefaultFileBufferSize()-1024,".json"); - int tooBigSize=RestClientHelper.getDefaultFileBufferSize()+1024; - File fileTooBig = createDummyFile(tooBigSize,".json"); - - MockResponse fileToResponse_1Mo = fileToResponse(MediaType.APPLICATION_JSON_VALUE, file1mo); - MockResponse fileToResponse_19Mo = fileToResponse(MediaType.APPLICATION_JSON_VALUE, file19mo); - MockResponse fileToResponseTooBig = fileToResponse(MediaType.APPLICATION_JSON_VALUE, fileTooBig); - - -/* - - KeycloakResponse kcResponse = new KeycloakResponse(); - kcResponse.setAccesToken("MYTOKEN"); - kcResponse.setExpiresIn(5*60*1000); - - - MockResponse mockResponseKC = new MockResponse() - .addHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON) - .setResponseCode(HttpStatus.OK.value()) - .setBody(new ObjectMapper().writeValueAsString(kcResponse)); - - final Dispatcher dispatcher = new Dispatcher() { - public MockResponse dispatch(RecordedRequest request) { - switch (request.getPath()) { - case "/users/1": - return new MockResponse().setResponseCode(200); - case "/users/2": - return new MockResponse().setResponseCode(500); - case "/users/3": - return new MockResponse().setResponseCode(200).setBody("{\"id\": 1, \"name\":\"duke\"}"); - } - return new MockResponse().setResponseCode(404); - } - - mockWebServer.enqueue(mockResponseKC); - - };*/ - - initMockWebServer(); - mockWebServer.enqueue(fileToResponse_1Mo); - mockWebServer.enqueue(fileToResponse_19Mo); - mockWebServer.enqueue(fileToResponseTooBig); - mockWebServer.enqueue(fileToResponseTooBig); - - //Check for 1Mo file - assertDoesNotThrow(()-> restClientHelper.getRestClientForFile() - .get() - .uri(getDummyUriWithPort()) - .retrieve() - .bodyToMono(String.class) - .block()); - - //Check for 19Mo file - assertDoesNotThrow(()-> restClientHelper.getRestClientForFile() - .get() - .uri(getDummyUriWithPort()) - .retrieve() - .bodyToMono(String.class) - .block()); - - //Check for a too big file : Should throw and exception as default buffer is 20Mo - assertThrows(WebClientResponseException.class, () -> restClientHelper.getRestClientForFile() - .get() - .uri(getDummyUriWithPort()) - .retrieve() - .bodyToMono(String.class) - .block()); - - //Check for a too big file with a custom buffer ==> Should be ok - assertDoesNotThrow(() -> restClientHelper.getRestClientForFile(tooBigSize) - .get() - .uri(getDummyUriWithPort()) - .retrieve() - .bodyToMono(String.class) - .block()); - } - - - @Test - void getRestClient_withInvalidApiConfig() { - when(apiConfigProperties.getAPIProperties(any())).thenReturn(null); - assertThatThrownBy(() -> restClientHelper.getRestClient(any())) - .isInstanceOf(ApiNotConfiguredBPMNError.class) - .hasMessageContaining("is not configured in properties"); - } - - @Test - void getRestClient_withDisabledApiConfig() { - when(apiConfigProperties.getAPIProperties(any())).thenReturn(new APIProperties("http://localhost:8080", new APIProperties.AuthProperties(), false )); - assertThatThrownBy(() -> restClientHelper.getRestClient(any())) - .isInstanceOf(ApiNotConfiguredBPMNError.class) - .hasMessageContaining("is disabled in properties"); - } - - @Test - @DisplayName("Test that the retrieval of spring private field still works") - void extractClientResponseRequestDescriptionPrivateFiledUsingReflexion_shouldWork() throws IOException { - RestClient restClient = restClientHelper.getRestClient(); - assertThat(restClient).isNotNull(); - - //Mock an error response - MockResponse mockResponse = new MockResponse() - .setResponseCode(HttpStatus.BAD_REQUEST.value()) - .setBody("XXX"); - - initMockWebServer(); - mockWebServer.enqueue(mockResponse); - - //Call method under test - HttpClient4xxBPMNError exception = assertThrows(HttpClient4xxBPMNError.class , () ->restClient.get().uri(getDummyUriWithPort()).retrieve() - .body(String.class)); - - //Post call conditions (we get more or less the expected message with the original request) - //IF it is not the case, check that the spring private field has not changed or been renamed - String actualMessage = exception.getMessage(); - assertThat(actualMessage) - .contains("GET") - .contains(getDummyUriWithPort()) - .contains(String.valueOf(HttpStatus.BAD_REQUEST.value())); - } - - @Test - @DisplayName("Test that containsCauseOfType find an existing cause") - void containsCauseOfType_shouldFindCauseIfExists() { - //Prepare - String rootMessage="TEST"; - ArithmeticException exRoot=new ArithmeticException(rootMessage); - Exception exLvl1=new Exception("dummy",exRoot ); - Exception ex = new Exception("dummy",exLvl1 ); - - //Call - boolean found = RestClientHelper.containsCauseOfType(ex, List.of(ArithmeticException.class)); - //Check - assertTrue(found,"ArithmeticException should be found"); - - //Call - found = RestClientHelper.containsCauseOfType(exLvl1, List.of(ArithmeticException.class)); - //Check - assertTrue(found,"ArithmeticException should be found"); - - //Call - found = RestClientHelper.containsCauseOfType(exRoot, List.of(ArithmeticException.class)); - //Check - assertTrue(found,"ArithmeticException should be found"); - - //Call - found = RestClientHelper.containsCauseOfType(exRoot, List.of(RuntimeException.class)); - //Check - assertTrue(found,"RuntimeException should be found"); - - //Call - found = RestClientHelper.containsCauseOfType(exRoot, List.of(IOException.class,RuntimeException.class)); - //Check - assertTrue(found,"RuntimeException should be found"); - - //Call - found = RestClientHelper.containsCauseOfType(exRoot, List.of(IOException.class)); - //Check (should not be found) - assertFalse(found,"IOException should not be found"); - } - -} \ No newline at end of file diff --git a/src/test/backup/java/fr/insee/protools/backend/service/sabiane/delegate/SabianeQuestionnaireCreateContextTaskTest.java b/src/test/backup/java/fr/insee/protools/backend/service/sabiane/delegate/SabianeQuestionnaireCreateContextTaskTest.java index 77de2b85..80a7311b 100644 --- a/src/test/backup/java/fr/insee/protools/backend/service/sabiane/delegate/SabianeQuestionnaireCreateContextTaskTest.java +++ b/src/test/backup/java/fr/insee/protools/backend/service/sabiane/delegate/SabianeQuestionnaireCreateContextTaskTest.java @@ -75,7 +75,7 @@ void execute_should_throwBadContextIncorrect_when_contextIsKO() { /*@Test void initQuestionnaireModels_should_produce_correct_json(){ - sabianeQuestTask.² + sabianeQuestTask. }*/ @Test diff --git a/src/test/java/fr/insee/protools/backend/restclient/KeycloakServiceTest.java b/src/test/java/fr/insee/protools/backend/restclient/KeycloakServiceTest.java index 798506df..c6f545c4 100644 --- a/src/test/java/fr/insee/protools/backend/restclient/KeycloakServiceTest.java +++ b/src/test/java/fr/insee/protools/backend/restclient/KeycloakServiceTest.java @@ -102,7 +102,6 @@ void getToken_should_throw_when_authIncorrect(){ assertThrows(KeycloakTokenConfigBPMNError.class , () -> keycloakService.getToken(kcAuthBlankSecret)); } - @Test @DisplayName("getToken should check if a token already exists for this AuthProperties and reuse the known token if it is not exipred") void getToken_should_refreshTokenWhenNeeded() throws IOException, KeycloakTokenConfigBPMNError, InterruptedException { diff --git a/src/test/java/fr/insee/protools/backend/service/context/ContextServiceImplTest.java b/src/test/java/fr/insee/protools/backend/service/context/ContextServiceImplTest.java new file mode 100644 index 00000000..89a6ac57 --- /dev/null +++ b/src/test/java/fr/insee/protools/backend/service/context/ContextServiceImplTest.java @@ -0,0 +1,310 @@ +package fr.insee.protools.backend.service.context; + + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.ObjectReader; +import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; +import fr.insee.protools.backend.dto.ContexteProcessus; +import fr.insee.protools.backend.service.context.exception.BadContextIOException; +import fr.insee.protools.backend.service.context.exception.BadContextNotJSONBPMNError; +import fr.insee.protools.backend.service.exception.ProcessDefinitionNotFoundException; +import fr.insee.protools.backend.service.exception.TaskNotFoundException; +import org.flowable.common.engine.api.FlowableObjectNotFoundException; +import org.flowable.engine.RepositoryService; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.TaskService; +import org.flowable.engine.impl.RepositoryServiceImpl; +import org.flowable.engine.impl.persistence.entity.ExecutionEntityImpl; +import org.flowable.engine.runtime.ProcessInstance; +import org.flowable.engine.runtime.ProcessInstanceQuery; +import org.flowable.engine.test.FlowableTest; +import org.flowable.task.service.impl.TaskQueryImpl; +import org.flowable.task.service.impl.persistence.entity.TaskEntityImpl; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.MethodSource; +import org.mockito.ArgumentCaptor; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.Spy; +import org.mockito.junit.jupiter.MockitoExtension; +import org.springframework.mock.web.MockMultipartFile; +import org.springframework.util.ClassUtils; + +import java.io.IOException; +import java.io.InputStream; +import java.nio.charset.StandardCharsets; +import java.util.Map; +import java.util.Set; + +import static fr.insee.protools.backend.service.FlowableVariableNameConstants.VARNAME_CONTEXT; +import static org.assertj.core.api.AssertionsForClassTypes.assertThatCode; +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.*; + +@ExtendWith(MockitoExtension.class) +@FlowableTest +class ContextServiceImplTest { + + final static String ressourceFolder = ClassUtils.convertClassNameToResourcePath(ContextServiceImplTest.class.getPackageName()); + + static final ObjectReader objectReader = new ObjectMapper().registerModule(new JavaTimeModule()).reader(); // maybe with configs + + + @Spy + @InjectMocks + ContextServiceImpl contextService; + //ne marche pas avec FlowbaleTest ; il faut @ExtendWith(SpringExtension.class) + // @Value("classpath:fr/insee/protools/backend/service/context/minimal_valid_context.json") + // private Resource minimalValidCtx; + @Spy + private RuntimeService runtimeService; + @Spy + private RepositoryService repositoryService = new RepositoryServiceImpl(); + @Mock + private TaskService taskService; + private String dummyId = "ID"; + + static String[] businessKeyProvided() { + return new String[]{"myBusinessKeyForTest", null, " ", ""}; + } + + private void initTaskServiceMock() { + TaskEntityImpl task = new TaskEntityImpl(); + task.setProcessInstanceId(dummyId); + TaskQueryImpl tq = mock(TaskQueryImpl.class); + lenient().when(tq.taskId(any())).thenReturn(tq); + lenient().when(tq.singleResult()).thenReturn(task); + lenient().when(taskService.createTaskQuery()).thenReturn(tq); + } + + private void initRuntimeServiceMock() { + ProcessInstanceQuery piq = mock(ProcessInstanceQuery.class); + ProcessInstance pi = new ExecutionEntityImpl(); + + lenient().when(piq.processInstanceId(any())).thenReturn(piq); + lenient().when(piq.singleResult()).thenReturn(pi); + lenient().when(runtimeService.createProcessInstanceQuery()).thenReturn(piq); + } + + @Test + void processContextFileAndCompleteTask_should_throw_when_fileNotJson() { + //Preconditions + MockMultipartFile multipartFile = new MockMultipartFile("file.xlk", "file.xlk", "text/xml", "some json".getBytes()); + initTaskServiceMock(); + + //Call method under test + assertThrows(BadContextNotJSONBPMNError.class, () -> contextService.processContextFileAndCompleteTask(multipartFile, dummyId)); + } + + @Test + void processContextFileAndCompleteTask_should_throw_when_taskBlank() { + //Preconditions + MockMultipartFile multipartFile = new MockMultipartFile("file.json", "file.json", "text/json", "some json".getBytes()); + initTaskServiceMock(); + + //Call method under test + assertThrows(TaskNotFoundException.class, () -> contextService.processContextFileAndCompleteTask(multipartFile, null)); + assertThrows(TaskNotFoundException.class, () -> contextService.processContextFileAndCompleteTask(multipartFile, "")); + assertThrows(TaskNotFoundException.class, () -> contextService.processContextFileAndCompleteTask(multipartFile, " ")); + assertThrows(TaskNotFoundException.class, () -> contextService.processContextFileAndCompleteTask(multipartFile, " ")); + } + + @Test + void processContextFileAndCompleteTask_should_throw_when_taskNotFound() { + //Preconditions + MockMultipartFile multipartFile = new MockMultipartFile("file.json", "file.json", "text/json", "some json".getBytes()); + + TaskQueryImpl tq = mock(TaskQueryImpl.class); + when(tq.taskId(any())).thenReturn(tq); + when(tq.singleResult()).thenReturn(null); //Return null task + when(taskService.createTaskQuery()).thenReturn(tq); + //Call method under test + assertThrows(TaskNotFoundException.class, () -> contextService.processContextFileAndCompleteTask(multipartFile, dummyId)); + } + + @Test + void processContextFileAndCompleteTask_should_throw_when_taskNoProcessInstanceId() { + //Preconditions + MockMultipartFile multipartFile = new MockMultipartFile("file.json", "file.json", "text/json", "some json".getBytes()); + + TaskEntityImpl task = new TaskEntityImpl(); + task.setProcessInstanceId(null); //null process Instance ID + TaskQueryImpl tq = mock(TaskQueryImpl.class); + when(tq.taskId(any())).thenReturn(tq); + when(tq.singleResult()).thenReturn(task); + when(taskService.createTaskQuery()).thenReturn(tq); + //Call method under test + assertThrows(TaskNotFoundException.class, () -> contextService.processContextFileAndCompleteTask(multipartFile, dummyId)); + } + + @Test + void processContextFileAndCompleteTask_should_throw_when_incorectJson() { + //Preconditions + MockMultipartFile multipartFile = new MockMultipartFile("file.json", "file.json", "text/json", "{toto}".getBytes()); + initTaskServiceMock(); + + //Call method under test + assertThrows(BadContextIOException.class, () -> contextService.processContextFileAndCompleteTask(multipartFile, dummyId)); + } + + @Test + void processContextFileAndCompleteTask_should_throw_when_taskNotExists() { + //Preconditions + MockMultipartFile multipartFile = new MockMultipartFile("file.json", "file.json", "text/json", "{}".getBytes()); + TaskQueryImpl tq = mock(TaskQueryImpl.class); + when(tq.taskId(any())).thenReturn(tq); + when(tq.singleResult()).thenReturn(null); + when(taskService.createTaskQuery()).thenReturn(tq); + + + //Call method under test + assertThrows(TaskNotFoundException.class, () -> contextService.processContextFileAndCompleteTask(multipartFile, dummyId)); + } + + @Test + void processContextFileAndCompleteTask_should_work_when_ContextOk() throws IOException { + //Preconditions + InputStream resourceAsStream = this.getClass().getClassLoader().getResourceAsStream(ressourceFolder + "/minimal_valid_context.json"); + MockMultipartFile multipartFile = new MockMultipartFile("file.json", "file.json", "text/json", resourceAsStream); + initTaskServiceMock(); + //we skip context verification by returning no error + doReturn(Set.of()).when(contextService).isContextOKForBPMN(any(), any()); + //Do not try to continue in a BPMN + doNothing().when(taskService).complete(any(), anyMap()); + //Call method under test + assertThatCode(() -> contextService.processContextFileAndCompleteTask(multipartFile, dummyId)).doesNotThrowAnyException(); + } + + @Test + void getContextByProcessInstance_should_work_when_exists_and_AlreadyLoaded() throws IOException { + //Preconditions + initRuntimeServiceMock(); + processContextFileAndCompleteTask_should_work_when_ContextOk(); + //Call method under test + JsonNode contextRootNode = contextService.getContextJsonNodeByProcessInstance(dummyId); + + //Post conditions : We've got a valid context object + assertNotNull(contextRootNode); + assertNotNull(contextRootNode.get("metadonnees")); + assertNotNull(contextRootNode.get("labelCourt")); + assertEquals("006aa47d-1574-424b-a67f-40705bec81f6", contextRootNode.get("id").asText()); + } + + @ParameterizedTest + @MethodSource("businessKeyProvided") + void processContextFileAndCreateProcessInstance_should_work_when_ContextOk(String businessKey) throws IOException { + //Preconditions + InputStream resourceAsStream = this.getClass().getClassLoader().getResourceAsStream(ressourceFolder + "/minimal_valid_context.json"); + byte[] inputCtxAsByteArray = resourceAsStream.readAllBytes(); + MockMultipartFile multipartFile = new MockMultipartFile("file.json", "file.json", "text/json", inputCtxAsByteArray); + + String mockedPid = "CUSTOM_PID"; + ProcessInstance pi = mock(ExecutionEntityImpl.class); + when(pi.getProcessInstanceId()).thenReturn(mockedPid); + if (businessKey == null || businessKey.isBlank()) { + when(runtimeService.startProcessInstanceByKey(any(), anyMap())).thenReturn(pi); + } else { + when(runtimeService.startProcessInstanceByKey(any(), any(), any())).thenReturn(pi); + } + initRuntimeServiceMock(); + //we skip context verification by returning no error + doReturn(Set.of()).when(contextService).isContextOKForBPMN(any(), any()); + + //Call method under test + String processId = contextService.processContextFileAndCreateProcessInstance(multipartFile, "simpleProcess", businessKey); + + //Post conditions : We've got a valid Process Instance + assertEquals(mockedPid, processId); + // We've got a valid context object + JsonNode contextRootNode = contextService.getContextJsonNodeByProcessInstance(mockedPid); + //Post conditions : We've got a valid context object + assertNotNull(contextRootNode); + assertNotNull(contextRootNode.get("metadonnees")); + assertNotNull(contextRootNode.get("labelCourt")); + assertEquals("006aa47d-1574-424b-a67f-40705bec81f6", contextRootNode.get("id").asText()); + + //We should have called the correct startProcessInstanceByKey + ArgumentCaptor> variablesMapCaptor = ArgumentCaptor.forClass(Map.class); + if (businessKey == null || businessKey.isBlank()) { + verify(runtimeService, times(1)).startProcessInstanceByKey(eq("simpleProcess"), variablesMapCaptor.capture()); + } else { + verify(runtimeService, times(1)).startProcessInstanceByKey(eq("simpleProcess"), eq(businessKey), variablesMapCaptor.capture()); + } + //and stored the correct context in process variables + Map variableMap = variablesMapCaptor.getValue(); + String ctxAsString = (String) variableMap.get(VARNAME_CONTEXT); + String inputAsString = new String(inputCtxAsByteArray, StandardCharsets.UTF_8); + assertEquals(inputAsString, ctxAsString, "The stored contexte is incorrect"); + } + + + @Test + void processContextFileAndCreateProcessInstance_should_throw_when_processDefinitionId_is_null_or_blank() throws IOException { + //Preconditions + InputStream resourceAsStream = this.getClass().getClassLoader().getResourceAsStream(ressourceFolder + "/minimal_valid_context.json"); + MockMultipartFile multipartFile = new MockMultipartFile("file.json", "file.json", "text/json", resourceAsStream.readAllBytes()); + + //Call method under test + assertThrows(ProcessDefinitionNotFoundException.class, () -> contextService.processContextFileAndCreateProcessInstance(multipartFile, " ", dummyId)); + assertThrows(ProcessDefinitionNotFoundException.class, () -> contextService.processContextFileAndCreateProcessInstance(multipartFile, "", dummyId)); + assertThrows(ProcessDefinitionNotFoundException.class, () -> contextService.processContextFileAndCreateProcessInstance(multipartFile, null, dummyId)); + } + + @Test + void processContextFileAndCreateProcessInstance_should_throw_when_processDefinitionId_is_not_Found() throws IOException { + //Preconditions + InputStream resourceAsStream = this.getClass().getClassLoader().getResourceAsStream(ressourceFolder + "/minimal_valid_context.json"); + MockMultipartFile multipartFile = new MockMultipartFile("file.json", "file.json", "text/json", resourceAsStream.readAllBytes()); + initRuntimeServiceMock(); + String processDefinitionId="Throwning_ID"; + doThrow(new FlowableObjectNotFoundException("msg")).when(runtimeService).startProcessInstanceByKey(any(),any(),anyMap()); + doReturn(new ContextServiceImpl.ContextPair("{}",null)).when(contextService).processContextFile(any(),any()); + //Call method under test + assertThrows(ProcessDefinitionNotFoundException.class, () -> contextService.processContextFileAndCreateProcessInstance(multipartFile, "throwingId", dummyId)); + } + + @Test + void processContextFile_should_throw_when_notJsonExtension(){ + //Prepare + MockMultipartFile multipartFile1 = new MockMultipartFile("file.xlk", "file.xlk", "text/xml", "some content".getBytes()); + MockMultipartFile multipartFile2 = new MockMultipartFile("file.", "file.", "text/xml", "some content".getBytes()); + MockMultipartFile multipartFile3 = new MockMultipartFile("file", "file", "text/xml", "some content".getBytes()); + + //Call method under test + assertThrows(BadContextNotJSONBPMNError.class, () -> contextService.processContextFile(multipartFile1, dummyId)); + assertThrows(BadContextNotJSONBPMNError.class, () -> contextService.processContextFile(multipartFile2, dummyId)); + assertThrows(BadContextNotJSONBPMNError.class, () -> contextService.processContextFile(multipartFile3, dummyId)); + } + + @Test + void jsonReadAndSchemaValidation_should_work_when_validJson() throws IOException { + // Prepare + InputStream resourceAsStream = this.getClass().getClassLoader().getResourceAsStream(ressourceFolder + "/minimal_valid_context.json"); + JsonNode rootContext = objectReader.readTree(resourceAsStream); + + // Call method under test + ContexteProcessus result = contextService.jsonReadAndSchemaValidation(rootContext); + + // Verify + assertNotNull(result); + } + + @Test + void jsonReadAndSchemaValidation_should_throw_when_invalidJson() throws JsonProcessingException { + // Prepare + String jsonString = "{\"key\": \"value\"}"; // Replace with valid JSON + JsonNode rootContext = objectReader.readTree(jsonString); + + // Act & Assert + BadContextNotJSONBPMNError exception = assertThrows( + BadContextNotJSONBPMNError.class, + () -> contextService.jsonReadAndSchemaValidation(rootContext) + ); + assertTrue(exception.getMessage().contains("Uploaded context is not correct according to the json-schema")); + } +} diff --git a/src/test/java/fr/insee/protools/backend/service/rem/delegate/RemGetPartitionListOfInterroPaginatedTaskTest.java b/src/test/java/fr/insee/protools/backend/service/rem/delegate/RemGetPartitionListOfInterroPaginatedTaskTest.java index 2d737a0e..d5ed8e15 100644 --- a/src/test/java/fr/insee/protools/backend/service/rem/delegate/RemGetPartitionListOfInterroPaginatedTaskTest.java +++ b/src/test/java/fr/insee/protools/backend/service/rem/delegate/RemGetPartitionListOfInterroPaginatedTaskTest.java @@ -1,11 +1,8 @@ package fr.insee.protools.backend.service.rem.delegate; import fr.insee.protools.backend.restclient.pagination.PageResponse; -import fr.insee.protools.backend.service.platine.delegate.pilotatage.PlatinePilotageGetListOfInterroToFollowUpPaginatedTaskREST; -import fr.insee.protools.backend.service.platine.service.PlatinePilotageService; import fr.insee.protools.backend.service.rem.RemService; import fr.insee.protools.backend.service.utils.delegate.IDelegateWithVariableGetPaginated; -import fr.insee.protools.backend.service.utils.delegate.PaginationHelper; import org.flowable.engine.delegate.JavaDelegate; import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.InjectMocks; @@ -16,11 +13,12 @@ import static fr.insee.protools.backend.service.FlowableVariableNameConstants.VARNAME_CURRENT_PARTITION_ID; import static fr.insee.protools.backend.service.FlowableVariableNameConstants.VARNAME_REM_INTERRO_LIST; -import static org.mockito.ArgumentMatchers.*; +import static org.mockito.ArgumentMatchers.anyLong; +import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.Mockito.lenient; @ExtendWith(MockitoExtension.class) -class RemGetPartitionListOfInterroPaginatedTaskTest implements IDelegateWithVariableGetPaginated { +class RemGetPartitionListOfInterroPaginatedTaskTest implements IDelegateWithVariableGetPaginated { @Mock RemService remService; diff --git a/src/test/backup/java/fr/insee/protools/backend/service/utils/password/PasswordServiceTest.java b/src/test/java/fr/insee/protools/backend/service/utils/password/PasswordServiceImplTest.java similarity index 89% rename from src/test/backup/java/fr/insee/protools/backend/service/utils/password/PasswordServiceTest.java rename to src/test/java/fr/insee/protools/backend/service/utils/password/PasswordServiceImplTest.java index 791a6d22..803dc005 100644 --- a/src/test/backup/java/fr/insee/protools/backend/service/utils/password/PasswordServiceTest.java +++ b/src/test/java/fr/insee/protools/backend/service/utils/password/PasswordServiceImplTest.java @@ -8,9 +8,7 @@ import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.TestPropertySource; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertTrue; - +import static org.junit.jupiter.api.Assertions.*; @SpringBootTest(classes = PasswordServiceImpl.class) @TestPropertySource(properties = { @@ -19,9 +17,10 @@ "fr.insee.protools.password.create.withLowerCase = true", "fr.insee.protools.password.create.withSpecial = true", }) -class PasswordServiceTest { +class PasswordServiceImplTest { - @Autowired private PasswordService passwordService; + @Autowired + private PasswordService passwordService; @Test void testGeneratePassword() { @@ -45,4 +44,4 @@ void testGeneratePassword() { } } -} +} \ No newline at end of file From ea6af818eaeb37dffee6d8b74a1e8f243c75ead9 Mon Sep 17 00:00:00 2001 From: SNDIL - Marc Date: Fri, 20 Sep 2024 13:48:49 +0200 Subject: [PATCH 66/75] en cours TU --- .../context/minimal_valid_context.json | 132 ++++++++++++++++++ 1 file changed, 132 insertions(+) create mode 100644 src/test/resources/fr/insee/protools/backend/service/context/minimal_valid_context.json diff --git a/src/test/resources/fr/insee/protools/backend/service/context/minimal_valid_context.json b/src/test/resources/fr/insee/protools/backend/service/context/minimal_valid_context.json new file mode 100644 index 00000000..054b4155 --- /dev/null +++ b/src/test/resources/fr/insee/protools/backend/service/context/minimal_valid_context.json @@ -0,0 +1,132 @@ +{ + "id": "006aa47d-1574-424b-a67f-40705bec81f6", + "labelCourt": "PRO2024X03", + "contexte": "menage", + "metadonnees": { + "serieId": "PRO", + "serieLabelCourt": "PRO", + "serieLabelLong": "Enquête Protools", + "periodicite": "X", + "periode": "X03", + "annee": 2024, + "operationId": "s1558", + "operationLabelCourt": "PRO2024", + "operationLabelLong": "Enquête Protools 2024", + "objectifsCourts": "Cette enquête permet de tester le prototype Protools asynchrone.", + "objectifsLongs": "Cette enquête permet de tester le prototype Protools asynchrone : intégration d'une enquête web avec envoi de courriers et remise en collecte.", + "cnisUrl": "http://cnis/DOG2021", + "diffusionUrl": "http://diffusion/DOG2021", + "noticeUrl": "http://notice/DOG2021", + "specimenUrl": "http://specimenUrl/DOG2021", + "numeroVisa": "2024X005EC", + "anneeVisa": "2024", + "caractereObligatoire": true, + "interetGeneral": true, + "qualiteStatistique": false, + "testNonLabellise": false, + "parutionJo": true, + "dateParutionJo": "2023-11-07", + "portailMesEnquetesOperation": false, + "proprietaireId": "Insee", + "proprietaireLabel": "Institut national de la statistique et des études économiques", + "imageLogos": "Insee", + "ministereTutelle": "de l'Économie, des Finances et de la Souveraineté Industrielle et Numérique", + "commanditaire": "l’Institut national de la statistique et des études économiques (Insee)", + "responsableOperationnel": "l’Institut national de la statistique et des études économiques (Insee)", + "mailResponsableOperationnel": "contact-rgpd@insee.fr", + "responsableTraitement": "l’Institut national de la statistique et des études économiques (Insee)", + "responsableTraitementIdenti": "L'Insee", + "responsableTraitementIdentiFem": false, + "urlResponsableTraitement": "www.insee.fr", + "prestataire": false, + "nomPrestataire": "", + "urlPrestataire": "", + "logoPartenaire": "", + "serviceCollecteurSignataireFonction": "La directrice des statistiques démographiques et sociales de l’Insee", + "serviceCollecteurSignataireNom": "Christel Colin", + "imageLogoSignataire": "Insee", + "assistanceTel": "09 71 10 02 81", + "assistanceMail": "https://enquetes.stat-publique.fr/fam
Rubrique « Contacter l’assistance »", + "assistanceAdresseL1": "Insee", + "assistanceAdresseL2": "Enquête Particuliers", + "assistanceAdresseL3": "CS 54 229", + "assistanceAdresseL4": "54042 Nancy Cedex", + "assistanceAdresseL5": "", + "adresseRetourQL1": "", + "adresseRetourQL2": "", + "adresseRetourQL3": "", + "adresseRetourQL4": "", + "adresseRetourQL5": "", + "adresseRetourQL6": "", + "adresseRetourQL7": "", + "representantLegal": false, + "mineur": false, + "mineurDroit": "", + "dpd": true, + "mailDPD": "le-delegue-a-la-protection-des-donnees-personnelles@finances.gouv.fr", + "appariement": true, + "sourceAdmin": "avec les données sur le revenu", + "archivage": true, + "dureeConservation": "20 ans", + "dureeConservationIdenti": "jusqu'à un an après la dernière utilisation", + "urlEnquete": "https://enquetes.stat-publique.fr/fam", + "incitationARepondre": "", + "mailBoiteRetour": "dr67-etb54-mission-metallica-multimode@insee.fr", + "themeMieuxConnaitreMail": "les familles", + "ville": "Montrouge", + "complementOpportunite": "", + "paragrapheDonneesPersonnelles": true, + "messageOffline": "L'enquête est terminée", + "messageInfoOffline": "", + "configurationVerificationMail": true, + "imageResultat": "", + "paragrapheResultat": "", + "urlInformationEnquete": "https://www.insee.fr/fr/information/6659341", + "dureeConservationDonneesConnexion": "au bout de cinq ans après la validation du fichier de collecte clôturant les trois questionnaires de l’enquête", + "urlAQuoiServentVosReponses": "https://www.insee.fr/fr/information/7651977", + "texteUrlAQuoiServentVosReponses": "Sans vos réponses à nos enquêtes, ces données n'existeraient pas", + "paragrapheAQuoiServentVosReponses": "La plupart des enquêtes auprès des particuliers du service statistique public débute par un ensemble de questions visant à décrire succinctement le foyer (âges, sexes, professions des occupants du logement notamment). Ces questions communes ont été retravaillées pour mieux correspondre aux modes de vie d’aujourd’hui et pour alléger cette partie des enquêtes.\n\n Pour finaliser cette rénovation et préparer au mieux les futures enquêtes qui utiliseront ces questions, l’Insee réalise une enquête sur le cadre de vie en 2023. Cette enquête servira aussi à comparer les réponses fournies selon le mode de collecte proposé aux enquêtés ; en effet, chacun sera sollicité pour répondre soit par internet sur smartphone, soit par internet sur ordinateur, soit par téléphone, soit lors de la visite d’un enquêteur à son domicile.", + "frequenceExtraction": "0 15 16 1/1 * *", + "cheminLivraisonDonnees": "", + "chiffrement": "", + "livraisonDifferentielle": false, + "formatLivraisonDonnees": "", + "mailBoiteFonctionnelle": "dr67-etb54-mission-metallica-multimode@insee.fr", + "referents": [ + { + "nom": "Dupont", + "prenom": "Jean", + "telephone": "0101010102", + "principal": true + }, + { + "nom": "Dupond", + "prenom": "Marie", + "telephone": "0101010103", + "principal": false + } + ], + "champGeographiqueEnquete": "France entière", + "champStatistiqueEnquete": "Tous les majeurs du ménage", + "urlLoiStatistique": "https://www.legifrance.gouv.fr/loda/id/JORFTEXT000000888573", + "urlLoiRGPD": "https://eur-lex.europa.eu/legal-content/FR/TXT/?uri=CELEX%3A32016R0679", + "urlLoiInformatique": "https://www.legifrance.gouv.fr/affichTexte.do?cidTexte=JORFTEXT000000886460" + }, + "lots": [ + { + "id": "1be5512c-1765-4c4d-adbd-48bbca1a3ce4", + "typeEchantillon": "logement", + "modesCollecte": [ + "CAWI" + ] + }, + { + "id": "9dd5a6b7-f9de-48e3-ac19-fc157d8d4c57", + "label": "Lot web - interro 2", + "typeEchantillon": "logement", + "modesCollecte": [ + "CAWI" + ] + } + ] +} From a3d8b3cfe7ce8937eff1c38811b7216b6a66fbb2 Mon Sep 17 00:00:00 2001 From: SNDIL - Marc Date: Fri, 20 Sep 2024 13:58:28 +0200 Subject: [PATCH 67/75] en cours TU --- .../flowable/engine/SimpleProcessTest.java | 41 - .../service/context/ContextServiceTest.java | 171 ----- ...ahCreateCommunicationsContextTaskTest.java | 234 ------ .../meshuggah/MeshuggahCtxExamples.java | 330 -------- ...OpeningMailCommunicationForSUTaskTest.java | 152 ---- .../PlatinePilotageCreateContextTaskTest.java | 79 -- ...atinePilotageCreateSurveyUnitTaskTest.java | 176 ----- .../PlatinePilotageGetSUContactTaskTest.java | 149 ---- ...ineQuestionnaireCreateContextTaskTest.java | 131 ---- ...QuestionnaireCreateSurveyUnitTaskTest.java | 115 --- ...tinePilotageCreateContextTaskRESTTest.java | 72 -- .../platine/utils/PlatineHelperTest.java | 21 - .../backend/service/rem/RemDtoUtilsTest.java | 194 ----- ...actContactIdentifierFromREMSUTaskTest.java | 119 --- .../RemGetPartitionListOfSuIdTaskTest.java | 115 --- .../rem/delegate/RemGetSUTaskTest.java | 65 -- .../delegate/RemWriteEraSUListTaskTest.java | 100 --- .../service/sabiane/SabianeIdHelperTest.java | 31 - .../sabiane/delegate/SabianeCtxExamples.java | 70 -- .../SabianePilotageCreateContextTaskTest.java | 87 --- .../SabianePilotageCreateSUTaskTest.java | 711 ------------------ ...aneQuestionnaireCreateContextTaskTest.java | 139 ---- .../SabianeQuestionnaireCreateSUTaskTest.java | 165 ---- .../sugoi/SugoiCreateUserTaskTest.java | 139 ---- .../service/utils/ContextUtilsTest.java | 62 -- .../service/utils/data/CtxExamples.java | 123 --- .../backend/service/utils/data/RemSUData.java | 16 - .../integration/EraREMProcessTest.java | 0 .../utils/FlowableVariableUtilsTest.java | 4 +- 29 files changed, 2 insertions(+), 3809 deletions(-) delete mode 100644 src/test/backup/java/fr/insee/protools/backend/flowable/engine/SimpleProcessTest.java delete mode 100644 src/test/backup/java/fr/insee/protools/backend/service/context/ContextServiceTest.java delete mode 100644 src/test/backup/java/fr/insee/protools/backend/service/meshuggah/MeshuggahCreateCommunicationsContextTaskTest.java delete mode 100644 src/test/backup/java/fr/insee/protools/backend/service/meshuggah/MeshuggahCtxExamples.java delete mode 100644 src/test/backup/java/fr/insee/protools/backend/service/meshuggah/MeshuggahSendOpeningMailCommunicationForSUTaskTest.java delete mode 100644 src/test/backup/java/fr/insee/protools/backend/service/platine/delegate/PlatinePilotageCreateContextTaskTest.java delete mode 100644 src/test/backup/java/fr/insee/protools/backend/service/platine/delegate/PlatinePilotageCreateSurveyUnitTaskTest.java delete mode 100644 src/test/backup/java/fr/insee/protools/backend/service/platine/delegate/PlatinePilotageGetSUContactTaskTest.java delete mode 100644 src/test/backup/java/fr/insee/protools/backend/service/platine/delegate/PlatineQuestionnaireCreateContextTaskTest.java delete mode 100644 src/test/backup/java/fr/insee/protools/backend/service/platine/delegate/PlatineQuestionnaireCreateSurveyUnitTaskTest.java delete mode 100644 src/test/backup/java/fr/insee/protools/backend/service/platine/delegate/pilotatage/PlatinePilotageCreateContextTaskRESTTest.java delete mode 100644 src/test/backup/java/fr/insee/protools/backend/service/platine/utils/PlatineHelperTest.java delete mode 100644 src/test/backup/java/fr/insee/protools/backend/service/rem/RemDtoUtilsTest.java delete mode 100644 src/test/backup/java/fr/insee/protools/backend/service/rem/delegate/ExtractContactIdentifierFromREMSUTaskTest.java delete mode 100644 src/test/backup/java/fr/insee/protools/backend/service/rem/delegate/RemGetPartitionListOfSuIdTaskTest.java delete mode 100644 src/test/backup/java/fr/insee/protools/backend/service/rem/delegate/RemGetSUTaskTest.java delete mode 100644 src/test/backup/java/fr/insee/protools/backend/service/rem/delegate/RemWriteEraSUListTaskTest.java delete mode 100644 src/test/backup/java/fr/insee/protools/backend/service/sabiane/SabianeIdHelperTest.java delete mode 100644 src/test/backup/java/fr/insee/protools/backend/service/sabiane/delegate/SabianeCtxExamples.java delete mode 100644 src/test/backup/java/fr/insee/protools/backend/service/sabiane/delegate/SabianePilotageCreateContextTaskTest.java delete mode 100644 src/test/backup/java/fr/insee/protools/backend/service/sabiane/delegate/SabianePilotageCreateSUTaskTest.java delete mode 100644 src/test/backup/java/fr/insee/protools/backend/service/sabiane/delegate/SabianeQuestionnaireCreateContextTaskTest.java delete mode 100644 src/test/backup/java/fr/insee/protools/backend/service/sabiane/delegate/SabianeQuestionnaireCreateSUTaskTest.java delete mode 100644 src/test/backup/java/fr/insee/protools/backend/service/sugoi/SugoiCreateUserTaskTest.java delete mode 100644 src/test/backup/java/fr/insee/protools/backend/service/utils/ContextUtilsTest.java delete mode 100644 src/test/backup/java/fr/insee/protools/backend/service/utils/data/CtxExamples.java delete mode 100644 src/test/backup/java/fr/insee/protools/backend/service/utils/data/RemSUData.java rename src/test/{backup => }/java/fr/insee/protools/backend/integration/EraREMProcessTest.java (100%) rename src/test/{backup => }/java/fr/insee/protools/backend/service/utils/FlowableVariableUtilsTest.java (92%) diff --git a/src/test/backup/java/fr/insee/protools/backend/flowable/engine/SimpleProcessTest.java b/src/test/backup/java/fr/insee/protools/backend/flowable/engine/SimpleProcessTest.java deleted file mode 100644 index fd93fa40..00000000 --- a/src/test/backup/java/fr/insee/protools/backend/flowable/engine/SimpleProcessTest.java +++ /dev/null @@ -1,41 +0,0 @@ -package fr.insee.protools.backend.flowable.engine; - - -import org.flowable.engine.ProcessEngine; -import org.flowable.engine.RuntimeService; -import org.flowable.engine.TaskService; -import org.flowable.engine.test.Deployment; -import org.flowable.engine.test.FlowableTest; -import org.flowable.task.api.Task; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; - -import static org.assertj.core.api.Assertions.assertThat; - -@FlowableTest -class SimpleProcessTest { - - private ProcessEngine processEngine; - private RuntimeService runtimeService; - private TaskService taskService; - - @BeforeEach - void setUp(ProcessEngine processEngine) { - this.processEngine = processEngine; - this.runtimeService = processEngine.getRuntimeService(); - this.taskService = processEngine.getTaskService(); - } - - @Test - @Deployment - void testSimpleProcess() { - runtimeService.startProcessInstanceByKey("simpleProcess"); - - Task task = taskService.createTaskQuery().singleResult(); - assertThat(task.getName()).isEqualTo("My Task"); - - taskService.complete(task.getId()); - assertThat(runtimeService.createProcessInstanceQuery().count()).isZero(); - - } -} \ No newline at end of file diff --git a/src/test/backup/java/fr/insee/protools/backend/service/context/ContextServiceTest.java b/src/test/backup/java/fr/insee/protools/backend/service/context/ContextServiceTest.java deleted file mode 100644 index 99796d2c..00000000 --- a/src/test/backup/java/fr/insee/protools/backend/service/context/ContextServiceTest.java +++ /dev/null @@ -1,171 +0,0 @@ -package fr.insee.protools.backend.service.context; - -import com.fasterxml.jackson.databind.JsonNode; -import fr.insee.protools.backend.service.context.exception.BadContextIOException; -import fr.insee.protools.backend.service.context.exception.BadContextNotJSONBPMNError; -import fr.insee.protools.backend.service.exception.TaskNotFoundException; -import org.flowable.engine.RepositoryService; -import org.flowable.engine.RuntimeService; -import org.flowable.engine.TaskService; -import org.flowable.engine.impl.RepositoryServiceImpl; -import org.flowable.engine.impl.persistence.entity.ExecutionEntityImpl; -import org.flowable.engine.runtime.ProcessInstance; -import org.flowable.engine.runtime.ProcessInstanceQuery; -import org.flowable.engine.test.FlowableTest; -import org.flowable.task.service.impl.TaskQueryImpl; -import org.flowable.task.service.impl.persistence.entity.TaskEntityImpl; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; -import org.mockito.InjectMocks; -import org.mockito.Mock; -import org.mockito.Spy; -import org.mockito.junit.jupiter.MockitoExtension; -import org.springframework.mock.web.MockMultipartFile; -import org.springframework.util.ClassUtils; - -import java.io.IOException; -import java.io.InputStream; -import java.util.Set; - -import static org.assertj.core.api.AssertionsForClassTypes.assertThatCode; -import static org.junit.jupiter.api.Assertions.*; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.Mockito.*; - - -@ExtendWith(MockitoExtension.class) -@FlowableTest -class ContextServiceTest { - final static String ressourceFolder = ClassUtils.convertClassNameToResourcePath(ContextServiceTest.class.getPackageName()); - - @Spy - private RuntimeService runtimeService; - @Spy - private RepositoryService repositoryService = new RepositoryServiceImpl(); - @Mock - private TaskService taskService; - - @Spy - @InjectMocks - ContextServiceImpl contextService; - - private String dummyId="ID"; - - private void initTaskServiceMock(){ - TaskEntityImpl task = new TaskEntityImpl(); - task.setProcessInstanceId(dummyId); - TaskQueryImpl tq = mock(TaskQueryImpl.class); - when(tq.taskId(any())).thenReturn(tq); - when(tq.singleResult()).thenReturn(task); - when(taskService.createTaskQuery()).thenReturn(tq); - } - - - private void initRuntimeSericeMock(){ - ProcessInstanceQuery piq = mock(ProcessInstanceQuery.class); - ProcessInstance pi = new ExecutionEntityImpl(); - - when(piq.processInstanceId(any())).thenReturn(piq); - when(piq.singleResult()).thenReturn(pi); - when(runtimeService.createProcessInstanceQuery()).thenReturn(piq); - } - - @Test - void processContextFileAndCompleteTask_should_throw_when_fileNotJson() { - //Preconditions - MockMultipartFile multipartFile = new MockMultipartFile("file.xml", "file.xml", "text/xml", "some xml".getBytes()); - initTaskServiceMock(); - - //Call method under test - assertThrows(BadContextNotJSONBPMNError.class, () -> contextService.processContextFileAndCompleteTask(multipartFile,dummyId)); - } - - - @Test - void processContextFileAndCompleteTask_should_throw_when_incorectJson() { - //Preconditions - MockMultipartFile multipartFile = new MockMultipartFile("file.json", "file.json", "text/json", "{toto}".getBytes()); - initTaskServiceMock(); - - //Call method under test - assertThrows(BadContextIOException.class, () -> contextService.processContextFileAndCompleteTask(multipartFile,dummyId)); - } - - - @Test - void processContextFileAndCompleteTask_should_throw_when_taskNotExists() { - //Preconditions - MockMultipartFile multipartFile = new MockMultipartFile("file.json", "file.json", "text/json", "{}".getBytes()); - TaskQueryImpl tq = mock(TaskQueryImpl.class); - when(tq.taskId(any())).thenReturn(tq); - when(tq.singleResult()).thenReturn(null); - when(taskService.createTaskQuery()).thenReturn(tq); - - - //Call method under test - assertThrows(TaskNotFoundException.class, () -> contextService.processContextFileAndCompleteTask(multipartFile,dummyId)); - } - - - @Test - void processContextFileAndCompleteTask_should_work_when_ContextOk() throws IOException { - //Preconditions - InputStream resourceAsStream = this.getClass().getClassLoader().getResourceAsStream(ressourceFolder+"/protools-contexte-platine.json"); - MockMultipartFile multipartFile = new MockMultipartFile("file.json", "file.json", "text/json", resourceAsStream.readAllBytes()); - initTaskServiceMock(); - //we skip context verification by returning no error - doReturn(Set.of()).when(contextService).isContextOKForBPMN(any(),any()); - //Do not try to continue in a BPMN - doNothing().when(taskService).complete(any(),anyMap()); - //Call method under test - assertThatCode(() -> contextService.processContextFileAndCompleteTask(multipartFile,dummyId)).doesNotThrowAnyException(); - } - - @Test - void getContextByProcessInstance_should_work_when_exists_and_AlreadyLoaded() throws IOException { - //Preconditions - initRuntimeSericeMock(); - processContextFileAndCompleteTask_should_work_when_ContextOk(); - //Call method under test - JsonNode contextRootNode = contextService.getContextByProcessInstance(dummyId); - - //Post conditions : We've got a valid context object - assertNotNull(contextRootNode); - assertNotNull(contextRootNode.get(ContextConstants.CTX_METADONNEES)); - assertNotNull(contextRootNode.get(ContextConstants.CTX_CAMPAGNE_ID)); - assertNotNull(contextRootNode.get(ContextConstants.CTX_CAMPAGNE_LABEL)); - assertEquals("DEM2022X00",contextRootNode.get(ContextConstants.CTX_CAMPAGNE_ID).asText()); - } - - @Test - void processContextFileAndCreateProcessInstance_should_work_when_ContextOk() throws IOException { - //Preconditions - InputStream resourceAsStream = this.getClass().getClassLoader().getResourceAsStream(ressourceFolder+"/protools-contexte-platine.json"); - MockMultipartFile multipartFile = new MockMultipartFile("file.json", "file.json", "text/json", resourceAsStream.readAllBytes()); - - ProcessInstance pi = mock(ExecutionEntityImpl.class); - when(pi.getProcessInstanceId()).thenReturn(dummyId); - when(runtimeService.startProcessInstanceByKey(any(),any(),any())).thenReturn(pi); - initRuntimeSericeMock(); - //we skip context verification by returning no error - doReturn(Set.of()).when(contextService).isContextOKForBPMN(any(),any()); - - //Call method under test - String processId=contextService.processContextFileAndCreateProcessInstance(multipartFile,"simpleProcess",dummyId); - - //Post conditions : We've got a valid Process Instance - assertEquals(dummyId,processId); - //Process instance creation has been called once - verify(runtimeService).startProcessInstanceByKey(any(),any(),any()); - // We've got a valid context object - JsonNode contextRootNode = contextService.getContextByProcessInstance(dummyId); - //Post conditions : We've got a valid context object - assertNotNull(contextRootNode); - assertNotNull(contextRootNode.get(ContextConstants.CTX_METADONNEES)); - assertNotNull(contextRootNode.get(ContextConstants.CTX_CAMPAGNE_ID)); - assertNotNull(contextRootNode.get(ContextConstants.CTX_CAMPAGNE_LABEL)); - assertEquals("DEM2022X00",contextRootNode.get(ContextConstants.CTX_CAMPAGNE_ID).asText()); - - } - -} diff --git a/src/test/backup/java/fr/insee/protools/backend/service/meshuggah/MeshuggahCreateCommunicationsContextTaskTest.java b/src/test/backup/java/fr/insee/protools/backend/service/meshuggah/MeshuggahCreateCommunicationsContextTaskTest.java deleted file mode 100644 index f1a06793..00000000 --- a/src/test/backup/java/fr/insee/protools/backend/service/meshuggah/MeshuggahCreateCommunicationsContextTaskTest.java +++ /dev/null @@ -1,234 +0,0 @@ -package fr.insee.protools.backend.service.meshuggah; - -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.JsonNode; -import fr.insee.protools.backend.ProtoolsTestUtils; -import fr.insee.protools.backend.deprecated.service.meshuggah.MeshuggahCreateCommunicationsContextTask; -import fr.insee.protools.backend.deprecated.service.meshuggah.MeshuggahService; -import fr.insee.protools.backend.service.context.exception.BadContextIncorrectBPMNError; -import fr.insee.protools.backend.dto.meshuggah.MeshuggahComDetails; -import fr.insee.protools.backend.service.utils.TestWithContext; -import org.flowable.engine.delegate.DelegateExecution; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.Arguments; -import org.junit.jupiter.params.provider.MethodSource; -import org.mockito.ArgumentCaptor; -import org.mockito.InjectMocks; -import org.mockito.Mock; -import org.mockito.Mockito; - -import java.util.List; -import java.util.stream.Stream; - -import static org.junit.jupiter.api.Assertions.*; -import static org.mockito.Mockito.*; -import static org.mockito.Mockito.times; - - -class MeshuggahCreateCommunicationsContextTaskTest extends TestWithContext { - - @Mock - MeshuggahService meshuggahService; - @InjectMocks - MeshuggahCreateCommunicationsContextTask meshuggahTask; - - //To be able to run tests with differents protools contexts - private static Stream contextErrorArguments() { - return Stream.of( - Arguments.of(MeshuggahCtxExamples.ctx_ERROR_2partitions_2com_1_typo_phase), - Arguments.of(MeshuggahCtxExamples.ctx_ERROR_no_part), - Arguments.of(MeshuggahCtxExamples.ctx_ERROR_no_com), - Arguments.of(MeshuggahCtxExamples.ctx_ERROR_no_moyen), - Arguments.of(MeshuggahCtxExamples.ctx_ERROR_typo_phase), - Arguments.of(MeshuggahCtxExamples.ctx_ERROR_1partitions_2com_1_typo_moyen), - Arguments.of(MeshuggahCtxExamples.ctx_ERROR_typo_moyen)); - } - - @Test - void execute_should_throwError_when_null_context(){ - assertThat_delegate_throwError_when_null_context(meshuggahTask); - } - - @ParameterizedTest - @MethodSource("contextErrorArguments") - @DisplayName("Test execute method - should throw if Context is not correct") - void execute_should_throw_BadContext_when_contextIncorrect(String context_json) throws JsonProcessingException { - //Precondition - DelegateExecution execution = mock(DelegateExecution.class); - lenient().when(execution.getProcessInstanceId()).thenReturn(dumyId); - - //Precondition - ProtoolsTestUtils.initContexteMockFromString(protoolsContext, context_json); - //Run test - assertThrows(BadContextIncorrectBPMNError.class, () -> meshuggahTask.execute(execution)); - Mockito.reset(protoolsContext); - } - - - @Test - @DisplayName("Test execute method - should work and make correct call to service when context has one partition") - void execute_should_work_when_ctx_1_part_ouverture_courrier() { - //Precondition - DelegateExecution execution = mock(DelegateExecution.class); - lenient().when(execution.getProcessInstanceId()).thenReturn(dumyId); - initContexteMockWithString(MeshuggahCtxExamples.ctx_OK_1part_ouverture_courrier); - - //Run method under test - assertDoesNotThrow(() -> meshuggahTask.execute(execution)); - - //Post conditions - MeshuggahComDetails expectedDetails = MeshuggahComDetails.builder() - .campaignId("AAC2023A00") - .phase("OUVERTURE") - .medium("COURRIER") - .mode("WEB") - .partitioningId(MeshuggahCtxExamples.ctx_partition1.toString()) - .avecQuestionnaire(false) - .protocol("DEFAULT") - .operation("RELANCE_LIBRE") - .build(); - ArgumentCaptor acDetails = ArgumentCaptor.forClass(MeshuggahComDetails.class); - ArgumentCaptor acBody = ArgumentCaptor.forClass(JsonNode.class); - verify(meshuggahService,times(1)).postCreateCommunication(acDetails.capture(),acBody.capture()); - MeshuggahComDetails details = acDetails.getValue(); - assertEquals(expectedDetails,details); - - - JsonNode actualBody = acBody.getValue(); - assertEquals(MeshuggahCtxExamples.ctx_complementConnexion,actualBody.path("Enq_ComplementConnexion").asText()); - assertEquals(MeshuggahCtxExamples.ctx_logoPrestataire,actualBody.path("Enq_LogoPrestataire").asText()); - assertEquals(MeshuggahCtxExamples.ctx_mailResponsableOperationnel,actualBody.path("Enq_MailRespOperationnel").asText()); - assertEquals(MeshuggahCtxExamples.ctx_prestataire,actualBody.path("Enq_Prestataire").asBoolean()); - assertEquals(MeshuggahCtxExamples.ctx_relanceLibreMailParagraphe1,actualBody.path("Enq_RelanceLibreMailParagraphe1").asText()); - assertEquals(MeshuggahCtxExamples.ctx_relanceLibreMailParagraphe2,actualBody.path("Enq_RelanceLibreMailParagraphe2").asText()); - assertEquals(MeshuggahCtxExamples.ctx_relanceLibreMailParagraphe3,actualBody.path("Enq_RelanceLibreMailParagraphe3").asText()); - assertEquals(MeshuggahCtxExamples.ctx_relanceLibreMailParagraphe4,actualBody.path("Enq_RelanceLibreMailParagraphe4").asText()); - assertEquals(MeshuggahCtxExamples.ctx_responsableOperationnel,actualBody.path("Enq_RespOperationnel").asText()); - assertEquals(MeshuggahCtxExamples.ctx_responsableTraitement,actualBody.path("Enq_RespTraitement").asText()); - assertEquals(MeshuggahCtxExamples.ctx_serviceCollecteurSignataireFonction,actualBody.path("Enq_ServiceCollecteurSignataireFonction").asText()); - assertEquals(MeshuggahCtxExamples.ctx_serviceCollecteurSignataireNom,actualBody.path("Enq_ServiceCollecteurSignataireNom").asText()); - assertEquals(MeshuggahCtxExamples.ctx_themeMieuxConnaitreMail,actualBody.path("Enq_ThemeMieuxConnaitreMail").asText()); - assertEquals(MeshuggahCtxExamples.ctx_urlEnquete,actualBody.path("Enq_UrlEnquete").asText()); - assertEquals(MeshuggahCtxExamples.ctx_boiteRetour,actualBody.path("Mail_BoiteRetour").asText()); - assertEquals(MeshuggahCtxExamples.ctx_objetMail,actualBody.path("Mail_Objet").asText()); - } - - - @Test - @DisplayName("Test execute method - should work and make correct call to service when context has one partition") - void execute_should_work_when_ctx_2_part_ouverture_courrier_relance_mail() { - //Precondition - DelegateExecution execution = mock(DelegateExecution.class); - lenient().when(execution.getProcessInstanceId()).thenReturn(dumyId); - initContexteMockWithString(MeshuggahCtxExamples.ctx_OK_2partitions_2com_ouverture_relance_ok); - - //Run method under test - assertDoesNotThrow(() -> meshuggahTask.execute(execution)); - - //Post conditions - MeshuggahComDetails expectedDetailsOuverture = MeshuggahComDetails.builder() - .campaignId("AAC2023A00") - .phase("OUVERTURE") - .medium("COURRIER") - .mode("WEB") - .partitioningId("to be set") - .avecQuestionnaire(false) - .protocol("DEFAULT") - .operation("RELANCE_LIBRE") - .build(); - MeshuggahComDetails expectedDetailsRelance = MeshuggahComDetails.builder() - .campaignId("AAC2023A00") - .phase("RELANCE") - .medium("EMAIL") - .mode("WEB") - .partitioningId("to be set") - .avecQuestionnaire(false) - .protocol("DEFAULT") - .operation("RELANCE_LIBRE") - .build(); - ArgumentCaptor acDetails = ArgumentCaptor.forClass(MeshuggahComDetails.class); - ArgumentCaptor acBody = ArgumentCaptor.forClass(JsonNode.class); - verify(meshuggahService,times(4)).postCreateCommunication(acDetails.capture(),acBody.capture()); - - List actualDetailsList = acDetails.getAllValues(); - List actualBodiesList = acBody.getAllValues(); - - int nbOuverturePart1=0; - int nbOuverturePart2=0; - int nbRelancePart1=0; - int nbRelancePart2=0; - for(int i=0; i<4;i++){ - MeshuggahComDetails actualDetails = actualDetailsList.get(i); - - if(actualDetails.getPartitioningId().equals(MeshuggahCtxExamples.ctx_partition1.toString())){ - if(actualDetails.getPhase().equals("OUVERTURE")){ - expectedDetailsOuverture.setPartitioningId(MeshuggahCtxExamples.ctx_partition1.toString()); - assertEquals(expectedDetailsOuverture,actualDetails); - nbOuverturePart1++; - } - else if(actualDetails.getPhase().equals("RELANCE")){ - expectedDetailsRelance.setPartitioningId(MeshuggahCtxExamples.ctx_partition1.toString()); - assertEquals(expectedDetailsRelance,actualDetails); - nbRelancePart1++; - } - } - else if(actualDetails.getPartitioningId().equals(MeshuggahCtxExamples.ctx_partition2.toString())){ - if(actualDetails.getPhase().equals("OUVERTURE")){ - expectedDetailsOuverture.setPartitioningId(MeshuggahCtxExamples.ctx_partition2.toString()); - assertEquals(expectedDetailsOuverture,actualDetails); - nbOuverturePart2++; - } - else if(actualDetails.getPhase().equals("RELANCE")){ - expectedDetailsRelance.setPartitioningId(MeshuggahCtxExamples.ctx_partition2.toString()); - assertEquals(expectedDetailsRelance,actualDetails); - nbRelancePart2++; - } - } - else { - fail("Incorect test definition (nb partition)"); - } - - - JsonNode actualBody = actualBodiesList.get(i); - assertEquals(MeshuggahCtxExamples.ctx_complementConnexion,actualBody.path("Enq_ComplementConnexion").asText()); - assertEquals(MeshuggahCtxExamples.ctx_logoPrestataire,actualBody.path("Enq_LogoPrestataire").asText()); - assertEquals(MeshuggahCtxExamples.ctx_mailResponsableOperationnel,actualBody.path("Enq_MailRespOperationnel").asText()); - assertEquals(MeshuggahCtxExamples.ctx_prestataire,actualBody.path("Enq_Prestataire").asBoolean()); - - //we have various values for this fiels - if(actualDetails.getPartitioningId().equals(MeshuggahCtxExamples.ctx_partition2.toString())){ - if(actualDetails.getPhase().equals("OUVERTURE")) { - assertEquals(MeshuggahCtxExamples.ctx_relanceLibreMailParagraphe1_partition2_com1, actualBody.path("Enq_RelanceLibreMailParagraphe1").asText()); - } - else if(actualDetails.getPhase().equals("RELANCE")) { - assertEquals(MeshuggahCtxExamples.ctx_relanceLibreMailParagraphe1_partition2_com2, actualBody.path("Enq_RelanceLibreMailParagraphe1").asText()); - } - else{ - fail("Incorect test definition"); - } - } - else { - assertEquals(MeshuggahCtxExamples.ctx_relanceLibreMailParagraphe1, actualBody.path("Enq_RelanceLibreMailParagraphe1").asText()); - } - assertEquals(MeshuggahCtxExamples.ctx_relanceLibreMailParagraphe2,actualBody.path("Enq_RelanceLibreMailParagraphe2").asText()); - assertEquals(MeshuggahCtxExamples.ctx_relanceLibreMailParagraphe3,actualBody.path("Enq_RelanceLibreMailParagraphe3").asText()); - assertEquals(MeshuggahCtxExamples.ctx_relanceLibreMailParagraphe4,actualBody.path("Enq_RelanceLibreMailParagraphe4").asText()); - assertEquals(MeshuggahCtxExamples.ctx_responsableOperationnel,actualBody.path("Enq_RespOperationnel").asText()); - assertEquals(MeshuggahCtxExamples.ctx_responsableTraitement,actualBody.path("Enq_RespTraitement").asText()); - assertEquals(MeshuggahCtxExamples.ctx_serviceCollecteurSignataireFonction,actualBody.path("Enq_ServiceCollecteurSignataireFonction").asText()); - assertEquals(MeshuggahCtxExamples.ctx_serviceCollecteurSignataireNom,actualBody.path("Enq_ServiceCollecteurSignataireNom").asText()); - assertEquals(MeshuggahCtxExamples.ctx_themeMieuxConnaitreMail,actualBody.path("Enq_ThemeMieuxConnaitreMail").asText()); - assertEquals(MeshuggahCtxExamples.ctx_urlEnquete,actualBody.path("Enq_UrlEnquete").asText()); - assertEquals(MeshuggahCtxExamples.ctx_boiteRetour,actualBody.path("Mail_BoiteRetour").asText()); - assertEquals(MeshuggahCtxExamples.ctx_objetMail,actualBody.path("Mail_Objet").asText()); - } - assertEquals(1,nbOuverturePart1,"Wrong number of opening for partition 1"); - assertEquals(1,nbOuverturePart2,"Wrong number of opening for partition 2"); - assertEquals(1,nbRelancePart1,"Wrong number of relance for partition 1"); - assertEquals(1,nbRelancePart2,"Wrong number of relance for partition 2"); - - } - -} \ No newline at end of file diff --git a/src/test/backup/java/fr/insee/protools/backend/service/meshuggah/MeshuggahCtxExamples.java b/src/test/backup/java/fr/insee/protools/backend/service/meshuggah/MeshuggahCtxExamples.java deleted file mode 100644 index 6551dec4..00000000 --- a/src/test/backup/java/fr/insee/protools/backend/service/meshuggah/MeshuggahCtxExamples.java +++ /dev/null @@ -1,330 +0,0 @@ -package fr.insee.protools.backend.service.meshuggah; - -import fr.insee.protools.backend.service.utils.data.CtxExamples; - -public class MeshuggahCtxExamples { - - static final Long ctx_partition1 = 99L; - static final Long ctx_partition2 = 100L; - //Values - //static final String ctx_minTutelle = "MIN_TUT"; - static final String ctx_complementConnexion = "COMP_CONNEXION"; - static final String ctx_logoPrestataire = "LOGO_PRESTA"; - static final String ctx_mailResponsableOperationnel = "contact@insee.fr"; - static final Boolean ctx_prestataire = Boolean.FALSE; - - static final String ctx_relanceLibreMailParagraphe1 ="ligne1"; - static final String ctx_relanceLibreMailParagraphe1_partition2_com1 ="ligne1_partition2_com1"; - static final String ctx_relanceLibreMailParagraphe1_partition2_com2 ="ligne1_partition2_com2"; - - static final String ctx_relanceLibreMailParagraphe2 ="ligne2"; - static final String ctx_relanceLibreMailParagraphe3 ="ligne3"; - static final String ctx_relanceLibreMailParagraphe4 ="ligne4"; - static final String ctx_responsableOperationnel="Mr X"; - static final String ctx_responsableTraitement="l'Insee"; - static final String ctx_themeMieuxConnaitreMail="les familles"; - static final String ctx_serviceCollecteurSignataireFonction="La directrice des statistiques démographiques et sociales de l’Insee"; - static final String ctx_serviceCollecteurSignataireNom="Mme XXX"; - static final String ctx_urlEnquete="https://toto.insee.fr/"; - static final String ctx_boiteRetour="toto.toto@insee.fr"; - static final String ctx_objetMail="Insee - enquêtes XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"; - - static final String ctx_OK_1part_ouverture_courrier= - """ - { - "id": "AAC2023A00", - "metadonnees": { - "ministereTutelle": "MIN_TUT", - "responsableOperationnel": "Mr X", - "responsableTraitement": "l'Insee", - "mailBoiteRetour": "toto.toto@insee.fr", - "urlEnquete": "https://toto.insee.fr/", - "themeMieuxConnaitreMail": "les familles", - "serviceCollecteurSignataireFonction": "La directrice des statistiques démographiques et sociales de l’Insee", - "serviceCollecteurSignataireNom": "Mme XXX", - "prestataire": false, - "mailResponsableOperationnel": "contact@insee.fr", - "logoPrestataire": "LOGO_PRESTA" - }, - "partitions": [{ - "id": 99, - "communications" :[ - { - "moyenCommunication" : "courrier", - "phaseCommunication" : "ouverture", - "avecQuestionnairePapier" : false, - "protocole" : null, - "mode" : "web", - "typeModele" : "relance_libre", - "objetMail" : "Insee - enquêtes XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", - "relanceLibreMailParagraphe1" : "ligne1", - "relanceLibreMailParagraphe2" : "ligne2", - "relanceLibreMailParagraphe3" : "ligne3", - "relanceLibreMailParagraphe4" : "ligne4", - "complementConnexion" : "COMP_CONNEXION", - "echeances" : ["J+0"] - } - ] - }] - } - """; - - - static final String ctx_OK_2partitions_2com_ouverture_relance_ok= - """ - { - "id": "AAC2023A00", - "metadonnees": { - "ministereTutelle": "MIN_TUT", - "responsableOperationnel": "Mr X", - "responsableTraitement": "l'Insee", - "mailBoiteRetour": "toto.toto@insee.fr", - "urlEnquete": "https://toto.insee.fr/", - "themeMieuxConnaitreMail": "les familles", - "serviceCollecteurSignataireFonction": "La directrice des statistiques démographiques et sociales de l’Insee", - "serviceCollecteurSignataireNom": "Mme XXX", - "prestataire": false, - "mailResponsableOperationnel": "contact@insee.fr", - "logoPrestataire": "LOGO_PRESTA" - }, - "partitions": [{ - "id": 99, - "communications" :[ - { - "moyenCommunication" : "courrier", - "phaseCommunication" : "ouverture", - "avecQuestionnairePapier" : false, - "protocole" : null, - "mode" : "web", - "typeModele" : "relance_libre", - "objetMail" : "Insee - enquêtes XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", - "relanceLibreMailParagraphe1" : "ligne1", - "relanceLibreMailParagraphe2" : "ligne2", - "relanceLibreMailParagraphe3" : "ligne3", - "relanceLibreMailParagraphe4" : "ligne4", - "complementConnexion" : "COMP_CONNEXION", - "echeances" : ["J+0"] - }, - { - "moyenCommunication" : "mail", - "phaseCommunication" : "relance", - "avecQuestionnairePapier" : false, - "protocole" : null, - "mode" : "web", - "typeModele" : "relance_libre", - "objetMail" : "Insee - enquêtes XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", - "relanceLibreMailParagraphe1" : "ligne1", - "relanceLibreMailParagraphe2" : "ligne2", - "relanceLibreMailParagraphe3" : "ligne3", - "relanceLibreMailParagraphe4" : "ligne4", - "complementConnexion" : "COMP_CONNEXION", - "echeances" : ["J+15"] - } - ] - }, - { - "id": 100, - "communications" :[ - { - "moyenCommunication" : "courrier", - "phaseCommunication" : "ouverture", - "avecQuestionnairePapier" : false, - "protocole" : null, - "mode" : "web", - "typeModele" : "relance_libre", - "objetMail" : "Insee - enquêtes XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", - "relanceLibreMailParagraphe1" : "ligne1_partition2_com1", - "relanceLibreMailParagraphe2" : "ligne2", - "relanceLibreMailParagraphe3" : "ligne3", - "relanceLibreMailParagraphe4" : "ligne4", - "complementConnexion" : "COMP_CONNEXION", - "echeances" : ["J+0"] - }, - { - "moyenCommunication" : "mail", - "phaseCommunication" : "relance", - "avecQuestionnairePapier" : false, - "protocole" : null, - "mode" : "web", - "typeModele" : "relance_libre", - "objetMail" : "Insee - enquêtes XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", - "relanceLibreMailParagraphe1" : "ligne1_partition2_com2", - "relanceLibreMailParagraphe2" : "ligne2", - "relanceLibreMailParagraphe3" : "ligne3", - "relanceLibreMailParagraphe4" : "ligne4", - "complementConnexion" : "COMP_CONNEXION", - "echeances" : ["J+15"] - } - ] - } - ] - } - """; - - static final String ctx_OK_envoi_mail_1part_ouverture_mail= - """ - { - "id": "AAC2023A00", - "partitions": [{ - "id": 99, - "communications" :[ - { - "moyenCommunication" : "mail", - "phaseCommunication" : "ouverture", - "avecQuestionnairePapier" : false, - "protocole" : null, - "mode" : "web", - "typeModele" : "relance_libre" - } - ] - }] - } - """; - - - //CTX ERROR - static final String ctx_ERROR_no_part = CtxExamples.ctx_no_part; - - static final String ctx_ERROR_no_com = CtxExamples.ctx_idCampagne_idPartition; - - static final String ctx_ERROR_no_moyen = - """ - { - "id": "AAC2023A00", - "partitions": [{ - "id": 99, - "communications" :[ - { - "phaseCommunication" : "ouverture", - "avecQuestionnairePapier" : false, - "protocole" : null, - "mode" : "web", - "typeModele" : "relance_libre" - } - ] - }] - } - """; - - static final String ctx_ERROR_typo_phase= - """ - { - "id": "AAC2023A00", - "partitions": [{ - "id": 99, - "communications" :[ - { - "moyenCommunication" : "mail", - "phaseCommunication" : "ouvertureeee", - "avecQuestionnairePapier" : false, - "protocole" : null, - "mode" : "web", - "typeModele" : "relance_libre" - } - ] - }] - } - """; - - static final String ctx_ERROR_typo_moyen= - """ - { - "id": "AAC2023A00", - "partitions": [{ - "id": 99, - "communications" :[ - { - "moyenCommunication" : "email", - "phaseCommunication" : "ouverture", - "avecQuestionnairePapier" : false, - "protocole" : null, - "mode" : "web", - "typeModele" : "relance_libre" - } - ] - }] - } - """; - - static final String ctx_ERROR_1partitions_2com_1_typo_moyen= - """ - { - "id": "AAC2023A00", - "partitions": [{ - "id": 99, - "communications" :[ - { - "moyenCommunication" : "mail", - "phaseCommunication" : "relance", - "avecQuestionnairePapier" : false, - "protocole" : null, - "mode" : "web", - "typeModele" : "relance_libre" - }, - { - "moyenCommunication" : "xxxxxxxx", - "phaseCommunication" : "ouverture", - "avecQuestionnairePapier" : false, - "protocole" : null, - "mode" : "web", - "typeModele" : "relance_libre" - } - ] - }] - } - """; - - - static final String ctx_ERROR_2partitions_2com_1_typo_phase= - """ - { - "id": "AAC2023A00", - "partitions": [{ - "id": 99, - "communications" :[ - { - "moyenCommunication" : "mail", - "phaseCommunication" : "relance", - "avecQuestionnairePapier" : false, - "protocole" : null, - "mode" : "web", - "typeModele" : "relance_libre" - }, - { - "moyenCommunication" : "courrier", - "phaseCommunication" : "relance", - "avecQuestionnairePapier" : false, - "protocole" : null, - "mode" : "web", - "typeModele" : "relance_libre" - } - ] - }, - { - "id": 100, - "communications" :[ - { - "moyenCommunication" : "mail", - "phaseCommunication" : "relance", - "avecQuestionnairePapier" : false, - "protocole" : null, - "mode" : "web", - "typeModele" : "relance_libre" - }, - { - "moyenCommunication" : "courrier", - "phaseCommunication" : "xxxxxxxxxx", - "avecQuestionnairePapier" : false, - "protocole" : null, - "mode" : "web", - "typeModele" : "relance_libre" - } - ] - } - ] - } - """; - - private MeshuggahCtxExamples(){} - -} diff --git a/src/test/backup/java/fr/insee/protools/backend/service/meshuggah/MeshuggahSendOpeningMailCommunicationForSUTaskTest.java b/src/test/backup/java/fr/insee/protools/backend/service/meshuggah/MeshuggahSendOpeningMailCommunicationForSUTaskTest.java deleted file mode 100644 index d637066b..00000000 --- a/src/test/backup/java/fr/insee/protools/backend/service/meshuggah/MeshuggahSendOpeningMailCommunicationForSUTaskTest.java +++ /dev/null @@ -1,152 +0,0 @@ -package fr.insee.protools.backend.service.meshuggah; - -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.node.ObjectNode; -import fr.insee.protools.backend.ProtoolsTestUtils; -import fr.insee.protools.backend.deprecated.service.meshuggah.MeshuggahSendOpeningMailCommunicationForSUTask; -import fr.insee.protools.backend.deprecated.service.meshuggah.MeshuggahService; -import fr.insee.protools.backend.service.context.exception.BadContextIncorrectBPMNError; -import fr.insee.protools.backend.dto.meshuggah.MeshuggahComDetails; -import fr.insee.protools.backend.service.utils.TestWithContext; -import org.flowable.common.engine.api.FlowableIllegalArgumentException; -import org.flowable.engine.delegate.DelegateExecution; -import org.flowable.engine.test.FlowableTest; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.Arguments; -import org.junit.jupiter.params.provider.MethodSource; -import org.mockito.ArgumentCaptor; -import org.mockito.InjectMocks; -import org.mockito.Mock; -import org.mockito.Mockito; - -import java.util.stream.Stream; - -import static fr.insee.protools.backend.service.FlowableVariableNameConstants.VARNAME_CURRENT_PARTITION_ID; -import static fr.insee.protools.backend.service.FlowableVariableNameConstants.VARNAME_PLATINE_CONTACT; -import static fr.insee.protools.backend.service.utils.FlowableVariableUtils.getMissingVariableMessage; -import static org.assertj.core.api.Assertions.assertThat; -import static org.junit.jupiter.api.Assertions.*; -import static org.mockito.Mockito.*; - -@FlowableTest -class MeshuggahSendOpeningMailCommunicationForSUTaskTest extends TestWithContext { - static ObjectMapper objectMapper = new ObjectMapper(); - - private final String platineContactContent = """ - { - "email": "toto@insee.fr", - "identifier": "id" - } - """; - - private static Stream contextErrorArguments() { - return Stream.of( - Arguments.of(MeshuggahCtxExamples.ctx_ERROR_no_part), - Arguments.of(MeshuggahCtxExamples.ctx_ERROR_no_com), - Arguments.of(MeshuggahCtxExamples.ctx_ERROR_no_moyen), - Arguments.of(MeshuggahCtxExamples.ctx_ERROR_typo_phase), - Arguments.of(MeshuggahCtxExamples.ctx_ERROR_typo_moyen)); - } - - @Test - void execute_should_throwError_when_null_context(){ - assertThat_delegate_throwError_when_null_context(meshuggahTask); - } - - @Mock - MeshuggahService meshuggahService; - @InjectMocks - MeshuggahSendOpeningMailCommunicationForSUTask meshuggahTask; - - @Test - @DisplayName("Test execute method - should throw if VARNAME_CURRENT_PARTITION_ID or VARNAME_PLATINE_CONTACT not initialized") - void execute_should_throw_FlowableIllegalArgumentException_when_variables_notDefined() throws JsonProcessingException { - - //Precondition - DelegateExecution execution = mock(DelegateExecution.class); - lenient().when(execution.getProcessInstanceId()).thenReturn(dumyId); - initContexteMockWithString(MeshuggahCtxExamples.ctx_OK_envoi_mail_1part_ouverture_mail); - - //Execute the unit under test - FlowableIllegalArgumentException exception = assertThrows(FlowableIllegalArgumentException.class, () -> meshuggahTask.execute(execution)); - //Post conditions - assertThat(exception.getMessage()).isEqualTo(getMissingVariableMessage(VARNAME_CURRENT_PARTITION_ID)); - - //Create First variable - when(execution.getVariable(VARNAME_CURRENT_PARTITION_ID, String.class)).thenReturn("99"); - //Execute again - exception = assertThrows(FlowableIllegalArgumentException.class, () -> meshuggahTask.execute(execution)); - //Check the error - assertThat(exception.getMessage()).isEqualTo(getMissingVariableMessage(VARNAME_PLATINE_CONTACT)); - - //Create 2nd variable - when(execution.getVariable(VARNAME_PLATINE_CONTACT, JsonNode.class)).thenReturn(objectMapper.readTree(platineContactContent)); - //Execute again - assertDoesNotThrow(() -> meshuggahTask.execute(execution)); - } - - @ParameterizedTest - @MethodSource("contextErrorArguments") - @DisplayName("Test execute method - should throw if Context is not correct") - void execute_should_throw_BadContext_when_contextIncorrect(String context_json) throws JsonProcessingException { - //Precondition - DelegateExecution execution = mock(DelegateExecution.class); - lenient().when(execution.getProcessInstanceId()).thenReturn(dumyId); - //Variables - lenient().when(execution.getVariable(VARNAME_CURRENT_PARTITION_ID, Long.class)).thenReturn(MeshuggahCtxExamples.ctx_partition1); - lenient().when(execution.getVariable(VARNAME_PLATINE_CONTACT, JsonNode.class)).thenReturn(objectMapper.readTree(platineContactContent)); - //Ctx - ProtoolsTestUtils.initContexteMockFromString(protoolsContext, context_json); - - - //Run test - assertThrows(BadContextIncorrectBPMNError.class, () -> meshuggahTask.execute(execution)); - Mockito.reset(protoolsContext); - } - - @Test - @DisplayName("Test execute method - should work and make correct call to service") - void execute_should_work_when_variables_OK() throws JsonProcessingException { - //Precondition - DelegateExecution execution = mock(DelegateExecution.class); - lenient().when(execution.getProcessInstanceId()).thenReturn(dumyId); - initContexteMockWithString(MeshuggahCtxExamples.ctx_OK_envoi_mail_1part_ouverture_mail); - - when(execution.getVariable(VARNAME_CURRENT_PARTITION_ID, String.class)).thenReturn(MeshuggahCtxExamples.ctx_partition1.toString()); - JsonNode platineContact = objectMapper.readTree(platineContactContent); - when(execution.getVariable(VARNAME_PLATINE_CONTACT, JsonNode.class)).thenReturn(platineContact); - //Run method under test - assertDoesNotThrow(() -> meshuggahTask.execute(execution)); - - //Post conditions - MeshuggahComDetails expectedDetails = MeshuggahComDetails.builder() - .campaignId("AAC2023A00") - .phase("OUVERTURE") - .medium("EMAIL") - .mode("WEB") - .partitioningId(MeshuggahCtxExamples.ctx_partition1.toString()) - .avecQuestionnaire(false) - .protocol("DEFAULT") - .operation("RELANCE_LIBRE") - .build(); - - ObjectNode expectedBody = objectMapper.createObjectNode(); - expectedBody.put("email", platineContact.path("email")); - expectedBody.put("Ue_CalcIdentifiant", platineContact.path("identifier")); - - - ArgumentCaptor acDetails = ArgumentCaptor.forClass(MeshuggahComDetails.class); - ArgumentCaptor acBody = ArgumentCaptor.forClass(JsonNode.class); - verify(meshuggahService,times(1)).postSendCommunication(acDetails.capture(),acBody.capture()); - MeshuggahComDetails details = acDetails.getValue(); - assertEquals(expectedDetails,details); - - JsonNode resultBody = acBody.getValue(); - assertEquals(expectedBody,resultBody); - - } -} \ No newline at end of file diff --git a/src/test/backup/java/fr/insee/protools/backend/service/platine/delegate/PlatinePilotageCreateContextTaskTest.java b/src/test/backup/java/fr/insee/protools/backend/service/platine/delegate/PlatinePilotageCreateContextTaskTest.java deleted file mode 100644 index bde532d8..00000000 --- a/src/test/backup/java/fr/insee/protools/backend/service/platine/delegate/PlatinePilotageCreateContextTaskTest.java +++ /dev/null @@ -1,79 +0,0 @@ -package fr.insee.protools.backend.service.platine.delegate; - -import fr.insee.protools.backend.deprecated.service.platine.delegate.PlatinePilotageCreateContextTask; -import fr.insee.protools.backend.service.context.exception.BadContextIncorrectBPMNError; -import fr.insee.protools.backend.deprecated.service.platine.pilotage.PlatinePilotageService; -import fr.insee.protools.backend.deprecated.service.platine.pilotage.metadata.MetadataDto; -import fr.insee.protools.backend.service.utils.TestWithContext; -import org.flowable.engine.delegate.DelegateExecution; -import org.flowable.engine.test.FlowableTest; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; -import org.mockito.ArgumentCaptor; -import org.mockito.InjectMocks; -import org.mockito.Mock; -import org.mockito.junit.jupiter.MockitoExtension; -import org.springframework.util.ClassUtils; - -import java.util.List; - -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertThrows; -import static org.mockito.Mockito.*; - -@ExtendWith(MockitoExtension.class) -@FlowableTest -class PlatinePilotageCreateContextTaskTest extends TestWithContext { - final static String ressourceFolder = ClassUtils.convertClassNameToResourcePath(PlatineQuestionnaireCreateContextTaskTest.class.getPackageName()); - final static String platine_context_json = ressourceFolder+"/protools-contexte-platine-individu.json"; - - - @Mock PlatinePilotageService platinePilotageService; - @InjectMocks - PlatinePilotageCreateContextTask platinePilotageTask; - - - @Test - void execute_should_throwError_when_null_context(){ - assertThat_delegate_throwError_when_null_context(platinePilotageTask); - } - - @Test - void execute_should_throw_BadContextIncorrectException_when_noContext() { - DelegateExecution execution = createMockedExecution(); - - //Execute the unit under test - assertThrows(BadContextIncorrectBPMNError.class,() -> platinePilotageTask.execute(execution)); - } - - @Test - void execute_should_work_when_contextOK() { - DelegateExecution execution = createMockedExecution(); - initContexteMockWithFile(platine_context_json); - String partitionId="1"; - String campaignId="DEM2022X00"; - - //Execute the unit under test - platinePilotageTask.execute(execution); - - //Post conditions : Exactly one call to post platinePilotageService.putMetadata - // it is one call per partition defined in context -// verify(platinePilotageService,times(1)).putMetadata(eq(partitionId), notNull()); - - - //Verify postCampaign - ArgumentCaptor acMetadataDto = ArgumentCaptor.forClass(MetadataDto.class); - verify(platinePilotageService,times(1)).putMetadata(eq(campaignId+partitionId),acMetadataDto.capture()); - List allValues = acMetadataDto.getAllValues(); - assertEquals(1, allValues.size(),"We should have exactly one partition"); -//TODO - // MetadataDto expectedMetadataNode = ProtoolsTestUtils.asObject(ressourceFolder + "/expected_post_questionnaire_metadata.json", MetadataDto.class); - // assertEquals(expectedMetadataNode,allValues.get(0).getMetadata(),"Erreur with generated Metadata"); - assertEquals("DEM2022X00",allValues.get(0).getCampaignDto().getId(),"Erreur with generated Metadata campaign id"); - assertEquals("DEM2022X001",allValues.get(0).getPartitioningDto().getId(),"Erreur with generated Metadata partition id"); - assertEquals("DEM2022",allValues.get(0).getSurveyDto().getId(),"Erreur with generated Metadata partition id"); - assertEquals("proprietaireId",allValues.get(0).getOwnerDto().getId(),"Erreur with generated Metadata owner id"); - assertEquals("assistanceNiveau2Id",allValues.get(0).getSupportDto().getId(),"Erreur with generated Metadata support id"); - } - -} diff --git a/src/test/backup/java/fr/insee/protools/backend/service/platine/delegate/PlatinePilotageCreateSurveyUnitTaskTest.java b/src/test/backup/java/fr/insee/protools/backend/service/platine/delegate/PlatinePilotageCreateSurveyUnitTaskTest.java deleted file mode 100644 index 261f047b..00000000 --- a/src/test/backup/java/fr/insee/protools/backend/service/platine/delegate/PlatinePilotageCreateSurveyUnitTaskTest.java +++ /dev/null @@ -1,176 +0,0 @@ -package fr.insee.protools.backend.service.platine.delegate; - -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.node.ObjectNode; -import fr.insee.protools.backend.ProtoolsTestUtils; -import fr.insee.protools.backend.deprecated.service.platine.delegate.PlatinePilotageCreateInterrogationListTask; -import fr.insee.protools.backend.deprecated.service.platine.delegate.PlatinePilotageCreateSurveyUnitTask; -import fr.insee.protools.backend.service.context.ContextConstants; -import fr.insee.protools.backend.service.context.exception.BadContextIncorrectBPMNError; -import fr.insee.protools.backend.service.exception.IncorrectSUBPMNError; -import fr.insee.protools.backend.deprecated.service.platine.pilotage.PlatinePilotageService; -import fr.insee.protools.backend.dto.platine.pilotage.PlatinePilotageGenderType; -import fr.insee.protools.backend.dto.platine.pilotage.query.QuestioningWebclientDto; -import fr.insee.protools.backend.service.rem.RemDtoUtils; -import fr.insee.protools.backend.dto.rem_tmp.PersonDto; -import fr.insee.protools.backend.dto.rem_tmp.REMSurveyUnitDto; -import fr.insee.protools.backend.service.utils.TestWithContext; -import fr.insee.protools.backend.service.utils.data.RemSUData; -import org.flowable.engine.delegate.DelegateExecution; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.Arguments; -import org.junit.jupiter.params.provider.MethodSource; -import org.mockito.ArgumentCaptor; -import org.mockito.InjectMocks; -import org.mockito.Mock; -import org.springframework.util.ClassUtils; - -import java.util.stream.Stream; - -import static fr.insee.protools.backend.service.FlowableVariableNameConstants.*; -import static fr.insee.protools.backend.deprecated.service.platine.utils.PlatineHelper.computePilotagePartitionID; -import static org.assertj.core.api.Assertions.assertThat; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertThrows; -import static org.mockito.Mockito.*; - -class PlatinePilotageCreateSurveyUnitTaskTest extends TestWithContext { - - final static String ressourceFolder = ClassUtils.convertClassNameToResourcePath(PlatinePilotageCreateSurveyUnitTaskTest.class.getPackageName()); - - @Mock - PlatinePilotageService platinePilotageService; - - @InjectMocks - PlatinePilotageCreateSurveyUnitTask platinePilotageTask; - - - final static String platine_context_json = ressourceFolder+"/protools-contexte-platine-individu.json"; - final static String platine_context_logement_json = ressourceFolder+"/protools-contexte-platine-individu.json"; - - @Test - void execute_should_throwError_when_null_context(){ - assertThat_delegate_throwError_when_null_context(platinePilotageTask); - } - - //To be able to run tests with differents protools contexts - private static Stream protoolsContextArguments() { - return Stream.of( - Arguments.of(platine_context_json), - Arguments.of(platine_context_logement_json) - ); - } - - - @Test - void execute_should_throw_BadContextIncorrectException_when_noContext() { - DelegateExecution execution=createMockedExecution(); - //Execute the unit under test - assertThrows(BadContextIncorrectBPMNError.class,() -> platinePilotageTask.execute(execution)); - } - - @ParameterizedTest - @MethodSource("protoolsContextArguments") - void execute_should_work_when_ContextOK(String context_json) { - //Prepare - DelegateExecution execution=createMockedExecution(); - JsonNode contextRootNode = initContexteMockWithFile(context_json); - JsonNode remSU = ProtoolsTestUtils.asJsonNode(RemSUData.rem_su_3personnes); - String idPartition="1"; - lenient().doReturn(idPartition).when(execution).getVariable(VARNAME_CURRENT_PARTITION_ID,String.class); - lenient().doReturn(remSU).when(execution).getVariable(VARNAME_REM_INTERROGATION,JsonNode.class); - lenient().doReturn("TOTO").when(execution).getVariable(VARNAME_DIRECTORYACCESS_ID_CONTACT,String.class); - - //Execute the unit under test - platinePilotageTask.execute(execution); - - //Post Conditions - ArgumentCaptor acQuestionningDto = ArgumentCaptor.forClass(QuestioningWebclientDto.class); - verify(platinePilotageService,times(1)).putQuestionings(acQuestionningDto.capture()); - QuestioningWebclientDto valueParam = acQuestionningDto.getValue(); - assertEquals("tic2023a00_web", valueParam.getModelName(),"Bad Questionnaire model"); - assertEquals(1, valueParam.getContacts().size(),"Expected exactly one contact"); - assertEquals("TOBEFOUND", valueParam.getContacts().get(0).getFirstName(),"Wrong contact found"); - - String campagneId=contextRootNode.path(ContextConstants.CTX_CAMPAGNE_ID).asText(); - assertEquals(computePilotagePartitionID(campagneId,idPartition), valueParam.getIdPartitioning(),"Wrong Partition ID"); - assertEquals("3043280", valueParam.getSurveyUnit().getIdSu(),"Wrong ID SU (repository id)"); - } - - void findContact_should_return_CorrectContact(String suTestFilePath, boolean isLogement, boolean shouldThrow){ - //Prepare - JsonNode remSU = ProtoolsTestUtils.asJsonNode(suTestFilePath); - REMSurveyUnitDto dto = ProtoolsTestUtils.asObject(suTestFilePath,REMSurveyUnitDto.class); - - if(!shouldThrow) { - //Execute - PersonDto contact = RemDtoUtils.findContact(remSU,dto,isLogement); - //Found the right contact - assertEquals("TOBEFOUND", contact.getFirstName()); - } - else{ - //Execute the unit under test - assertThrows(IncorrectSUBPMNError.class,() -> RemDtoUtils.findContact(remSU,dto,isLogement)); - } - } - - @Test - void findContact_should_return_CorrectContactForLogement() { - findContact_should_return_CorrectContact(RemSUData.rem_su_1personne,true,false); - findContact_should_return_CorrectContact(RemSUData.rem_su_1personne,false,false); - findContact_should_return_CorrectContact(RemSUData.rem_su_3personnes,true,false); - findContact_should_return_CorrectContact(RemSUData.rem_su_3personnes,false,false); - findContact_should_return_CorrectContact(RemSUData.getRem_su_1personne_noContact,false,true); - findContact_should_return_CorrectContact(RemSUData.getRem_su_1personne_noContact,true,true); - } - - - @Test - @DisplayName("convertREMGenderToPlatineCivility should return Female when param '2' ; 'Male' when param is '1' and Undefined in other cases") - void convertREMGenderToPlatineCivility_should_ReturnCorrectValues() { - assertThat(PlatinePilotageCreateInterrogationListTask.convertREMGenderToPlatineCivility("2")).isEqualTo(PlatinePilotageGenderType.Female); - assertThat(PlatinePilotageCreateInterrogationListTask.convertREMGenderToPlatineCivility("1")).isEqualTo(PlatinePilotageGenderType.Male); - assertThat(PlatinePilotageCreateInterrogationListTask.convertREMGenderToPlatineCivility("22")).isEqualTo(PlatinePilotageGenderType.Undefined); - assertThat(PlatinePilotageCreateInterrogationListTask.convertREMGenderToPlatineCivility(" 2")).isEqualTo(PlatinePilotageGenderType.Undefined); - assertThat(PlatinePilotageCreateInterrogationListTask.convertREMGenderToPlatineCivility(" 2 ")).isEqualTo(PlatinePilotageGenderType.Undefined); - assertThat(PlatinePilotageCreateInterrogationListTask.convertREMGenderToPlatineCivility("3")).isEqualTo(PlatinePilotageGenderType.Undefined); - assertThat(PlatinePilotageCreateInterrogationListTask.convertREMGenderToPlatineCivility("23JZKEOSJF")).isEqualTo(PlatinePilotageGenderType.Undefined); - assertThat(PlatinePilotageCreateInterrogationListTask.convertREMGenderToPlatineCivility("0")).isEqualTo(PlatinePilotageGenderType.Undefined); - assertThat(PlatinePilotageCreateInterrogationListTask.convertREMGenderToPlatineCivility("-1")).isEqualTo(PlatinePilotageGenderType.Undefined); - assertThat(PlatinePilotageCreateInterrogationListTask.convertREMGenderToPlatineCivility("-2")).isEqualTo(PlatinePilotageGenderType.Undefined); - assertThat(PlatinePilotageCreateInterrogationListTask.convertREMGenderToPlatineCivility("& ukdslw,kvlk,l")).isEqualTo(PlatinePilotageGenderType.Undefined); - } - - @Test - @DisplayName("getPlatineLastname should return lastname if not null else return birthname if not null else return empty string") - void getPlatineLastname_should_work(){ - String lastname="lastname"; - String birthname="birthname"; - assertThat(PlatinePilotageCreateInterrogationListTask.getPlatineLastname(lastname,birthname)).isEqualTo(lastname); - assertThat(PlatinePilotageCreateInterrogationListTask.getPlatineLastname(null,birthname)).isEqualTo(birthname); - assertThat(PlatinePilotageCreateInterrogationListTask.getPlatineLastname(lastname,null)).isEqualTo(lastname); - assertThat(PlatinePilotageCreateInterrogationListTask.getPlatineLastname(null,null)).isEmpty(); - - } - - - @Test - @DisplayName("Should throw if REM SU Json is invalid") - void execute_should_throw_IncorrectSUException_when_wrongSU() { - DelegateExecution execution=createMockedExecution(); - initContexteMockWithFile(platine_context_json); - JsonNode remSU = ProtoolsTestUtils.asJsonNode(RemSUData.rem_su_3personnes); - //Break this node - ((ObjectNode) remSU).remove("repositoryId"); - String idPartition="1"; - lenient().doReturn(idPartition).when(execution).getVariable(VARNAME_CURRENT_PARTITION_ID,String.class); - lenient().doReturn(remSU).when(execution).getVariable(VARNAME_REM_INTERROGATION,JsonNode.class); - lenient().doReturn("TOTO").when(execution).getVariable(VARNAME_DIRECTORYACCESS_ID_CONTACT,String.class); - - - //Execute the unit under test - assertThrows(IncorrectSUBPMNError.class,() -> platinePilotageTask.execute(execution)); - } -} \ No newline at end of file diff --git a/src/test/backup/java/fr/insee/protools/backend/service/platine/delegate/PlatinePilotageGetSUContactTaskTest.java b/src/test/backup/java/fr/insee/protools/backend/service/platine/delegate/PlatinePilotageGetSUContactTaskTest.java deleted file mode 100644 index 5743a6b5..00000000 --- a/src/test/backup/java/fr/insee/protools/backend/service/platine/delegate/PlatinePilotageGetSUContactTaskTest.java +++ /dev/null @@ -1,149 +0,0 @@ -package fr.insee.protools.backend.service.platine.delegate; - -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; -import fr.insee.protools.backend.deprecated.service.platine.delegate.PlatinePilotageGetSUContactTask; -import fr.insee.protools.backend.service.context.exception.BadContextIncorrectBPMNError; -import fr.insee.protools.backend.deprecated.service.platine.pilotage.PlatinePilotageService; -import fr.insee.protools.backend.dto.platine.pilotage.contact.PlatineContactDto; -import fr.insee.protools.backend.deprecated.service.platine.utils.PlatineHelper; -import fr.insee.protools.backend.service.rem.delegate.ExtractContactIdentifierFromREMSUTask; -import fr.insee.protools.backend.service.utils.TestWithContext; -import org.flowable.common.engine.api.FlowableIllegalArgumentException; -import org.flowable.engine.delegate.DelegateExecution; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; -import org.mockito.ArgumentCaptor; -import org.mockito.InjectMocks; -import org.mockito.Mock; -import org.springframework.util.ClassUtils; - -import static fr.insee.protools.backend.service.FlowableVariableNameConstants.*; -import static fr.insee.protools.backend.service.context.ContextConstants.CTX_CAMPAGNE_ID; -import static org.junit.jupiter.api.Assertions.*; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.Mockito.*; - -class PlatinePilotageGetSUContactTaskTest extends TestWithContext { - final static String ressourceFolder = ClassUtils.convertClassNameToResourcePath(PlatinePilotageGetSUContactTaskTest.class.getPackageName()); - final static String platine_context_json = ressourceFolder + "/protools-contexte-platine-individu.json"; - final static String platine_context_incorrect_json = ressourceFolder + "/protools-contexte-platine-incorrect-no-campaign-id.json"; - - @Mock PlatinePilotageService platinePilotageService; - @InjectMocks - PlatinePilotageGetSUContactTask platinePilotageTask; - - @Test - void execute_should_throwError_when_null_context(){ - assertThat_delegate_throwError_when_null_context(platinePilotageTask); - } - - @Test - void execute_should_throw_BadContextIncorrectException_when_noContext() { - DelegateExecution execution = createMockedExecution(); - //Execute the unit under test - assertThrows(BadContextIncorrectBPMNError.class, () -> platinePilotageTask.execute(execution)); - } - - @Test - void execute_should_throw_BadContextIncorrectException_when_CampaignId_missing() { - DelegateExecution execution = createMockedExecution(); - initContexteMockWithFile(platine_context_incorrect_json); - - //Execute the unit under test - assertThrows(BadContextIncorrectBPMNError.class, () -> platinePilotageTask.execute(execution)); - } - - @Test - @DisplayName("PlatinePilotageGetSUContactTaskTest should throw an exception when the VARNAME_REM_SURVEY_UNIT_IDENTIFIER variable is missing or has wrong type") - void execute_should_throw_when_variable1_missing() { - //Prepare - DelegateExecution execution = createMockedExecution(); - ExtractContactIdentifierFromREMSUTask extractTask = new ExtractContactIdentifierFromREMSUTask(); - //set the 2nd variable correctly - lenient().doReturn("999").when(execution).getVariable(VARNAME_CURRENT_PARTITION_ID, String.class); - - - //No variable set ==> Error - assertThrows(FlowableIllegalArgumentException.class, () -> extractTask.execute(execution)); - - //Wrong Type ==> Error - lenient().doReturn(Boolean.FALSE).when(execution).getVariable(VARNAME_REM_SURVEY_UNIT_IDENTIFIER, Boolean.class); - assertThrows(FlowableIllegalArgumentException.class, () -> extractTask.execute(execution)); - } - - @Test - @DisplayName("PlatinePilotageGetSUContactTaskTest should throw an exception when the VARNAME_CURRENT_PARTITION_ID variable is missing or has wrong type") - void execute_should_throw_when_variable2_missing() { - //Prepare - DelegateExecution execution = createMockedExecution(); - ExtractContactIdentifierFromREMSUTask extractTask = new ExtractContactIdentifierFromREMSUTask(); - //set the 2nd variable correctly - lenient().doReturn(12L).when(execution).getVariable(VARNAME_REM_SURVEY_UNIT_IDENTIFIER, Long.class); - - - //No variable set ==> Error - assertThrows(FlowableIllegalArgumentException.class, () -> extractTask.execute(execution)); - - //Wrong Type ==> Error - lenient().doReturn(Boolean.FALSE).when(execution).getVariable(VARNAME_CURRENT_PARTITION_ID, Boolean.class); - assertThrows(FlowableIllegalArgumentException.class, () -> extractTask.execute(execution)); - } - - @Test - @DisplayName("PlatinePilotageGetSUContactTaskTest should throw an exception when the VARNAME_CURRENT_PARTITION_ID and VARNAME_CURRENT_PARTITION_ID variable are missing or have wrong type") - void execute_should_throw_when_variable1and2_missing() { - //Prepare - DelegateExecution execution = createMockedExecution(); - ExtractContactIdentifierFromREMSUTask extractTask = new ExtractContactIdentifierFromREMSUTask(); - - //No variable set ==> Error - assertThrows(FlowableIllegalArgumentException.class, () -> extractTask.execute(execution)); - - //Wrong Type ==> Error - lenient().doReturn(Boolean.FALSE).when(execution).getVariable(VARNAME_CURRENT_PARTITION_ID, Boolean.class); - lenient().doReturn(Boolean.TRUE).when(execution).getVariable(VARNAME_REM_SURVEY_UNIT_IDENTIFIER, Boolean.class); - - - assertThrows(FlowableIllegalArgumentException.class, () -> extractTask.execute(execution)); - } - - - @Test - void execute_should_work_when_context_and_variables_OK() throws JsonProcessingException { - DelegateExecution execution = createMockedExecution(); - JsonNode contextRootNode = initContexteMockWithFile(platine_context_json); - //Prepare parent - DelegateExecution executionParent = mock(DelegateExecution.class); - doReturn(executionParent).when(execution).getParent(); - //Process variables - Long suId = 20231110L; - String currentPartitionID = "120883"; - lenient().doReturn(currentPartitionID).when(execution).getVariable(VARNAME_CURRENT_PARTITION_ID, String.class); - lenient().doReturn(suId).when(execution).getVariable(VARNAME_REM_SURVEY_UNIT_IDENTIFIER, Long.class); - - //Prepare service response from platine - PlatineContactDto contactDto = PlatineContactDto.builder().identifier("55").build(); - doReturn(contactDto).when(platinePilotageService).getSUMainContact(any(),any()); - - - //Execute the unit under test - assertDoesNotThrow(() -> platinePilotageTask.execute(execution)); - - //Post conditions : - // 1 : Exactly one call to post platinePilotageService.getSUMainContact with correct parameters - String platinePartitionId = PlatineHelper.computePilotagePartitionID(contextRootNode.path(CTX_CAMPAGNE_ID).asText(), currentPartitionID); - verify(platinePilotageService, times(1)).getSUMainContact(suId, platinePartitionId); - //2 : VARNAME_PLATINE_CONTACT has been set to correct value - ArgumentCaptor acVariableValue = ArgumentCaptor.forClass(JsonNode.class); - ArgumentCaptor acVariableKey = ArgumentCaptor.forClass(String.class); - - verify(executionParent, times(1)).setVariableLocal(acVariableKey.capture(),acVariableValue.capture()); - assertEquals(VARNAME_PLATINE_CONTACT, acVariableKey.getValue(),"variable VARNAME_PLATINE_CONTACT not set"); - PlatineContactDto argumentDto = (new ObjectMapper()).treeToValue(acVariableValue.getValue(),PlatineContactDto.class); - assertEquals("55", argumentDto.getIdentifier(),"Bad Object retrieved"); - - } - -} \ No newline at end of file diff --git a/src/test/backup/java/fr/insee/protools/backend/service/platine/delegate/PlatineQuestionnaireCreateContextTaskTest.java b/src/test/backup/java/fr/insee/protools/backend/service/platine/delegate/PlatineQuestionnaireCreateContextTaskTest.java deleted file mode 100644 index fc698cc3..00000000 --- a/src/test/backup/java/fr/insee/protools/backend/service/platine/delegate/PlatineQuestionnaireCreateContextTaskTest.java +++ /dev/null @@ -1,131 +0,0 @@ -package fr.insee.protools.backend.service.platine.delegate; - -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; -import fr.insee.protools.backend.ProtoolsTestUtils; -import fr.insee.protools.backend.deprecated.service.platine.delegate.PlatineQuestionnaireCreateContextTask; -import fr.insee.protools.backend.service.context.ContextConstants; -import fr.insee.protools.backend.service.context.ContextService; -import fr.insee.protools.backend.service.context.exception.BadContextIncorrectBPMNError; -import fr.insee.protools.backend.deprecated.service.nomenclature.NomenclatureService; -import fr.insee.protools.backend.deprecated.service.platine.questionnaire.PlatineQuestionnaireService; -import fr.insee.protools.backend.deprecated.service.questionnaire_model.QuestionnaireModelService; -import org.flowable.engine.delegate.DelegateExecution; -import org.flowable.engine.test.FlowableTest; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; -import org.mockito.ArgumentCaptor; -import org.mockito.InjectMocks; -import org.mockito.Mock; -import org.mockito.Spy; -import org.mockito.junit.jupiter.MockitoExtension; -import org.springframework.util.ClassUtils; - -import java.io.IOException; -import java.util.List; -import java.util.Set; - -import static fr.insee.protools.backend.service.context.ContextConstants.*; -import static org.assertj.core.api.AssertionsForClassTypes.assertThatCode; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertThrows; -import static org.mockito.ArgumentMatchers.anyString; -import static org.mockito.Mockito.*; - - -@ExtendWith(MockitoExtension.class) -@FlowableTest -public -class PlatineQuestionnaireCreateContextTaskTest { - - final static String ressourceFolder = ClassUtils.convertClassNameToResourcePath(PlatineQuestionnaireCreateContextTaskTest.class.getPackageName()); - final static String platine_context_json = ressourceFolder+"/protools-contexte-platine-individu.json"; - final static String platine_context_incorrect_json = ressourceFolder+"/protools-contexte-platine-incorrect.json"; - - @Mock PlatineQuestionnaireService platineQuestionnaireService; - @Mock QuestionnaireModelService questionnaireModelService; - @Mock NomenclatureService nomenclatureService; - @Mock ContextService protoolsContext; - @Spy ObjectMapper objectMapper; - - @InjectMocks - PlatineQuestionnaireCreateContextTask platineQuestTask; - - private final String questionnaireContent1 ="{\"id\": \"TOTO\" , \"toto\": 55 }"; - - - private JsonNode initContexteMock(String contexteToLoad){ - JsonNode contextRootNode = ProtoolsTestUtils.asJsonNode(contexteToLoad); - when(protoolsContext.getContextByProcessInstance(anyString())).thenReturn(contextRootNode); - return contextRootNode; - } - - @Test - void execute_should_throwBadContextIncorrect_when_contextIsKO() { - // preconditions - DelegateExecution execution = mock(DelegateExecution.class); - when(execution.getProcessInstanceId()).thenReturn("1"); - initContexteMock(platine_context_incorrect_json); - - //Execute the unit under test - assertThrows(BadContextIncorrectBPMNError.class, () -> platineQuestTask.execute(execution)); - - // postconditions - //assertThat(execution.getVariable("myVariable")).isEqualTo("myValue"); - - } - - /*@Test - void initQuestionnaireModels_should_produce_correct_json(){ - platineQuestTask.² - }*/ - - @Test - void execute_should_work_and_make_correct_calls() throws IOException { - DelegateExecution execution = mock(DelegateExecution.class); - when(execution.getProcessInstanceId()).thenReturn("1"); - JsonNode contextRootNode = initContexteMock(platine_context_json); - assertEquals(1,contextRootNode.path(ContextConstants.CTX_QUESTIONNAIRE_MODELS).size(), "Context error : expected exactly one questionnaire model"); - String idQuestionnaireModel = contextRootNode.path(ContextConstants.CTX_QUESTIONNAIRE_MODELS).get(0).path(CTX_QUESTIONNAIRE_MODEL_ID).asText(); - String labelQuestionnaireModel = contextRootNode.path(ContextConstants.CTX_QUESTIONNAIRE_MODELS).get(0).path(CTX_QUESTIONNAIRE_MODEL_LABEL).asText(); - String repertoireQuestionnaireModel = contextRootNode.path(ContextConstants.CTX_QUESTIONNAIRE_MODELS).get(0).path(CTX_QUESTIONNAIRE_MODEL_CHEMIN_REPERTOIRE).asText(); - - //Prepare the list of existing nomenclatures ("L_NATIONETR-1-1-0" does not exists yet) - when(platineQuestionnaireService.getNomenclaturesId()).thenReturn(Set.of("L_DEPNAIS-1-1-0","L_PAYSNAIS-1-1-0")); - //Mock the read nomenclature - String nomenclatureContent="{\"id\": \"nomenclatureContent\"}"; - when(nomenclatureService.getNomenclatureContent("L_NATIONETR-1-1-0","NATIONETR")).thenReturn(nomenclatureContent); - //Mock questionnaire - when(platineQuestionnaireService.questionnaireModelExists(anyString())).thenReturn(false); - when(questionnaireModelService.getQuestionnaireModel(anyString(), anyString())).thenReturn(questionnaireContent1); - - - //Execute the unit under test - assertThatCode(() -> platineQuestTask.execute(execution)).doesNotThrowAnyException(); - - //Verifications on nomenclatures - verify(platineQuestionnaireService,atLeastOnce()).getNomenclaturesId(); - verify(platineQuestionnaireService).postNomenclature( - "L_NATIONETR-1-1-0", - "liste des nationalités", - objectMapper.readTree(nomenclatureContent)); - - //Verifications on questionnaires - verify(platineQuestionnaireService,times(1)).questionnaireModelExists(idQuestionnaireModel); - verify(questionnaireModelService,times(1)).getQuestionnaireModel(idQuestionnaireModel,repertoireQuestionnaireModel); - verify(platineQuestionnaireService).postQuestionnaireModel(idQuestionnaireModel,labelQuestionnaireModel, - objectMapper.readTree(questionnaireContent1), - Set.of("L_DEPNAIS-1-1-0","L_PAYSNAIS-1-1-0","L_NATIONETR-1-1-0")); - - //Verify postCampaign - ArgumentCaptor acContext = ArgumentCaptor.forClass(JsonNode.class); - ArgumentCaptor acCampaignId = ArgumentCaptor.forClass(String.class); - verify(platineQuestionnaireService,times(1)).postContext(acCampaignId.capture(),acContext.capture()); - - List allCtxValues = acContext.getAllValues(); - assertEquals(1, allCtxValues.size(),"We should have exactly one campaign"); - - JsonNode expectedCtx = ProtoolsTestUtils.asJsonNode(platine_context_json); - assertEquals(expectedCtx,allCtxValues.get(0),"Error with the passed json context"); - } -} diff --git a/src/test/backup/java/fr/insee/protools/backend/service/platine/delegate/PlatineQuestionnaireCreateSurveyUnitTaskTest.java b/src/test/backup/java/fr/insee/protools/backend/service/platine/delegate/PlatineQuestionnaireCreateSurveyUnitTaskTest.java deleted file mode 100644 index 4e9830fc..00000000 --- a/src/test/backup/java/fr/insee/protools/backend/service/platine/delegate/PlatineQuestionnaireCreateSurveyUnitTaskTest.java +++ /dev/null @@ -1,115 +0,0 @@ -package fr.insee.protools.backend.service.platine.delegate; - -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.node.ObjectNode; -import fr.insee.protools.backend.ProtoolsTestUtils; -import fr.insee.protools.backend.deprecated.service.platine.delegate.PlatineQuestionnaireCreateSurveyUnitTask; -import fr.insee.protools.backend.dto.platine_sabiane_questionnaire.surveyunit.SurveyUnitResponseDto; -import fr.insee.protools.backend.service.context.exception.BadContextIncorrectBPMNError; -import fr.insee.protools.backend.service.exception.IncorrectSUBPMNError; -import fr.insee.protools.backend.deprecated.service.platine.questionnaire.PlatineQuestionnaireService; -import fr.insee.protools.backend.service.utils.TestWithContext; -import fr.insee.protools.backend.service.utils.data.RemSUData; -import org.flowable.engine.delegate.DelegateExecution; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.Arguments; -import org.junit.jupiter.params.provider.MethodSource; -import org.mockito.ArgumentCaptor; -import org.mockito.InjectMocks; -import org.mockito.Mock; -import org.springframework.util.ClassUtils; - -import java.util.stream.Stream; - -import static fr.insee.protools.backend.service.FlowableVariableNameConstants.*; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertThrows; -import static org.mockito.Mockito.*; - -class PlatineQuestionnaireCreateSurveyUnitTaskTest extends TestWithContext { - - @Mock - PlatineQuestionnaireService platineQuestionnaireService; - - @InjectMocks - PlatineQuestionnaireCreateSurveyUnitTask platineQuestionnaireCreateSurveyUnitTask; - - - - final static String ressourceFolder = ClassUtils.convertClassNameToResourcePath(PlatineQuestionnaireCreateSurveyUnitTask.class.getPackageName()); - final static String platine_context_json = ressourceFolder+"/protools-contexte-platine-individu.json"; - final static String platine_context_logement_json = ressourceFolder+"/protools-contexte-platine-individu.json"; - - //To be able to run tests with differents protools contexts - private static Stream protoolsContextArguments() { - return Stream.of( - Arguments.of(platine_context_json), - Arguments.of(platine_context_logement_json) - ); - } - - @Test - void execute_should_throwError_when_null_context(){ - assertThat_delegate_throwError_when_null_context(platineQuestionnaireCreateSurveyUnitTask); - } - @Test - void execute_should_throw_BadContextIncorrectException_when_noContext() { - DelegateExecution execution=createMockedExecution(); - //Execute the unit under test - assertThrows(BadContextIncorrectBPMNError.class,() -> platineQuestionnaireCreateSurveyUnitTask.execute(execution)); - } - @ParameterizedTest - @MethodSource("protoolsContextArguments") - void execute_should_work_when_ContextOK(String context_json) throws JsonProcessingException { - //Prepare - DelegateExecution execution=createMockedExecution(); - JsonNode contextRootNode = initContexteMockWithFile(context_json); - JsonNode remSU = ProtoolsTestUtils.asJsonNode(RemSUData.rem_su_3personnes); - String idPartition="1"; - lenient().doReturn(idPartition).when(execution).getVariable(VARNAME_CURRENT_PARTITION_ID,String.class); - lenient().doReturn(remSU).when(execution).getVariable(VARNAME_REM_INTERROGATION,JsonNode.class); - lenient().doReturn("TOTO").when(execution).getVariable(VARNAME_DIRECTORYACCESS_ID_CONTACT,String.class); - - //Execute the unit under test - platineQuestionnaireCreateSurveyUnitTask.execute(execution); - - //Post Conditions - ObjectMapper objectMapper = new ObjectMapper(); - ArgumentCaptor acSUResDTO = ArgumentCaptor.forClass(SurveyUnitResponseDto.class); - verify(platineQuestionnaireService,times(1)).postSurveyUnit(acSUResDTO.capture(),any()); - SurveyUnitResponseDto valueParam = acSUResDTO.getValue(); - assertEquals("3043280", valueParam.getId(),"Wrong ID SU (repository id)"); - assertEquals("tic2023a00_web", valueParam.getQuestionnaireId(),"Wrong questionnaireId"); - assertEquals(objectMapper.readTree("[{\"name\":\"whoAnswers1\",\"value\":\"Qui doit répondre paragraphe 1\"}," + - "{\"name\":\"whoAnswers2\",\"value\":\"Qui doit répondre paragraphe 2\"}," + - "{\"name\":\"whoAnswers3\",\"value\":\"Qui doit répondre paragraphe 3\"}]") - , valueParam.getPersonalization(),"Wrong questionnaireId"); - assertEquals(objectMapper.readTree("{\"EXTERNAL\":{\"ADMINISTRATION1\":\"Insee\",\"ADMINISTRATION2\":\"Patate\"}}"), - valueParam.getData(),"Wrong data (external)"); - assertEquals(objectMapper.createObjectNode(), valueParam.getComment(),"No comment expected"); - //assertEquals(objectMapper.createObjectNode(), valueParam.getStateData(),"No stateData expected"); - } - - @Test - void execute_should_throw_IncorrectSUException_when_wrongSU() { - DelegateExecution execution=createMockedExecution(); - initContexteMockWithFile(platine_context_json); - JsonNode remSU = ProtoolsTestUtils.asJsonNode(RemSUData.rem_su_3personnes); - //Break this node - ((ObjectNode) remSU).remove("repositoryId"); - String idPartition="1"; - lenient().doReturn(idPartition).when(execution).getVariable(VARNAME_CURRENT_PARTITION_ID,String.class); - lenient().doReturn(remSU).when(execution).getVariable(VARNAME_REM_INTERROGATION,JsonNode.class); - lenient().doReturn("TOTO").when(execution).getVariable(VARNAME_DIRECTORYACCESS_ID_CONTACT,String.class); - - - //Execute the unit under test - assertThrows(IncorrectSUBPMNError.class,() -> platineQuestionnaireCreateSurveyUnitTask.execute(execution)); - } - - - -} \ No newline at end of file diff --git a/src/test/backup/java/fr/insee/protools/backend/service/platine/delegate/pilotatage/PlatinePilotageCreateContextTaskRESTTest.java b/src/test/backup/java/fr/insee/protools/backend/service/platine/delegate/pilotatage/PlatinePilotageCreateContextTaskRESTTest.java deleted file mode 100644 index b1f5bf4a..00000000 --- a/src/test/backup/java/fr/insee/protools/backend/service/platine/delegate/pilotatage/PlatinePilotageCreateContextTaskRESTTest.java +++ /dev/null @@ -1,72 +0,0 @@ -package fr.insee.protools.backend.service.platine.delegate.pilotatage; - -import com.fasterxml.jackson.databind.JsonNode; -import fr.insee.protools.backend.ProtoolsTestUtils; -import fr.insee.protools.backend.service.context.exception.BadContextIncorrectBPMNError; -import fr.insee.protools.backend.service.platine.delegate.PlatineQuestionnaireCreateContextTaskTest; -import fr.insee.protools.backend.service.platine.service.PlatinePilotageService; -import fr.insee.protools.backend.service.utils.TestWithContext; -import org.flowable.engine.delegate.DelegateExecution; -import org.flowable.engine.test.FlowableTest; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; -import org.mockito.ArgumentCaptor; -import org.mockito.InjectMocks; -import org.mockito.Mock; -import org.mockito.junit.jupiter.MockitoExtension; -import org.springframework.util.ClassUtils; - -import java.util.List; - -import static org.junit.jupiter.api.Assertions.*; -import static org.mockito.ArgumentMatchers.eq; -import static org.mockito.Mockito.times; -import static org.mockito.Mockito.verify; - -@ExtendWith(MockitoExtension.class) -@FlowableTest -class PlatinePilotageCreateContextTaskRESTTest extends TestWithContext { - final static String ressourceFolder = ClassUtils.convertClassNameToResourcePath(PlatineQuestionnaireCreateContextTaskTest.class.getPackageName()); - final static String platine_context_json = ressourceFolder+"/protools-contexte-platine-individu.json"; - - - @Mock - PlatinePilotageService platinePilotageService; - @InjectMocks - PlatinePilotageCreateContextTaskREST platinePilotageTask; - - - @Test - void execute_should_throwError_when_null_context(){ - assertThat_delegate_throwError_when_null_context(platinePilotageTask); - } - - @Test - void execute_should_throw_BadContextIncorrectException_when_noContext() { - DelegateExecution execution = createMockedExecution(); - - //Execute the unit under test - assertThrows(BadContextIncorrectBPMNError.class,() -> platinePilotageTask.execute(execution)); - } - - @Test - void execute_should_work_when_contextOK() { - DelegateExecution execution = createMockedExecution(); - initContexteMockWithFile(platine_context_json); - String partitionId="1"; - String campaignId="DEM2022X00"; - - //Execute the unit under test - platinePilotageTask.execute(execution); - - //Verify postContext - ArgumentCaptor acCtx = ArgumentCaptor.forClass(JsonNode.class); - verify(platinePilotageService,times(1)).postContext(eq(campaignId),acCtx.capture()); - List allValues = acCtx.getAllValues(); - assertEquals(1, allValues.size(),"We should have exactly one partition"); - - JsonNode expectedContext = ProtoolsTestUtils.asJsonNode(platine_context_json); - assertEquals(expectedContext,allValues.get(0),"Wrong context passed"); - } - -} \ No newline at end of file diff --git a/src/test/backup/java/fr/insee/protools/backend/service/platine/utils/PlatineHelperTest.java b/src/test/backup/java/fr/insee/protools/backend/service/platine/utils/PlatineHelperTest.java deleted file mode 100644 index 48eb6a06..00000000 --- a/src/test/backup/java/fr/insee/protools/backend/service/platine/utils/PlatineHelperTest.java +++ /dev/null @@ -1,21 +0,0 @@ -package fr.insee.protools.backend.service.platine.utils; - -import fr.insee.protools.backend.deprecated.service.platine.utils.PlatineHelper; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; -import org.mockito.junit.jupiter.MockitoExtension; - -import static org.junit.jupiter.api.Assertions.assertEquals; - -@ExtendWith(MockitoExtension.class) -class PlatineHelperTest { - - @Test - void computePilotagePartitionID_should_returnConcat(){ - assertEquals("A1", PlatineHelper.computePilotagePartitionID("A","1")); - assertEquals("AAAAAAAAA1",PlatineHelper.computePilotagePartitionID("AAAAAAAAA","1")); - assertEquals(null,PlatineHelper.computePilotagePartitionID(null,"1")); - assertEquals(null,PlatineHelper.computePilotagePartitionID("1",null)); - assertEquals(null,PlatineHelper.computePilotagePartitionID(null,null)); - } -} \ No newline at end of file diff --git a/src/test/backup/java/fr/insee/protools/backend/service/rem/RemDtoUtilsTest.java b/src/test/backup/java/fr/insee/protools/backend/service/rem/RemDtoUtilsTest.java deleted file mode 100644 index 493b916e..00000000 --- a/src/test/backup/java/fr/insee/protools/backend/service/rem/RemDtoUtilsTest.java +++ /dev/null @@ -1,194 +0,0 @@ -package fr.insee.protools.backend.service.rem; - -import fr.insee.protools.backend.service.exception.IncorrectSUBPMNError; -import fr.insee.protools.backend.dto.rem_tmp.PersonDto; -import fr.insee.protools.backend.dto.rem_tmp.REMSurveyUnitDto; -import org.apache.commons.lang3.tuple.Pair; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; -import org.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.Arguments; -import org.junit.jupiter.params.provider.MethodSource; -import org.mockito.junit.jupiter.MockitoExtension; - -import java.util.List; -import java.util.Optional; -import java.util.stream.Stream; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.junit.jupiter.api.Assertions.*; - -@ExtendWith(MockitoExtension.class) -class RemDtoUtilsTest { - - static PersonDto person1_main_surveyed = PersonDto.builder().index(1).main(Boolean.TRUE).surveyed(Boolean.TRUE).coDeclarant(Boolean.FALSE).build(); - static PersonDto person2_main = PersonDto.builder().index(2).main(Boolean.TRUE).surveyed(Boolean.FALSE).coDeclarant(Boolean.FALSE).build(); - static PersonDto person3_surveyed = PersonDto.builder().index(3).main(Boolean.FALSE).surveyed(Boolean.TRUE).coDeclarant(Boolean.FALSE).build(); - - static PersonDto person4_main_surveyed_codeclarant = PersonDto.builder().index(4).main(Boolean.TRUE).surveyed(Boolean.TRUE).coDeclarant(Boolean.TRUE).build(); - static PersonDto person5_main_codeclarant = PersonDto.builder().index(5).main(Boolean.TRUE).surveyed(Boolean.FALSE).coDeclarant(Boolean.TRUE).build(); - static PersonDto person6_surveyed_codeclarant = PersonDto.builder().index(6).main(Boolean.FALSE).surveyed(Boolean.TRUE).coDeclarant(Boolean.TRUE).build(); - - static PersonDto person7_main_surveyed_codeclarantNull = PersonDto.builder().index(7).main(Boolean.TRUE).surveyed(Boolean.TRUE).coDeclarant(null).build(); - static PersonDto person8 = PersonDto.builder().index(8).main(Boolean.FALSE).surveyed(Boolean.FALSE).coDeclarant(Boolean.FALSE).build(); - static PersonDto person9 = PersonDto.builder().index(9).main(Boolean.FALSE).surveyed(Boolean.FALSE).coDeclarant(Boolean.FALSE).build(); - static PersonDto person10_codeclarant = PersonDto.builder().index(10).main(Boolean.FALSE).surveyed(Boolean.FALSE).coDeclarant(Boolean.TRUE).build(); - - - private static Stream findContactIndividuArgument() { - return Stream.of( - //Run method under test : 1 person surveyed - Arguments.of(REMSurveyUnitDto.builder().persons(List.of(person3_surveyed)).build(),3), - //Run method under test : 2 person including 1 surveyed - Arguments.of(REMSurveyUnitDto.builder().persons(List.of(person3_surveyed, person2_main)).build(),3), - //Run method under test : 2 person including 1 surveyed (swapped) - Arguments.of(REMSurveyUnitDto.builder().persons(List.of(person2_main, person3_surveyed)).build(),3), - //Run method under test : 3 person including 1 surveyed (reswap) - Arguments.of(REMSurveyUnitDto.builder().persons(List.of(person8, person3_surveyed, person9)).build(),3), - //Run method under test : 3 person including 1 surveyed (swapped 1) - Arguments.of(REMSurveyUnitDto.builder().persons(List.of(person3_surveyed, person9, person8)).build(),3), - Arguments.of(REMSurveyUnitDto.builder().persons(List.of(person9, person8, person3_surveyed)).build(),3), - Arguments.of(REMSurveyUnitDto.builder().persons(List.of(person9, person8, person8,person8,person8,person8,person8,person8,person8,person8,person3_surveyed)).build(),3) - - ); - } - - private static Stream findContactIndividuArgument_noSurveyed() { - return Stream.of( - Arguments.of(REMSurveyUnitDto.builder().persons(List.of(person2_main)).build()), - Arguments.of(REMSurveyUnitDto.builder().persons(List.of(person2_main, person5_main_codeclarant)).build()), - Arguments.of(REMSurveyUnitDto.builder().persons(List.of(person2_main, person5_main_codeclarant,person9,person8)).build()) - ); - } - - @ParameterizedTest - @MethodSource("findContactIndividuArgument_noSurveyed") - void findContactIndividu_shouldThrow_whenNoSurved(REMSurveyUnitDto su) { - assertThrows(IncorrectSUBPMNError.class, () -> RemDtoUtils.findContact(null, su, false)); - } - - - @ParameterizedTest - @MethodSource("findContactIndividuArgument") - void findContact_shouldWork_for_individu(REMSurveyUnitDto su, int expectedContactIndex) { - PersonDto res = RemDtoUtils.findContact(null, su, false); - //Check - assertEquals(res.getIndex(), expectedContactIndex); - } - - - - private static Stream findContactLogementArgument() { - return Stream.of( - //Run method under test : 1 person main - Arguments.of(REMSurveyUnitDto.builder().persons(List.of(person2_main)).build(),2), - Arguments.of(REMSurveyUnitDto.builder().persons(List.of(person5_main_codeclarant)).build(),5), - //Run method under test : 2 person including 1 main - Arguments.of(REMSurveyUnitDto.builder().persons(List.of(person2_main, person3_surveyed)).build(),2), - //Run method under test : 2 person including 1 main (swapped) - Arguments.of(REMSurveyUnitDto.builder().persons(List.of(person3_surveyed, person2_main)).build(),2), - //Run method under test : 3 person including 1 main - Arguments.of(REMSurveyUnitDto.builder().persons(List.of(person8, person2_main, person9)).build(),2), - //Run method under test : 3 person including 1 surveyed (swapped 1) - Arguments.of(REMSurveyUnitDto.builder().persons(List.of(person2_main, person9, person8)).build(),2), - Arguments.of(REMSurveyUnitDto.builder().persons(List.of(person9, person8, person2_main)).build(),2), - Arguments.of(REMSurveyUnitDto.builder().persons(List.of(person9, person8, person8,person8,person8,person8,person8,person8,person8,person8,person5_main_codeclarant)).build(),5), - //2 mains - Arguments.of(REMSurveyUnitDto.builder().persons(List.of(person9, person8, person8,person8,person8,person8,person8,person8,person8,person8,person5_main_codeclarant,person2_main)).build(),5) - - ); - } - - private static Stream findContactLogementArgument_noMain() { - return Stream.of( - Arguments.of(REMSurveyUnitDto.builder().persons(List.of(person3_surveyed)).build()), - Arguments.of(REMSurveyUnitDto.builder().persons(List.of(person3_surveyed, person9)).build()), - Arguments.of(REMSurveyUnitDto.builder().persons(List.of(person3_surveyed,person9,person8)).build()) - - ); - } - - @ParameterizedTest - @MethodSource("findContactLogementArgument_noMain") - void findContact_shouldThrow_whenNoSurved_for_logment(REMSurveyUnitDto su) { - assertThrows(IncorrectSUBPMNError.class, () -> RemDtoUtils.findContact(null, su, true)); - } - - @ParameterizedTest - @MethodSource("findContactLogementArgument") - void findContactAndSecondary_shouldWork_for_logement(REMSurveyUnitDto su, int expectedContactIndex) { - PersonDto res = RemDtoUtils.findContact(null, su, true); - //Check - assertEquals(res.getIndex(), expectedContactIndex); - } - - - private static Stream findContactAndSecondaryIndividuArgument() { - return Stream.of( - //Run method under test : 1 person surveyed - Arguments.of(REMSurveyUnitDto.builder().persons(List.of(person3_surveyed)).build(),3,-1), - Arguments.of(REMSurveyUnitDto.builder().persons(List.of(person1_main_surveyed)).build(),1,-1), - //2 Persons ; 1 Main/Surveyed - 1 N/A - Arguments.of(REMSurveyUnitDto.builder().persons(List.of(person1_main_surveyed,person8)).build(),1,-1), - Arguments.of(REMSurveyUnitDto.builder().persons(List.of(person8,person1_main_surveyed)).build(),1,-1), - Arguments.of(REMSurveyUnitDto.builder().persons(List.of(person3_surveyed,person8)).build(),3,-1), - - //2 or 3 Persons : 1 Main/Surveyed - 1 Declarant - Arguments.of(REMSurveyUnitDto.builder().persons(List.of(person1_main_surveyed,person10_codeclarant)).build(),1,10), - Arguments.of(REMSurveyUnitDto.builder().persons(List.of(person1_main_surveyed,person10_codeclarant,person9)).build(),1,10), - Arguments.of(REMSurveyUnitDto.builder().persons(List.of(person8,person1_main_surveyed,person10_codeclarant,person9)).build(),1,10), - //2 or 3 Persons : 1 Surveyed (not main) - 1 Main - Arguments.of(REMSurveyUnitDto.builder().persons(List.of(person3_surveyed,person2_main)).build(),3,2), - Arguments.of(REMSurveyUnitDto.builder().persons(List.of(person3_surveyed,person5_main_codeclarant)).build(),3,5), - Arguments.of(REMSurveyUnitDto.builder().persons(List.of(person8,person3_surveyed,person5_main_codeclarant)).build(),3,5), - Arguments.of(REMSurveyUnitDto.builder().persons(List.of(person8,person3_surveyed,person5_main_codeclarant,person9)).build(),3,5) - ); - } - @ParameterizedTest - @MethodSource("findContactAndSecondaryIndividuArgument") - void findContactAndSecondary_shouldWork_for_individu(REMSurveyUnitDto su, int expectedFirstContactIndex, int expectedSecondContact) { - Pair> res = RemDtoUtils.findContactAndSecondary(null, su, false); - //Check - assertEquals(res.getLeft().getIndex(), expectedFirstContactIndex); - if(expectedSecondContact==-1){ - assertThat(res.getRight()).isEmpty(); - } - else{ - assertThat(res.getRight().get().getIndex()).isEqualTo(expectedSecondContact); - } - } - - - - private static Stream findContactAndSecondaryLogementArgument() { - return Stream.of( - //Run method under test : 1 person surveyed - Arguments.of(REMSurveyUnitDto.builder().persons(List.of(person2_main)).build(),2,-1), - Arguments.of(REMSurveyUnitDto.builder().persons(List.of(person1_main_surveyed)).build(),1,-1), - //2/3 Persons ; 1 Main - 1 N/A - Arguments.of(REMSurveyUnitDto.builder().persons(List.of(person1_main_surveyed,person8)).build(),1,-1), - Arguments.of(REMSurveyUnitDto.builder().persons(List.of(person8,person1_main_surveyed)).build(),1,-1), - Arguments.of(REMSurveyUnitDto.builder().persons(List.of(person2_main,person8)).build(),2,-1), - Arguments.of(REMSurveyUnitDto.builder().persons(List.of(person9,person2_main,person8)).build(),2,-1), - - //2 or 3 Persons : 1 Main - 1 Declarant - Arguments.of(REMSurveyUnitDto.builder().persons(List.of(person1_main_surveyed,person10_codeclarant)).build(),1,10), - Arguments.of(REMSurveyUnitDto.builder().persons(List.of(person1_main_surveyed,person10_codeclarant,person9)).build(),1,10), - Arguments.of(REMSurveyUnitDto.builder().persons(List.of(person8,person1_main_surveyed,person10_codeclarant,person9)).build(),1,10), - Arguments.of(REMSurveyUnitDto.builder().persons(List.of(person8,person7_main_surveyed_codeclarantNull,person10_codeclarant,person9)).build(),7,10) - ); - } - @ParameterizedTest - @MethodSource("findContactAndSecondaryLogementArgument") - void findContactAndSecondary_shouldWork_for_Logement(REMSurveyUnitDto su, int expectedFirstContactIndex, int expectedSecondContact) { - Pair> res = RemDtoUtils.findContactAndSecondary(null, su, true); - //Check - assertEquals(res.getLeft().getIndex(), expectedFirstContactIndex); - if(expectedSecondContact==-1){ - assertThat(res.getRight()).isEmpty(); - } - else{ - assertThat(res.getRight().get().getIndex()).isEqualTo(expectedSecondContact); - } - } -} \ No newline at end of file diff --git a/src/test/backup/java/fr/insee/protools/backend/service/rem/delegate/ExtractContactIdentifierFromREMSUTaskTest.java b/src/test/backup/java/fr/insee/protools/backend/service/rem/delegate/ExtractContactIdentifierFromREMSUTaskTest.java deleted file mode 100644 index 6b9c277e..00000000 --- a/src/test/backup/java/fr/insee/protools/backend/service/rem/delegate/ExtractContactIdentifierFromREMSUTaskTest.java +++ /dev/null @@ -1,119 +0,0 @@ -package fr.insee.protools.backend.service.rem.delegate; - -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; -import fr.insee.protools.backend.service.exception.IncorrectSUBPMNError; -import fr.insee.protools.backend.service.utils.TestWithContext; -import org.flowable.common.engine.api.FlowableIllegalArgumentException; -import org.flowable.engine.delegate.DelegateExecution; -import org.flowable.engine.test.FlowableTest; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; -import org.mockito.junit.jupiter.MockitoExtension; - -import static fr.insee.protools.backend.service.FlowableVariableNameConstants.VARNAME_DIRECTORYACCESS_ID_CONTACT; -import static fr.insee.protools.backend.service.FlowableVariableNameConstants.VARNAME_REM_INTERROGATION; -import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; -import static org.junit.jupiter.api.Assertions.assertThrows; -import static org.mockito.Mockito.*; - -@ExtendWith(MockitoExtension.class) -@FlowableTest -class ExtractContactIdentifierFromREMSUTaskTest extends TestWithContext { - - - @Test - @DisplayName("ExtractContactIdentifierFromREMSUTask should throw an exception when the VARNAME_REM_SURVEY_UNIT variable is missing") - void execute_should_throw_when_variable_missing() { - //Prepare - DelegateExecution execution = createMockedExecution(); - ExtractContactIdentifierFromREMSUTask extractTask = new ExtractContactIdentifierFromREMSUTask(); - - //No variable set ==> Error - assertThrows(FlowableIllegalArgumentException.class, () -> extractTask.execute(execution)); - - //Wrong Type ==> Error - lenient().doReturn(Boolean.FALSE).when(execution).getVariable(VARNAME_REM_INTERROGATION, Boolean.class); - assertThrows(FlowableIllegalArgumentException.class, () -> extractTask.execute(execution)); - - } - - @Test - void execute_should_thow_when_variable_OKand_UEJson_NOT_OK() throws JsonProcessingException { - //Prepare - DelegateExecution execution = mock(DelegateExecution.class); - doReturn(dumyId).when(execution).getProcessInstanceId(); - ExtractContactIdentifierFromREMSUTask extractTask = new ExtractContactIdentifierFromREMSUTask(); - ObjectMapper objectMapper = new ObjectMapper(); - - - //JSon content with missing additionalInformations node - String content = - """ - { - "otherIdentifier": null, - "missing_tag": [ ] - } - """; - doReturn(objectMapper.readTree(content)).when(execution).getVariable(VARNAME_REM_INTERROGATION, JsonNode.class); - //Execute - assertThrows(IncorrectSUBPMNError.class, () -> extractTask.execute(execution)); - - //JSon content with missing identifiantCompte key - content = - """ - { - "otherIdentifier": null, - "additionalInformations": [ - { - "key": "xxxx", - "value": "xxxxxxxxxx" - }, - { - "key": "yyyyyy", - "value": "yyyyyyyyyyyyyyyy" - } ] - } - """; - doReturn(objectMapper.readTree(content)).when(execution).getVariable(VARNAME_REM_INTERROGATION, JsonNode.class); - //Execute - assertThrows(IncorrectSUBPMNError.class, () -> extractTask.execute(execution)); - } - - @Test - void execute_should_work_when_variable_and_UEJson_OK() throws JsonProcessingException { - //Prepare - DelegateExecution execution = mock(DelegateExecution.class); - doReturn(dumyId).when(execution).getProcessInstanceId(); - - ExtractContactIdentifierFromREMSUTask extractTask = new ExtractContactIdentifierFromREMSUTask(); - ObjectMapper objectMapper = new ObjectMapper(); - final String content = - """ - { - "otherIdentifier": null, - "additionalInformations": [ - { - "key": "xxxx", - "value": "xxxxxxxxxx" - }, - { - "key": "identifiantCompte", - "value": "TOTO_55" - }, - { - "key": "yyyyyy", - "value": "yyyyyyyyyyyyyyyy" - } ] - } - """; - doReturn(objectMapper.readTree(content)).when(execution).getVariable(VARNAME_REM_INTERROGATION, JsonNode.class); - - //Execute - assertDoesNotThrow(() -> extractTask.execute(execution)); - - verify(execution).setVariableLocal(VARNAME_DIRECTORYACCESS_ID_CONTACT, "TOTO_55"); - } -} \ No newline at end of file diff --git a/src/test/backup/java/fr/insee/protools/backend/service/rem/delegate/RemGetPartitionListOfSuIdTaskTest.java b/src/test/backup/java/fr/insee/protools/backend/service/rem/delegate/RemGetPartitionListOfSuIdTaskTest.java deleted file mode 100644 index bfa0e49f..00000000 --- a/src/test/backup/java/fr/insee/protools/backend/service/rem/delegate/RemGetPartitionListOfSuIdTaskTest.java +++ /dev/null @@ -1,115 +0,0 @@ -package fr.insee.protools.backend.service.rem.delegate; - -import com.fasterxml.jackson.core.JsonProcessingException; -import fr.insee.protools.backend.service.context.ContextService; -import fr.insee.protools.backend.service.rem.RemService; -import org.flowable.common.engine.api.FlowableIllegalArgumentException; -import org.flowable.engine.delegate.DelegateExecution; -import org.flowable.engine.test.FlowableTest; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; -import org.mockito.InjectMocks; -import org.mockito.Mock; -import org.mockito.Spy; -import org.mockito.junit.jupiter.MockitoExtension; -import org.springframework.util.ClassUtils; - -import java.util.List; - -import static fr.insee.protools.backend.service.FlowableVariableNameConstants.VARNAME_CURRENT_PARTITION_ID; -import static fr.insee.protools.backend.service.FlowableVariableNameConstants.VARNAME_REM_INTERRO_ID_LIST; -import static fr.insee.protools.backend.service.utils.FlowableVariableUtils.getMissingVariableMessage; -import static org.assertj.core.api.Assertions.assertThat; -import static org.junit.jupiter.api.Assertions.assertThrows; -import static org.mockito.Mockito.*; - - -@ExtendWith(MockitoExtension.class) -@FlowableTest -class RemGetPartitionListOfSuIdTaskTest { - - - @Mock RemService remService; - @Spy ContextService protoolsContext; - - @InjectMocks RemGetPartitionListOfSuIdTask remGetPartitionListOfSuIdTask; - - String dumyId = "ID1"; - - final static String ressourceFolder = ClassUtils.convertClassNameToResourcePath(RemGetPartitionListOfSuIdTaskTest.class.getPackageName()); - - final String json1Partition = - "{ \"partitions\": [{ " + - " \"id\": 1" + - " }]" + - "}"; - - /* - @Test - void execute_should_throw_BadContextIncorrectException_when_noContext() { - //Precondition - DelegateExecution execution = mock(DelegateExecution.class); - when(execution.getProcessInstanceId()).thenReturn(dumyId); - - //Execute the unit under test - assertThrows(BadContextIncorrectException.class, () -> remGetPartitionListOfSuIdTask.execute(execution)); - } - */ - - - @Test - void execute_should_throw_FlowableIllegalArgumentException_when_variableCurrentPartition_notDefined() throws JsonProcessingException { - //Precondition - DelegateExecution execution = mock(DelegateExecution.class); - lenient().when(execution.getProcessInstanceId()).thenReturn(dumyId); - //No context used for this taks - - //Execute the unit under test - FlowableIllegalArgumentException exception = assertThrows(FlowableIllegalArgumentException.class, () -> remGetPartitionListOfSuIdTask.execute(execution)); - assertThat(exception.getMessage()).isEqualTo(getMissingVariableMessage(VARNAME_CURRENT_PARTITION_ID)); - } - - - void execute_should_work_when_contextNpartition_and_variable_OK(String contexte, String currentPartitionId, Long[] remSuIdList) throws JsonProcessingException { - //Préconditions - DelegateExecution execution = mock(DelegateExecution.class); - DelegateExecution executionParent = mock(DelegateExecution.class); - - when(execution.getProcessInstanceId()).thenReturn(dumyId); - - //No context used by this task - when(execution.getVariable(VARNAME_CURRENT_PARTITION_ID, String.class)).thenReturn(currentPartitionId); - when(execution.getParent()).thenReturn(executionParent); - - List expectedResult = List.of(remSuIdList); - when(remService.getSampleSuIds(currentPartitionId)).thenReturn(remSuIdList); - //Execute the unit under test - remGetPartitionListOfSuIdTask.execute(execution); - - - //Post conditions - //Service called once and for the right partition - verify(remService).getSampleSuIds(currentPartitionId); - //Process instance variable set with the list of retrieved Ids - verify(executionParent).setVariableLocal(VARNAME_REM_INTERRO_ID_LIST, expectedResult); - } - - @Test - void execute_should_work_when_context1partition_and_variable_OK() throws JsonProcessingException { - Long[] remSuIdList = {1l, 2l, 3l}; - String json1Partition = - "{ \"partitions\": [{ " + - " \"id\": 1" + - " }]" + - "}"; - execute_should_work_when_contextNpartition_and_variable_OK(json1Partition, "1", remSuIdList); - } - - @Test - void execute_should_work_when_context3partition_and_variable_OK() throws JsonProcessingException { - Long[] remSuIdList = {1l, 2l, 3l}; - String json3Partition = - "{ \"partitions\": [{ \"id\": 1 },{ \"id\": 56 }, { \"id\": 99 }] }"; - execute_should_work_when_contextNpartition_and_variable_OK(json3Partition, "1", remSuIdList); - } -} \ No newline at end of file diff --git a/src/test/backup/java/fr/insee/protools/backend/service/rem/delegate/RemGetSUTaskTest.java b/src/test/backup/java/fr/insee/protools/backend/service/rem/delegate/RemGetSUTaskTest.java deleted file mode 100644 index 4e65c581..00000000 --- a/src/test/backup/java/fr/insee/protools/backend/service/rem/delegate/RemGetSUTaskTest.java +++ /dev/null @@ -1,65 +0,0 @@ -package fr.insee.protools.backend.service.rem.delegate; - -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.ObjectMapper; -import fr.insee.protools.backend.service.rem.RemService; -import fr.insee.protools.backend.dto.rem_tmp.REMSurveyUnitDto; -import org.flowable.common.engine.api.FlowableIllegalArgumentException; -import org.flowable.engine.delegate.DelegateExecution; -import org.flowable.engine.test.FlowableTest; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; -import org.mockito.InjectMocks; -import org.mockito.Mock; -import org.mockito.Spy; -import org.mockito.junit.jupiter.MockitoExtension; - -import static fr.insee.protools.backend.service.FlowableVariableNameConstants.VARNAME_REM_INTERROGATION; -import static fr.insee.protools.backend.service.FlowableVariableNameConstants.VARNAME_REM_SURVEY_UNIT_IDENTIFIER; -import static fr.insee.protools.backend.service.utils.FlowableVariableUtils.getMissingVariableMessage; -import static org.assertj.core.api.Assertions.assertThat; -import static org.junit.jupiter.api.Assertions.assertThrows; -import static org.mockito.Mockito.*; - -@ExtendWith(MockitoExtension.class) -@FlowableTest -class RemGetSUTaskTest { - - @Mock RemService remService; - @Spy ObjectMapper objectMapper; - @InjectMocks RemGetSUTask remGetSUTask; - - String dumyId = "ID1"; - - @Test - void execute_should_throw_FlowableIllegalArgumentException_when_variableremSurveyUnitIdentifier_notDefined() throws JsonProcessingException { - //Precondition - DelegateExecution execution = mock(DelegateExecution.class); - lenient().when(execution.getProcessInstanceId()).thenReturn(dumyId); - - //Execute the unit under test - FlowableIllegalArgumentException exception = assertThrows(FlowableIllegalArgumentException.class, () -> remGetSUTask.execute(execution)); - assertThat(exception.getMessage()).isEqualTo(getMissingVariableMessage(VARNAME_REM_SURVEY_UNIT_IDENTIFIER)); - } - - @Test - void execute_should_work_when_variable_OK() { - //Préconditions - DelegateExecution execution = mock(DelegateExecution.class); - Long variableSuId=98455435l; - REMSurveyUnitDto expectedREMSU = REMSurveyUnitDto.builder().externalId("TOTO").build(); - - when(execution.getProcessInstanceId()).thenReturn(dumyId); - when(execution.getVariable(VARNAME_REM_SURVEY_UNIT_IDENTIFIER, Long.class)).thenReturn(variableSuId); - when(remService.getSurveyUnit(variableSuId)).thenReturn(expectedREMSU); - - //Execute the unit under test - remGetSUTask.execute(execution); - - //Post conditions - //Service called once and for the right SU ID - verify(remService).getSurveyUnit(variableSuId); - //Process instance variable set with the retrieved SU content - verify(execution).setVariableLocal(VARNAME_REM_INTERROGATION, objectMapper.valueToTree(expectedREMSU)); - } -} \ No newline at end of file diff --git a/src/test/backup/java/fr/insee/protools/backend/service/rem/delegate/RemWriteEraSUListTaskTest.java b/src/test/backup/java/fr/insee/protools/backend/service/rem/delegate/RemWriteEraSUListTaskTest.java deleted file mode 100644 index 666a1a65..00000000 --- a/src/test/backup/java/fr/insee/protools/backend/service/rem/delegate/RemWriteEraSUListTaskTest.java +++ /dev/null @@ -1,100 +0,0 @@ -package fr.insee.protools.backend.service.rem.delegate; - -import com.fasterxml.jackson.core.JsonProcessingException; -import fr.insee.protools.backend.dto.era.CensusJsonDto; -import fr.insee.protools.backend.service.rem.RemService; -import fr.insee.protools.backend.dto.rem_tmp.SuIdMappingJson; -import fr.insee.protools.backend.dto.rem_tmp.SuIdMappingRecord; -import org.flowable.common.engine.api.FlowableIllegalArgumentException; -import org.flowable.engine.delegate.DelegateExecution; -import org.flowable.engine.test.FlowableTest; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; -import org.mockito.InjectMocks; -import org.mockito.Mock; -import org.mockito.junit.jupiter.MockitoExtension; - -import java.util.List; - -import static fr.insee.protools.backend.service.FlowableVariableNameConstants.*; -import static fr.insee.protools.backend.service.utils.FlowableVariableUtils.getMissingVariableMessage; -import static org.assertj.core.api.Assertions.assertThat; -import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; -import static org.junit.jupiter.api.Assertions.assertThrows; -import static org.mockito.Mockito.*; - -@ExtendWith(MockitoExtension.class) -@FlowableTest -class RemWriteEraSUListTaskTest { - - @Mock RemService remService; - @InjectMocks RemWriteEraSUListTask remWriteEraSUListTask; - - String dumyId = "ID999"; - - @Test - @DisplayName("Test execute method - should throw if VARNAME_ERA_RESPONSE or VARNAME_CURRENT_PARTITION_ID not initialized") - void execute_should_throw_FlowableIllegalArgumentException_when_variables_notDefined() throws JsonProcessingException { - //Precondition - DelegateExecution execution = mock(DelegateExecution.class); - lenient().when(execution.getProcessInstanceId()).thenReturn(dumyId); - - //Execute the unit under test - FlowableIllegalArgumentException exception = assertThrows(FlowableIllegalArgumentException.class, () -> remWriteEraSUListTask.execute(execution)); - //Post conditions - assertThat(exception.getMessage()).isEqualTo(getMissingVariableMessage(VARNAME_ERA_RESPONSE)); - - - //Create First variable - when(execution.getVariable(VARNAME_ERA_RESPONSE, List.class)).thenReturn(List.of(CensusJsonDto.builder().build())); - - //Execute again - exception = assertThrows(FlowableIllegalArgumentException.class, () -> remWriteEraSUListTask.execute(execution)); - //Check the error - assertThat(exception.getMessage()).isEqualTo(getMissingVariableMessage(VARNAME_CURRENT_PARTITION_ID)); - - } - - @Test - @DisplayName("Test execute method - should tVARNAME_ERA_RESPONSE or VARNAME_CURRENT_PARTITION_ID not initialized") - void execute_should_work_when_variables_Ok() throws JsonProcessingException { - //Precondition - DelegateExecution execution = mock(DelegateExecution.class); - DelegateExecution executionParent = mock(DelegateExecution.class); - when(execution.getParent()).thenReturn(executionParent); - lenient().when(execution.getProcessInstanceId()).thenReturn(dumyId); - - //PartitionID - String partitionID = "99"; - //Stubbed list of ERA Values - String eraId1="500", eraId2="1000"; - CensusJsonDto eraSU1 = CensusJsonDto.builder() - .id(eraId1) - .build(); - CensusJsonDto eraSU2 = CensusJsonDto.builder() - .id(eraId2) - .build(); - List listOfEraSU = List.of(eraSU1,eraSU2); - lenient().when(execution.getVariable(VARNAME_ERA_RESPONSE, List.class)).thenReturn(listOfEraSU); - lenient().when(execution.getVariable(VARNAME_CURRENT_PARTITION_ID, String.class)).thenReturn(partitionID); - - //Stubbed list id mapping between ERA SU and created REM SU - long remId1=1l,remId2=2l; - when(remService.writeERASUList(partitionID,listOfEraSU)) - .thenReturn(SuIdMappingJson.builder() - .count(2) - .partitionId(partitionID) - .data( - List.of( - new SuIdMappingRecord(remId1,String.valueOf(eraId1)), - new SuIdMappingRecord(remId2,String.valueOf(eraId2)))) - .build()); - //Execute method under test - assertDoesNotThrow(() -> remWriteEraSUListTask.execute(execution)); - - //Post conditions - verify(remService,times(1)).writeERASUList(partitionID,listOfEraSU); - verify(executionParent,times(1)).setVariableLocal(VARNAME_REM_INTERRO_ID_LIST,List.of(remId1,remId2)); - } -} \ No newline at end of file diff --git a/src/test/backup/java/fr/insee/protools/backend/service/sabiane/SabianeIdHelperTest.java b/src/test/backup/java/fr/insee/protools/backend/service/sabiane/SabianeIdHelperTest.java deleted file mode 100644 index 75a1cca1..00000000 --- a/src/test/backup/java/fr/insee/protools/backend/service/sabiane/SabianeIdHelperTest.java +++ /dev/null @@ -1,31 +0,0 @@ -package fr.insee.protools.backend.service.sabiane; - -import fr.insee.protools.backend.service.exception.IncorrectSUBPMNError; -import org.junit.Test; -import org.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.CsvSource; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.junit.jupiter.api.Assertions.assertThrows; - -class SabianeIdHelperTest { - - @ParameterizedTest - @CsvSource( - { - "1,2,1P2", - "A,B,APB", - "99999999,aJJTJJTTJPPPP,99999999PaJJTJJTTJPPPP" - }) - void computeSabianeID_should_work_when_inputsAreCorrects(String partitionId, String remRepositoryID, String expectedResult) { - assertThat(SabianeIdHelper.computeSabianeID(partitionId,remRepositoryID)).isEqualTo(expectedResult); - } - - @Test - void computeSabianeID_should_throw_when_inputsAreInCorrects() { - assertThrows(IncorrectSUBPMNError.class,() -> SabianeIdHelper.computeSabianeID("99",null)); - assertThrows(IncorrectSUBPMNError.class,() -> SabianeIdHelper.computeSabianeID(null,"99")); - assertThrows(IncorrectSUBPMNError.class,() -> SabianeIdHelper.computeSabianeID(null,null)); - } - -} \ No newline at end of file diff --git a/src/test/backup/java/fr/insee/protools/backend/service/sabiane/delegate/SabianeCtxExamples.java b/src/test/backup/java/fr/insee/protools/backend/service/sabiane/delegate/SabianeCtxExamples.java deleted file mode 100644 index 7e2613d4..00000000 --- a/src/test/backup/java/fr/insee/protools/backend/service/sabiane/delegate/SabianeCtxExamples.java +++ /dev/null @@ -1,70 +0,0 @@ -package fr.insee.protools.backend.service.sabiane.delegate; - -public class SabianeCtxExamples { - - - public static final String ctx_ok_idCampagne_idPartition_typeIndividu_prioritaire = - """ - { - "id": "AAC2023A00", - "partitions": [{ - "id": 99, - "typeEchantillon" : "individu", - "prioritaire": "true" - }] - } - """; - - public static final String ctx_ok_idCampagne_idPartition_typeIndividu_nonPrioritaire = - """ - { - "id": "AAC2023A00", - "partitions": [{ - "id": 99, - "typeEchantillon" : "individu", - "prioritaire": "false" - }] - } - """; - - public static final String ctx_ok_idCampagne_idPartition_typeLogement_prioritaire = - """ - { - "id": "AAC2023A00", - "partitions": [{ - "id": 99, - "typeEchantillon" : "individu", - "prioritaire": "true" - }] - } - """; - - public static final String ctx_ok_idCampagne_idPartition_typeLogement_nonPrioritaire = - """ - { - "id": "AAC2023A00", - "partitions": [{ - "id": 99, - "typeEchantillon" : "individu", - "prioritaire": "false" - }] - } - """; - - public static final String ctx_ok_idCampagne_idQuestionnaireModel_idPartition_questionnaireModelPartition = - """ - { - "id": "AAC2023A00", - "partitions": [{ - "id": 99, - "questionnaireModel": "ID_1" - }], - "questionnaireModels": [ - { - "id": "ID_1" - }] - } - """; - - private SabianeCtxExamples(){} -} diff --git a/src/test/backup/java/fr/insee/protools/backend/service/sabiane/delegate/SabianePilotageCreateContextTaskTest.java b/src/test/backup/java/fr/insee/protools/backend/service/sabiane/delegate/SabianePilotageCreateContextTaskTest.java deleted file mode 100644 index 658791e7..00000000 --- a/src/test/backup/java/fr/insee/protools/backend/service/sabiane/delegate/SabianePilotageCreateContextTaskTest.java +++ /dev/null @@ -1,87 +0,0 @@ -package fr.insee.protools.backend.service.sabiane.delegate; - -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; -import fr.insee.protools.backend.ProtoolsTestUtils; -import fr.insee.protools.backend.service.context.ContextService; -import fr.insee.protools.backend.service.context.exception.BadContextIncorrectBPMNError; -import fr.insee.protools.backend.service.sabiane.pilotage.SabianePilotageService; -import fr.insee.protools.backend.dto.sabiane.pilotage.CampaignContextDto; -import fr.insee.protools.backend.service.utils.TestWithContext; -import org.flowable.engine.delegate.DelegateExecution; -import org.flowable.engine.test.FlowableTest; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; -import org.mockito.ArgumentCaptor; -import org.mockito.InjectMocks; -import org.mockito.Mock; -import org.mockito.Spy; -import org.mockito.junit.jupiter.MockitoExtension; -import org.springframework.util.ClassUtils; - -import java.util.List; - -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertThrows; -import static org.mockito.ArgumentMatchers.anyString; -import static org.mockito.Mockito.*; - -@ExtendWith(MockitoExtension.class) -@FlowableTest -class SabianePilotageCreateContextTaskTest extends TestWithContext { - final static String ressourceFolder = ClassUtils.convertClassNameToResourcePath(SabianePilotageCreateContextTaskTest.class.getPackageName()); - final static String sabiane_context_json = ressourceFolder+"/protools-contexte-sabiane.json"; - final static String sabiane_context_incorrect_json = ressourceFolder+"/protools-contexte-sabiane-incorrect.json"; - - @Mock SabianePilotageService platinePilotageService; - @Spy ObjectMapper objectMapper; - - @InjectMocks - SabianePilotageCreateContextTask sabianePilotageTask; - - String dumyId="ID1"; - - @Test - void execute_should_throwError_when_null_context(){ - assertThat_delegate_throwError_when_null_context(sabianePilotageTask); - } - - @Test - void execute_should_throw_BadContextIncorrectException_when_noContext() { - DelegateExecution execution = mock(DelegateExecution.class); - when(execution.getProcessInstanceId()).thenReturn(dumyId); - - //Execute the unit under test - assertThrows(BadContextIncorrectBPMNError.class,() -> sabianePilotageTask.execute(execution)); - } - - @Test - void execute_should_work_when_contextOK() { - DelegateExecution execution = mock(DelegateExecution.class); - when(execution.getProcessInstanceId()).thenReturn(dumyId); - initContexteMockWithFile(sabiane_context_json); - - //Execute the unit under test - sabianePilotageTask.execute(execution); - - //Post conditions : Exactly one call to post platinePilotageService.putMetadata - // it is one call per partition defined in context -// verify(platinePilotageService,times(1)).putMetadata(eq(partitionId), notNull()); - - - //Verify postCampaign - ArgumentCaptor acMetadataDto = ArgumentCaptor.forClass(CampaignContextDto.class); - //Exactly one Call to the postCampaign method - verify(platinePilotageService,times(1)).postCampaign(acMetadataDto.capture()); - List allValues = acMetadataDto.getAllValues(); - assertEquals(1, allValues.size(),"We should have exactly one call to postCampaign"); - - //Simple (redundant) verification of the campaignId - assertEquals("MBG2022X01",allValues.get(0).getCampaign(),"Erreur with generated campaign id"); - //Verification that the sent json is exactly what we expected - CampaignContextDto expectedCampaignDto = ProtoolsTestUtils.asObject(ressourceFolder + "/pilotage_expected_post_campaign.json", CampaignContextDto.class); - assertEquals(expectedCampaignDto,allValues.get(0)); - - } - -} diff --git a/src/test/backup/java/fr/insee/protools/backend/service/sabiane/delegate/SabianePilotageCreateSUTaskTest.java b/src/test/backup/java/fr/insee/protools/backend/service/sabiane/delegate/SabianePilotageCreateSUTaskTest.java deleted file mode 100644 index fcafcda2..00000000 --- a/src/test/backup/java/fr/insee/protools/backend/service/sabiane/delegate/SabianePilotageCreateSUTaskTest.java +++ /dev/null @@ -1,711 +0,0 @@ -package fr.insee.protools.backend.service.sabiane.delegate; - -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.node.ObjectNode; -import fr.insee.protools.backend.ProtoolsTestUtils; -import fr.insee.protools.backend.dto.rem_tmp.*; -import fr.insee.protools.backend.dto.sabiane.pilotage.*; -import fr.insee.protools.backend.service.context.exception.BadContextIncorrectBPMNError; -import fr.insee.protools.backend.service.exception.IncorrectSUBPMNError; -import fr.insee.protools.backend.service.sabiane.SabianeIdHelper; -import fr.insee.protools.backend.service.sabiane.pilotage.SabianePilotageService; -import fr.insee.protools.backend.service.utils.TestWithContext; -import fr.insee.protools.backend.service.utils.data.CtxExamples; -import fr.insee.protools.backend.service.utils.data.RemSUData; -import org.apache.commons.lang3.tuple.Pair; -import org.flowable.common.engine.api.FlowableIllegalArgumentException; -import org.flowable.engine.delegate.DelegateExecution; -import org.json.JSONException; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.Arguments; -import org.junit.jupiter.params.provider.CsvSource; -import org.junit.jupiter.params.provider.MethodSource; -import org.junit.jupiter.params.provider.ValueSource; -import org.mockito.ArgumentCaptor; -import org.mockito.InjectMocks; -import org.mockito.Mock; -import org.mockito.Mockito; -import org.skyscreamer.jsonassert.JSONAssert; - -import java.time.Instant; -import java.util.ArrayList; -import java.util.List; -import java.util.Set; -import java.util.stream.Stream; - -import static fr.insee.protools.backend.service.FlowableVariableNameConstants.VARNAME_CURRENT_PARTITION_ID; -import static fr.insee.protools.backend.service.FlowableVariableNameConstants.VARNAME_REM_INTERROGATION; -import static fr.insee.protools.backend.service.utils.FlowableVariableUtils.getMissingVariableMessage; -import static org.assertj.core.api.Assertions.assertThat; -import static org.junit.jupiter.api.Assertions.*; -import static org.mockito.Mockito.*; - -class SabianePilotageCreateSUTaskTest extends TestWithContext { - - static final String ctx_partition1 = "99"; - static final String minimal_ctx_ok = - """ - { "id": "TEST_ID" , "partitions": [{ "id":99, "typeEchantillon": "logement" , "prioritaire": "false"}] } - """; - - @Mock SabianePilotageService sabianePilotageService; - - @InjectMocks - SabianePilotageCreateSUTask sabianePilotageTask; - - @Test - void execute_should_throwError_when_null_context(){ - assertThat_delegate_throwError_when_null_context(sabianePilotageTask); - } - - @Test - @DisplayName("convertREMGenderToSabianeCivilityTitle should return MISS when param '2' ; 'MISTER' when param is '1' and throw in other cases") - void convertREMGenderToSabianeCivilityTitle_should_ReturnCorrectValues() { - assertThat(SabianePilotageCreateSUTask.convertREMGenderToSabianeCivilityTitle("1")).isEqualTo(SabianeTitle.MISTER); - assertThat(SabianePilotageCreateSUTask.convertREMGenderToSabianeCivilityTitle("1").getSabianeTitle()).isEqualTo("Mister"); - assertThat(SabianePilotageCreateSUTask.convertREMGenderToSabianeCivilityTitle("1").getFrenchCivility()).isEqualTo("M"); - - assertThat(SabianePilotageCreateSUTask.convertREMGenderToSabianeCivilityTitle("2")).isEqualTo(SabianeTitle.MISS); - assertThat(SabianePilotageCreateSUTask.convertREMGenderToSabianeCivilityTitle("2").getSabianeTitle()).isEqualTo("MISS"); - assertThat(SabianePilotageCreateSUTask.convertREMGenderToSabianeCivilityTitle("2").getFrenchCivility()).isEqualTo("MME"); - - assertThat(SabianePilotageCreateSUTask.convertREMGenderToSabianeCivilityTitle("2 ")).isEqualTo(SabianeTitle.MISS); - assertThat(SabianePilotageCreateSUTask.convertREMGenderToSabianeCivilityTitle(" 2 ")).isEqualTo(SabianeTitle.MISS); - assertThat(SabianePilotageCreateSUTask.convertREMGenderToSabianeCivilityTitle("3")).isEqualTo(SabianeTitle.MISS); - assertThat(SabianePilotageCreateSUTask.convertREMGenderToSabianeCivilityTitle("23JZKEOSJF")).isEqualTo(SabianeTitle.MISS); - assertThat(SabianePilotageCreateSUTask.convertREMGenderToSabianeCivilityTitle("0")).isEqualTo(SabianeTitle.MISS); - assertThat(SabianePilotageCreateSUTask.convertREMGenderToSabianeCivilityTitle("-1")).isEqualTo(SabianeTitle.MISS); - assertThat(SabianePilotageCreateSUTask.convertREMGenderToSabianeCivilityTitle("-2")).isEqualTo(SabianeTitle.MISS); - assertThat(SabianePilotageCreateSUTask.convertREMGenderToSabianeCivilityTitle("& ukdslw,kvlk,l")).isEqualTo(SabianeTitle.MISS); - assertThat(SabianePilotageCreateSUTask.convertREMGenderToSabianeCivilityTitle("")).isEqualTo(SabianeTitle.MISS); - assertThat(SabianePilotageCreateSUTask.convertREMGenderToSabianeCivilityTitle(null)).isEqualTo(SabianeTitle.MISS); - } - - @Test - void createSabianePhoneList_should_ReturnCorrectValues_2favorites_initial() { - //Prepare - List remPhones1 = - List.of( - PhoneNumberDto.builder().source(REMPhoneSource.INITIAL).number("01").favorite(Boolean.TRUE).build(), - PhoneNumberDto.builder().source(REMPhoneSource.INITIAL).number("02").favorite(Boolean.TRUE).build(), - PhoneNumberDto.builder().source(REMPhoneSource.INITIAL).number("03").favorite(Boolean.FALSE).build(), - PhoneNumberDto.builder().source(REMPhoneSource.DIRECTORY).number("04").favorite(Boolean.FALSE).build(), - PhoneNumberDto.builder().source(REMPhoneSource.DIRECTORY).number("05").favorite(Boolean.FALSE).build(), - PhoneNumberDto.builder().source(REMPhoneSource.INTERVIEWER).number("06").favorite(Boolean.TRUE).build(), - PhoneNumberDto.builder().source(REMPhoneSource.INTERVIEWER).number("07").favorite(Boolean.FALSE).build(), - PhoneNumberDto.builder().source(REMPhoneSource.INTERVIEWER).number("08").favorite(Boolean.TRUE).build(), - PhoneNumberDto.builder().source(REMPhoneSource.OTHER).number("09").favorite(Boolean.FALSE).build()); - - Set expectedSabiane1 = - Set.of( - SabianePhoneNumberDto.builder().source(Source.FISCAL).number("01").favorite(Boolean.TRUE).build(), - SabianePhoneNumberDto.builder().source(Source.DIRECTORY).number("02").favorite(Boolean.TRUE).build(), - SabianePhoneNumberDto.builder().source(Source.INTERVIEWER).number("06").favorite(Boolean.TRUE).build(), - SabianePhoneNumberDto.builder().source(Source.INTERVIEWER).number("07").favorite(Boolean.FALSE).build(), - SabianePhoneNumberDto.builder().source(Source.INTERVIEWER).number("08").favorite(Boolean.TRUE).build() - ); - //Execute the unit under test - List res = SabianePilotageCreateSUTask.createSabianePhoneList(new ArrayList<>(remPhones1)); - //Post conditions - assertEquals(expectedSabiane1.size(), res.size()); - assertTrue(res.containsAll(expectedSabiane1)); - - } - - @Test - void createSabianePhoneList_should_ReturnCorrectValues_noFavorite() { - //Prepare - List remPhones1 = - List.of( - PhoneNumberDto.builder().source(REMPhoneSource.INITIAL).number("01").favorite(Boolean.FALSE).build(), - PhoneNumberDto.builder().source(REMPhoneSource.INITIAL).number("02").favorite(Boolean.FALSE).build(), - PhoneNumberDto.builder().source(REMPhoneSource.INITIAL).number("03").favorite(Boolean.FALSE).build() - ); - Set expectedSabiane1 = - Set.of( - SabianePhoneNumberDto.builder().source(Source.FISCAL).number("01").favorite(Boolean.FALSE).build(), - SabianePhoneNumberDto.builder().source(Source.DIRECTORY).number("02").favorite(Boolean.FALSE).build() - ); - //Execute the unit under test - List res = SabianePilotageCreateSUTask.createSabianePhoneList(new ArrayList<>(remPhones1)); - //Post conditions - assertEquals(expectedSabiane1.size(), res.size()); - assertTrue(res.containsAll(expectedSabiane1)); - } - - @Test - void createSabianePhoneList_should_ReturnCorrectValues_1Favorite() { - //Prepare - List remPhones1 = - List.of( - PhoneNumberDto.builder().source(REMPhoneSource.INITIAL).number("01").favorite(Boolean.FALSE).build(), - PhoneNumberDto.builder().source(REMPhoneSource.INITIAL).number("02").favorite(Boolean.FALSE).build(), - PhoneNumberDto.builder().source(REMPhoneSource.INITIAL).number("03").favorite(Boolean.TRUE).build() - ); - Set expectedSabiane1 = - Set.of( - SabianePhoneNumberDto.builder().source(Source.FISCAL).number("03").favorite(Boolean.TRUE).build(), - SabianePhoneNumberDto.builder().source(Source.DIRECTORY).number("01").favorite(Boolean.FALSE).build() - ); - //Execute the unit under test - List res = SabianePilotageCreateSUTask.createSabianePhoneList(new ArrayList<>(remPhones1)); - //Post conditions - assertEquals(expectedSabiane1.size(), res.size()); - assertTrue(res.containsAll(expectedSabiane1)); - } - - @Test - void createSabianePhoneList_should_ReturnCorrectValues_1InterviewerFavorite() { - //Prepare - List remPhones1 = - List.of( - PhoneNumberDto.builder().source(REMPhoneSource.INITIAL).number("01").favorite(Boolean.FALSE).build(), - PhoneNumberDto.builder().source(REMPhoneSource.INITIAL).number("02").favorite(Boolean.FALSE).build(), - PhoneNumberDto.builder().source(REMPhoneSource.INITIAL).number("03").favorite(Boolean.FALSE).build(), - PhoneNumberDto.builder().source(REMPhoneSource.INTERVIEWER).number("04").favorite(Boolean.TRUE).build() - ); - Set expectedSabiane1 = - Set.of( - SabianePhoneNumberDto.builder().source(Source.FISCAL).number("01").favorite(Boolean.FALSE).build(), - SabianePhoneNumberDto.builder().source(Source.DIRECTORY).number("02").favorite(Boolean.FALSE).build(), - SabianePhoneNumberDto.builder().source(Source.INTERVIEWER).number("04").favorite(Boolean.TRUE).build() - - ); - //Execute the unit under test - List res = SabianePilotageCreateSUTask.createSabianePhoneList(new ArrayList<>(remPhones1)); - assertEquals(expectedSabiane1.size(), res.size()); - assertTrue(res.containsAll(expectedSabiane1)); - } - - - @Test - void createSabianePhoneList_should_throw_moreThan2Favorites() { - //Prepare - List remPhones1 = - List.of( - PhoneNumberDto.builder().source(REMPhoneSource.INITIAL).number("01").favorite(Boolean.FALSE).build(), - PhoneNumberDto.builder().source(REMPhoneSource.INITIAL).number("02").favorite(Boolean.TRUE).build(), - PhoneNumberDto.builder().source(REMPhoneSource.INITIAL).number("03").favorite(Boolean.TRUE).build(), - PhoneNumberDto.builder().source(REMPhoneSource.INITIAL).number("04").favorite(Boolean.TRUE).build() - ); - - //Execute the unit under test - assertThrows(IncorrectSUBPMNError.class, () ->SabianePilotageCreateSUTask.createSabianePhoneList(new ArrayList<>(remPhones1))); - } - - @Test - void createSabianePhoneList_should_throw_moreThan2Favorites_excludingInterviewers() { - //Prepare - List remPhones1 = - List.of( - PhoneNumberDto.builder().source(REMPhoneSource.INITIAL).number("01").favorite(Boolean.FALSE).build(), - PhoneNumberDto.builder().source(REMPhoneSource.INITIAL).number("02").favorite(Boolean.TRUE).build(), - PhoneNumberDto.builder().source(REMPhoneSource.INITIAL).number("03").favorite(Boolean.TRUE).build(), - PhoneNumberDto.builder().source(REMPhoneSource.INTERVIEWER).number("04").favorite(Boolean.TRUE).build() - ); - - //Execute the unit under test - assertDoesNotThrow(() ->SabianePilotageCreateSUTask.createSabianePhoneList(new ArrayList<>(remPhones1))); - } - - @ParameterizedTest - @CsvSource( - { "20110808, 1312754400", - "20110801, 1312149600", - "201108, 1312149600", - "2000, 946681200", - "," - }) - void computeSabianeBirthDateFromRem_should_ReturnCorrectValues(String remBirthdateInput, Long expectedOutputTimestampMs) { - //Prepare - //Call method under test - Long result = SabianePilotageCreateSUTask.computeSabianeBirthDateFromRem(remBirthdateInput); - // Post status - assertEquals(expectedOutputTimestampMs, result, "The computed timestamp for the birthdate : " + remBirthdateInput + " is incorrect"); - } - - @ParameterizedTest - @ValueSource(strings = {"20001", "anabab", "200099", "2011010111111", "2", "200", "2011a", "1600010a", ",", "01122024"}) - // Les valeurs à tester - void computeSabianeBirthDateFromRem_should_Throw_when_dateIsIncorrect(String inccorectDate) { - assertThrows(IncorrectSUBPMNError.class, () -> SabianePilotageCreateSUTask.computeSabianeBirthDateFromRem(inccorectDate)); - } - - - @ParameterizedTest - @CsvSource( - {"0123456789012345678901234567891234567abcd,0123456789012345678901234567891234567a,bcd", - "'','',''", - "' ','',''", - "' ','',''", - "0123456789012345678901234567891234567, 0123456789012345678901234567891234567,''" - }) - @DisplayName("computeL2L3 should cut the string at 38th caracter (included in L2)") - void computeL2L3_should_ReturnCorrectValues(String input, String expectedL2, String expectedL3) { - //Prepare - //Call method under test - Pair result = SabianePilotageCreateSUTask.computeL2L3(input); - // Post status - assertEquals(Pair.of(expectedL2, expectedL3), result, "The computed L2 & L3 for input " + input + " is incorrect"); - } - - // Méthode statique fournissant des données de test - static Stream providedREMAdressAndContactAndExpectedResults() { - return Stream.of( - Arguments.of( - REMAddressDto.builder().streetNumber("01").repetitionIndex("bis").streetType("rue") - .streetName("des lilas").specialDistribution("specialDistribution") - .zipCode("59000").cityName("Lille")/*.countryName("FRANCE")*/ - .addressSupplement("SupplementAdresse") - .locationHelp(null).build() - , PersonDto.builder().gender("1").firstName("FirstName").lastName("LastName").build(), - AddressDto.builder() - .l1("M FirstName LastName") - .l2("SupplementAdresse").l3("") - .l4("01 bis rue des lilas") - .l5("specialDistribution") - .l6("59000 Lille") - .l7("FRANCE") - .build() - ), - - Arguments.of( - REMAddressDto.builder().streetNumber("01").repetitionIndex("bis").streetType("rue") - .streetName("des lilas").specialDistribution("specialDistribution") - .zipCode("59000")/*.cityName("").countryName("FRANCE")*/ - .addressSupplement("SupplementAdresse") - .locationHelp(null).build() - , PersonDto.builder().gender("1")/*.firstName("FirstName")*/.lastName("LastName").build(), - AddressDto.builder() - .l1("M LastName") - .l2("SupplementAdresse").l3("") - .l4("01 bis rue des lilas") - .l5("specialDistribution") - .l6("59000") - .l7("FRANCE") - .build() - ), - - Arguments.of( - REMAddressDto.builder().streetNumber("01").repetitionIndex("bis").streetType("rue") - .streetName("des lilas").specialDistribution("specialDistribution") - /*.zipCode("59000")*/.cityName("TOTO")/*.countryName("FRANCE")*/ - .addressSupplement("SupplementAdresse") - .locationHelp(null).build() - , PersonDto.builder().gender("1").firstName("FirstName")/*.lastName("LastName")*/.build(), - AddressDto.builder() - .l1("M FirstName") - .l2("SupplementAdresse").l3("") - .l4("01 bis rue des lilas") - .l5("specialDistribution") - .l6("TOTO") - .l7("FRANCE") - .build() - ), - Arguments.of( - REMAddressDto.builder().streetNumber("01").repetitionIndex("bis").streetType("rue") - .streetName("des lilas").specialDistribution("specialDistribution") - /*.zipCode("59000").cityName("TOTO").countryName("FRANCE")*/ - .addressSupplement("SupplementAdresse") - .locationHelp(null).build() - , PersonDto.builder().gender("1")/*.firstName("FirstName").lastName("LastName")*/.build(), - AddressDto.builder() - .l1("M") - .l2("SupplementAdresse").l3("") - .l4("01 bis rue des lilas") - .l5("specialDistribution") - .l6("") - .l7("FRANCE") - .build() - ), - - - Arguments.of( - REMAddressDto.builder().streetNumber("1110")/*.repetitionIndex()*/.streetType("route") - .streetName("des Touches").specialDistribution("specialDistribution") - .zipCode("59000").cityName("Lille").countryName("FRANCE") - .addressSupplement("SupplementAdresse") - .locationHelp(null).build() - , PersonDto.builder().gender("XXKLXKEZSDKWLJDWSKKJ").firstName("FirstName").lastName("LastName").build(), - AddressDto.builder() - .l1("MME FirstName LastName") - .l2("SupplementAdresse").l3("") - .l4("1110 route des Touches") - .l5("specialDistribution") - .l6("59000 Lille") - .l7("FRANCE") - .build() - ), - - Arguments.of( - REMAddressDto.builder()/*.streetNumber().repetitionIndex()*/.streetType("place") - .streetName("de la Poste").specialDistribution("specialDistribution") - .zipCode("59000").cityName("Lille").countryName("FRANCE") - .addressSupplement("SupplementAdresse") - .locationHelp(null).build() - , PersonDto.builder()/*.gender("2")*/.firstName("FirstName").lastName("LastName").build(), - AddressDto.builder() - .l1("MME FirstName LastName") - .l2("SupplementAdresse").l3("") - .l4("place de la Poste") - .l5("specialDistribution") - .l6("59000 Lille") - .l7("FRANCE") - .build() - ), - - Arguments.of( - REMAddressDto.builder().streetNumber("").repetitionIndex(" ").streetType("place") - .streetName("de la Poste").specialDistribution("specialDistribution") - .zipCode("59000").cityName("Lille").countryName(" ") - .addressSupplement("SupplementAdresse") - .locationHelp(null).build() - , PersonDto.builder().gender(null).firstName("FirstName").lastName("LastName").build(), - AddressDto.builder() - .l1("MME FirstName LastName") - .l2("SupplementAdresse").l3("") - .l4("place de la Poste") - .l5("specialDistribution") - .l6("59000 Lille") - .l7("FRANCE") - .build()) - - , - - Arguments.of( - REMAddressDto.builder().streetNumber("").repetitionIndex(" ").streetType("place") - .streetName("de la Poste").specialDistribution("specialDistribution") - .zipCode("59000").cityName("Lille").countryName(" ") - .addressSupplement("SupplementAdresse") - .locationHelp( - LocationHelpDto.builder() - .building("building") - .cityPriorityDistrict(Boolean.FALSE) - .door("door") - .elevator(Boolean.TRUE) - .floor("floor") - .build()) - .build() - , PersonDto.builder().gender(" ").firstName("FirstName").lastName("LastName").build(), - AddressDto.builder() - .l1("MME FirstName LastName") - .l2("SupplementAdresse").l3("") - .l4("place de la Poste") - .l5("specialDistribution") - .l6("59000 Lille") - .l7("FRANCE") - .building("building") - .cityPriorityDistrict(Boolean.FALSE) - .door("door") - .elevator(Boolean.TRUE) - .floor("floor") - .build()) - ); - } - - @ParameterizedTest - @MethodSource("providedREMAdressAndContactAndExpectedResults") - void computeSabianeAdress_should_returnCorrectValues(REMAddressDto remAdress, PersonDto remContact, AddressDto expectedSabianeAdress) { - //Prepare - //Call method under test - AddressDto sabianeAdress = SabianePilotageCreateSUTask.computeSabianeAdress(remAdress, remContact); - //Post conditions - assertEquals(expectedSabianeAdress, sabianeAdress); - } - - @Test - void createSabianePersonFromRemPerson_should_returnCorrectValues_for_individu() throws JsonProcessingException, JSONException { - String ctx_ok = -""" - { "id": "TEST_ID" } -"""; - - String expectedJsonSabiane = -""" -{ - "organizationUnitId": "ID_POLE_GESTION_OPALE", - "address": { - "cityPriorityDistrict": false, - "door": "door", - "floor": "00/_", - "l1": "MME firstName2 lastName2", - "l2": "SupplementAdresse", - "l3": "", - "l4": "1 RUE DE L INSEE", - "l5": "specialDistribution", - "l6": "59000 Lille", - "l7": "FRANCE" - }, - "persons": [ - { - "birthdate": 315615600, - "email": "test2@gmail.com", - "favoriteEmail": false, - "firstName": "firstName2", - "lastName": "lastName2", - "phoneNumbers": [ - { - "favorite": false, - "number": "02", - "source": "FISCAL" - } - ], - "privileged": true, - "title": "MISS" - } - ], - "sampleIdentifiers": { - "autre": "0", - "bs": 0, - "ec": "0", - "le": 0, - "nograp": null, - "noi": 0, - "nole": 0, - "nolog": 0, - "numfa": 0, - "rges": 0, - "ssech": 99 - } -} -"""; - - //Prepare - JsonNode ctxNode = new ObjectMapper().readTree(ctx_ok); - JsonNode remNode = ProtoolsTestUtils.asObject(RemSUData.rem_su_test_selection_3personnes,JsonNode.class); - - - //Run Methode under tests - SurveyUnitContextDto sabianeDto = SabianePilotageCreateSUTask.createSabianeSUContextDto(ctxNode, ctx_partition1, remNode, false, false); - - //Verifications - JsonNode sabianeResultNode = new ObjectMapper().valueToTree(sabianeDto); - assertThat(sabianeResultNode.get("states").isArray()).isTrue(); - assertThat(sabianeResultNode.get("states").size()).isEqualTo(1); - assertThat(sabianeResultNode.get("states").get(0).get("type").textValue()).isEqualTo(StateType.NVM.toString()); - //state datetime - long statesTS = sabianeResultNode.get("states").get(0).get("date").longValue(); - long currentTs = Instant.now().toEpochMilli(); - long difference = currentTs - statesTS; - assertThat(statesTS).isLessThanOrEqualTo(currentTs); - assertThat(difference).isLessThanOrEqualTo(1 * 60 * 1000);//less than one minute old - - - //Put static values in expected result - JsonNode expectedSabianeNode = new ObjectMapper().readTree(expectedJsonSabiane);//Execute method under test - ObjectNode objectNode = (ObjectNode) expectedSabianeNode; - // Ajouter une nouvelle clé/valeur - objectNode.put("priority", false); - objectNode.put("campaign", "TEST_ID"); - String idSabiane = SabianeIdHelper.computeSabianeID(ctx_partition1.toString(), "3043280"); - objectNode.put("id", idSabiane); - - //We are sure of the state; we can just override the expected value with the actual one - objectNode.put("states", sabianeResultNode.get("states")); - // Convertir l'ObjectNode en JsonNode - expectedSabianeNode = objectNode; - JSONAssert.assertEquals(expectedSabianeNode.toString(), sabianeResultNode.toString(), false); - } - - - @Test - void createSabianePersonFromRemPerson_should_returnCorrectValues_for_logement() throws JsonProcessingException, JSONException { - String ctx_ok = - """ - { "id": "TEST_ID" } - """; - - String expectedJsonSabiane = - """ - { - "organizationUnitId": "ID_POLE_GESTION_OPALE", - "address": { - "cityPriorityDistrict": false, - "door": "door", - "floor": "00/_", - "l1": "MME firstName2 lastName2", - "l2": "SupplementAdresse", - "l3": "", - "l4": "1 RUE DE L INSEE", - "l5": "specialDistribution", - "l6": "59000 Lille", - "l7": "FRANCE" - }, - "persons": [ - { - "birthdate": 315615600, - "email": "test2@gmail.com", - "favoriteEmail": false, - "firstName": "firstName2", - "lastName": "lastName2", - "phoneNumbers": [ - { - "favorite": false, - "number": "02", - "source": "FISCAL" - } - ], - "privileged": true, - "title": "MISS" - } - ], - "sampleIdentifiers": { - "autre": "0", - "bs": 0, - "ec": "0", - "le": 0, - "nograp": null, - "noi": 0, - "nole": 0, - "nolog": 0, - "numfa": 0, - "rges": 0, - "ssech": 99 - } - } - """; - - //Prepare - JsonNode ctxNode = new ObjectMapper().readTree(ctx_ok); - JsonNode remNode = ProtoolsTestUtils.asObject(RemSUData.rem_su_test_selection_3personnes,JsonNode.class); - - //Run Methode under tests - SurveyUnitContextDto sabianeDto = SabianePilotageCreateSUTask.createSabianeSUContextDto(ctxNode, ctx_partition1, remNode, true, false); - - //Verifications - JsonNode sabianeResultNode = new ObjectMapper().valueToTree(sabianeDto); - assertThat(sabianeResultNode.get("states").isArray()).isTrue(); - assertThat(sabianeResultNode.get("states").size()).isEqualTo(1); - assertThat(sabianeResultNode.get("states").get(0).get("type").textValue()).isEqualTo(StateType.NVM.toString()); - //state datetime - long statesTS = sabianeResultNode.get("states").get(0).get("date").longValue(); - long currentTs = Instant.now().toEpochMilli(); - long difference = currentTs - statesTS; - assertThat(statesTS).isLessThanOrEqualTo(currentTs); - assertThat(difference).isLessThanOrEqualTo(1 * 60 * 1000);//less than one minute old - - - //Put static values in expected result - JsonNode expectedSabianeNode = new ObjectMapper().readTree(expectedJsonSabiane);//Execute method under test - ObjectNode objectNode = (ObjectNode) expectedSabianeNode; - // Ajouter une nouvelle clé/valeur - objectNode.put("priority", false); - objectNode.put("campaign", "TEST_ID"); - String idSabiane = SabianeIdHelper.computeSabianeID(ctx_partition1.toString(), "3043280"); - objectNode.put("id", idSabiane); - - //We are sure of the state; we can just override the expected value with the actual one - objectNode.put("states", sabianeResultNode.get("states")); - // Convertir l'ObjectNode en JsonNode - expectedSabianeNode = objectNode; - JSONAssert.assertEquals(expectedSabianeNode.toString(), sabianeResultNode.toString(), false); - } - - @Test - @DisplayName("Test execute method - should throw if VARNAME_CURRENT_PARTITION_ID or VARNAME_REM_SURVEY_UNIT not initialized") - void execute_should_throw_FlowableIllegalArgumentException_when_variables_notDefined() throws JsonProcessingException { - //Precondition - DelegateExecution execution = createMockedExecution(); - initContexteMockWithString(minimal_ctx_ok); - - //Execute the unit under test - FlowableIllegalArgumentException exception = assertThrows(FlowableIllegalArgumentException.class, () -> sabianePilotageTask.execute(execution)); - //Post conditions - assertThat(exception.getMessage()).isEqualTo(getMissingVariableMessage(VARNAME_CURRENT_PARTITION_ID)); - - //Create First variable - when(execution.getVariable(VARNAME_CURRENT_PARTITION_ID, String.class)).thenReturn("99"); - //Execute again - exception = assertThrows(FlowableIllegalArgumentException.class, () -> sabianePilotageTask.execute(execution)); - //Check the error - assertThat(exception.getMessage()).isEqualTo(getMissingVariableMessage(VARNAME_REM_INTERROGATION)); - - //Create 2nd variable - when(execution.getVariable(VARNAME_REM_INTERROGATION, JsonNode.class)).thenReturn(ProtoolsTestUtils.asJsonNode(RemSUData.rem_su_1personne)); - //Execute again - assertDoesNotThrow(() -> sabianePilotageTask.execute(execution)); - } - - - private static Stream contextErrorArguments() { - return Stream.of( - Arguments.of(CtxExamples.ctx_no_part), - Arguments.of(CtxExamples.ctx_idCampagne_idPartition), - Arguments.of(CtxExamples.ctx_idCampagne_1emptyPartition), - Arguments.of(CtxExamples.ctx_idCampagne_idPartition_typeLogement), - Arguments.of(CtxExamples.ctx_idCampagne_idPartition_typeIndividu) - ); - } - - @ParameterizedTest - @MethodSource("contextErrorArguments") - @DisplayName("Test execute method - should throw if Context is not correct") - void execute_should_throw_BadContext_when_contextIncorrect(String context_json) throws JsonProcessingException { - //Precondition - DelegateExecution execution = createMockedExecution(); - //Variables - lenient().when(execution.getVariable(VARNAME_CURRENT_PARTITION_ID, String.class)).thenReturn(CtxExamples.ctx_partition1); - lenient().when(execution.getVariable(VARNAME_REM_INTERROGATION, JsonNode.class)).thenReturn(ProtoolsTestUtils.asJsonNode(RemSUData.rem_su_1personne)); - //Ctx - ProtoolsTestUtils.initContexteMockFromString(protoolsContext, context_json); - - //Run test - assertThrows(BadContextIncorrectBPMNError.class, () -> sabianePilotageTask.execute(execution)); - Mockito.reset(protoolsContext); - } - - - static Stream initExecuteParameters() { - return Stream.of( - Arguments.of( - SabianeCtxExamples.ctx_ok_idCampagne_idPartition_typeLogement_prioritaire, - RemSUData.rem_su_1personne, - Boolean.TRUE), - Arguments.of( - SabianeCtxExamples.ctx_ok_idCampagne_idPartition_typeLogement_nonPrioritaire, - RemSUData.rem_su_1personne, - Boolean.FALSE) - ); - } - - @ParameterizedTest - @MethodSource("initExecuteParameters") - @DisplayName("Test execute method - should work and make correct call to service when context has one partition") - void execute_should_work_when_ctx_1part_logement(String inputCtx, String inputRemSU, Boolean expectedPriority) { - //Precondition - DelegateExecution execution = mock(DelegateExecution.class); - lenient().when(execution.getProcessInstanceId()).thenReturn(dumyId); - lenient().when(execution.getVariable(VARNAME_CURRENT_PARTITION_ID, String.class)).thenReturn(CtxExamples.ctx_partition1); - JsonNode remSU = ProtoolsTestUtils.asJsonNode(inputRemSU); - lenient().when(execution.getVariable(VARNAME_REM_INTERROGATION, JsonNode.class)).thenReturn(remSU); - //Ctx - initContexteMockWithString(inputCtx); - - //Run method under test - assertDoesNotThrow(() -> sabianePilotageTask.execute(execution)); - - final ArgumentCaptor > listCaptor - = ArgumentCaptor.forClass((Class) List.class); - verify(sabianePilotageService,times(1)).postSurveyUnits(listCaptor.capture()); - - List> captured = listCaptor.getAllValues(); - assertEquals(1,captured.size(),"We are supposed to call the method only one"); - List actualListOfSU = captured.get(0); - assertEquals(1,actualListOfSU.size(),"We are supposed to create SU one by one"); - SurveyUnitContextDto actualSU = actualListOfSU.get(0); - - assertEquals(1,actualSU.getPersons().size()); - //Prioritaire - assertEquals(expectedPriority,actualSU.getPriority()); - - - assertEquals(remSU.path("persons").path(0).path("emails").path(0).path("mailAddress").asText(),actualSU.getPersons().get(0).getEmail()); - assertEquals(remSU.path("persons").path(0).path("firstName").asText(),actualSU.getPersons().get(0).getFirstName()); - Mockito.reset(protoolsContext); - } - -} \ No newline at end of file diff --git a/src/test/backup/java/fr/insee/protools/backend/service/sabiane/delegate/SabianeQuestionnaireCreateContextTaskTest.java b/src/test/backup/java/fr/insee/protools/backend/service/sabiane/delegate/SabianeQuestionnaireCreateContextTaskTest.java deleted file mode 100644 index 80a7311b..00000000 --- a/src/test/backup/java/fr/insee/protools/backend/service/sabiane/delegate/SabianeQuestionnaireCreateContextTaskTest.java +++ /dev/null @@ -1,139 +0,0 @@ -package fr.insee.protools.backend.service.sabiane.delegate; - -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; -import fr.insee.protools.backend.ProtoolsTestUtils; -import fr.insee.protools.backend.service.context.ContextConstants; -import fr.insee.protools.backend.service.context.exception.BadContextIncorrectBPMNError; -import fr.insee.protools.backend.deprecated.service.nomenclature.NomenclatureService; -import fr.insee.protools.backend.deprecated.service.questionnaire_model.QuestionnaireModelService; -import fr.insee.protools.backend.service.sabiane.questionnaire.SabianeQuestionnaireService; -import fr.insee.protools.backend.service.utils.TestWithContext; -import org.flowable.engine.delegate.DelegateExecution; -import org.flowable.engine.test.FlowableTest; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; -import org.mockito.ArgumentCaptor; -import org.mockito.InjectMocks; -import org.mockito.Mock; -import org.mockito.Spy; -import org.mockito.junit.jupiter.MockitoExtension; -import org.springframework.util.ClassUtils; - -import java.io.IOException; -import java.util.HashSet; -import java.util.List; -import java.util.Set; - -import static fr.insee.protools.backend.service.context.ContextConstants.*; -import static org.assertj.core.api.AssertionsForClassTypes.assertThatCode; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertThrows; -import static org.mockito.ArgumentMatchers.anyString; -import static org.mockito.Mockito.*; - - -@ExtendWith(MockitoExtension.class) -@FlowableTest -public -class SabianeQuestionnaireCreateContextTaskTest extends TestWithContext { - - - final static String ressourceFolder = ClassUtils.convertClassNameToResourcePath(SabianeQuestionnaireCreateContextTaskTest.class.getPackageName()); - final static String sabiane_context_json = ressourceFolder+"/protools-contexte-sabiane.json"; - final static String sabiane_context_incorrect_json = ressourceFolder+"/protools-contexte-sabiane-incorrect.json"; - - @Mock SabianeQuestionnaireService sabianeQuestionnaireService; - @Mock QuestionnaireModelService questionnaireModelService; - @Mock NomenclatureService nomenclatureService; - @Spy ObjectMapper objectMapper; - - @InjectMocks - SabianeQuestionnaireCreateContextTask sabianeQuestTask; - - private final String questionnaireContent1 ="{\"id\": \"TOTO\" , \"toto\": 55 }"; - - @Test - void execute_should_throwError_when_null_context(){ - assertThat_delegate_throwError_when_null_context(sabianeQuestTask); - } - - @Test - void execute_should_throwBadContextIncorrect_when_contextIsKO() { - // preconditions - DelegateExecution execution = mock(DelegateExecution.class); - when(execution.getProcessInstanceId()).thenReturn("1"); - initContexteMockWithFile(sabiane_context_incorrect_json); - - //Execute the unit under test - assertThrows(BadContextIncorrectBPMNError.class, () -> sabianeQuestTask.execute(execution)); - - // postconditions - //assertThat(execution.getVariable("myVariable")).isEqualTo("myValue"); - - } - - /*@Test - void initQuestionnaireModels_should_produce_correct_json(){ - sabianeQuestTask. - }*/ - - @Test - void execute_should_work_and_make_correct_calls() throws IOException { - DelegateExecution execution = mock(DelegateExecution.class); - when(execution.getProcessInstanceId()).thenReturn("1"); - JsonNode contextRootNode = initContexteMockWithFile(sabiane_context_json); - assertEquals(2,contextRootNode.path(ContextConstants.CTX_QUESTIONNAIRE_MODELS).size(), "Context error : expected exactly 2 questionnaire model"); - - //Prepare the list of existing nomenclatures ("L_NATIONETR-1-1-0" does not exists yet) - when(sabianeQuestionnaireService.getNomenclaturesId()).thenReturn(Set.of("L_DEPNAIS-1-1-0","L_PAYSNAIS-1-1-0","L_COMMUNEPASSEE-1-1-0")); - //Mock the read nomenclature - String nomenclatureContent="{\"id\": \"nomenclatureContent\"}"; - - when(nomenclatureService.getNomenclatureContent("L_NATIONETR-1-1-0","NATIONETR")).thenReturn(nomenclatureContent); - //Mock questionnaire - when(sabianeQuestionnaireService.questionnaireModelExists(anyString())).thenReturn(false); - when(questionnaireModelService.getQuestionnaireModel(anyString(), anyString())).thenReturn(questionnaireContent1); - - - //Execute the unit under test - assertThatCode(() -> sabianeQuestTask.execute(execution)).doesNotThrowAnyException(); - - //Verifications on nomenclatures - verify(sabianeQuestionnaireService,atLeastOnce()).getNomenclaturesId(); - verify(sabianeQuestionnaireService).postNomenclature( - "L_NATIONETR-1-1-0", - "liste des nationalités", - objectMapper.readTree(nomenclatureContent)); - - //Verifications on questionnaires (2 questionnaires models to create) - verify(sabianeQuestionnaireService,times(2)).postQuestionnaireModel(any(),any(),any(),any()); - for(int i =0; i<2; i++){ - String idQuestionnaireModel = contextRootNode.path(ContextConstants.CTX_QUESTIONNAIRE_MODELS).get(i).path(CTX_QUESTIONNAIRE_MODEL_ID).asText(); - String labelQuestionnaireModel = contextRootNode.path(ContextConstants.CTX_QUESTIONNAIRE_MODELS).get(i).path(CTX_QUESTIONNAIRE_MODEL_LABEL).asText(); - String repertoireQuestionnaireModel = contextRootNode.path(ContextConstants.CTX_QUESTIONNAIRE_MODELS).get(i).path(CTX_QUESTIONNAIRE_MODEL_CHEMIN_REPERTOIRE).asText(); - Set nomenclatures = new HashSet<>(); - var iter=contextRootNode.path(ContextConstants.CTX_QUESTIONNAIRE_MODELS).get(i).path(CTX_QUESTIONNAIRE_MODEL_REQUIRED_NOMENCLATURES).elements(); - while(iter.hasNext()){ - var nomenclature=iter.next().asText(); - nomenclatures.add(nomenclature); - } - - verify(sabianeQuestionnaireService,times(1)).questionnaireModelExists(idQuestionnaireModel); - verify(questionnaireModelService,times(1)).getQuestionnaireModel(idQuestionnaireModel,repertoireQuestionnaireModel); - verify(sabianeQuestionnaireService).postQuestionnaireModel(idQuestionnaireModel,labelQuestionnaireModel, - objectMapper.readTree(questionnaireContent1),nomenclatures); - } - - //Verify postCampaign - ArgumentCaptor acContext = ArgumentCaptor.forClass(JsonNode.class); - ArgumentCaptor acCampaignId = ArgumentCaptor.forClass(String.class); - verify(sabianeQuestionnaireService,times(1)).postContext(acCampaignId.capture(),acContext.capture()); - - List allCtxValues = acContext.getAllValues(); - assertEquals(1, allCtxValues.size(),"We should have exactly one campaign"); - - JsonNode expectedCtx = ProtoolsTestUtils.asJsonNode(sabiane_context_json); - assertEquals(expectedCtx,allCtxValues.get(0),"Error with the passed json context"); - } -} diff --git a/src/test/backup/java/fr/insee/protools/backend/service/sabiane/delegate/SabianeQuestionnaireCreateSUTaskTest.java b/src/test/backup/java/fr/insee/protools/backend/service/sabiane/delegate/SabianeQuestionnaireCreateSUTaskTest.java deleted file mode 100644 index b8f30402..00000000 --- a/src/test/backup/java/fr/insee/protools/backend/service/sabiane/delegate/SabianeQuestionnaireCreateSUTaskTest.java +++ /dev/null @@ -1,165 +0,0 @@ -package fr.insee.protools.backend.service.sabiane.delegate; - -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.JsonNode; -import fr.insee.protools.backend.ProtoolsTestUtils; -import fr.insee.protools.backend.dto.platine_sabiane_questionnaire.surveyunit.SurveyUnitResponseDto; -import fr.insee.protools.backend.service.context.exception.BadContextIncorrectBPMNError; -import fr.insee.protools.backend.service.sabiane.SabianeIdHelper; -import fr.insee.protools.backend.service.sabiane.questionnaire.SabianeQuestionnaireService; -import fr.insee.protools.backend.service.utils.TestWithContext; -import fr.insee.protools.backend.service.utils.data.CtxExamples; -import fr.insee.protools.backend.service.utils.data.RemSUData; -import org.flowable.common.engine.api.FlowableIllegalArgumentException; -import org.flowable.engine.delegate.DelegateExecution; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.Arguments; -import org.junit.jupiter.params.provider.MethodSource; -import org.mockito.ArgumentCaptor; -import org.mockito.InjectMocks; -import org.mockito.Mock; -import org.mockito.Mockito; - -import java.util.List; -import java.util.stream.Stream; - -import static fr.insee.protools.backend.service.FlowableVariableNameConstants.VARNAME_CURRENT_PARTITION_ID; -import static fr.insee.protools.backend.service.FlowableVariableNameConstants.VARNAME_REM_INTERROGATION; -import static fr.insee.protools.backend.service.utils.FlowableVariableUtils.getMissingVariableMessage; -import static org.assertj.core.api.Assertions.assertThat; -import static org.junit.jupiter.api.Assertions.*; -import static org.mockito.Mockito.*; - - -class SabianeQuestionnaireCreateSUTaskTest extends TestWithContext { - - - static final String minimal_ctx_ok = - """ - { "id": "TEST_ID" , "partitions": [{ "id":99, "questionnaireModel": "ID_1"}] , "questionnaireModels": [{"id": "ID_1"}]} - """; - - @Mock SabianeQuestionnaireService sabianeQuestionnaireService; - - @InjectMocks - SabianeQuestionnaireCreateSUTask sabianePilotageTask; - - private static Stream contextErrorArguments() { - return Stream.of( - Arguments.of(CtxExamples.ctx_no_part), - Arguments.of(CtxExamples.ctx_idCampagne_questionnaireModels_idPartition), - Arguments.of(CtxExamples.ctx_questionnaireModels_no_part), - Arguments.of(CtxExamples.ctx_idCampagne_questionnaireModels_1emptyPartition), - Arguments.of(CtxExamples.ctx_idCampagne_emptyQuestionnaireModels_idPartition) - ); - } - - static Stream initExecuteParameters() { - return Stream.of( - Arguments.of( - SabianeCtxExamples.ctx_ok_idCampagne_idQuestionnaireModel_idPartition_questionnaireModelPartition, - RemSUData.rem_su_1personne, - Boolean.TRUE) - ); - } - - @Test - void execute_should_throwError_when_null_context(){ - assertThat_delegate_throwError_when_null_context(sabianePilotageTask); - } - - @Test - @DisplayName("Test execute method - should throw if VARNAME_CURRENT_PARTITION_ID or VARNAME_REM_SURVEY_UNIT not initialized") - void execute_should_throw_FlowableIllegalArgumentException_when_variables_notDefined() { - //Precondition - DelegateExecution execution = createMockedExecution(); - initContexteMockWithString(minimal_ctx_ok); - - //Execute the unit under test - FlowableIllegalArgumentException exception = assertThrows(FlowableIllegalArgumentException.class, () -> sabianePilotageTask.execute(execution)); - //Post conditions - assertThat(exception.getMessage()).isEqualTo(getMissingVariableMessage(VARNAME_CURRENT_PARTITION_ID)); - - //Create First variable - when(execution.getVariable(VARNAME_CURRENT_PARTITION_ID, String.class)).thenReturn(CtxExamples.ctx_partition1); - //Execute again - exception = assertThrows(FlowableIllegalArgumentException.class, () -> sabianePilotageTask.execute(execution)); - //Check the error - assertThat(exception.getMessage()).isEqualTo(getMissingVariableMessage(VARNAME_REM_INTERROGATION)); - - //Create 2nd variable - when(execution.getVariable(VARNAME_REM_INTERROGATION, JsonNode.class)).thenReturn(ProtoolsTestUtils.asJsonNode(RemSUData.rem_su_1personne)); - //Execute again - assertDoesNotThrow(() -> sabianePilotageTask.execute(execution)); - } - - @Test - void execute_should_throw_BadContextIncorrectException_when_noContext() { - DelegateExecution execution = createMockedExecution(); - //Execute the unit under test - assertThrows(BadContextIncorrectBPMNError.class, () -> sabianePilotageTask.execute(execution)); - } - - @ParameterizedTest - @MethodSource("contextErrorArguments") - @DisplayName("Test execute method - should throw if Context is not correct") - void execute_should_throw_BadContext_when_contextIncorrect(String context_json) throws JsonProcessingException { - //Precondition - DelegateExecution execution = createMockedExecution(); - //Variables - lenient().when(execution.getVariable(VARNAME_CURRENT_PARTITION_ID, String.class)).thenReturn(CtxExamples.ctx_partition1); - lenient().when(execution.getVariable(VARNAME_REM_INTERROGATION, JsonNode.class)).thenReturn(ProtoolsTestUtils.asJsonNode(RemSUData.rem_su_1personne)); - //Ctx - ProtoolsTestUtils.initContexteMockFromString(protoolsContext, context_json); - - //Run test - assertThrows(BadContextIncorrectBPMNError.class, () -> sabianePilotageTask.execute(execution)); - Mockito.reset(protoolsContext); - } - - @ParameterizedTest - @MethodSource("initExecuteParameters") - @DisplayName("Test execute method - should work and make correct call to service when context has one partition") - void execute_should_work_when_ctx_1part_logement(String inputCtx, String inputRemSU) { - //Precondition - DelegateExecution execution = mock(DelegateExecution.class); - lenient().when(execution.getProcessInstanceId()).thenReturn(dumyId); - lenient().when(execution.getVariable(VARNAME_CURRENT_PARTITION_ID, String.class)).thenReturn(CtxExamples.ctx_partition1); - JsonNode remSU = ProtoolsTestUtils.asJsonNode(inputRemSU); - lenient().when(execution.getVariable(VARNAME_REM_INTERROGATION, JsonNode.class)).thenReturn(remSU); - //Ctx - JsonNode ctxNode = initContexteMockWithString(inputCtx); - - //Run method under test - assertDoesNotThrow(() -> sabianePilotageTask.execute(execution)); - - //Post conditions - ArgumentCaptor acSUDto = ArgumentCaptor.forClass(SurveyUnitResponseDto.class); - verify(sabianeQuestionnaireService, times(1)).postSurveyUnit(acSUDto.capture(), eq("AAC2023A00")); - List allValues = acSUDto.getAllValues(); - assertEquals(1, allValues.size(), "We should have exactly one SU Created"); - - SurveyUnitResponseDto actualSU = allValues.get(0); - assertEquals( - ctxNode.path("partitions").path(0).path("questionnaireModel").asText(), - actualSU.getQuestionnaireId()); - assertEquals( - remSU.path("externals"), - actualSU.getData()); - - String idSabiane = SabianeIdHelper.computeSabianeID(CtxExamples.ctx_partition1.toString(), remSU.path("repositoryId").asText()); - assertEquals( - idSabiane, - actualSU.getId(), - "Expected a correctly formed sabiane SU ID"); - - assertThat(actualSU.getPersonalization()).isEmpty(); - assertThat(actualSU.getComment()).isEmpty(); - //assertThat(actualSU.getStateData()).isEmpty(); - - Mockito.reset(protoolsContext); - } - -} \ No newline at end of file diff --git a/src/test/backup/java/fr/insee/protools/backend/service/sugoi/SugoiCreateUserTaskTest.java b/src/test/backup/java/fr/insee/protools/backend/service/sugoi/SugoiCreateUserTaskTest.java deleted file mode 100644 index 4e264d31..00000000 --- a/src/test/backup/java/fr/insee/protools/backend/service/sugoi/SugoiCreateUserTaskTest.java +++ /dev/null @@ -1,139 +0,0 @@ -package fr.insee.protools.backend.service.sugoi; - -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.DeserializationFeature; -import com.fasterxml.jackson.databind.ObjectMapper; -import fr.insee.protools.backend.ProtoolsTestUtils; -import fr.insee.protools.backend.dto.sugoi.User; -import fr.insee.protools.backend.service.context.exception.BadContextIncorrectBPMNError; -import fr.insee.protools.backend.service.utils.TestWithContext; -import fr.insee.protools.backend.service.utils.password.PasswordService; -import org.flowable.engine.delegate.DelegateExecution; -import org.flowable.engine.test.FlowableTest; -import org.junit.jupiter.api.AfterEach; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; -import org.mockito.ArgumentCaptor; -import org.mockito.InjectMocks; -import org.mockito.Mock; -import org.mockito.Mockito; -import org.mockito.junit.jupiter.MockitoExtension; - -import java.util.List; - -import static fr.insee.protools.backend.service.FlowableVariableNameConstants.VARNAME_DIRECTORYACCESS_ID_CONTACT; -import static fr.insee.protools.backend.service.sugoi.SugoiCreateUserTask.PLATINE_HABILITATION; -import static org.junit.jupiter.api.Assertions.*; -import static org.mockito.Mockito.*; - -@ExtendWith(MockitoExtension.class) -@FlowableTest -class SugoiCreateUserTaskTest extends TestWithContext { - - @Mock SugoiService sugoiService; - @Mock PasswordService passwordService; - @InjectMocks SugoiCreateUserTask task; - - protected final String dumyId="ID1"; - - @Test - void execute_should_work() throws JsonProcessingException { - //Prepare - DelegateExecution execution = mock(DelegateExecution.class); - doReturn(dumyId).when(execution).getProcessInstanceId(); - - final String context = - "{\"contexte\": \"household\" } }"; - ProtoolsTestUtils.initContexteMockFromString(protoolsContext, context); - - String expectedPwd="veryComplicatedPassword"; - doReturn(expectedPwd).when(passwordService).generatePassword(anyInt()); - final String userId="D96QSST"; - final String sugoiResponse = - """ - { - "username": "D96QSST", - "groups": [], - "habilitations": [ - { - "id": "repondant_platine", - "application": "platine", - "role": "repondant", - "property": null - } - ], - "metadatas": { - "userStorage": "default", - "realm": "questionnaire-particuliers", - "modifyTimestamp": "20231106141045Z" - }, - "attributes": { - "hasPassword": false - } - } - """; - doReturn( - new ObjectMapper().configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false) - .readValue(sugoiResponse,User.class)) - .when(sugoiService).postCreateUsers(any()); - - //Execute - assertDoesNotThrow(() -> task.execute(execution)); - - //post conditions - verify(execution).setVariableLocal(VARNAME_DIRECTORYACCESS_ID_CONTACT, userId); - //verif on user creation - ArgumentCaptor acUserDto = ArgumentCaptor.forClass(User.class); - verify(sugoiService).postCreateUsers(acUserDto.capture()); - assertEquals(1, acUserDto.getAllValues().size(),"We should have exactly one call to postCreateUsers"); - User userParam = acUserDto.getValue(); - assertEquals(1, userParam.getHabilitations().size(),"We should have exactly one habilitation"); - assertTrue(userParam.getHabilitations().contains(PLATINE_HABILITATION),"Platine habilitiation not found"); - - //verif on password - verify(sugoiService).postInitPassword(userId,expectedPwd); - } - - @Test - @DisplayName("Test execute method - should throw if Context is not correct") - void execute_should_throw_BadContext_when_contextIncorrect() throws JsonProcessingException { - //Precondition - DelegateExecution execution = mock(DelegateExecution.class); - lenient().when(execution.getProcessInstanceId()).thenReturn(dumyId); - - //Erreur - final String contextKO1 = - "{ \"partitions\": [{ \"id\": 1 }] }"; - final String contextKO2 = - "{\"contexte\": \"xxxx\" } }"; - - List contextErrorTestList=List.of(contextKO1,contextKO2); - for(String context : contextErrorTestList){ - //Precondition - ProtoolsTestUtils.initContexteMockFromString(protoolsContext, context); - //Run test - assertThrows(BadContextIncorrectBPMNError.class, () -> task.execute(execution)); - Mockito.reset(protoolsContext); - } - } - @Test - @DisplayName("Test getPasswordSize method - should return 8 for household") - void getPasswordSize_should_return_8_for_household() throws JsonProcessingException { - - final String context = - "{\"contexte\": \"household\" } }"; - ProtoolsTestUtils.initContexteMockFromString(protoolsContext, context); - assertEquals(8,task.getPasswordSize(protoolsContext.getContextByProcessInstance(dumyId))); - } - - @Test - @DisplayName("Test getPasswordSize method - should return 12 for non household") - void getPasswordSize_should_return_12_for_NonHousehold() throws JsonProcessingException { - - final String context = - "{\"contexte\": \"business\" } }"; - ProtoolsTestUtils.initContexteMockFromString(protoolsContext, context); - assertEquals(12,task.getPasswordSize(protoolsContext.getContextByProcessInstance(dumyId))); - } -} \ No newline at end of file diff --git a/src/test/backup/java/fr/insee/protools/backend/service/utils/ContextUtilsTest.java b/src/test/backup/java/fr/insee/protools/backend/service/utils/ContextUtilsTest.java deleted file mode 100644 index 21d9fc0f..00000000 --- a/src/test/backup/java/fr/insee/protools/backend/service/utils/ContextUtilsTest.java +++ /dev/null @@ -1,62 +0,0 @@ -package fr.insee.protools.backend.service.utils; - -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; -import fr.insee.protools.backend.deprecated.service.utils.ContextUtils; -import org.flowable.common.engine.api.FlowableIllegalArgumentException; -import org.junit.jupiter.api.Test; - -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertThrows; - -class ContextUtilsTest { - - final String json0Partition = - "{ \"partitions\": [ ] }"; - final String json1Partition = - "{ \"partitions\": [{ \"id\": 1 , \"toto\": \"val1\" }] }"; - final String json2Partition = - "{ \"partitions\": [{ \"id\": 1 , \"toto\": \"val1\" }, { \"id\": 2 , \"toto\": \"val2\" }] }"; - - @Test - void getCurrentPartitionNode_ShouldReturnCorrectPartitionNode_WhenFound() throws JsonProcessingException { - // Arrange - JsonNode contextRootNode = new ObjectMapper().readTree(json1Partition); - // Act - JsonNode result = ContextUtils.getCurrentPartitionNode(contextRootNode, "1"); - // Assert - assertEquals("val1",result.path("toto").asText()); - } - - @Test - void getCurrentPartitionNode_ShouldReturnCorrectPartitionNode_WhenFound2() throws JsonProcessingException { - // Arrange - JsonNode contextRootNode = new ObjectMapper().readTree(json2Partition); - // Act - JsonNode result = ContextUtils.getCurrentPartitionNode(contextRootNode, "2"); - // Assert - assertEquals("val2",result.path("toto").asText()); - } - - - @Test - void getCurrentPartitionNode_ShouldThrowFlowableIllegalArgumentException_WhenPartitionNotFound() throws JsonProcessingException { - // Arrange - JsonNode contextRootNode = new ObjectMapper().readTree(json0Partition); - - // Act - assertThrows(FlowableIllegalArgumentException.class, - () -> ContextUtils.getCurrentPartitionNode(contextRootNode, "55")); - } - - @Test - void getCurrentPartitionNode_ShouldThrowFlowableIllegalArgumentException_WhenPartitionNoPartition() throws JsonProcessingException { - // Arrange - JsonNode contextRootNode = new ObjectMapper().readTree(""); - - // Act - assertThrows(FlowableIllegalArgumentException.class, - () -> ContextUtils.getCurrentPartitionNode(contextRootNode, "55")); - } -} \ No newline at end of file diff --git a/src/test/backup/java/fr/insee/protools/backend/service/utils/data/CtxExamples.java b/src/test/backup/java/fr/insee/protools/backend/service/utils/data/CtxExamples.java deleted file mode 100644 index b7ff02c7..00000000 --- a/src/test/backup/java/fr/insee/protools/backend/service/utils/data/CtxExamples.java +++ /dev/null @@ -1,123 +0,0 @@ -package fr.insee.protools.backend.service.utils.data; - -public class CtxExamples { - - public static final String ctx_partition1 = "99"; - - //CTX - public static final String ctx_no_part = - """ - { - "id": "AAC2023A00" - } - """; - - public static final String ctx_idCampagne_idPartition = - """ - { - "id": "AAC2023A00", - "partitions": [{ - "id": 99 - }] - } - """; - - public static final String ctx_idCampagne_1emptyPartition = - """ - { - "id": "AAC2023A00", - "partitions": [{ - }] - } - """; - - public static final String ctx_idCampagne_idPartition_typeLogement = - """ - { - "id": "AAC2023A00", - "partitions": [{ - "id": 99, - "typeEchantillon" : "LOGEMENT" - }] - } - """; - - public static final String ctx_idCampagne_idPartition_typeIndividu = - """ - { - "id": "AAC2023A00", - "partitions": [{ - "id": 99, - "typeEchantillon" : "individu" - }] - } - """; - - public static final String ctx_questionnaireModels_no_part = - """ - { - "id": "AAC2023A00", - "questionnaireModels": [{ - "id": "ID_1", - "cheminRepertoire": "path", - "label": "ID_1_LABEL", - "requiredNomenclatureIds": [ - "NOMA-1-1-0", - "NOMB-1-1-0" - ] - }] - } - """; - - public static final String ctx_idCampagne_questionnaireModels_idPartition = - """ - { - "id": "AAC2023A00", - "partitions": [{ - "id": 99 - }], - "questionnaireModels": [{ - "id": "ID_1", - "cheminRepertoire": "path", - "label": "ID_1_LABEL", - "requiredNomenclatureIds": [ - "NOMA-1-1-0", - "NOMB-1-1-0" - ] - }] - } - """; - - public static final String ctx_idCampagne_questionnaireModels_1emptyPartition = - """ - { - "id": "AAC2023A00", - "partitions": [{ - }], - "questionnaireModels": [{ - "id": "ID_1", - "cheminRepertoire": "path", - "label": "ID_1_LABEL", - "requiredNomenclatureIds": [ - "NOMA-1-1-0", - "NOMB-1-1-0" - ] - }] - } - """; - - public static final String ctx_idCampagne_emptyQuestionnaireModels_idPartition = - """ - { - "id": "AAC2023A00", - "partitions": [{ - "id": 99 - }], - "questionnaireModels": [] - } - """; - - - - private CtxExamples(){} -} diff --git a/src/test/backup/java/fr/insee/protools/backend/service/utils/data/RemSUData.java b/src/test/backup/java/fr/insee/protools/backend/service/utils/data/RemSUData.java deleted file mode 100644 index ab41b7c9..00000000 --- a/src/test/backup/java/fr/insee/protools/backend/service/utils/data/RemSUData.java +++ /dev/null @@ -1,16 +0,0 @@ -package fr.insee.protools.backend.service.utils.data; - -import org.springframework.util.ClassUtils; - -public class RemSUData { - private RemSUData() {} - - final static String ressourceFolder = ClassUtils.convertClassNameToResourcePath(RemSUData.class.getPackageName()); - - - public final static String rem_su_1personne = ressourceFolder+"/rem-su_1personne.json"; - public final static String rem_su_3personnes = ressourceFolder+"/rem-su_3personnes.json"; - public final static String getRem_su_1personne_noContact = ressourceFolder+"/rem-su-noMainOrSurveyed.json"; - public final static String rem_su_test_selection_3personnes = ressourceFolder+"/rem-su-test-selection.json"; - -} diff --git a/src/test/backup/java/fr/insee/protools/backend/integration/EraREMProcessTest.java b/src/test/java/fr/insee/protools/backend/integration/EraREMProcessTest.java similarity index 100% rename from src/test/backup/java/fr/insee/protools/backend/integration/EraREMProcessTest.java rename to src/test/java/fr/insee/protools/backend/integration/EraREMProcessTest.java diff --git a/src/test/backup/java/fr/insee/protools/backend/service/utils/FlowableVariableUtilsTest.java b/src/test/java/fr/insee/protools/backend/service/utils/FlowableVariableUtilsTest.java similarity index 92% rename from src/test/backup/java/fr/insee/protools/backend/service/utils/FlowableVariableUtilsTest.java rename to src/test/java/fr/insee/protools/backend/service/utils/FlowableVariableUtilsTest.java index 200a0afb..b7171deb 100644 --- a/src/test/backup/java/fr/insee/protools/backend/service/utils/FlowableVariableUtilsTest.java +++ b/src/test/java/fr/insee/protools/backend/service/utils/FlowableVariableUtilsTest.java @@ -7,10 +7,10 @@ import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.junit.jupiter.MockitoExtension; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.*; import static org.mockito.Mockito.*; + @ExtendWith(MockitoExtension.class) class FlowableVariableUtilsTest { From 8943f0d869625d58a769eaca03053f9738467863 Mon Sep 17 00:00:00 2001 From: SNDIL - Marc Date: Fri, 20 Sep 2024 14:05:39 +0200 Subject: [PATCH 68/75] suppression de tous les tests en backup --- .../backend/StarterApplicationTests.java | 8 - .../context/protools-contexte-platine.json | 79 ---------- .../expected_post_questionnaire_metadata.json | 67 -------- ...exte-platine-incorrect-no-campaign-id.json | 75 --------- .../protools-contexte-platine-incorrect.json | 76 --------- .../protools-contexte-platine-individu.json | 88 ----------- .../protools-contexte-platine-logement.json | 84 ---------- .../expected_post_questionnaire_metadata.json | 11 -- .../pilotage_expected_post_campaign.json | 48 ------ .../protools-contexte-sabiane-incorrect.json | 93 ----------- .../delegate/protools-contexte-sabiane.json | 94 ----------- .../utils/data/rem-su-noMainOrSurveyed.json | 91 ----------- .../utils/data/rem-su-test-selection.json | 141 ----------------- .../service/utils/data/rem-su_1personne.json | 91 ----------- .../service/utils/data/rem-su_3personnes.json | 147 ------------------ .../integration/EraREMProcessTest.java | 6 +- ...impleProcess.testSimpleProcess.bpmn20.xml} | 0 .../integration/collecte_web_no_com.json | 0 .../integration/noCTX_eraREM.bpmn20.xml | 0 19 files changed, 2 insertions(+), 1197 deletions(-) delete mode 100644 src/test/backup/java/fr/insee/protools/backend/StarterApplicationTests.java delete mode 100644 src/test/backup/ressources/service/context/protools-contexte-platine.json delete mode 100644 src/test/backup/ressources/service/platine/delegate/expected_post_questionnaire_metadata.json delete mode 100644 src/test/backup/ressources/service/platine/delegate/protools-contexte-platine-incorrect-no-campaign-id.json delete mode 100644 src/test/backup/ressources/service/platine/delegate/protools-contexte-platine-incorrect.json delete mode 100644 src/test/backup/ressources/service/platine/delegate/protools-contexte-platine-individu.json delete mode 100644 src/test/backup/ressources/service/platine/delegate/protools-contexte-platine-logement.json delete mode 100644 src/test/backup/ressources/service/sabiane/delegate/expected_post_questionnaire_metadata.json delete mode 100644 src/test/backup/ressources/service/sabiane/delegate/pilotage_expected_post_campaign.json delete mode 100644 src/test/backup/ressources/service/sabiane/delegate/protools-contexte-sabiane-incorrect.json delete mode 100644 src/test/backup/ressources/service/sabiane/delegate/protools-contexte-sabiane.json delete mode 100644 src/test/backup/ressources/service/utils/data/rem-su-noMainOrSurveyed.json delete mode 100644 src/test/backup/ressources/service/utils/data/rem-su-test-selection.json delete mode 100644 src/test/backup/ressources/service/utils/data/rem-su_1personne.json delete mode 100644 src/test/backup/ressources/service/utils/data/rem-su_3personnes.json rename src/test/{backup/ressources/flowable/engine/SimpleProcessTest.testSimpleProcess.bpmn20.xml => resources/fr/insee/protools/backend/integration/SimpleProcess.testSimpleProcess.bpmn20.xml} (100%) rename src/test/{backup/ressources => resources/fr/insee/protools/backend}/integration/collecte_web_no_com.json (100%) rename src/test/{backup/ressources => resources/fr/insee/protools/backend}/integration/noCTX_eraREM.bpmn20.xml (100%) diff --git a/src/test/backup/java/fr/insee/protools/backend/StarterApplicationTests.java b/src/test/backup/java/fr/insee/protools/backend/StarterApplicationTests.java deleted file mode 100644 index cd7751a1..00000000 --- a/src/test/backup/java/fr/insee/protools/backend/StarterApplicationTests.java +++ /dev/null @@ -1,8 +0,0 @@ -package fr.insee.protools.backend; - -//@SpringBootTest class StarterApplicationTests { -// -// @Test void contextLoads() { -// } - -//} diff --git a/src/test/backup/ressources/service/context/protools-contexte-platine.json b/src/test/backup/ressources/service/context/protools-contexte-platine.json deleted file mode 100644 index 2dcb750c..00000000 --- a/src/test/backup/ressources/service/context/protools-contexte-platine.json +++ /dev/null @@ -1,79 +0,0 @@ -{ - "id": "DEM2022X00", - "label": "Enquête démo 2022 - séquence 1", - "contexte": "household", - "metadonnees": { - "annee": 2022, - "periodicite": "X", - "periode": "X00", - "operationId": "DEM2022", - "operationLabelCourt": "operationLabelCourt", - "operationLabelLong": "operationLabelLong", - "serieId": "DEM", - "serieLabelCourt": "serieLabelCourt", - "serieLabelLong": "serieLabelLong", - "portailMesEnquetesOperation": true, - "objectifsCourts": "objectifsCourts", - "objectifsLongs": "objectifsLongs", - "caractereObligatoire": true, - "qualiteStatistique": true, - "testNonLabellise": true, - "anneeVisa": 2022, - "numeroVisa": "2022xxxxxx", - "ministereTutelle": "de l'Économie, des Finances et de la Souveraineté Industrielle et Numérique", - "parutionJo": true, - "dateParutionJo": "2021-12-23", - "responsableOperationnel": "L’Institut national de la statistique et des études économiques (Insee)", - "responsableTraitement": "l'Insee", - "cnisUrl": "http://cnis/DOG2021", - "diffusionUrl": "http://diffusion/DOG2021", - "noticeUrl": "http://notice/DOG2021", - "specimenUrl": "http://specimenUrl/DOG2021", - "proprietaireId": "proprietaireId", - "proprietaireLabel": "proprietaireLabel", - "proprietaireLogo": "proprietaireLogo", - "assistanceNiveau2Id": "assistanceNiveau2Id", - "assistanceNiveau2Label": "assistanceNiveau2Label", - "assistanceNiveau2Tel": "assistanceNiveau2Tel", - "assitanceNiveau2Mail": "assitanceNiveau2Mail", - "asssistanceNiveau2Pays": "asssistanceNiveau2Pays", - "assistanceNiveau2NumeroVoie": "assistanceNiveau2NumeroVoie", - "assistanceNiveau2NomVoie": "rue Kennedy", - "assistanceNiveau2Commune": "assistanceNiveau2Commune", - "assistanceNiveau2CodePostal": "assistanceNiveau2CodePostal" - }, - "partitions": [{ - "id": 1, - "label": "lot hommes", - "dateDebutCollecte": "2023-01-16T14:07:23.001Z", - "dateFinCollecte": "2024-01-16T14:07:23.001Z", - "dateRetour": "2024-01-16T14:07:23.001Z" - }], - "questionnaireModels": [{ - "id": "tic2023a00_web", - "cheminRepertoire": "coleman", - "label": "Super modèle 1", - "requiredNomenclatureIds": [ - "L_DEPNAIS-1-1-0", - "L_PAYSNAIS-1-1-0", - "L_NATIONETR-1-1-0" - ] - }], - "nomenclatures": [ - { - "id": "L_DEPNAIS-1-1-0", - "cheminRepertoire": "DEPNAIS", - "label": "Liste des départements" - }, - { - "id": "L_PAYSNAIS-1-1-0", - "cheminRepertoire": "PAYSNAIS", - "label": "liste des pays" - }, - { - "id": "L_NATIONETR-1-1-0", - "cheminRepertoire": "NATIONETR", - "label": "liste des nationalités" - } - ] -} \ No newline at end of file diff --git a/src/test/backup/ressources/service/platine/delegate/expected_post_questionnaire_metadata.json b/src/test/backup/ressources/service/platine/delegate/expected_post_questionnaire_metadata.json deleted file mode 100644 index cf57eb9c..00000000 --- a/src/test/backup/ressources/service/platine/delegate/expected_post_questionnaire_metadata.json +++ /dev/null @@ -1,67 +0,0 @@ -{ - "value": { - "variables": [ - { - "name": "Enq_LibelleEnquete", - "value": "operationLabelLong" - }, - { - "name": "Enq_ObjectifsCourts", - "value": "objectifsCourts" - }, - { - "name": "Enq_CaractereObligatoire", - "value": true - }, - { - "name": "Enq_NumeroVisa", - "value": "2022xxxxxx" - }, - { - "name": "Enq_MinistereTutelle", - "value": "de l'Économie, des Finances et de la Souveraineté Industrielle et Numérique" - }, - { - "name": "Enq_ParutionJo", - "value": true - }, - { - "name": "Enq_DateParutionJo", - "value": "2021-12-23" - }, - { - "name": "Enq_RespOperationnel", - "value": "L’Institut national de la statistique et des études économiques (Insee)" - }, - { - "name": "Enq_RespTraitement", - "value": "l'Insee" - }, - { - "name": "Enq_AnneeVisa", - "value": 2022 - }, - { - "name": "Enq_QualiteStatistique", - "value": true - }, - { - "name": "Enq_TestNonLabellise", - "value": true - }, - { - "name": "Loi_statistique", - "value": "urlLoiStatistique_val" - }, - { - "name": "Loi_rgpd", - "value": "urlLoiRGPD_val" - }, - { - "name": "Loi_informatique", - "value": "urlLoiInformatique_val" - } - ], - "inseeContext": "household" - } -} \ No newline at end of file diff --git a/src/test/backup/ressources/service/platine/delegate/protools-contexte-platine-incorrect-no-campaign-id.json b/src/test/backup/ressources/service/platine/delegate/protools-contexte-platine-incorrect-no-campaign-id.json deleted file mode 100644 index 350a307c..00000000 --- a/src/test/backup/ressources/service/platine/delegate/protools-contexte-platine-incorrect-no-campaign-id.json +++ /dev/null @@ -1,75 +0,0 @@ -{ - "label": "Enquête démo 2022 - séquence 1", - "contexte": "household", - "metadonnees": { - "annee": 2022, - "periodicite": "X", - "periode": "X00", - "operationId": "DEM2022", - "operationLabelCourt": "operationLabelCourt", - "operationLabelLong": "operationLabelLong", - "serieId": "DEM", - "serieLabelCourt": "serieLabelCourt", - "serieLabelLong": "serieLabelLong", - "objectifsCourts": "Cette enquête permet de connaître précisément ...", - "objectifsLongs": "Cette enquête permet de connaître précisément...", - "caractereObligatoire": true, - "testNonLabellise": true, - "anneeVisa": 2022, - "numeroVisa": "2022xxxxxx", - "ministereTutelle": "de l'Économie, des Finances et de la Souveraineté Industrielle et Numérique", - "parutionJo": true, - "dateParutionJo": "2021-12-23", - "responsableOperationnel": "L’Institut national de la statistique et des études économiques (Insee)", - "responsableTraitement": "l'Insee", - "cnisUrl": "http://cnis/DOG2021", - "diffusionUrl": "http://diffusion/DOG2021", - "noticeUrl": "http://notice/DOG2021", - "specimenUrl": "http://specimenUrl/DOG2021", - "proprietaireId": "proprietaireId", - "proprietaireLabel": "proprietaireLabel", - "proprietaireLogo": "proprietaireLogo", - "assistanceNiveau2Id": "assistanceNiveau2Id", - "assistanceNiveau2Label": "assistanceNiveau2Label", - "assistanceNiveau2Tel": "assistanceNiveau2Tel", - "assitanceNiveau2Mail": "assitanceNiveau2Mail", - "asssistanceNiveau2Pays": "asssistanceNiveau2Pays", - "assistanceNiveau2NumeroVoie": "assistanceNiveau2NumeroVoie", - "assistanceNiveau2NomVoie": "rue Kennedy", - "assistanceNiveau2Commune": "assistanceNiveau2Commune", - "assistanceNiveau2CodePostal": "assistanceNiveau2CodePostal" - }, - "partitions": [{ - "id": 1, - "label": "lot hommes", - "dateDebutCollecte": "2023-01-16T14:07:23.001Z", - "dateFinCollecte": "2024-01-16T14:07:23.001Z", - "dateRetour": "2024-01-16T14:07:23.001Z" - }], - "questionnaireModels": [{ - "id": "tic2023a00_web", - "cheminRepertoire": "coleman", - "label": "Super modèle 1", - "requiredNomenclatureIds": [ - "L_DEPNAIS-1-1-0", - "L_PAYSNAIS-1-1-0", - "L_NATIONETR-1-1-0" - ] - }], - "nomenclatures": [ - { - "id": "L_DEPNAIS-1-1-0", - "cheminRepertoire": " DEPNAIS", - "label": "Liste des départements" - }, - { - "id": "L_PAYSNAIS-1-1-0", - "cheminRepertoire": "PAYSNAIS", - "label": "liste des pays" - }, - { - "id": "L_NATIONETR-1-1-0", - "label": "liste des nationalités" - } - ] -} \ No newline at end of file diff --git a/src/test/backup/ressources/service/platine/delegate/protools-contexte-platine-incorrect.json b/src/test/backup/ressources/service/platine/delegate/protools-contexte-platine-incorrect.json deleted file mode 100644 index 07b86e75..00000000 --- a/src/test/backup/ressources/service/platine/delegate/protools-contexte-platine-incorrect.json +++ /dev/null @@ -1,76 +0,0 @@ -{ - "id": "DEM2022X00", - "label": "Enquête démo 2022 - séquence 1", - "contexte": "household", - "metadonnees": { - "annee": 2022, - "periodicite": "X", - "periode": "X00", - "operationId": "DEM2022", - "operationLabelCourt": "operationLabelCourt", - "operationLabelLong": "operationLabelLong", - "serieId": "DEM", - "serieLabelCourt": "serieLabelCourt", - "serieLabelLong": "serieLabelLong", - "objectifsCourts": "Cette enquête permet de connaître précisément ...", - "objectifsLongs": "Cette enquête permet de connaître précisément...", - "caractereObligatoire": true, - "testNonLabellise": true, - "anneeVisa": 2022, - "numeroVisa": "2022xxxxxx", - "ministereTutelle": "de l'Économie, des Finances et de la Souveraineté Industrielle et Numérique", - "parutionJo": true, - "dateParutionJo": "2021-12-23", - "responsableOperationnel": "L’Institut national de la statistique et des études économiques (Insee)", - "responsableTraitement": "l'Insee", - "cnisUrl": "http://cnis/DOG2021", - "diffusionUrl": "http://diffusion/DOG2021", - "noticeUrl": "http://notice/DOG2021", - "specimenUrl": "http://specimenUrl/DOG2021", - "proprietaireId": "proprietaireId", - "proprietaireLabel": "proprietaireLabel", - "proprietaireLogo": "proprietaireLogo", - "assistanceNiveau2Id": "assistanceNiveau2Id", - "assistanceNiveau2Label": "assistanceNiveau2Label", - "assistanceNiveau2Tel": "assistanceNiveau2Tel", - "assitanceNiveau2Mail": "assitanceNiveau2Mail", - "asssistanceNiveau2Pays": "asssistanceNiveau2Pays", - "assistanceNiveau2NumeroVoie": "assistanceNiveau2NumeroVoie", - "assistanceNiveau2NomVoie": "rue Kennedy", - "assistanceNiveau2Commune": "assistanceNiveau2Commune", - "assistanceNiveau2CodePostal": "assistanceNiveau2CodePostal" - }, - "partitions": [{ - "id": 1, - "label": "lot hommes", - "dateDebutCollecte": "2023-01-16T14:07:23.001Z", - "dateFinCollecte": "2024-01-16T14:07:23.001Z", - "dateRetour": "2024-01-16T14:07:23.001Z" - }], - "questionnaireModels": [{ - "id": "tic2023a00_web", - "cheminRepertoire": "coleman", - "label": "Super modèle 1", - "requiredNomenclatureIds": [ - "L_DEPNAIS-1-1-0", - "L_PAYSNAIS-1-1-0", - "L_NATIONETR-1-1-0" - ] - }], - "nomenclatures": [ - { - "id": "L_DEPNAIS-1-1-0", - "cheminRepertoire": " DEPNAIS", - "label": "Liste des départements" - }, - { - "id": "L_PAYSNAIS-1-1-0", - "cheminRepertoire": "PAYSNAIS", - "label": "liste des pays" - }, - { - "id": "L_NATIONETR-1-1-0", - "label": "liste des nationalités" - } - ] -} \ No newline at end of file diff --git a/src/test/backup/ressources/service/platine/delegate/protools-contexte-platine-individu.json b/src/test/backup/ressources/service/platine/delegate/protools-contexte-platine-individu.json deleted file mode 100644 index 4e245ed3..00000000 --- a/src/test/backup/ressources/service/platine/delegate/protools-contexte-platine-individu.json +++ /dev/null @@ -1,88 +0,0 @@ -{ - "id": "DEM2022X00", - "label": "Enquête démo 2022 - séquence 1", - "contexte": "household", - "metadonnees": { - "annee": 2022, - "periodicite": "X", - "periode": "X00", - "operationId": "DEM2022", - "operationLabelCourt": "operationLabelCourt", - "operationLabelLong": "operationLabelLong", - "serieId": "DEM", - "serieLabelCourt": "serieLabelCourt", - "serieLabelLong": "serieLabelLong", - "portailMesEnquetesOperation": true, - "objectifsCourts": "objectifsCourts", - "objectifsLongs": "objectifsLongs", - "caractereObligatoire": true, - "qualiteStatistique": true, - "testNonLabellise": true, - "anneeVisa": 2022, - "numeroVisa": "2022xxxxxx", - "ministereTutelle": "de l'Économie, des Finances et de la Souveraineté Industrielle et Numérique", - "parutionJo": true, - "dateParutionJo": "2021-12-23", - "responsableOperationnel": "L’Institut national de la statistique et des études économiques (Insee)", - "responsableTraitement": "l'Insee", - "cnisUrl": "http://cnis/DOG2021", - "diffusionUrl": "http://diffusion/DOG2021", - "noticeUrl": "http://notice/DOG2021", - "specimenUrl": "http://specimenUrl/DOG2021", - "proprietaireId": "proprietaireId", - "proprietaireLabel": "proprietaireLabel", - "proprietaireLogo": "proprietaireLogo", - "assistanceNiveau2Id": "assistanceNiveau2Id", - "assistanceNiveau2Label": "assistanceNiveau2Label", - "assistanceNiveau2Tel": "assistanceNiveau2Tel", - "assitanceNiveau2Mail": "assitanceNiveau2Mail", - "asssistanceNiveau2Pays": "asssistanceNiveau2Pays", - "assistanceNiveau2NumeroVoie": "assistanceNiveau2NumeroVoie", - "assistanceNiveau2NomVoie": "rue Kennedy", - "assistanceNiveau2Commune": "assistanceNiveau2Commune", - "assistanceNiveau2CodePostal": "assistanceNiveau2CodePostal", - "urlLoiStatistique": "urlLoiStatistique_val", - "urlLoiRGPD": "urlLoiRGPD_val", - "urlLoiInformatique": "urlLoiInformatique_val" - - }, - "partitions": [{ - "id": 1, - "label": "lot hommes", - "typeEchantillon" : "INDIVIDU", - "dateDebutCollecte": "2023-01-16T14:07:23.001Z", - "dateFinCollecte": "2024-01-16T14:07:23.001Z", - "dateRetour": "2024-01-16T14:07:23.001Z", - "questionnaireModel": "tic2023a00_web", - "quiRepond1": "Qui doit répondre paragraphe 1", - "quiRepond2": "Qui doit répondre paragraphe 2", - "quiRepond3": "Qui doit répondre paragraphe 3" - }], - "questionnaireModels": [{ - "id": "tic2023a00_web", - "cheminRepertoire": "coleman", - "label": "Super modèle 1", - "requiredNomenclatureIds": [ - "L_DEPNAIS-1-1-0", - "L_PAYSNAIS-1-1-0", - "L_NATIONETR-1-1-0" - ] - }], - "nomenclatures": [ - { - "id": "L_DEPNAIS-1-1-0", - "cheminRepertoire": "DEPNAIS", - "label": "Liste des départements" - }, - { - "id": "L_PAYSNAIS-1-1-0", - "cheminRepertoire": "PAYSNAIS", - "label": "liste des pays" - }, - { - "id": "L_NATIONETR-1-1-0", - "cheminRepertoire": "NATIONETR", - "label": "liste des nationalités" - } - ] -} \ No newline at end of file diff --git a/src/test/backup/ressources/service/platine/delegate/protools-contexte-platine-logement.json b/src/test/backup/ressources/service/platine/delegate/protools-contexte-platine-logement.json deleted file mode 100644 index 54c24fa8..00000000 --- a/src/test/backup/ressources/service/platine/delegate/protools-contexte-platine-logement.json +++ /dev/null @@ -1,84 +0,0 @@ -{ - "id": "DEM2022X00", - "label": "Enquête démo 2022 - séquence 1", - "contexte": "menage", - "metadonnees": { - "annee": 2022, - "periodicite": "X", - "periode": "X00", - "operationId": "DEM2022", - "operationLabelCourt": "operationLabelCourt", - "operationLabelLong": "operationLabelLong", - "serieId": "DEM", - "serieLabelCourt": "serieLabelCourt", - "serieLabelLong": "serieLabelLong", - "portailMesEnquetesOperation": true, - "objectifsCourts": "objectifsCourts", - "objectifsLongs": "objectifsLongs", - "caractereObligatoire": true, - "qualiteStatistique": true, - "testNonLabellise": true, - "anneeVisa": 2022, - "numeroVisa": "2022xxxxxx", - "ministereTutelle": "de l'Économie, des Finances et de la Souveraineté Industrielle et Numérique", - "parutionJo": true, - "dateParutionJo": "2021-12-23", - "responsableOperationnel": "L’Institut national de la statistique et des études économiques (Insee)", - "responsableTraitement": "l'Insee", - "cnisUrl": "http://cnis/DOG2021", - "diffusionUrl": "http://diffusion/DOG2021", - "noticeUrl": "http://notice/DOG2021", - "specimenUrl": "http://specimenUrl/DOG2021", - "proprietaireId": "proprietaireId", - "proprietaireLabel": "proprietaireLabel", - "proprietaireLogo": "proprietaireLogo", - "assistanceNiveau2Id": "assistanceNiveau2Id", - "assistanceNiveau2Label": "assistanceNiveau2Label", - "assistanceNiveau2Tel": "assistanceNiveau2Tel", - "assitanceNiveau2Mail": "assitanceNiveau2Mail", - "asssistanceNiveau2Pays": "asssistanceNiveau2Pays", - "assistanceNiveau2NumeroVoie": "assistanceNiveau2NumeroVoie", - "assistanceNiveau2NomVoie": "rue Kennedy", - "assistanceNiveau2Commune": "assistanceNiveau2Commune", - "assistanceNiveau2CodePostal": "assistanceNiveau2CodePostal" - }, - "partitions": [{ - "id": 1, - "label": "lot hommes", - "typeEchantillon" : "LOGEMENT", - "dateDebutCollecte": "2023-01-16T14:07:23.001Z", - "dateFinCollecte": "2024-01-16T14:07:23.001Z", - "dateRetour": "2024-01-16T14:07:23.001Z", - "questionnaireModel": "tic2023a00_web", - "quiRepond1": "Qui doit répondre paragraphe 1", - "quiRepond2": "Qui doit répondre paragraphe 2", - "quiRepond3": "Qui doit répondre paragraphe 3" - }], - "questionnaireModels": [{ - "id": "tic2023a00_web", - "cheminRepertoire": "coleman", - "label": "Super modèle 1", - "requiredNomenclatureIds": [ - "L_DEPNAIS-1-1-0", - "L_PAYSNAIS-1-1-0", - "L_NATIONETR-1-1-0" - ] - }], - "nomenclatures": [ - { - "id": "L_DEPNAIS-1-1-0", - "cheminRepertoire": "DEPNAIS", - "label": "Liste des départements" - }, - { - "id": "L_PAYSNAIS-1-1-0", - "cheminRepertoire": "PAYSNAIS", - "label": "liste des pays" - }, - { - "id": "L_NATIONETR-1-1-0", - "cheminRepertoire": "NATIONETR", - "label": "liste des nationalités" - } - ] -} \ No newline at end of file diff --git a/src/test/backup/ressources/service/sabiane/delegate/expected_post_questionnaire_metadata.json b/src/test/backup/ressources/service/sabiane/delegate/expected_post_questionnaire_metadata.json deleted file mode 100644 index 47609748..00000000 --- a/src/test/backup/ressources/service/sabiane/delegate/expected_post_questionnaire_metadata.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "value": { - "variables": [ - { - "name": "Enq_LibelleEnquete", - "value": "Enquête de démo 2022" - } - ], - "inseeContext": "household" - } -} \ No newline at end of file diff --git a/src/test/backup/ressources/service/sabiane/delegate/pilotage_expected_post_campaign.json b/src/test/backup/ressources/service/sabiane/delegate/pilotage_expected_post_campaign.json deleted file mode 100644 index adec50fa..00000000 --- a/src/test/backup/ressources/service/sabiane/delegate/pilotage_expected_post_campaign.json +++ /dev/null @@ -1,48 +0,0 @@ -{ - "campaign":"MBG2022X01", - "campaignLabel":"Enquête de démo 2022 - séquence 1", - "visibilities":[ - { - "organizationalUnit":"OU-TEST1", - "collectionStartDate":1673878043001, - "collectionEndDate":1705414043001, - "identificationPhaseStartDate":1673878043001, - "interviewerStartDate":1673878043001, - "managementStartDate":1705414043001, - "endDate":1705414043001 - }, - { - "organizationalUnit":"OU-TEST2", - "collectionStartDate":1673878043001, - "collectionEndDate":1705414043001, - "identificationPhaseStartDate":1673878043001, - "interviewerStartDate":1673878043001, - "managementStartDate":1705414043001, - "endDate":1705414043001 - } - ], - "referents":[ - { - "firstName":"Paul", - "lastName":"Durand", - "phoneNumber":"0101010101", - "role":"PRIMARY" - }, - { - "firstName":"Jean", - "lastName":"Dupont", - "phoneNumber":"0101010102", - "role":"PRIMARY" - }, - { - "firstName":"Léa", - "lastName":"Durand", - "phoneNumber":"0101010103", - "role":"SECONDARY" - } - ], - "email":"blabla@insee.fr", - "identificationConfiguration":"IASCO", - "contactOutcomeConfiguration":"TEL", - "contactAttemptConfiguration":"TEL" -} \ No newline at end of file diff --git a/src/test/backup/ressources/service/sabiane/delegate/protools-contexte-sabiane-incorrect.json b/src/test/backup/ressources/service/sabiane/delegate/protools-contexte-sabiane-incorrect.json deleted file mode 100644 index 28548ab7..00000000 --- a/src/test/backup/ressources/service/sabiane/delegate/protools-contexte-sabiane-incorrect.json +++ /dev/null @@ -1,93 +0,0 @@ -{ - "id": "MBG2022X01", - "label": "Enquête de démo 2022 - séquence 1", - "contexte": "household", - "metadonnees": { - "operationLabelCourt": "Démo 2022", - "ERROR___________operationLabelLong": "Enquête de démo 2022", - "assitanceNiveau2Mail": "blabla@insee.fr", - "reperage": "faf_logement", - "essaisContact": "tel", - "bilanContact": "tel", - "referentsPrincipaux": [ - { - "nom": "Durand", - "prenom": "Paul", - "telephone": "0101010101" - }, - { - "nom": "Dupont", - "prenom": "Jean", - "telephone": "0101010102" - } - ], - "referentsSecondaires": [ - { - "nom": "Durand", - "prenom": "Léa", - "telephone": "0101010103" - } - ] - }, - "partitions": [{ - "id": 59901, - "label": "lot hommes", - "dateDebutCollecte": "2023-01-16T14:07:23.001Z", - "dateFinCollecte": "2023-01-16T14:07:23.001Z", - "dateDebutVisibiliteGestionnaire": "2023-01-16T14:07:23.001Z", - "dateDebutVisibiliteEnqueteur": "2023-01-16T14:07:23.001Z", - "dateDebutReperage": "2023-01-16T14:07:23.001Z", - "dateFinTraitement": "2023-01-16T14:07:23.001Z" - }, - { - "id": 59902, - "label": "lot femmes", - "dateDebutCollecte": "2024-01-16T14:07:23.001Z", - "dateFinCollecte": "2024-01-16T14:07:23.001Z", - "dateDebutVisibiliteGestionnaire": "2024-01-16T14:07:23.001Z", - "dateDebutVisibiliteEnqueteur": "2024-01-16T14:07:23.001Z", - "dateDebutReperage": "2024-01-16T14:07:23.001Z", - "dateFinTraitement": "2024-01-16T14:07:23.001Z" - } - ], - "questionnaireModels": [{ - "id": "tic2023a00_webMBG", - "cheminRepertoire": "coleman", - "label": "Super modèle 1", - "requiredNomenclatureIds": [ - "L_DEPNAIS-1-1-0", - "L_PAYSNAIS-1-1-0", - "L_NATIONETR-1-1-0" - ] - }, - { - "id": "FAM2022X01", - "cheminRepertoire": "sabiane", - "label": "Super modèle 2", - "requiredNomenclatureIds": [ - "L_COMMUNEPASSEE-1-1-0" - ] - }], - "nomenclatures": [ - { - "id": "L_DEPNAIS-1-1-0", - "cheminRepertoire": " DEPNAIS", - "label": "Liste des départements" - }, - { - "id": "L_PAYSNAIS-1-1-0", - "cheminRepertoire": "PAYSNAIS", - "label": "liste des pays" - }, - { - "id": "L_NATIONETR-1-1-0", - "cheminRepertoire": "NATIONETR", - "label": "liste des nationalités" - }, - { - "id": "L_COMMUNEPASSEE-1-1-0", - "cheminRepertoire": "COMMUNEPASSEE", - "label": "liste des communes" - } - ] -} \ No newline at end of file diff --git a/src/test/backup/ressources/service/sabiane/delegate/protools-contexte-sabiane.json b/src/test/backup/ressources/service/sabiane/delegate/protools-contexte-sabiane.json deleted file mode 100644 index 4c4bc920..00000000 --- a/src/test/backup/ressources/service/sabiane/delegate/protools-contexte-sabiane.json +++ /dev/null @@ -1,94 +0,0 @@ -{ - "id": "MBG2022X01", - "label": "Enquête de démo 2022 - séquence 1", - "contexte": "household", - "metadonnees": { - "operationLabelCourt": "Démo 2022", - "operationLabelLong": "Enquête de démo 2022", - "assitanceNiveau2Mail": "blabla@insee.fr", - "reperage": "faf_logement", - "essaisContact": "tel", - "bilanContact": "tel", - "referentsPrincipaux": [ - { - "nom": "Durand", - "prenom": "Paul", - "telephone": "0101010101" - }, - { - "nom": "Dupont", - "prenom": "Jean", - "telephone": "0101010102" - } - ], - "referentsSecondaires": [ - { - "nom": "Durand", - "prenom": "Léa", - "telephone": "0101010103" - } - ], - "sitesGestion": [ "OU-TEST1" , "OU-TEST2" ] - }, - "partitions": [{ - "id": 59901, - "label": "lot hommes", - "dateDebutCollecte": "2023-01-16T14:07:23.001Z", - "dateFinCollecte": "2023-01-16T14:07:23.001Z", - "dateDebutVisibiliteGestionnaire": "2023-01-16T14:07:23.001Z", - "dateDebutVisibiliteEnqueteur": "2023-01-16T14:07:23.001Z", - "dateDebutReperage": "2023-01-16T14:07:23.001Z", - "dateFinTraitement": "2023-01-16T14:07:23.001Z" - }, - { - "id": 59902, - "label": "lot femmes", - "dateDebutCollecte": "2024-01-16T14:07:23.001Z", - "dateFinCollecte": "2024-01-16T14:07:23.001Z", - "dateDebutVisibiliteGestionnaire": "2024-01-16T14:07:23.001Z", - "dateDebutVisibiliteEnqueteur": "2024-01-16T14:07:23.001Z", - "dateDebutReperage": "2024-01-16T14:07:23.001Z", - "dateFinTraitement": "2024-01-16T14:07:23.001Z" - } - ], - "questionnaireModels": [{ - "id": "tic2023a00_webMBG", - "cheminRepertoire": "coleman", - "label": "Super modèle 1", - "requiredNomenclatureIds": [ - "L_DEPNAIS-1-1-0", - "L_PAYSNAIS-1-1-0", - "L_NATIONETR-1-1-0" - ] - }, - { - "id": "FAM2022X01", - "cheminRepertoire": "sabiane", - "label": "Super modèle 2", - "requiredNomenclatureIds": [ - "L_COMMUNEPASSEE-1-1-0" - ] - }], - "nomenclatures": [ - { - "id": "L_DEPNAIS-1-1-0", - "cheminRepertoire": " DEPNAIS", - "label": "Liste des départements" - }, - { - "id": "L_PAYSNAIS-1-1-0", - "cheminRepertoire": "PAYSNAIS", - "label": "liste des pays" - }, - { - "id": "L_NATIONETR-1-1-0", - "cheminRepertoire": "NATIONETR", - "label": "liste des nationalités" - }, - { - "id": "L_COMMUNEPASSEE-1-1-0", - "cheminRepertoire": "COMMUNEPASSEE", - "label": "liste des communes" - } - ] -} \ No newline at end of file diff --git a/src/test/backup/ressources/service/utils/data/rem-su-noMainOrSurveyed.json b/src/test/backup/ressources/service/utils/data/rem-su-noMainOrSurveyed.json deleted file mode 100644 index 38091cef..00000000 --- a/src/test/backup/ressources/service/utils/data/rem-su-noMainOrSurveyed.json +++ /dev/null @@ -1,91 +0,0 @@ -{ - "repositoryId": 3043280, - "externalId": "012797237", - "externalName": null, - "context": "HOUSEHOLD", - "address": { - "streetNumber": "1", - "repetitionIndex": null, - "streetType": null, - "streetName": "RUE DE L INSEE", - "addressSupplement": "BAT DE TEST", - "cityName": "LILLE", - "zipCode": "59000", - "cedexCode": null, - "cedexName": null, - "specialDistribution": null, - "countryCode": null, - "countryName": null, - "locationHelp": { - "cityCode": "31488", - "building": null, - "floor": "00/_", - "staircase": null, - "door": null, - "iris": "0104", - "sector": "up_31488", - "gpsCoordinates": { - "latitude": 43.00000000000000, - "longitude": 1.00000000000000 - }, - "elevator": null, - "cityPriorityDistrict": false - } - }, - "persons": [ - { - "index": 1, - "externalId": "012797237", - "function": null, - "gender": "2", - "firstName": "TOBEFOUND", - "lastName": null, - "birthName": "Nom de test", - "dateOfBirth": "19000101", - "surveyed": false, - "main": false, - "coDeclarant": null, - "phoneNumbers": [ - { - "source": "INITIAL", - "favorite": false, - "number": "0601020304" - } - ], - "emails": [ - { - "source": "INITIAL", - "favorite": false, - "mailAddress": "test@gmail.com" - } - ], - "address": null - } - ], - "otherIdentifier": { - "numfa": null, - "rges": "1", - "ssech": "2", - "cle": null, - "le": null, - "ec": null, - "bs": null, - "nograp": null, - "nolog": null, - "noi": null, - "nole": null, - "autre": null - }, - "additionalInformations": [ - { - "key": "ident_ind_dec", - "value": "012797237" - } - ], - "externals": { - "EXTERNAL": { - "ADMINISTRATION1": "Insee", - "ADMINISTRATION2": "Patate" - } - } -} \ No newline at end of file diff --git a/src/test/backup/ressources/service/utils/data/rem-su-test-selection.json b/src/test/backup/ressources/service/utils/data/rem-su-test-selection.json deleted file mode 100644 index 9ce5cf24..00000000 --- a/src/test/backup/ressources/service/utils/data/rem-su-test-selection.json +++ /dev/null @@ -1,141 +0,0 @@ -{ - "repositoryId": 3043280, - "externalId": "012797237", - "externalName": null, - "context": "HOUSEHOLD", - "address": { - "streetNumber": "1", - "repetitionIndex": null, - "streetType": null, - "streetName": "RUE DE L INSEE", - "addressSupplement": "SupplementAdresse", - "cityName": "Lille", - "zipCode": "59000", - "cedexCode": null, - "cedexName": null, - "specialDistribution": "specialDistribution", - "countryCode": null, - "countryName": null, - "locationHelp": { - "cityCode": "31488", - "building": null, - "floor": "00/_", - "staircase": null, - "door": "door", - "iris": "0104", - "sector": "up_31488", - "cityPriorityDistrict": false - } - }, - "otherIdentifier": { - "numfa": null, - "rges": null, - "ssech": null, - "cle": null, - "le": null, - "ec": null, - "bs": null, - "nograp": null, - "nolog": null, - "noi": null, - "nole": null, - "autre": null - }, - "persons": [ - { - "index": 1, - "externalId": "012797237", - "function": null, - "gender": "2", - "firstName": "firstName1", - "lastName": "lastName1", - "birthName": "Nom de test", - "dateOfBirth": "19800505", - "surveyed": false, - "main": false, - "coDeclarant": null, - "phoneNumbers": [ - { - "source": "INITIAL", - "favorite": false, - "number": "01" - } - ], - "emails": [ - { - "source": "INITIAL", - "favorite": false, - "mailAddress": "test1@gmail.com" - } - ], - "address": null - }, - { - "index": 2, - "externalId": "012797236", - "function": null, - "gender": "2", - "firstName": "firstName2", - "lastName": "lastName2", - "birthName": "Nom de test", - "dateOfBirth": "19800102", - "surveyed": true, - "main": true, - "coDeclarant": null, - "phoneNumbers": [ - { - "source": "INITIAL", - "favorite": false, - "number": "02" - } - ], - "emails": [ - { - "source": "INITIAL", - "favorite": false, - "mailAddress": "test2@gmail.com" - } - ], - "address": null - }, - { - "index": 3, - "externalId": "012797235", - "function": null, - "gender": "2", - "firstName": "firstName3", - "lastName": "lastName3", - "birthName": "Nom de test", - "dateOfBirth": "19800103", - "surveyed": false, - "main": false, - "coDeclarant": null, - "phoneNumbers": [ - { - "source": "INITIAL", - "favorite": false, - "number": "0601020304" - } - ], - "emails": [ - { - "source": "INITIAL", - "favorite": false, - "mailAddress": "test3a@gmail.com" - }, - { - "source": "INITIAL", - "favorite": true, - "mailAddress": "test3b@gmail.com" - } - ], - "address": null - } - ], - "additionalInformations": [ - { - "key": "pole_gestion_opale", - "value": "ID_POLE_GESTION_OPALE" - } - ] -} \ No newline at end of file diff --git a/src/test/backup/ressources/service/utils/data/rem-su_1personne.json b/src/test/backup/ressources/service/utils/data/rem-su_1personne.json deleted file mode 100644 index af47cb1e..00000000 --- a/src/test/backup/ressources/service/utils/data/rem-su_1personne.json +++ /dev/null @@ -1,91 +0,0 @@ -{ - "repositoryId": 3043280, - "externalId": "012797237", - "externalName": null, - "context": "HOUSEHOLD", - "address": { - "streetNumber": "1", - "repetitionIndex": null, - "streetType": null, - "streetName": "RUE DE L INSEE", - "addressSupplement": "BAT DE TEST", - "cityName": "LILLE", - "zipCode": "59000", - "cedexCode": null, - "cedexName": null, - "specialDistribution": null, - "countryCode": null, - "countryName": null, - "locationHelp": { - "cityCode": "31488", - "building": null, - "floor": "00/_", - "staircase": null, - "door": null, - "iris": "0104", - "sector": "up_31488", - "gpsCoordinates": { - "latitude": 43.00000000000000, - "longitude": 1.00000000000000 - }, - "elevator": null, - "cityPriorityDistrict": false - } - }, - "persons": [ - { - "index": 1, - "externalId": "012797237", - "function": null, - "gender": "2", - "firstName": "TOBEFOUND", - "lastName": null, - "birthName": "Nom de test", - "dateOfBirth": "19000101", - "surveyed": true, - "main": true, - "coDeclarant": null, - "phoneNumbers": [ - { - "source": "INITIAL", - "favorite": false, - "number": "0601020304" - } - ], - "emails": [ - { - "source": "INITIAL", - "favorite": false, - "mailAddress": "test@gmail.com" - } - ], - "address": null - } - ], - "otherIdentifier": { - "numfa": null, - "rges": "1", - "ssech": "2", - "cle": null, - "le": null, - "ec": null, - "bs": null, - "nograp": null, - "nolog": null, - "noi": null, - "nole": null, - "autre": null - }, - "additionalInformations": [ - { - "key": "ident_ind_dec", - "value": "012797237" - } - ], - "externals": { - "EXTERNAL": { - "ADMINISTRATION1": "Insee", - "ADMINISTRATION2": "Patate" - } - } -} \ No newline at end of file diff --git a/src/test/backup/ressources/service/utils/data/rem-su_3personnes.json b/src/test/backup/ressources/service/utils/data/rem-su_3personnes.json deleted file mode 100644 index 2fb3679b..00000000 --- a/src/test/backup/ressources/service/utils/data/rem-su_3personnes.json +++ /dev/null @@ -1,147 +0,0 @@ -{ - "repositoryId": 3043280, - "externalId": "012797237", - "externalName": null, - "context": "HOUSEHOLD", - "address": { - "streetNumber": "1", - "repetitionIndex": null, - "streetType": null, - "streetName": "RUE DE L INSEE", - "addressSupplement": "BAT DE TEST", - "cityName": "LILLE", - "zipCode": "59000", - "cedexCode": null, - "cedexName": null, - "specialDistribution": null, - "countryCode": null, - "countryName": null, - "locationHelp": { - "cityCode": "31488", - "building": null, - "floor": "00/_", - "staircase": null, - "door": null, - "iris": "0104", - "sector": "up_31488", - "gpsCoordinates": { - "latitude": 43.00000000000000, - "longitude": 1.00000000000000 - }, - "elevator": null, - "cityPriorityDistrict": false - } - }, - "persons": [ - { - "index": 1, - "externalId": "012797237", - "function": null, - "gender": "2", - "firstName": "PAS_CONTACT1", - "lastName": null, - "birthName": "Nom de test", - "dateOfBirth": "19000101", - "surveyed": false, - "main": false, - "coDeclarant": null, - "phoneNumbers": [ - { - "source": "INITIAL", - "favorite": false, - "number": "0601020304" - } - ], - "emails": [ - { - "source": "INITIAL", - "favorite": false, - "mailAddress": "test@gmail.com" - } - ], - "address": null - }, - { - "index": 2, - "externalId": "012797236", - "function": null, - "gender": "2", - "firstName": "TOBEFOUND", - "lastName": null, - "birthName": "Nom de test", - "dateOfBirth": "19000101", - "surveyed": true, - "main": true, - "coDeclarant": null, - "phoneNumbers": [ - { - "source": "INITIAL", - "favorite": false, - "number": "0601020304" - } - ], - "emails": [ - { - "source": "INITIAL", - "favorite": false, - "mailAddress": "test@gmail.com" - } - ], - "address": null - }, - { - "index": 3, - "externalId": "012797235", - "function": null, - "gender": "2", - "firstName": "PAS_CONTACT2", - "lastName": null, - "birthName": "Nom de test", - "dateOfBirth": "19000101", - "surveyed": false, - "main": false, - "coDeclarant": null, - "phoneNumbers": [ - { - "source": "INITIAL", - "favorite": false, - "number": "0601020304" - } - ], - "emails": [ - { - "source": "INITIAL", - "favorite": false, - "mailAddress": "test@gmail.com" - } - ], - "address": null - } - ], - "otherIdentifier": { - "numfa": null, - "rges": "1", - "ssech": "2", - "cle": null, - "le": null, - "ec": null, - "bs": null, - "nograp": null, - "nolog": null, - "noi": null, - "nole": null, - "autre": null - }, - "additionalInformations": [ - { - "key": "ident_ind_dec", - "value": "012797237" - } - ], - "externals": { - "EXTERNAL": { - "ADMINISTRATION1": "Insee", - "ADMINISTRATION2": "Patate" - } - } -} \ No newline at end of file diff --git a/src/test/java/fr/insee/protools/backend/integration/EraREMProcessTest.java b/src/test/java/fr/insee/protools/backend/integration/EraREMProcessTest.java index aac5957a..bef2ad87 100644 --- a/src/test/java/fr/insee/protools/backend/integration/EraREMProcessTest.java +++ b/src/test/java/fr/insee/protools/backend/integration/EraREMProcessTest.java @@ -3,9 +3,6 @@ import fr.insee.protools.backend.service.context.ContextServiceImpl; import fr.insee.protools.backend.service.rem.RemService; -import fr.insee.protools.backend.dto.rem_tmp.REMSurveyUnitDto; -import fr.insee.protools.backend.dto.rem_tmp.SuIdMappingJson; -import fr.insee.protools.backend.dto.rem_tmp.SuIdMappingRecord; import org.flowable.engine.test.Deployment; import org.flowable.engine.test.FlowableTest; import org.junit.jupiter.api.Test; @@ -33,7 +30,7 @@ @TestPropertySource(locations = "/application-test.properties") @ExtendWith(MockitoExtension.class) class EraREMProcessTest { - +/* @Autowired ContextServiceImpl contextService; @MockBean EraService eraService; @MockBean RemService remService; @@ -118,4 +115,5 @@ private static REMSurveyUnitDto createRemSUFromMapping(SuIdMappingRecord mapping .build(); } + */ } \ No newline at end of file diff --git a/src/test/backup/ressources/flowable/engine/SimpleProcessTest.testSimpleProcess.bpmn20.xml b/src/test/resources/fr/insee/protools/backend/integration/SimpleProcess.testSimpleProcess.bpmn20.xml similarity index 100% rename from src/test/backup/ressources/flowable/engine/SimpleProcessTest.testSimpleProcess.bpmn20.xml rename to src/test/resources/fr/insee/protools/backend/integration/SimpleProcess.testSimpleProcess.bpmn20.xml diff --git a/src/test/backup/ressources/integration/collecte_web_no_com.json b/src/test/resources/fr/insee/protools/backend/integration/collecte_web_no_com.json similarity index 100% rename from src/test/backup/ressources/integration/collecte_web_no_com.json rename to src/test/resources/fr/insee/protools/backend/integration/collecte_web_no_com.json diff --git a/src/test/backup/ressources/integration/noCTX_eraREM.bpmn20.xml b/src/test/resources/fr/insee/protools/backend/integration/noCTX_eraREM.bpmn20.xml similarity index 100% rename from src/test/backup/ressources/integration/noCTX_eraREM.bpmn20.xml rename to src/test/resources/fr/insee/protools/backend/integration/noCTX_eraREM.bpmn20.xml From 29661301858171da6ab185fb8a28f31959162133 Mon Sep 17 00:00:00 2001 From: SNDIL - Marc Date: Fri, 20 Sep 2024 14:27:22 +0200 Subject: [PATCH 69/75] passe sonarLing --- .../dto/rem_tmp/InterrogationIdentifiersDto.java | 12 +++--------- .../protools/backend/flowable/types/ListLong.java | 2 +- .../backend/service/DelegateContextVerifier.java | 2 -- .../backend/service/context/ContextConstants.java | 5 ----- .../context/resolvers/PartitionCtxResolver.java | 2 +- ...nePilotageCreateCommunicationEventTaskREST.java | 4 ---- .../platine/service/PlatinePilotageService.java | 2 +- .../service/PlatineQuestionnaireService.java | 2 +- .../protools/backend/service/rem/RemService.java | 2 +- .../backend/service/sugoi/SugoiService.java | 4 +--- .../TraiterXXXService.java | 4 ++-- .../delegate/TraiterXXXCreateContextTaskREST.java | 4 ++-- .../TraiterXXXGetRemiseEnCollecteTaskREST.java | 4 ++-- .../service/utils/FlowableVariableUtils.java | 1 + .../service/context/ContextServiceImplTest.java | 7 ++----- ...ePilotageCreateContextTaskRESTTestDelegate.java | 10 +++++----- ...reateInterrogationListTaskRESTTestDelegate.java | 10 +++++----- ...tionnaireCreateContextTaskRESTTestDelegate.java | 10 +++++----- ...reateInterrogationListTaskRESTTestDelegate.java | 10 +++++----- .../SugoiREMCreateMissingAccountListTaskTest.java | 6 +++--- .../TraiterXXXServiceTest.java | 3 +-- .../TraiterXXXCreateContextTaskRESTTest.java | 14 +++++++------- .../TraiterXXXGetRemiseEnCollecteTaskRESTTest.java | 4 ++-- .../backend/service/utils/CustomJWTHelper.java | 6 ++---- .../protools/backend/utils/data/CtxExamples.java | 8 ++++---- 25 files changed, 57 insertions(+), 81 deletions(-) delete mode 100644 src/main/java/fr/insee/protools/backend/service/context/ContextConstants.java rename src/main/java/fr/insee/protools/backend/service/{traiterXXXX => traiterxxxx}/TraiterXXXService.java (93%) rename src/main/java/fr/insee/protools/backend/service/{traiterXXXX => traiterxxxx}/delegate/TraiterXXXCreateContextTaskREST.java (91%) rename src/main/java/fr/insee/protools/backend/service/{traiterXXXX => traiterxxxx}/delegate/TraiterXXXGetRemiseEnCollecteTaskREST.java (92%) rename src/test/java/fr/insee/protools/backend/service/{traiterXXXX => traiterxxxx}/TraiterXXXServiceTest.java (94%) rename src/test/java/fr/insee/protools/backend/service/{traiterXXXX => traiterxxxx}/delegate/TraiterXXXCreateContextTaskRESTTest.java (77%) rename src/test/java/fr/insee/protools/backend/service/{traiterXXXX => traiterxxxx}/delegate/TraiterXXXGetRemiseEnCollecteTaskRESTTest.java (95%) diff --git a/src/main/java/fr/insee/protools/backend/dto/rem_tmp/InterrogationIdentifiersDto.java b/src/main/java/fr/insee/protools/backend/dto/rem_tmp/InterrogationIdentifiersDto.java index d328d761..3e1f30f9 100644 --- a/src/main/java/fr/insee/protools/backend/dto/rem_tmp/InterrogationIdentifiersDto.java +++ b/src/main/java/fr/insee/protools/backend/dto/rem_tmp/InterrogationIdentifiersDto.java @@ -1,18 +1,12 @@ package fr.insee.protools.backend.dto.rem_tmp; -import java.net.URI; -import java.util.Objects; import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonTypeName; -import java.util.UUID; -import java.time.OffsetDateTime; +import jakarta.annotation.Generated; import jakarta.validation.Valid; -import jakarta.validation.constraints.*; - -import java.util.*; -import jakarta.annotation.Generated; +import java.util.Objects; +import java.util.UUID; /** * InterrogationIdentifiersDto diff --git a/src/main/java/fr/insee/protools/backend/flowable/types/ListLong.java b/src/main/java/fr/insee/protools/backend/flowable/types/ListLong.java index 8fca4067..6af0f907 100644 --- a/src/main/java/fr/insee/protools/backend/flowable/types/ListLong.java +++ b/src/main/java/fr/insee/protools/backend/flowable/types/ListLong.java @@ -39,7 +39,7 @@ public Object getValue(ValueFields valueFields) { try { return Arrays.stream(valStr.split(",")) .map(Long::parseLong) - .collect(Collectors.toList()); + .toList(); } catch (NumberFormatException e) { throw new FlowableIllegalArgumentException("The given variable value is not comma separated list of Long: '" + valStr+ "'", e); } diff --git a/src/main/java/fr/insee/protools/backend/service/DelegateContextVerifier.java b/src/main/java/fr/insee/protools/backend/service/DelegateContextVerifier.java index fcc3e49c..6b134bb7 100644 --- a/src/main/java/fr/insee/protools/backend/service/DelegateContextVerifier.java +++ b/src/main/java/fr/insee/protools/backend/service/DelegateContextVerifier.java @@ -1,12 +1,10 @@ package fr.insee.protools.backend.service; -import com.fasterxml.jackson.databind.JsonNode; import fr.insee.protools.backend.dto.ContexteProcessus; import fr.insee.protools.backend.service.context.exception.BadContexMissingBPMNError; import fr.insee.protools.backend.service.context.exception.BadContextIncorrectBPMNError; import org.slf4j.Logger; -import java.util.HashSet; import java.util.Set; /** diff --git a/src/main/java/fr/insee/protools/backend/service/context/ContextConstants.java b/src/main/java/fr/insee/protools/backend/service/context/ContextConstants.java deleted file mode 100644 index 1d26e651..00000000 --- a/src/main/java/fr/insee/protools/backend/service/context/ContextConstants.java +++ /dev/null @@ -1,5 +0,0 @@ -package fr.insee.protools.backend.service.context; - -public final class ContextConstants { - - } \ No newline at end of file diff --git a/src/main/java/fr/insee/protools/backend/service/context/resolvers/PartitionCtxResolver.java b/src/main/java/fr/insee/protools/backend/service/context/resolvers/PartitionCtxResolver.java index 8208389e..0d5e9a1f 100644 --- a/src/main/java/fr/insee/protools/backend/service/context/resolvers/PartitionCtxResolver.java +++ b/src/main/java/fr/insee/protools/backend/service/context/resolvers/PartitionCtxResolver.java @@ -46,7 +46,7 @@ public class PartitionCtxResolver { private final TemporalAmount maxSendCommunicationWindowHours = Duration.ofHours(24);; //Date in a far away future - private final static Instant farAwayInstant = LocalDate.parse("9999-12-31").atStartOfDay(ZoneId.of("Europe/Paris")).toInstant(); + private static final Instant farAwayInstant = LocalDate.parse("9999-12-31").atStartOfDay(ZoneId.of("Europe/Paris")).toInstant(); private Optional getPartition(ExecutionEntity execution, String partitionId){ diff --git a/src/main/java/fr/insee/protools/backend/service/platine/delegate/pilotatage/PlatinePilotageCreateCommunicationEventTaskREST.java b/src/main/java/fr/insee/protools/backend/service/platine/delegate/pilotatage/PlatinePilotageCreateCommunicationEventTaskREST.java index 00ebe1ee..786f9ee7 100644 --- a/src/main/java/fr/insee/protools/backend/service/platine/delegate/pilotatage/PlatinePilotageCreateCommunicationEventTaskREST.java +++ b/src/main/java/fr/insee/protools/backend/service/platine/delegate/pilotatage/PlatinePilotageCreateCommunicationEventTaskREST.java @@ -46,10 +46,6 @@ public void execute(DelegateExecution execution) { return; } - - //TODO: put it at a single place ==> Maybe an helper to get the Id of an interro or of any json? - String jsonKeyId = "id"; - List platinePilotageCommunicationEventList = communicationRequestIdByInterroIdMap.entrySet() .stream() .map(entry -> diff --git a/src/main/java/fr/insee/protools/backend/service/platine/service/PlatinePilotageService.java b/src/main/java/fr/insee/protools/backend/service/platine/service/PlatinePilotageService.java index e1bbde07..a1d38b15 100644 --- a/src/main/java/fr/insee/protools/backend/service/platine/service/PlatinePilotageService.java +++ b/src/main/java/fr/insee/protools/backend/service/platine/service/PlatinePilotageService.java @@ -27,7 +27,7 @@ public class PlatinePilotageService { private final RestClientHelper restClientHelper; - private final ApiConfigProperties.KNOWN_API API= KNOWN_API_PLATINE_PILOTAGE; + private static final ApiConfigProperties.KNOWN_API API= KNOWN_API_PLATINE_PILOTAGE; @Value("${fr.insee.protools.api.platine-pilotage.interrogation.page.size:5000}") private int pageSizeGetInterro; diff --git a/src/main/java/fr/insee/protools/backend/service/platine/service/PlatineQuestionnaireService.java b/src/main/java/fr/insee/protools/backend/service/platine/service/PlatineQuestionnaireService.java index 7aa46318..1859a0b8 100644 --- a/src/main/java/fr/insee/protools/backend/service/platine/service/PlatineQuestionnaireService.java +++ b/src/main/java/fr/insee/protools/backend/service/platine/service/PlatineQuestionnaireService.java @@ -20,7 +20,7 @@ public class PlatineQuestionnaireService { private final RestClientHelper restClientHelper; - private final ApiConfigProperties.KNOWN_API API= KNOWN_API_PLATINE_QUESTIONNAIRE; + private static final ApiConfigProperties.KNOWN_API API= KNOWN_API_PLATINE_QUESTIONNAIRE; public void postContext(String campaignId, JsonNode contextRootNode) { log.trace("postContext: campaignId={}",campaignId); diff --git a/src/main/java/fr/insee/protools/backend/service/rem/RemService.java b/src/main/java/fr/insee/protools/backend/service/rem/RemService.java index 134b2233..a79abc4e 100644 --- a/src/main/java/fr/insee/protools/backend/service/rem/RemService.java +++ b/src/main/java/fr/insee/protools/backend/service/rem/RemService.java @@ -25,7 +25,7 @@ @RequiredArgsConstructor public class RemService { - private final ApiConfigProperties.KNOWN_API API = KNOWN_API_REM; + private static final ApiConfigProperties.KNOWN_API API = KNOWN_API_REM; private final RestClientHelper restClientHelper; @Value("${fr.insee.protools.api.rem.interrogation.page.size:5000}") private int pageSizeGetInterro; diff --git a/src/main/java/fr/insee/protools/backend/service/sugoi/SugoiService.java b/src/main/java/fr/insee/protools/backend/service/sugoi/SugoiService.java index 6ec1a420..cc28a063 100644 --- a/src/main/java/fr/insee/protools/backend/service/sugoi/SugoiService.java +++ b/src/main/java/fr/insee/protools/backend/service/sugoi/SugoiService.java @@ -20,10 +20,8 @@ @Slf4j @RequiredArgsConstructor public class SugoiService { - //TODO: a quel niveau configure on ça? - - private final ApiConfigProperties.KNOWN_API API = KNOWN_API_SUGOI; + private static final ApiConfigProperties.KNOWN_API API = KNOWN_API_SUGOI; static final String STORAGE = "default"; private final RestClientHelper restClientHelper; diff --git a/src/main/java/fr/insee/protools/backend/service/traiterXXXX/TraiterXXXService.java b/src/main/java/fr/insee/protools/backend/service/traiterxxxx/TraiterXXXService.java similarity index 93% rename from src/main/java/fr/insee/protools/backend/service/traiterXXXX/TraiterXXXService.java rename to src/main/java/fr/insee/protools/backend/service/traiterxxxx/TraiterXXXService.java index f0ecdf10..af1f7052 100644 --- a/src/main/java/fr/insee/protools/backend/service/traiterXXXX/TraiterXXXService.java +++ b/src/main/java/fr/insee/protools/backend/service/traiterxxxx/TraiterXXXService.java @@ -1,4 +1,4 @@ -package fr.insee.protools.backend.service.traiterXXXX; +package fr.insee.protools.backend.service.traiterxxxx; import com.fasterxml.jackson.databind.JsonNode; import fr.insee.protools.backend.restclient.RestClientHelper; @@ -18,7 +18,7 @@ public class TraiterXXXService { private final RestClientHelper restClientHelper; - private final ApiConfigProperties.KNOWN_API API = KNOWN_API_TRAITERXXX; + private static final ApiConfigProperties.KNOWN_API API = KNOWN_API_TRAITERXXX; public List getRemiseEnCollecteForPartition(String partitionId) { log.debug("getRemiseEnCollecteForPartition - partitionId={} ",partitionId); diff --git a/src/main/java/fr/insee/protools/backend/service/traiterXXXX/delegate/TraiterXXXCreateContextTaskREST.java b/src/main/java/fr/insee/protools/backend/service/traiterxxxx/delegate/TraiterXXXCreateContextTaskREST.java similarity index 91% rename from src/main/java/fr/insee/protools/backend/service/traiterXXXX/delegate/TraiterXXXCreateContextTaskREST.java rename to src/main/java/fr/insee/protools/backend/service/traiterxxxx/delegate/TraiterXXXCreateContextTaskREST.java index 0a6d2aab..317a537e 100644 --- a/src/main/java/fr/insee/protools/backend/service/traiterXXXX/delegate/TraiterXXXCreateContextTaskREST.java +++ b/src/main/java/fr/insee/protools/backend/service/traiterxxxx/delegate/TraiterXXXCreateContextTaskREST.java @@ -1,10 +1,10 @@ -package fr.insee.protools.backend.service.traiterXXXX.delegate; +package fr.insee.protools.backend.service.traiterxxxx.delegate; import com.fasterxml.jackson.databind.JsonNode; import fr.insee.protools.backend.dto.ContexteProcessus; import fr.insee.protools.backend.service.DelegateContextVerifier; import fr.insee.protools.backend.service.context.ContextService; -import fr.insee.protools.backend.service.traiterXXXX.TraiterXXXService; +import fr.insee.protools.backend.service.traiterxxxx.TraiterXXXService; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.flowable.engine.delegate.DelegateExecution; diff --git a/src/main/java/fr/insee/protools/backend/service/traiterXXXX/delegate/TraiterXXXGetRemiseEnCollecteTaskREST.java b/src/main/java/fr/insee/protools/backend/service/traiterxxxx/delegate/TraiterXXXGetRemiseEnCollecteTaskREST.java similarity index 92% rename from src/main/java/fr/insee/protools/backend/service/traiterXXXX/delegate/TraiterXXXGetRemiseEnCollecteTaskREST.java rename to src/main/java/fr/insee/protools/backend/service/traiterxxxx/delegate/TraiterXXXGetRemiseEnCollecteTaskREST.java index 7aae4046..6c202c0f 100644 --- a/src/main/java/fr/insee/protools/backend/service/traiterXXXX/delegate/TraiterXXXGetRemiseEnCollecteTaskREST.java +++ b/src/main/java/fr/insee/protools/backend/service/traiterxxxx/delegate/TraiterXXXGetRemiseEnCollecteTaskREST.java @@ -1,8 +1,8 @@ -package fr.insee.protools.backend.service.traiterXXXX.delegate; +package fr.insee.protools.backend.service.traiterxxxx.delegate; import com.fasterxml.jackson.databind.JsonNode; import fr.insee.protools.backend.service.DelegateContextVerifier; -import fr.insee.protools.backend.service.traiterXXXX.TraiterXXXService; +import fr.insee.protools.backend.service.traiterxxxx.TraiterXXXService; import fr.insee.protools.backend.service.utils.FlowableVariableUtils; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; diff --git a/src/main/java/fr/insee/protools/backend/service/utils/FlowableVariableUtils.java b/src/main/java/fr/insee/protools/backend/service/utils/FlowableVariableUtils.java index 61641c65..401b33bc 100644 --- a/src/main/java/fr/insee/protools/backend/service/utils/FlowableVariableUtils.java +++ b/src/main/java/fr/insee/protools/backend/service/utils/FlowableVariableUtils.java @@ -11,6 +11,7 @@ public class FlowableVariableUtils { * Throws Protools VariableClassCastException if the cast is not successful * Throws FlowableIllegalArgumentException if the variable is not found */ + @SuppressWarnings("squid:S1192") public static T getVariableOrThrow(DelegateExecution execution, String variableName, Class variableClass ){ T res; try{ diff --git a/src/test/java/fr/insee/protools/backend/service/context/ContextServiceImplTest.java b/src/test/java/fr/insee/protools/backend/service/context/ContextServiceImplTest.java index 89a6ac57..a8417228 100644 --- a/src/test/java/fr/insee/protools/backend/service/context/ContextServiceImplTest.java +++ b/src/test/java/fr/insee/protools/backend/service/context/ContextServiceImplTest.java @@ -50,11 +50,9 @@ @FlowableTest class ContextServiceImplTest { - final static String ressourceFolder = ClassUtils.convertClassNameToResourcePath(ContextServiceImplTest.class.getPackageName()); - + static final String ressourceFolder = ClassUtils.convertClassNameToResourcePath(ContextServiceImplTest.class.getPackageName()); static final ObjectReader objectReader = new ObjectMapper().registerModule(new JavaTimeModule()).reader(); // maybe with configs - - + @Spy @InjectMocks ContextServiceImpl contextService; @@ -261,7 +259,6 @@ void processContextFileAndCreateProcessInstance_should_throw_when_processDefinit InputStream resourceAsStream = this.getClass().getClassLoader().getResourceAsStream(ressourceFolder + "/minimal_valid_context.json"); MockMultipartFile multipartFile = new MockMultipartFile("file.json", "file.json", "text/json", resourceAsStream.readAllBytes()); initRuntimeServiceMock(); - String processDefinitionId="Throwning_ID"; doThrow(new FlowableObjectNotFoundException("msg")).when(runtimeService).startProcessInstanceByKey(any(),any(),anyMap()); doReturn(new ContextServiceImpl.ContextPair("{}",null)).when(contextService).processContextFile(any(),any()); //Call method under test diff --git a/src/test/java/fr/insee/protools/backend/service/platine/delegate/pilotatage/PlatinePilotageCreateContextTaskRESTTestDelegate.java b/src/test/java/fr/insee/protools/backend/service/platine/delegate/pilotatage/PlatinePilotageCreateContextTaskRESTTestDelegate.java index 25a70aee..731ccc82 100644 --- a/src/test/java/fr/insee/protools/backend/service/platine/delegate/pilotatage/PlatinePilotageCreateContextTaskRESTTestDelegate.java +++ b/src/test/java/fr/insee/protools/backend/service/platine/delegate/pilotatage/PlatinePilotageCreateContextTaskRESTTestDelegate.java @@ -16,8 +16,8 @@ import java.util.List; import java.util.Map; -import static fr.insee.protools.backend.utils.data.CtxExamples.ctx_empty; -import static fr.insee.protools.backend.utils.data.CtxExamples.ctx_empty_id; +import static fr.insee.protools.backend.utils.data.CtxExamples.CTX_EMPTY; +import static fr.insee.protools.backend.utils.data.CtxExamples.CTX_EMPTY_ID; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.times; @@ -36,14 +36,14 @@ class PlatinePilotageCreateContextTaskRESTTestDelegate extends TestDelegateWithC @Test void execute_should_work_when_contextOK() { DelegateExecution execution = createMockedExecution(); - JsonNode expectedContext = initContexteMockWithString(ctx_empty); + JsonNode expectedContext = initContexteMockWithString(CTX_EMPTY); //Execute the unit under test platinePilotageTask.execute(execution); //Verify postContext ArgumentCaptor acCtx = ArgumentCaptor.forClass(JsonNode.class); - verify(platinePilotageService,times(1)).postContext(eq(ctx_empty_id),acCtx.capture()); + verify(platinePilotageService,times(1)).postContext(eq(CTX_EMPTY_ID),acCtx.capture()); List allValues = acCtx.getAllValues(); assertEquals(1, allValues.size(),"We should have exactly one value"); @@ -63,6 +63,6 @@ public Map getVariablesAndTypes() { @Override protected String minimalValidCtxt() { - return ctx_empty; + return CTX_EMPTY; } } \ No newline at end of file diff --git a/src/test/java/fr/insee/protools/backend/service/platine/delegate/pilotatage/PlatinePilotageCreateInterrogationListTaskRESTTestDelegate.java b/src/test/java/fr/insee/protools/backend/service/platine/delegate/pilotatage/PlatinePilotageCreateInterrogationListTaskRESTTestDelegate.java index 75e47b1f..7ae44676 100644 --- a/src/test/java/fr/insee/protools/backend/service/platine/delegate/pilotatage/PlatinePilotageCreateInterrogationListTaskRESTTestDelegate.java +++ b/src/test/java/fr/insee/protools/backend/service/platine/delegate/pilotatage/PlatinePilotageCreateInterrogationListTaskRESTTestDelegate.java @@ -18,8 +18,8 @@ import static fr.insee.protools.backend.service.FlowableVariableNameConstants.VARNAME_CURRENT_PARTITION_ID; import static fr.insee.protools.backend.service.FlowableVariableNameConstants.VARNAME_REM_INTERRO_LIST; -import static fr.insee.protools.backend.utils.data.CtxExamples.ctx_empty; -import static fr.insee.protools.backend.utils.data.CtxExamples.ctx_empty_id; +import static fr.insee.protools.backend.utils.data.CtxExamples.CTX_EMPTY; +import static fr.insee.protools.backend.utils.data.CtxExamples.CTX_EMPTY_ID; import static fr.insee.protools.backend.utils.data.InterroExamples.generateEmptyInterro; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.mockito.ArgumentMatchers.eq; @@ -36,7 +36,7 @@ class PlatinePilotageCreateInterrogationListTaskRESTTestDelegate extends TestDel @Test void execute_should_work_when_contextOKVarOK() { DelegateExecution execution = createMockedExecution(); - JsonNode expectedContext = initContexteMockWithString(ctx_empty); + JsonNode expectedContext = initContexteMockWithString(CTX_EMPTY); //Process variables lenient().doReturn(String.valueOf(UUID.randomUUID())).when(execution).getVariable(VARNAME_CURRENT_PARTITION_ID, String.class); @@ -53,7 +53,7 @@ void execute_should_work_when_contextOKVarOK() { final ArgumentCaptor > listCaptor = ArgumentCaptor.forClass((Class) List.class); - verify(platinePilotageService,times(1)).postInterrogations(eq(ctx_empty_id),listCaptor.capture()); + verify(platinePilotageService,times(1)).postInterrogations(eq(CTX_EMPTY_ID),listCaptor.capture()); List> allValues = listCaptor.getAllValues(); assertEquals(1, allValues.size(),"We should have exactly one value"); @@ -74,6 +74,6 @@ public Map getVariablesAndTypes() { @Override protected String minimalValidCtxt() { - return ctx_empty; + return CTX_EMPTY; } } \ No newline at end of file diff --git a/src/test/java/fr/insee/protools/backend/service/platine/delegate/questionnaire/PlatineQuestionnaireCreateContextTaskRESTTestDelegate.java b/src/test/java/fr/insee/protools/backend/service/platine/delegate/questionnaire/PlatineQuestionnaireCreateContextTaskRESTTestDelegate.java index 60328284..6fbb57e4 100644 --- a/src/test/java/fr/insee/protools/backend/service/platine/delegate/questionnaire/PlatineQuestionnaireCreateContextTaskRESTTestDelegate.java +++ b/src/test/java/fr/insee/protools/backend/service/platine/delegate/questionnaire/PlatineQuestionnaireCreateContextTaskRESTTestDelegate.java @@ -13,8 +13,8 @@ import java.util.List; import java.util.Map; -import static fr.insee.protools.backend.utils.data.CtxExamples.ctx_empty; -import static fr.insee.protools.backend.utils.data.CtxExamples.ctx_empty_id; +import static fr.insee.protools.backend.utils.data.CtxExamples.CTX_EMPTY; +import static fr.insee.protools.backend.utils.data.CtxExamples.CTX_EMPTY_ID; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.times; @@ -42,14 +42,14 @@ public Map getVariablesAndTypes() { @Test void execute_should_work_when_contextOK() { DelegateExecution execution = createMockedExecution(); - JsonNode expectedContext = initContexteMockWithString(ctx_empty); + JsonNode expectedContext = initContexteMockWithString(CTX_EMPTY); //Execute the unit under test platineQuestionnaireTask.execute(execution); //Verify postContext ArgumentCaptor acCtx = ArgumentCaptor.forClass(JsonNode.class); - verify(platineQuestionnaireService,times(1)).postContext(eq(ctx_empty_id),acCtx.capture()); + verify(platineQuestionnaireService,times(1)).postContext(eq(CTX_EMPTY_ID),acCtx.capture()); List allValues = acCtx.getAllValues(); assertEquals(1, allValues.size(),"We should have exactly one value"); @@ -59,6 +59,6 @@ void execute_should_work_when_contextOK() { @Override protected String minimalValidCtxt() { - return ctx_empty; + return CTX_EMPTY; } } \ No newline at end of file diff --git a/src/test/java/fr/insee/protools/backend/service/platine/delegate/questionnaire/PlatineQuestionnaireCreateInterrogationListTaskRESTTestDelegate.java b/src/test/java/fr/insee/protools/backend/service/platine/delegate/questionnaire/PlatineQuestionnaireCreateInterrogationListTaskRESTTestDelegate.java index db6821d6..b9be1c66 100644 --- a/src/test/java/fr/insee/protools/backend/service/platine/delegate/questionnaire/PlatineQuestionnaireCreateInterrogationListTaskRESTTestDelegate.java +++ b/src/test/java/fr/insee/protools/backend/service/platine/delegate/questionnaire/PlatineQuestionnaireCreateInterrogationListTaskRESTTestDelegate.java @@ -18,8 +18,8 @@ import static fr.insee.protools.backend.service.FlowableVariableNameConstants.VARNAME_CURRENT_PARTITION_ID; import static fr.insee.protools.backend.service.FlowableVariableNameConstants.VARNAME_REM_INTERRO_LIST; -import static fr.insee.protools.backend.utils.data.CtxExamples.ctx_empty; -import static fr.insee.protools.backend.utils.data.CtxExamples.ctx_empty_id; +import static fr.insee.protools.backend.utils.data.CtxExamples.CTX_EMPTY; +import static fr.insee.protools.backend.utils.data.CtxExamples.CTX_EMPTY_ID; import static fr.insee.protools.backend.utils.data.InterroExamples.generateEmptyInterro; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.mockito.ArgumentMatchers.eq; @@ -36,7 +36,7 @@ class PlatineQuestionnaireCreateInterrogationListTaskRESTTestDelegate extends Te @Test void execute_should_work_when_contextOKVarOK() { DelegateExecution execution = createMockedExecution(); - JsonNode expectedContext = initContexteMockWithString(ctx_empty); + JsonNode expectedContext = initContexteMockWithString(CTX_EMPTY); //Process variables lenient().doReturn(String.valueOf(UUID.randomUUID())).when(execution).getVariable(VARNAME_CURRENT_PARTITION_ID, String.class); @@ -53,7 +53,7 @@ void execute_should_work_when_contextOKVarOK() { final ArgumentCaptor > listCaptor = ArgumentCaptor.forClass((Class) List.class); - verify(platineQuestionnaireService,times(1)).postInterrogations(eq(ctx_empty_id),listCaptor.capture()); + verify(platineQuestionnaireService,times(1)).postInterrogations(eq(CTX_EMPTY_ID),listCaptor.capture()); List> allValues = listCaptor.getAllValues(); assertEquals(1, allValues.size(),"We should have exactly one value"); @@ -74,6 +74,6 @@ public Map getVariablesAndTypes() { @Override protected String minimalValidCtxt() { - return ctx_empty; + return CTX_EMPTY; } } \ No newline at end of file diff --git a/src/test/java/fr/insee/protools/backend/service/sugoi_rem/delegate/SugoiREMCreateMissingAccountListTaskTest.java b/src/test/java/fr/insee/protools/backend/service/sugoi_rem/delegate/SugoiREMCreateMissingAccountListTaskTest.java index 2704708f..178c8994 100644 --- a/src/test/java/fr/insee/protools/backend/service/sugoi_rem/delegate/SugoiREMCreateMissingAccountListTaskTest.java +++ b/src/test/java/fr/insee/protools/backend/service/sugoi_rem/delegate/SugoiREMCreateMissingAccountListTaskTest.java @@ -81,7 +81,7 @@ record MockData(String idInterro, String sugoiResponseUserName, User createdUser String contexts_as_string; if(context.equals("menage")) { - contexts_as_string=ctx_contexte_menage; + contexts_as_string= CTX_CONTEXTE_MENAGE; tmpexpectedPwdSize=8; } else if(context.equals("entreprise")){ @@ -145,13 +145,13 @@ public Map getVariablesAndTypes() { @Override protected String minimalValidCtxt() { - return ctx_contexte_menage; + return CTX_CONTEXTE_MENAGE; } @Test void getPasswordSize_should_return8_for_menage() throws JsonProcessingException { //prepare - ContexteProcessus schema = new ObjectMapper().readValue(ctx_contexte_menage, ContexteProcessus.class); + ContexteProcessus schema = new ObjectMapper().readValue(CTX_CONTEXTE_MENAGE, ContexteProcessus.class); //Call method under tests int pwdSize=task.getPasswordSize(schema); //Verify diff --git a/src/test/java/fr/insee/protools/backend/service/traiterXXXX/TraiterXXXServiceTest.java b/src/test/java/fr/insee/protools/backend/service/traiterxxxx/TraiterXXXServiceTest.java similarity index 94% rename from src/test/java/fr/insee/protools/backend/service/traiterXXXX/TraiterXXXServiceTest.java rename to src/test/java/fr/insee/protools/backend/service/traiterxxxx/TraiterXXXServiceTest.java index eafb08fd..9cf02dbb 100644 --- a/src/test/java/fr/insee/protools/backend/service/traiterXXXX/TraiterXXXServiceTest.java +++ b/src/test/java/fr/insee/protools/backend/service/traiterxxxx/TraiterXXXServiceTest.java @@ -1,4 +1,4 @@ -package fr.insee.protools.backend.service.traiterXXXX; +package fr.insee.protools.backend.service.traiterxxxx; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; @@ -14,7 +14,6 @@ import java.util.List; import java.util.UUID; -import static fr.insee.protools.backend.restclient.configuration.ApiConfigProperties.KNOWN_API.KNOWN_API_REM; import static fr.insee.protools.backend.restclient.configuration.ApiConfigProperties.KNOWN_API.KNOWN_API_TRAITERXXX; import static org.hamcrest.MatcherAssert.assertThat; import static org.mockito.Mockito.verify; diff --git a/src/test/java/fr/insee/protools/backend/service/traiterXXXX/delegate/TraiterXXXCreateContextTaskRESTTest.java b/src/test/java/fr/insee/protools/backend/service/traiterxxxx/delegate/TraiterXXXCreateContextTaskRESTTest.java similarity index 77% rename from src/test/java/fr/insee/protools/backend/service/traiterXXXX/delegate/TraiterXXXCreateContextTaskRESTTest.java rename to src/test/java/fr/insee/protools/backend/service/traiterxxxx/delegate/TraiterXXXCreateContextTaskRESTTest.java index 4ee864e3..cca3486d 100644 --- a/src/test/java/fr/insee/protools/backend/service/traiterXXXX/delegate/TraiterXXXCreateContextTaskRESTTest.java +++ b/src/test/java/fr/insee/protools/backend/service/traiterxxxx/delegate/TraiterXXXCreateContextTaskRESTTest.java @@ -1,7 +1,7 @@ -package fr.insee.protools.backend.service.traiterXXXX.delegate; +package fr.insee.protools.backend.service.traiterxxxx.delegate; import com.fasterxml.jackson.databind.JsonNode; -import fr.insee.protools.backend.service.traiterXXXX.TraiterXXXService; +import fr.insee.protools.backend.service.traiterxxxx.TraiterXXXService; import fr.insee.protools.backend.service.utils.delegate.TestDelegateWithContext; import org.flowable.engine.delegate.DelegateExecution; import org.flowable.engine.delegate.JavaDelegate; @@ -13,8 +13,8 @@ import java.util.List; import java.util.Map; -import static fr.insee.protools.backend.utils.data.CtxExamples.ctx_empty; -import static fr.insee.protools.backend.utils.data.CtxExamples.ctx_empty_id; +import static fr.insee.protools.backend.utils.data.CtxExamples.CTX_EMPTY; +import static fr.insee.protools.backend.utils.data.CtxExamples.CTX_EMPTY_ID; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.times; @@ -42,14 +42,14 @@ public Map getVariablesAndTypes() { @Test void execute_should_work_when_contextOK() { DelegateExecution execution = createMockedExecution(); - JsonNode expectedContext = initContexteMockWithString(ctx_empty); + JsonNode expectedContext = initContexteMockWithString(CTX_EMPTY); //Execute the unit under test traiterCreateContextTask.execute(execution); //Verify postContext ArgumentCaptor acCtx = ArgumentCaptor.forClass(JsonNode.class); - verify(traiterService, times(1)).postContext(eq(ctx_empty_id), acCtx.capture()); + verify(traiterService, times(1)).postContext(eq(CTX_EMPTY_ID), acCtx.capture()); List allValues = acCtx.getAllValues(); assertEquals(1, allValues.size(), "We should have exactly one value"); @@ -59,6 +59,6 @@ void execute_should_work_when_contextOK() { @Override protected String minimalValidCtxt() { - return ctx_empty; + return CTX_EMPTY; } } \ No newline at end of file diff --git a/src/test/java/fr/insee/protools/backend/service/traiterXXXX/delegate/TraiterXXXGetRemiseEnCollecteTaskRESTTest.java b/src/test/java/fr/insee/protools/backend/service/traiterxxxx/delegate/TraiterXXXGetRemiseEnCollecteTaskRESTTest.java similarity index 95% rename from src/test/java/fr/insee/protools/backend/service/traiterXXXX/delegate/TraiterXXXGetRemiseEnCollecteTaskRESTTest.java rename to src/test/java/fr/insee/protools/backend/service/traiterxxxx/delegate/TraiterXXXGetRemiseEnCollecteTaskRESTTest.java index 112e08f8..d05454fe 100644 --- a/src/test/java/fr/insee/protools/backend/service/traiterXXXX/delegate/TraiterXXXGetRemiseEnCollecteTaskRESTTest.java +++ b/src/test/java/fr/insee/protools/backend/service/traiterxxxx/delegate/TraiterXXXGetRemiseEnCollecteTaskRESTTest.java @@ -1,8 +1,8 @@ -package fr.insee.protools.backend.service.traiterXXXX.delegate; +package fr.insee.protools.backend.service.traiterxxxx.delegate; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; -import fr.insee.protools.backend.service.traiterXXXX.TraiterXXXService; +import fr.insee.protools.backend.service.traiterxxxx.TraiterXXXService; import fr.insee.protools.backend.service.utils.delegate.IDelegateWithVariables; import org.flowable.engine.delegate.DelegateExecution; import org.flowable.engine.delegate.JavaDelegate; diff --git a/src/test/java/fr/insee/protools/backend/service/utils/CustomJWTHelper.java b/src/test/java/fr/insee/protools/backend/service/utils/CustomJWTHelper.java index 9bca3949..946f69e6 100644 --- a/src/test/java/fr/insee/protools/backend/service/utils/CustomJWTHelper.java +++ b/src/test/java/fr/insee/protools/backend/service/utils/CustomJWTHelper.java @@ -28,7 +28,7 @@ public static String getEncodedToken(List roles) throws Exception { for (String role:roles){ rolesNode.add(role); } - realmAccessNode.put("roles", rolesNode); + realmAccessNode.set("roles", rolesNode); Jwt kcToken = Jwt.withTokenValue("token").header("alg", ALGO). claim("realm_access", realmAccessNode) @@ -48,9 +48,7 @@ public static String getEncodedToken(Jwt token) throws Exception { String signature = createSignature(encodedHeader, encodedPayload); // Concatenate header, payload, and signature to form the JWT - String signedToken = encodedHeader + "." + encodedPayload + "." + signature; - return signedToken; - + return encodedHeader + "." + encodedPayload + "." + signature; } public static String createSignature(String header, String payload) throws Exception { diff --git a/src/test/java/fr/insee/protools/backend/utils/data/CtxExamples.java b/src/test/java/fr/insee/protools/backend/utils/data/CtxExamples.java index 5d996b19..b607f237 100644 --- a/src/test/java/fr/insee/protools/backend/utils/data/CtxExamples.java +++ b/src/test/java/fr/insee/protools/backend/utils/data/CtxExamples.java @@ -3,22 +3,22 @@ public class CtxExamples { - public static final String ctx_empty = + public static final String CTX_EMPTY = """ { "id": "a958cfac-2bf3-478d-a97a-dda5e751898c" } """; - public static final String ctx_empty_id="a958cfac-2bf3-478d-a97a-dda5e751898c"; + public static final String CTX_EMPTY_ID ="a958cfac-2bf3-478d-a97a-dda5e751898c"; - public static final String ctx_contexte_menage = + public static final String CTX_CONTEXTE_MENAGE = """ { "id": "b958cfac-2bf3-478d-a97a-dda5e751898c", "contexte": "menage" } """; - public static final String ctx_contexte_menage_id="b958cfac-2bf3-478d-a97a-dda5e751898c"; + public static final String CTX_CONTEXTE_MENAGE_ID ="b958cfac-2bf3-478d-a97a-dda5e751898c"; public static final String ctx_contexte_entreprise = """ From e758b2bf8983263b17e189daa0059697c812735d Mon Sep 17 00:00:00 2001 From: SNDIL - Marc Date: Fri, 20 Sep 2024 14:27:39 +0200 Subject: [PATCH 70/75] springboot 3.3.4 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 7cf4356b..118ca4b3 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ org.springframework.boot spring-boot-starter-parent - 3.3.3 + 3.3.4 fr.insee.sndil.protools From a8d58d13b8a83e3e82167140dfc3be46f1986b9a Mon Sep 17 00:00:00 2001 From: SNDIL - Marc Date: Thu, 26 Sep 2024 11:21:49 +0200 Subject: [PATCH 71/75] =?UTF-8?q?feat:=20Travaux=20sur=20les=20tests=20d'i?= =?UTF-8?q?nt=C3=A9gration=20(lancement=20de=20processus=20flowable=20dans?= =?UTF-8?q?=20les=20tests)=20=3D=3D>=20On=20met=20des=20interfaces=20sur?= =?UTF-8?q?=20tous=20les=20services.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/ProtoolsProcessController.java | 4 +- .../restclient/pagination/PageResponse.java | 2 +- .../service/context/ContextServiceImpl.java | 2 +- ...ntextService.java => IContextService.java} | 2 +- .../resolvers/PartitionCtxResolver.java | 4 +- .../{sample => logging}/LogVariablesTask.java | 2 +- .../delegate/sample/SampleServiceTask.java | 24 -- .../service/meshuggah/IMeshuggahService.java | 12 + ...Service.java => MeshuggahServiceImpl.java} | 4 +- .../MeshuggahCreateContextTaskREST.java | 8 +- ...unicationForInterrogationListTaskREST.java | 8 +- ...otageCreateCommunicationEventTaskREST.java | 5 +- .../PlatinePilotageCreateContextTaskREST.java | 8 +- ...lotageCreateInterrogationListTaskREST.java | 8 +- ...tOfInterroToFollowUpPaginatedTaskREST.java | 4 +- ...ineQuestionnaireCreateContextTaskREST.java | 8 +- ...nnaireCreateInterrogationListTaskREST.java | 8 +- .../service/IPlatinePilotageService.java | 19 ++ .../service/IPlatineQuestionnaireService.java | 12 + ...e.java => PlatinePilotageServiceImpl.java} | 8 +- ...a => PlatineQuestionnaireServiceImpl.java} | 5 +- .../backend/service/rem/IRemService.java | 20 ++ .../{RemService.java => RemServiceImpl.java} | 2 +- ...etPartitionListOfInterroPaginatedTask.java | 9 +- .../RemPostResmiseEnCollecteTaskREST.java | 4 +- .../RemPutContactPlatineTaskREST.java | 4 +- .../backend/service/sugoi/ISugoiService.java | 10 + ...ugoiService.java => SugoiServiceImpl.java} | 4 +- .../SugoiREMCreateMissingAccountListTask.java | 13 +- .../traiterxxxx/ITraiterXXXService.java | 11 + ...ervice.java => TraiterXXXServiceImpl.java} | 4 +- .../TraiterXXXCreateContextTaskREST.java | 8 +- ...TraiterXXXGetRemiseEnCollecteTaskREST.java | 4 +- .../integration/EraREMProcessTest.java | 119 --------- .../integration/GetREMProcessTest.java | 113 +++++++++ .../integration/SimpleProcessTest.java | 64 +++++ .../RemServiceStub.java | 46 ++++ .../TestDelegate.java | 11 + ...ommunicationEventTaskRESTTestDelegate.java | 4 +- ...tageCreateContextTaskRESTTestDelegate.java | 4 +- ...InterrogationListTaskRESTTestDelegate.java | 4 +- ...nterroToFollowUpPaginatedTaskRESTTest.java | 7 +- ...aireCreateContextTaskRESTTestDelegate.java | 4 +- ...InterrogationListTaskRESTTestDelegate.java | 4 +- .../service/PlatinePilotageServiceTest.java | 2 +- .../PlatineQuestionnaireServiceTest.java | 3 +- ...rviceTest.java => RemServiceImplTest.java} | 5 +- ...rtitionListOfInterroPaginatedTaskTest.java | 4 +- .../RemPostResmiseEnCollecteTaskRESTTest.java | 6 +- .../RemPutContactPlatineTaskRESTTest.java | 6 +- .../service/sugoi/SugoiServiceTest.java | 4 +- ...oiREMCreateMissingAccountListTaskTest.java | 8 +- .../traiterxxxx/TraiterXXXServiceTest.java | 2 +- .../TraiterXXXCreateContextTaskRESTTest.java | 4 +- ...terXXXGetRemiseEnCollecteTaskRESTTest.java | 4 +- .../delegate/TestDelegateWithContext.java | 4 +- ...ProcessTest.testDelegateProcess.bpmn20.xml | 17 ++ ...eProcessTest.testSimpleProcess.bpmn20.xml} | 6 +- .../integration/collecte_web_no_com.json | 160 ------------ .../integration/noCTX_eraREM.bpmn20.xml | 232 ------------------ .../springGetREMDelegate-context.xml | 14 ++ .../springTestDelegate-context.xml | 12 + .../springTypicalUsageTest-context.xml | 45 ++++ 63 files changed, 518 insertions(+), 650 deletions(-) rename src/main/java/fr/insee/protools/backend/service/context/{ContextService.java => IContextService.java} (98%) rename src/main/java/fr/insee/protools/backend/service/delegate/{sample => logging}/LogVariablesTask.java (96%) delete mode 100644 src/main/java/fr/insee/protools/backend/service/delegate/sample/SampleServiceTask.java create mode 100644 src/main/java/fr/insee/protools/backend/service/meshuggah/IMeshuggahService.java rename src/main/java/fr/insee/protools/backend/service/meshuggah/{MeshuggahService.java => MeshuggahServiceImpl.java} (94%) create mode 100644 src/main/java/fr/insee/protools/backend/service/platine/service/IPlatinePilotageService.java create mode 100644 src/main/java/fr/insee/protools/backend/service/platine/service/IPlatineQuestionnaireService.java rename src/main/java/fr/insee/protools/backend/service/platine/service/{PlatinePilotageService.java => PlatinePilotageServiceImpl.java} (97%) rename src/main/java/fr/insee/protools/backend/service/platine/service/{PlatineQuestionnaireService.java => PlatineQuestionnaireServiceImpl.java} (91%) create mode 100644 src/main/java/fr/insee/protools/backend/service/rem/IRemService.java rename src/main/java/fr/insee/protools/backend/service/rem/{RemService.java => RemServiceImpl.java} (99%) create mode 100644 src/main/java/fr/insee/protools/backend/service/sugoi/ISugoiService.java rename src/main/java/fr/insee/protools/backend/service/sugoi/{SugoiService.java => SugoiServiceImpl.java} (97%) create mode 100644 src/main/java/fr/insee/protools/backend/service/traiterxxxx/ITraiterXXXService.java rename src/main/java/fr/insee/protools/backend/service/traiterxxxx/{TraiterXXXService.java => TraiterXXXServiceImpl.java} (95%) delete mode 100644 src/test/java/fr/insee/protools/backend/integration/EraREMProcessTest.java create mode 100644 src/test/java/fr/insee/protools/backend/integration/GetREMProcessTest.java create mode 100644 src/test/java/fr/insee/protools/backend/integration/SimpleProcessTest.java create mode 100644 src/test/java/fr/insee/protools/backend/integration/delegate_and_services_stub/RemServiceStub.java create mode 100644 src/test/java/fr/insee/protools/backend/integration/delegate_and_services_stub/TestDelegate.java rename src/test/java/fr/insee/protools/backend/service/rem/{RemServiceTest.java => RemServiceImplTest.java} (99%) create mode 100644 src/test/resources/fr/insee/protools/backend/integration/SimpleProcessTest.testDelegateProcess.bpmn20.xml rename src/test/resources/fr/insee/protools/backend/integration/{SimpleProcess.testSimpleProcess.bpmn20.xml => SimpleProcessTest.testSimpleProcess.bpmn20.xml} (65%) delete mode 100644 src/test/resources/fr/insee/protools/backend/integration/collecte_web_no_com.json delete mode 100644 src/test/resources/fr/insee/protools/backend/integration/noCTX_eraREM.bpmn20.xml create mode 100644 src/test/resources/fr/insee/protools/backend/integration/springGetREMDelegate-context.xml create mode 100644 src/test/resources/fr/insee/protools/backend/integration/springTestDelegate-context.xml create mode 100644 src/test/resources/fr/insee/protools/backend/integration/springTypicalUsageTest-context.xml diff --git a/src/main/java/fr/insee/protools/backend/controller/ProtoolsProcessController.java b/src/main/java/fr/insee/protools/backend/controller/ProtoolsProcessController.java index bf445c9c..c3397da4 100644 --- a/src/main/java/fr/insee/protools/backend/controller/ProtoolsProcessController.java +++ b/src/main/java/fr/insee/protools/backend/controller/ProtoolsProcessController.java @@ -1,6 +1,6 @@ package fr.insee.protools.backend.controller; -import fr.insee.protools.backend.service.context.ContextService; +import fr.insee.protools.backend.service.context.IContextService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.responses.ApiResponse; @@ -21,7 +21,7 @@ @RequiredArgsConstructor public class ProtoolsProcessController { - private final ContextService contextService; + private final IContextService contextService; @PostMapping(value = "/upload-context", consumes = MediaType.MULTIPART_FORM_DATA_VALUE) @Operation(summary = "Upload of the context file", diff --git a/src/main/java/fr/insee/protools/backend/restclient/pagination/PageResponse.java b/src/main/java/fr/insee/protools/backend/restclient/pagination/PageResponse.java index 1e925ad3..a150c125 100644 --- a/src/main/java/fr/insee/protools/backend/restclient/pagination/PageResponse.java +++ b/src/main/java/fr/insee/protools/backend/restclient/pagination/PageResponse.java @@ -28,7 +28,7 @@ public Boolean isLastPage(){ if(currentPage==null || pageCount==null){ return true; } - else return (currentPage>=pageCount); + else return ((currentPage+1)>=pageCount); } } diff --git a/src/main/java/fr/insee/protools/backend/service/context/ContextServiceImpl.java b/src/main/java/fr/insee/protools/backend/service/context/ContextServiceImpl.java index 78e88301..ae9b1143 100644 --- a/src/main/java/fr/insee/protools/backend/service/context/ContextServiceImpl.java +++ b/src/main/java/fr/insee/protools/backend/service/context/ContextServiceImpl.java @@ -47,7 +47,7 @@ @Service @Slf4j @RequiredArgsConstructor -public class ContextServiceImpl implements ContextService { +public class ContextServiceImpl implements IContextService { private static final ObjectReader defaultReader = new ObjectMapper().registerModule(new JavaTimeModule()).reader(); // maybe with configs //Key : processInstanceID diff --git a/src/main/java/fr/insee/protools/backend/service/context/ContextService.java b/src/main/java/fr/insee/protools/backend/service/context/IContextService.java similarity index 98% rename from src/main/java/fr/insee/protools/backend/service/context/ContextService.java rename to src/main/java/fr/insee/protools/backend/service/context/IContextService.java index d0fd6b00..183574b2 100644 --- a/src/main/java/fr/insee/protools/backend/service/context/ContextService.java +++ b/src/main/java/fr/insee/protools/backend/service/context/IContextService.java @@ -5,7 +5,7 @@ import fr.insee.protools.backend.service.context.exception.BadContexMissingBPMNError; import org.springframework.web.multipart.MultipartFile; -public interface ContextService { +public interface IContextService { /** * Process the uploaded file and store it's content in VARIABLE_NAME_SERIALIZED_CONTEXT_FILE engine variable. * If ok pass the task referenced by *taskId* to completed diff --git a/src/main/java/fr/insee/protools/backend/service/context/resolvers/PartitionCtxResolver.java b/src/main/java/fr/insee/protools/backend/service/context/resolvers/PartitionCtxResolver.java index 0d5e9a1f..7f029109 100644 --- a/src/main/java/fr/insee/protools/backend/service/context/resolvers/PartitionCtxResolver.java +++ b/src/main/java/fr/insee/protools/backend/service/context/resolvers/PartitionCtxResolver.java @@ -2,7 +2,7 @@ import fr.insee.protools.backend.dto.Communication; import fr.insee.protools.backend.dto.Lot; -import fr.insee.protools.backend.service.context.ContextService; +import fr.insee.protools.backend.service.context.IContextService; import fr.insee.protools.backend.service.exception.IncoherentBPMNContextError; import fr.insee.protools.backend.service.utils.FlowableVariableUtils; import fr.insee.protools.backend.service.utils.log.TimeLogUtils; @@ -40,7 +40,7 @@ @Slf4j public class PartitionCtxResolver { - private final ContextService protoolsContext; + private final IContextService protoolsContext; //TODO: à faire valider par le métier private final TemporalAmount maxSendCommunicationWindowHours = Duration.ofHours(24);; diff --git a/src/main/java/fr/insee/protools/backend/service/delegate/sample/LogVariablesTask.java b/src/main/java/fr/insee/protools/backend/service/delegate/logging/LogVariablesTask.java similarity index 96% rename from src/main/java/fr/insee/protools/backend/service/delegate/sample/LogVariablesTask.java rename to src/main/java/fr/insee/protools/backend/service/delegate/logging/LogVariablesTask.java index 1105bbbc..4656cca0 100644 --- a/src/main/java/fr/insee/protools/backend/service/delegate/sample/LogVariablesTask.java +++ b/src/main/java/fr/insee/protools/backend/service/delegate/logging/LogVariablesTask.java @@ -1,4 +1,4 @@ -package fr.insee.protools.backend.service.delegate.sample; +package fr.insee.protools.backend.service.delegate.logging; import lombok.extern.slf4j.Slf4j; import org.flowable.engine.delegate.DelegateExecution; diff --git a/src/main/java/fr/insee/protools/backend/service/delegate/sample/SampleServiceTask.java b/src/main/java/fr/insee/protools/backend/service/delegate/sample/SampleServiceTask.java deleted file mode 100644 index b31efce0..00000000 --- a/src/main/java/fr/insee/protools/backend/service/delegate/sample/SampleServiceTask.java +++ /dev/null @@ -1,24 +0,0 @@ -package fr.insee.protools.backend.service.delegate.sample; - -import fr.insee.protools.backend.service.context.ContextService; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.flowable.engine.delegate.DelegateExecution; -import org.flowable.engine.delegate.JavaDelegate; -import org.springframework.stereotype.Component; - -@Component -@Slf4j -@RequiredArgsConstructor -public class SampleServiceTask implements JavaDelegate { - - private final ContextService contextService; - - @Override - public void execute(DelegateExecution delegateExecution) { - String messageLog = ""; - log.info("Variables : {}", delegateExecution.getVariables()); - log.info("\t Sample service getCurrentActivityId={} - getCurrentFlowElement={} {}" - ,delegateExecution.getCurrentActivityId(), delegateExecution.getCurrentFlowElement().getName(),messageLog); - } -} diff --git a/src/main/java/fr/insee/protools/backend/service/meshuggah/IMeshuggahService.java b/src/main/java/fr/insee/protools/backend/service/meshuggah/IMeshuggahService.java new file mode 100644 index 00000000..69e82980 --- /dev/null +++ b/src/main/java/fr/insee/protools/backend/service/meshuggah/IMeshuggahService.java @@ -0,0 +1,12 @@ +package fr.insee.protools.backend.service.meshuggah; + +import com.fasterxml.jackson.databind.JsonNode; + +import java.util.List; + +public interface IMeshuggahService { + + void postContext(String campaignId, JsonNode contextRootNode); + + void postCommunicationRequest(String campaignId, String communicationId, List list); +} diff --git a/src/main/java/fr/insee/protools/backend/service/meshuggah/MeshuggahService.java b/src/main/java/fr/insee/protools/backend/service/meshuggah/MeshuggahServiceImpl.java similarity index 94% rename from src/main/java/fr/insee/protools/backend/service/meshuggah/MeshuggahService.java rename to src/main/java/fr/insee/protools/backend/service/meshuggah/MeshuggahServiceImpl.java index 225e370d..76c3b4bc 100644 --- a/src/main/java/fr/insee/protools/backend/service/meshuggah/MeshuggahService.java +++ b/src/main/java/fr/insee/protools/backend/service/meshuggah/MeshuggahServiceImpl.java @@ -14,10 +14,11 @@ @Service @Slf4j @RequiredArgsConstructor -public class MeshuggahService { +public class MeshuggahServiceImpl implements IMeshuggahService{ private final RestClientHelper restClientHelper; + @Override public void postContext(String campaignId, JsonNode contextRootNode) { log.trace("postContext: campaignId={}",campaignId); var response = restClientHelper.getRestClient(KNOWN_API_MESHUGGAH) @@ -29,6 +30,7 @@ public void postContext(String campaignId, JsonNode contextRootNode) { log.trace("postContext: campaignId={} - response={} ",campaignId,response); } + @Override public void postCommunicationRequest(String campaignId, String communicationId, List list) { log.trace("postCommunicationRequest: campaignId={} - communicationId={}",campaignId,communicationId); var response = restClientHelper.getRestClient(KNOWN_API_MESHUGGAH) diff --git a/src/main/java/fr/insee/protools/backend/service/meshuggah/delegate/MeshuggahCreateContextTaskREST.java b/src/main/java/fr/insee/protools/backend/service/meshuggah/delegate/MeshuggahCreateContextTaskREST.java index f33c17a3..1a84040a 100644 --- a/src/main/java/fr/insee/protools/backend/service/meshuggah/delegate/MeshuggahCreateContextTaskREST.java +++ b/src/main/java/fr/insee/protools/backend/service/meshuggah/delegate/MeshuggahCreateContextTaskREST.java @@ -3,8 +3,8 @@ import com.fasterxml.jackson.databind.JsonNode; import fr.insee.protools.backend.dto.ContexteProcessus; import fr.insee.protools.backend.service.DelegateContextVerifier; -import fr.insee.protools.backend.service.context.ContextService; -import fr.insee.protools.backend.service.meshuggah.MeshuggahService; +import fr.insee.protools.backend.service.context.IContextService; +import fr.insee.protools.backend.service.meshuggah.IMeshuggahService; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.flowable.engine.delegate.DelegateExecution; @@ -15,8 +15,8 @@ @RequiredArgsConstructor @Component public class MeshuggahCreateContextTaskREST implements JavaDelegate, DelegateContextVerifier { - private final ContextService protoolsContext; - private final MeshuggahService service; + private final IContextService protoolsContext; + private final IMeshuggahService service; @Override public void execute(DelegateExecution execution) { diff --git a/src/main/java/fr/insee/protools/backend/service/meshuggah/delegate/MeshuggahSendCommunicationForInterrogationListTaskREST.java b/src/main/java/fr/insee/protools/backend/service/meshuggah/delegate/MeshuggahSendCommunicationForInterrogationListTaskREST.java index b5160505..5f4c25fb 100644 --- a/src/main/java/fr/insee/protools/backend/service/meshuggah/delegate/MeshuggahSendCommunicationForInterrogationListTaskREST.java +++ b/src/main/java/fr/insee/protools/backend/service/meshuggah/delegate/MeshuggahSendCommunicationForInterrogationListTaskREST.java @@ -2,8 +2,8 @@ import com.fasterxml.jackson.databind.JsonNode; import fr.insee.protools.backend.dto.ContexteProcessus; -import fr.insee.protools.backend.service.context.ContextService; -import fr.insee.protools.backend.service.meshuggah.MeshuggahService; +import fr.insee.protools.backend.service.context.IContextService; +import fr.insee.protools.backend.service.meshuggah.IMeshuggahService; import fr.insee.protools.backend.service.utils.FlowableVariableUtils; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -21,8 +21,8 @@ @Slf4j public class MeshuggahSendCommunicationForInterrogationListTaskREST implements JavaDelegate { - private final MeshuggahService meshuggahService; - private final ContextService protoolsContext; + private final IMeshuggahService meshuggahService; + private final IContextService protoolsContext; @Override public void execute(DelegateExecution execution) { diff --git a/src/main/java/fr/insee/protools/backend/service/platine/delegate/pilotatage/PlatinePilotageCreateCommunicationEventTaskREST.java b/src/main/java/fr/insee/protools/backend/service/platine/delegate/pilotatage/PlatinePilotageCreateCommunicationEventTaskREST.java index 786f9ee7..8f10b27b 100644 --- a/src/main/java/fr/insee/protools/backend/service/platine/delegate/pilotatage/PlatinePilotageCreateCommunicationEventTaskREST.java +++ b/src/main/java/fr/insee/protools/backend/service/platine/delegate/pilotatage/PlatinePilotageCreateCommunicationEventTaskREST.java @@ -1,9 +1,8 @@ package fr.insee.protools.backend.service.platine.delegate.pilotatage; -import com.fasterxml.jackson.databind.JsonNode; import fr.insee.protools.backend.dto.platine.pilotage.PlatinePilotageCommunicationEventDto; import fr.insee.protools.backend.exception.ProtoolsProcessFlowBPMNError; -import fr.insee.protools.backend.service.platine.service.PlatinePilotageService; +import fr.insee.protools.backend.service.platine.service.IPlatinePilotageService; import fr.insee.protools.backend.service.utils.FlowableVariableUtils; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -22,7 +21,7 @@ @Component public class PlatinePilotageCreateCommunicationEventTaskREST implements JavaDelegate { - private final PlatinePilotageService platinePilotageService; + private final IPlatinePilotageService platinePilotageService; @Override public void execute(DelegateExecution execution) { diff --git a/src/main/java/fr/insee/protools/backend/service/platine/delegate/pilotatage/PlatinePilotageCreateContextTaskREST.java b/src/main/java/fr/insee/protools/backend/service/platine/delegate/pilotatage/PlatinePilotageCreateContextTaskREST.java index a822eb45..5854ce3e 100644 --- a/src/main/java/fr/insee/protools/backend/service/platine/delegate/pilotatage/PlatinePilotageCreateContextTaskREST.java +++ b/src/main/java/fr/insee/protools/backend/service/platine/delegate/pilotatage/PlatinePilotageCreateContextTaskREST.java @@ -2,8 +2,8 @@ import com.fasterxml.jackson.databind.JsonNode; import fr.insee.protools.backend.dto.ContexteProcessus; -import fr.insee.protools.backend.service.context.ContextService; -import fr.insee.protools.backend.service.platine.service.PlatinePilotageService; +import fr.insee.protools.backend.service.context.IContextService; +import fr.insee.protools.backend.service.platine.service.IPlatinePilotageService; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.flowable.engine.delegate.DelegateExecution; @@ -15,8 +15,8 @@ @Component public class PlatinePilotageCreateContextTaskREST implements JavaDelegate { - private final ContextService protoolsContext; - private final PlatinePilotageService platinePilotageService; + private final IContextService protoolsContext; + private final IPlatinePilotageService platinePilotageService; @Override public void execute(DelegateExecution execution) { diff --git a/src/main/java/fr/insee/protools/backend/service/platine/delegate/pilotatage/PlatinePilotageCreateInterrogationListTaskREST.java b/src/main/java/fr/insee/protools/backend/service/platine/delegate/pilotatage/PlatinePilotageCreateInterrogationListTaskREST.java index e3226acc..6e60c8b0 100644 --- a/src/main/java/fr/insee/protools/backend/service/platine/delegate/pilotatage/PlatinePilotageCreateInterrogationListTaskREST.java +++ b/src/main/java/fr/insee/protools/backend/service/platine/delegate/pilotatage/PlatinePilotageCreateInterrogationListTaskREST.java @@ -2,8 +2,8 @@ import com.fasterxml.jackson.databind.JsonNode; import fr.insee.protools.backend.dto.ContexteProcessus; -import fr.insee.protools.backend.service.context.ContextService; -import fr.insee.protools.backend.service.platine.service.PlatinePilotageService; +import fr.insee.protools.backend.service.context.IContextService; +import fr.insee.protools.backend.service.platine.service.IPlatinePilotageService; import fr.insee.protools.backend.service.utils.FlowableVariableUtils; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -21,8 +21,8 @@ @Slf4j public class PlatinePilotageCreateInterrogationListTaskREST implements JavaDelegate { - private final PlatinePilotageService platinePilotageService; - private final ContextService protoolsContext; + private final IPlatinePilotageService platinePilotageService; + private final IContextService protoolsContext; @Override public void execute(DelegateExecution execution) { diff --git a/src/main/java/fr/insee/protools/backend/service/platine/delegate/pilotatage/PlatinePilotageGetListOfInterroToFollowUpPaginatedTaskREST.java b/src/main/java/fr/insee/protools/backend/service/platine/delegate/pilotatage/PlatinePilotageGetListOfInterroToFollowUpPaginatedTaskREST.java index fbeaa53a..1ce886cf 100644 --- a/src/main/java/fr/insee/protools/backend/service/platine/delegate/pilotatage/PlatinePilotageGetListOfInterroToFollowUpPaginatedTaskREST.java +++ b/src/main/java/fr/insee/protools/backend/service/platine/delegate/pilotatage/PlatinePilotageGetListOfInterroToFollowUpPaginatedTaskREST.java @@ -3,7 +3,7 @@ import com.fasterxml.jackson.databind.JsonNode; import fr.insee.protools.backend.restclient.pagination.PageResponse; import fr.insee.protools.backend.service.DelegateContextVerifier; -import fr.insee.protools.backend.service.platine.service.PlatinePilotageService; +import fr.insee.protools.backend.service.platine.service.IPlatinePilotageService; import fr.insee.protools.backend.service.utils.FlowableVariableUtils; import fr.insee.protools.backend.service.utils.delegate.PaginationHelper; import lombok.RequiredArgsConstructor; @@ -26,7 +26,7 @@ @RequiredArgsConstructor public class PlatinePilotageGetListOfInterroToFollowUpPaginatedTaskREST implements JavaDelegate, DelegateContextVerifier, PaginationHelper { - private final PlatinePilotageService pilotageService; + private final IPlatinePilotageService pilotageService; protected PageResponse readFunction(Integer pageToRead, Object... objects) { String partitionId = (String) objects[0]; diff --git a/src/main/java/fr/insee/protools/backend/service/platine/delegate/questionnaire/PlatineQuestionnaireCreateContextTaskREST.java b/src/main/java/fr/insee/protools/backend/service/platine/delegate/questionnaire/PlatineQuestionnaireCreateContextTaskREST.java index 1ae39ddb..9cbe6f1c 100644 --- a/src/main/java/fr/insee/protools/backend/service/platine/delegate/questionnaire/PlatineQuestionnaireCreateContextTaskREST.java +++ b/src/main/java/fr/insee/protools/backend/service/platine/delegate/questionnaire/PlatineQuestionnaireCreateContextTaskREST.java @@ -2,8 +2,8 @@ import com.fasterxml.jackson.databind.JsonNode; import fr.insee.protools.backend.dto.ContexteProcessus; -import fr.insee.protools.backend.service.context.ContextService; -import fr.insee.protools.backend.service.platine.service.PlatineQuestionnaireService; +import fr.insee.protools.backend.service.context.IContextService; +import fr.insee.protools.backend.service.platine.service.IPlatineQuestionnaireService; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.flowable.engine.delegate.DelegateExecution; @@ -15,8 +15,8 @@ @Component public class PlatineQuestionnaireCreateContextTaskREST implements JavaDelegate { - private final ContextService protoolsContext; - private final PlatineQuestionnaireService platineQuestionnaireService; + private final IContextService protoolsContext; + private final IPlatineQuestionnaireService platineQuestionnaireService; @Override public void execute(DelegateExecution execution) { diff --git a/src/main/java/fr/insee/protools/backend/service/platine/delegate/questionnaire/PlatineQuestionnaireCreateInterrogationListTaskREST.java b/src/main/java/fr/insee/protools/backend/service/platine/delegate/questionnaire/PlatineQuestionnaireCreateInterrogationListTaskREST.java index 8a161fb0..cd744729 100644 --- a/src/main/java/fr/insee/protools/backend/service/platine/delegate/questionnaire/PlatineQuestionnaireCreateInterrogationListTaskREST.java +++ b/src/main/java/fr/insee/protools/backend/service/platine/delegate/questionnaire/PlatineQuestionnaireCreateInterrogationListTaskREST.java @@ -2,8 +2,8 @@ import com.fasterxml.jackson.databind.JsonNode; import fr.insee.protools.backend.dto.ContexteProcessus; -import fr.insee.protools.backend.service.context.ContextService; -import fr.insee.protools.backend.service.platine.service.PlatineQuestionnaireService; +import fr.insee.protools.backend.service.context.IContextService; +import fr.insee.protools.backend.service.platine.service.IPlatineQuestionnaireService; import fr.insee.protools.backend.service.utils.FlowableVariableUtils; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -21,8 +21,8 @@ @Slf4j public class PlatineQuestionnaireCreateInterrogationListTaskREST implements JavaDelegate { - private final PlatineQuestionnaireService platineQuestionnaireService; - private final ContextService protoolsContext; + private final IPlatineQuestionnaireService platineQuestionnaireService; + private final IContextService protoolsContext; @Override public void execute(DelegateExecution execution) { diff --git a/src/main/java/fr/insee/protools/backend/service/platine/service/IPlatinePilotageService.java b/src/main/java/fr/insee/protools/backend/service/platine/service/IPlatinePilotageService.java new file mode 100644 index 00000000..419b4b2d --- /dev/null +++ b/src/main/java/fr/insee/protools/backend/service/platine/service/IPlatinePilotageService.java @@ -0,0 +1,19 @@ +package fr.insee.protools.backend.service.platine.service; + +import com.fasterxml.jackson.databind.JsonNode; +import fr.insee.protools.backend.dto.platine.pilotage.PlatinePilotageCommunicationEventDto; +import fr.insee.protools.backend.restclient.pagination.PageResponse; + +import java.util.List; +import java.util.Optional; + +public interface IPlatinePilotageService { + + void postCommunicationEvents(List platinePilotageCommunicationEventList); + + void postContext(String campaignId, JsonNode contextRootNode); + + void postInterrogations(String campaignId, List interrogations); + + PageResponse getInterrogationToFollowUpPaginated(String partitionId, long page, Optional isToFollowUp); +} diff --git a/src/main/java/fr/insee/protools/backend/service/platine/service/IPlatineQuestionnaireService.java b/src/main/java/fr/insee/protools/backend/service/platine/service/IPlatineQuestionnaireService.java new file mode 100644 index 00000000..bfae6ac0 --- /dev/null +++ b/src/main/java/fr/insee/protools/backend/service/platine/service/IPlatineQuestionnaireService.java @@ -0,0 +1,12 @@ +package fr.insee.protools.backend.service.platine.service; + +import com.fasterxml.jackson.databind.JsonNode; + +import java.util.List; + +public interface IPlatineQuestionnaireService { + + void postContext(String campaignId, JsonNode contextRootNode); + + void postInterrogations(String campaignId, List interrogations); +} diff --git a/src/main/java/fr/insee/protools/backend/service/platine/service/PlatinePilotageService.java b/src/main/java/fr/insee/protools/backend/service/platine/service/PlatinePilotageServiceImpl.java similarity index 97% rename from src/main/java/fr/insee/protools/backend/service/platine/service/PlatinePilotageService.java rename to src/main/java/fr/insee/protools/backend/service/platine/service/PlatinePilotageServiceImpl.java index a1d38b15..06b8f8b8 100644 --- a/src/main/java/fr/insee/protools/backend/service/platine/service/PlatinePilotageService.java +++ b/src/main/java/fr/insee/protools/backend/service/platine/service/PlatinePilotageServiceImpl.java @@ -19,12 +19,11 @@ import static fr.insee.protools.backend.logging.LoggingHelper.logJson; import static fr.insee.protools.backend.restclient.configuration.ApiConfigProperties.KNOWN_API.KNOWN_API_PLATINE_PILOTAGE; -import static fr.insee.protools.backend.restclient.configuration.ApiConfigProperties.KNOWN_API.KNOWN_API_REM; @Service @Slf4j @RequiredArgsConstructor -public class PlatinePilotageService { +public class PlatinePilotageServiceImpl implements IPlatinePilotageService{ private final RestClientHelper restClientHelper; private static final ApiConfigProperties.KNOWN_API API= KNOWN_API_PLATINE_PILOTAGE; @@ -32,6 +31,7 @@ public class PlatinePilotageService { @Value("${fr.insee.protools.api.platine-pilotage.interrogation.page.size:5000}") private int pageSizeGetInterro; + @Override public void postCommunicationEvents(List platinePilotageCommunicationEventList) { log.trace("postCommunicationEvents: "); logJson("postCommunicationEvents ",platinePilotageCommunicationEventList,log, Level.TRACE); @@ -45,6 +45,7 @@ public void postCommunicationEvents(List p log.trace("postCommunicationEvents: response={} ",response); } + @Override public void postContext(String campaignId, JsonNode contextRootNode) { log.trace("postContext: campaignId={}",campaignId); var response = restClientHelper.getRestClient(KNOWN_API_PLATINE_PILOTAGE) @@ -56,6 +57,7 @@ public void postContext(String campaignId, JsonNode contextRootNode) { log.trace("postContext: campaignId={} - response={} ",campaignId,response); } + @Override public void postInterrogations(String campaignId, List interrogations) { log.trace("postInterrogations: campaignId={}",campaignId); logJson("postInterrogations ",interrogations,log,Level.TRACE); @@ -68,7 +70,7 @@ public void postInterrogations(String campaignId, List interrogations) log.trace("postInterrogations: campaignId={} - response={} ",campaignId,response); } - + @Override public PageResponse getInterrogationToFollowUpPaginated(String partitionId, long page, Optional isToFollowUp) { log.debug("partitionId={} - page={} - pageSizeGetInterro={} - isToFollowUp={}",partitionId,page,pageSizeGetInterro,isToFollowUp); ParameterizedTypeReference> typeReference = new ParameterizedTypeReference<>() { }; diff --git a/src/main/java/fr/insee/protools/backend/service/platine/service/PlatineQuestionnaireService.java b/src/main/java/fr/insee/protools/backend/service/platine/service/PlatineQuestionnaireServiceImpl.java similarity index 91% rename from src/main/java/fr/insee/protools/backend/service/platine/service/PlatineQuestionnaireService.java rename to src/main/java/fr/insee/protools/backend/service/platine/service/PlatineQuestionnaireServiceImpl.java index 1859a0b8..65da9e03 100644 --- a/src/main/java/fr/insee/protools/backend/service/platine/service/PlatineQuestionnaireService.java +++ b/src/main/java/fr/insee/protools/backend/service/platine/service/PlatineQuestionnaireServiceImpl.java @@ -11,17 +11,17 @@ import java.util.List; import static fr.insee.protools.backend.logging.LoggingHelper.logJson; -import static fr.insee.protools.backend.restclient.configuration.ApiConfigProperties.KNOWN_API.KNOWN_API_PLATINE_PILOTAGE; import static fr.insee.protools.backend.restclient.configuration.ApiConfigProperties.KNOWN_API.KNOWN_API_PLATINE_QUESTIONNAIRE; @Service @Slf4j @RequiredArgsConstructor -public class PlatineQuestionnaireService { +public class PlatineQuestionnaireServiceImpl implements IPlatineQuestionnaireService{ private final RestClientHelper restClientHelper; private static final ApiConfigProperties.KNOWN_API API= KNOWN_API_PLATINE_QUESTIONNAIRE; + @Override public void postContext(String campaignId, JsonNode contextRootNode) { log.trace("postContext: campaignId={}",campaignId); var response = restClientHelper.getRestClient(API) @@ -33,6 +33,7 @@ public void postContext(String campaignId, JsonNode contextRootNode) { log.trace("postContext: campaignId={} - response={} ",campaignId,response); } + @Override public void postInterrogations(String campaignId, List interrogations) { log.trace("postInterrogations: campaignId={}",campaignId); logJson("putQuestionings ",interrogations,log,Level.TRACE); diff --git a/src/main/java/fr/insee/protools/backend/service/rem/IRemService.java b/src/main/java/fr/insee/protools/backend/service/rem/IRemService.java new file mode 100644 index 00000000..6a8dbe9c --- /dev/null +++ b/src/main/java/fr/insee/protools/backend/service/rem/IRemService.java @@ -0,0 +1,20 @@ +package fr.insee.protools.backend.service.rem; + +import com.fasterxml.jackson.databind.JsonNode; +import fr.insee.protools.backend.restclient.pagination.PageResponse; + +import java.util.List; +import java.util.Map; + +public interface IRemService { + + PageResponse getPartitionAllInterroPaginated(String partitionId, long page); + + List getInterrogationIdsWithoutAccountForPartition(String partitionId); + + void patchInterrogationsSetAccounts(Map userByInterroId); + + void putContactsPlatine(List contactPlatineList); + + void postRemiseEnCollecte(List interroRemiseEnCollecteList); +} \ No newline at end of file diff --git a/src/main/java/fr/insee/protools/backend/service/rem/RemService.java b/src/main/java/fr/insee/protools/backend/service/rem/RemServiceImpl.java similarity index 99% rename from src/main/java/fr/insee/protools/backend/service/rem/RemService.java rename to src/main/java/fr/insee/protools/backend/service/rem/RemServiceImpl.java index a79abc4e..c3407af5 100644 --- a/src/main/java/fr/insee/protools/backend/service/rem/RemService.java +++ b/src/main/java/fr/insee/protools/backend/service/rem/RemServiceImpl.java @@ -23,7 +23,7 @@ @Service @Slf4j @RequiredArgsConstructor -public class RemService { +public class RemServiceImpl implements IRemService{ private static final ApiConfigProperties.KNOWN_API API = KNOWN_API_REM; private final RestClientHelper restClientHelper; diff --git a/src/main/java/fr/insee/protools/backend/service/rem/delegate/RemGetPartitionListOfInterroPaginatedTask.java b/src/main/java/fr/insee/protools/backend/service/rem/delegate/RemGetPartitionListOfInterroPaginatedTask.java index f3e42c70..6c3834a7 100644 --- a/src/main/java/fr/insee/protools/backend/service/rem/delegate/RemGetPartitionListOfInterroPaginatedTask.java +++ b/src/main/java/fr/insee/protools/backend/service/rem/delegate/RemGetPartitionListOfInterroPaginatedTask.java @@ -3,10 +3,10 @@ import com.fasterxml.jackson.databind.JsonNode; import fr.insee.protools.backend.restclient.pagination.PageResponse; import fr.insee.protools.backend.service.DelegateContextVerifier; -import fr.insee.protools.backend.service.rem.RemService; +import fr.insee.protools.backend.service.rem.IRemService; import fr.insee.protools.backend.service.utils.FlowableVariableUtils; import fr.insee.protools.backend.service.utils.delegate.PaginationHelper; -import lombok.RequiredArgsConstructor; +import lombok.Data; import lombok.extern.slf4j.Slf4j; import org.flowable.engine.delegate.DelegateExecution; import org.flowable.engine.delegate.JavaDelegate; @@ -21,11 +21,10 @@ @Slf4j @Component -@RequiredArgsConstructor +@Data public class RemGetPartitionListOfInterroPaginatedTask implements JavaDelegate, DelegateContextVerifier, PaginationHelper { - RemService remService; - + IRemService remService; private PageResponse readFunction(Integer pageToRead, Object... objects) { String partitionId = (String) objects[0]; diff --git a/src/main/java/fr/insee/protools/backend/service/rem/delegate/RemPostResmiseEnCollecteTaskREST.java b/src/main/java/fr/insee/protools/backend/service/rem/delegate/RemPostResmiseEnCollecteTaskREST.java index 2ef84388..7aaf3532 100644 --- a/src/main/java/fr/insee/protools/backend/service/rem/delegate/RemPostResmiseEnCollecteTaskREST.java +++ b/src/main/java/fr/insee/protools/backend/service/rem/delegate/RemPostResmiseEnCollecteTaskREST.java @@ -2,7 +2,7 @@ import com.fasterxml.jackson.databind.JsonNode; import fr.insee.protools.backend.service.DelegateContextVerifier; -import fr.insee.protools.backend.service.rem.RemService; +import fr.insee.protools.backend.service.rem.IRemService; import fr.insee.protools.backend.service.utils.FlowableVariableUtils; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -19,7 +19,7 @@ @RequiredArgsConstructor public class RemPostResmiseEnCollecteTaskREST implements JavaDelegate, DelegateContextVerifier { - RemService remService; + IRemService remService; @Override public void execute(DelegateExecution execution) { diff --git a/src/main/java/fr/insee/protools/backend/service/rem/delegate/RemPutContactPlatineTaskREST.java b/src/main/java/fr/insee/protools/backend/service/rem/delegate/RemPutContactPlatineTaskREST.java index b0c81caf..a0239be9 100644 --- a/src/main/java/fr/insee/protools/backend/service/rem/delegate/RemPutContactPlatineTaskREST.java +++ b/src/main/java/fr/insee/protools/backend/service/rem/delegate/RemPutContactPlatineTaskREST.java @@ -2,7 +2,7 @@ import com.fasterxml.jackson.databind.JsonNode; import fr.insee.protools.backend.service.DelegateContextVerifier; -import fr.insee.protools.backend.service.rem.RemService; +import fr.insee.protools.backend.service.rem.IRemService; import fr.insee.protools.backend.service.utils.FlowableVariableUtils; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -19,7 +19,7 @@ @RequiredArgsConstructor public class RemPutContactPlatineTaskREST implements JavaDelegate, DelegateContextVerifier { - RemService remService; + IRemService remService; @Override public void execute(DelegateExecution execution) { diff --git a/src/main/java/fr/insee/protools/backend/service/sugoi/ISugoiService.java b/src/main/java/fr/insee/protools/backend/service/sugoi/ISugoiService.java new file mode 100644 index 00000000..60080f2d --- /dev/null +++ b/src/main/java/fr/insee/protools/backend/service/sugoi/ISugoiService.java @@ -0,0 +1,10 @@ +package fr.insee.protools.backend.service.sugoi; + +import fr.insee.protools.backend.dto.sugoi.User; + +public interface ISugoiService { + + User postCreateUser(User userBody); + + void postInitPassword(String userId, String password); +} diff --git a/src/main/java/fr/insee/protools/backend/service/sugoi/SugoiService.java b/src/main/java/fr/insee/protools/backend/service/sugoi/SugoiServiceImpl.java similarity index 97% rename from src/main/java/fr/insee/protools/backend/service/sugoi/SugoiService.java rename to src/main/java/fr/insee/protools/backend/service/sugoi/SugoiServiceImpl.java index cc28a063..293ed9cf 100644 --- a/src/main/java/fr/insee/protools/backend/service/sugoi/SugoiService.java +++ b/src/main/java/fr/insee/protools/backend/service/sugoi/SugoiServiceImpl.java @@ -19,7 +19,7 @@ @Service @Slf4j @RequiredArgsConstructor -public class SugoiService { +public class SugoiServiceImpl implements ISugoiService{ private static final ApiConfigProperties.KNOWN_API API = KNOWN_API_SUGOI; @@ -29,6 +29,7 @@ public class SugoiService { @Value("${fr.insee.protools.api.sugoi.dmz-account-creation-realm:questionnaire-particuliers}") private String realm; + @Override public User postCreateUser(User userBody) { if(userBody==null){ String msg="called SUGOI postCreateUser with empty userBody"; @@ -60,6 +61,7 @@ public User postCreateUser(User userBody) { } } + @Override public void postInitPassword(String userId, String password) { log.debug("postInitPassword - userId={} begin", userId); ObjectNode body = objectMapper.createObjectNode(); diff --git a/src/main/java/fr/insee/protools/backend/service/sugoi_rem/delegate/SugoiREMCreateMissingAccountListTask.java b/src/main/java/fr/insee/protools/backend/service/sugoi_rem/delegate/SugoiREMCreateMissingAccountListTask.java index 3c7658e4..0ef1f94c 100644 --- a/src/main/java/fr/insee/protools/backend/service/sugoi_rem/delegate/SugoiREMCreateMissingAccountListTask.java +++ b/src/main/java/fr/insee/protools/backend/service/sugoi_rem/delegate/SugoiREMCreateMissingAccountListTask.java @@ -4,9 +4,9 @@ import fr.insee.protools.backend.dto.sugoi.Habilitation; import fr.insee.protools.backend.dto.sugoi.User; import fr.insee.protools.backend.service.DelegateContextVerifier; -import fr.insee.protools.backend.service.context.ContextService; -import fr.insee.protools.backend.service.rem.RemService; -import fr.insee.protools.backend.service.sugoi.SugoiService; +import fr.insee.protools.backend.service.context.IContextService; +import fr.insee.protools.backend.service.rem.RemServiceImpl; +import fr.insee.protools.backend.service.sugoi.ISugoiService; import fr.insee.protools.backend.service.utils.FlowableVariableUtils; import fr.insee.protools.backend.service.utils.password.PasswordService; import lombok.RequiredArgsConstructor; @@ -18,7 +18,6 @@ import java.util.LinkedHashMap; import java.util.List; import java.util.Map; -import java.util.Set; import static fr.insee.protools.backend.service.FlowableVariableNameConstants.VARNAME_CURRENT_PARTITION_ID; import static fr.insee.protools.backend.service.FlowableVariableNameConstants.VARNAME_DIRECTORYACCESS_PWD_FOR_INTERRO_ID_MAP; @@ -31,11 +30,11 @@ public class SugoiREMCreateMissingAccountListTask implements JavaDelegate, Deleg protected static final Habilitation PLATINE_HABILITATION = new Habilitation("platine", "repondant", null); protected static final User createSugoiUserBody = User.builder().habilitations(List.of(PLATINE_HABILITATION)).build(); - private final SugoiService sugoiService; - private final RemService remService; + private final ISugoiService sugoiService; + private final RemServiceImpl remService; private final PasswordService passwordService; - private final ContextService protoolsContext; + private final IContextService protoolsContext; public static final int HOUSEHOLD_PASSWORD_SIZE=8; public static final int DEFAULT_PASSWORD_SIZE=12; diff --git a/src/main/java/fr/insee/protools/backend/service/traiterxxxx/ITraiterXXXService.java b/src/main/java/fr/insee/protools/backend/service/traiterxxxx/ITraiterXXXService.java new file mode 100644 index 00000000..8515cb46 --- /dev/null +++ b/src/main/java/fr/insee/protools/backend/service/traiterxxxx/ITraiterXXXService.java @@ -0,0 +1,11 @@ +package fr.insee.protools.backend.service.traiterxxxx; + +import com.fasterxml.jackson.databind.JsonNode; +import java.util.List; + +public interface ITraiterXXXService { + + List getRemiseEnCollecteForPartition(String partitionId); + + void postContext(String campaignId, JsonNode contextRootNode); +} diff --git a/src/main/java/fr/insee/protools/backend/service/traiterxxxx/TraiterXXXService.java b/src/main/java/fr/insee/protools/backend/service/traiterxxxx/TraiterXXXServiceImpl.java similarity index 95% rename from src/main/java/fr/insee/protools/backend/service/traiterxxxx/TraiterXXXService.java rename to src/main/java/fr/insee/protools/backend/service/traiterxxxx/TraiterXXXServiceImpl.java index af1f7052..572871cc 100644 --- a/src/main/java/fr/insee/protools/backend/service/traiterxxxx/TraiterXXXService.java +++ b/src/main/java/fr/insee/protools/backend/service/traiterxxxx/TraiterXXXServiceImpl.java @@ -15,11 +15,12 @@ @Service @Slf4j @RequiredArgsConstructor -public class TraiterXXXService { +public class TraiterXXXServiceImpl implements ITraiterXXXService{ private final RestClientHelper restClientHelper; private static final ApiConfigProperties.KNOWN_API API = KNOWN_API_TRAITERXXX; + @Override public List getRemiseEnCollecteForPartition(String partitionId) { log.debug("getRemiseEnCollecteForPartition - partitionId={} ",partitionId); ParameterizedTypeReference> typeReference = new ParameterizedTypeReference<>() { }; @@ -36,6 +37,7 @@ public List getRemiseEnCollecteForPartition(String partitionId) { return response; } + @Override public void postContext(String campaignId,JsonNode contextRootNode) { log.trace("postContext: campaignId={}",campaignId); var response = restClientHelper.getRestClient(API) diff --git a/src/main/java/fr/insee/protools/backend/service/traiterxxxx/delegate/TraiterXXXCreateContextTaskREST.java b/src/main/java/fr/insee/protools/backend/service/traiterxxxx/delegate/TraiterXXXCreateContextTaskREST.java index 317a537e..6009f98b 100644 --- a/src/main/java/fr/insee/protools/backend/service/traiterxxxx/delegate/TraiterXXXCreateContextTaskREST.java +++ b/src/main/java/fr/insee/protools/backend/service/traiterxxxx/delegate/TraiterXXXCreateContextTaskREST.java @@ -3,8 +3,8 @@ import com.fasterxml.jackson.databind.JsonNode; import fr.insee.protools.backend.dto.ContexteProcessus; import fr.insee.protools.backend.service.DelegateContextVerifier; -import fr.insee.protools.backend.service.context.ContextService; -import fr.insee.protools.backend.service.traiterxxxx.TraiterXXXService; +import fr.insee.protools.backend.service.context.IContextService; +import fr.insee.protools.backend.service.traiterxxxx.ITraiterXXXService; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.flowable.engine.delegate.DelegateExecution; @@ -15,8 +15,8 @@ @RequiredArgsConstructor @Component public class TraiterXXXCreateContextTaskREST implements JavaDelegate, DelegateContextVerifier { - private final ContextService protoolsContext; - private final TraiterXXXService service; + private final IContextService protoolsContext; + private final ITraiterXXXService service; @Override public void execute(DelegateExecution execution) { diff --git a/src/main/java/fr/insee/protools/backend/service/traiterxxxx/delegate/TraiterXXXGetRemiseEnCollecteTaskREST.java b/src/main/java/fr/insee/protools/backend/service/traiterxxxx/delegate/TraiterXXXGetRemiseEnCollecteTaskREST.java index 6c202c0f..94afb5cd 100644 --- a/src/main/java/fr/insee/protools/backend/service/traiterxxxx/delegate/TraiterXXXGetRemiseEnCollecteTaskREST.java +++ b/src/main/java/fr/insee/protools/backend/service/traiterxxxx/delegate/TraiterXXXGetRemiseEnCollecteTaskREST.java @@ -2,7 +2,7 @@ import com.fasterxml.jackson.databind.JsonNode; import fr.insee.protools.backend.service.DelegateContextVerifier; -import fr.insee.protools.backend.service.traiterxxxx.TraiterXXXService; +import fr.insee.protools.backend.service.traiterxxxx.ITraiterXXXService; import fr.insee.protools.backend.service.utils.FlowableVariableUtils; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -19,7 +19,7 @@ @RequiredArgsConstructor @Component public class TraiterXXXGetRemiseEnCollecteTaskREST implements JavaDelegate, DelegateContextVerifier { - private final TraiterXXXService service; + private final ITraiterXXXService service; @Override public void execute(DelegateExecution execution) { diff --git a/src/test/java/fr/insee/protools/backend/integration/EraREMProcessTest.java b/src/test/java/fr/insee/protools/backend/integration/EraREMProcessTest.java deleted file mode 100644 index bef2ad87..00000000 --- a/src/test/java/fr/insee/protools/backend/integration/EraREMProcessTest.java +++ /dev/null @@ -1,119 +0,0 @@ -package fr.insee.protools.backend.integration; - - -import fr.insee.protools.backend.service.context.ContextServiceImpl; -import fr.insee.protools.backend.service.rem.RemService; -import org.flowable.engine.test.Deployment; -import org.flowable.engine.test.FlowableTest; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; -import org.mockito.Mockito; -import org.mockito.junit.jupiter.MockitoExtension; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.test.mock.mockito.MockBean; -import org.springframework.mock.web.MockMultipartFile; -import org.springframework.test.context.TestPropertySource; -import org.springframework.util.ClassUtils; - -import java.io.IOException; -import java.io.InputStream; -import java.io.UncheckedIOException; -import java.time.LocalDate; -import java.util.List; -import java.util.concurrent.atomic.AtomicLong; - -import static org.assertj.core.api.AssertionsForClassTypes.assertThat; - -@FlowableTest -@SpringBootTest -@TestPropertySource(locations = "/application-test.properties") -@ExtendWith(MockitoExtension.class) -class EraREMProcessTest { -/* - @Autowired ContextServiceImpl contextService; - @MockBean EraService eraService; - @MockBean RemService remService; - - final static String ressourceFolder = ClassUtils.convertClassNameToResourcePath(EraREMProcessTest.class.getPackageName()); - final static String ctx_json = ressourceFolder + "/collecte_web_no_com.json"; - - static AtomicLong i=new AtomicLong(0l); - - @Test - @Deployment(resources = { "fr/insee/protools/backend/integration/noCTX_eraREM.bpmn20.xml" }) - void testBPMN_ERA_REM() { - - //ERA SU for 2 Partitions (2 SU for each partition) - //42 : Men - //43 : Females - String partition1="42",partition2="41"; - CensusJsonDto eraP1SU1=createCensusJsonDto("1",partition1); - CensusJsonDto eraP1SU2=createCensusJsonDto("2",partition1); - CensusJsonDto eraP2SU1=createCensusJsonDto("3",partition2); - CensusJsonDto eraP2SU2=createCensusJsonDto("4",partition2); - - List listOfEraSU_P1 = List.of(eraP1SU1,eraP1SU2); - List listOfEraSU_P2 = List.of(eraP2SU1,eraP2SU2); - SuIdMappingJson mapping_P1 = createSuIdMappingJson(partition1,listOfEraSU_P1); - SuIdMappingJson mapping_P2 = createSuIdMappingJson(partition2,listOfEraSU_P2); - LocalDate startDate = LocalDate.now().minusDays(1); - LocalDate endDate = LocalDate.now(); - - Mockito.when(eraService.getSUForPeriodAndSex(startDate,endDate, GenderType.MALE)).thenReturn(listOfEraSU_P1); - Mockito.when(eraService.getSUForPeriodAndSex(startDate,endDate,GenderType.FEMALE)).thenReturn(listOfEraSU_P2); - - Mockito.when(remService.writeERASUList(partition1,listOfEraSU_P1)) - .thenReturn(mapping_P1); - Mockito.when(remService.writeERASUList(partition2,listOfEraSU_P2)) - .thenReturn(mapping_P2); - - REMSurveyUnitDto rem_P1SU1 = createRemSUFromMapping(mapping_P1.getData().get(0)); - REMSurveyUnitDto rem_P1SU2 = createRemSUFromMapping(mapping_P1.getData().get(1)); - REMSurveyUnitDto rem_P2SU1 = createRemSUFromMapping(mapping_P2.getData().get(0)); - REMSurveyUnitDto rem_P2SU2 = createRemSUFromMapping(mapping_P2.getData().get(1)); - - - Mockito.when(remService.getSurveyUnit(mapping_P1.getData().get(0).repositoryId())) - .thenReturn(rem_P1SU1); - Mockito.when(remService.getSurveyUnit(mapping_P1.getData().get(1).repositoryId())) - .thenReturn(rem_P1SU2); - Mockito.when(remService.getSurveyUnit(mapping_P2.getData().get(0).repositoryId())) - .thenReturn(rem_P2SU1); - Mockito.when(remService.getSurveyUnit(mapping_P2.getData().get(1).repositoryId())) - .thenReturn(rem_P2SU2); - - try (InputStream is = EraREMProcessTest.class.getClassLoader().getResourceAsStream(ctx_json)){ - MockMultipartFile multipartFile = new MockMultipartFile("file.json", "file.json", "text/json", is.readAllBytes()); - String processID = contextService.processContextFileAndCreateProcessInstance(multipartFile,"eraREM","toto"); - assertThat(processID).isNotBlank(); - - } catch (IOException e) { - throw new UncheckedIOException(e); - } - } - - private static CensusJsonDto createCensusJsonDto(String eraId, String partitionID){ - return CensusJsonDto.builder() - .id(eraId) - .identifiantCompte("SU1_PART_"+partitionID) - .build(); - } - private static SuIdMappingJson createSuIdMappingJson(String partitionId,List eraSUList){ - List mappingEraREM = eraSUList.stream().map(censusJsonDto -> new SuIdMappingRecord(i.incrementAndGet(),String.valueOf(censusJsonDto.getId()))).toList(); - return SuIdMappingJson.builder() - .count(mappingEraREM.size()) - .partitionId(partitionId) - .data(mappingEraREM) - .build(); - } - - private static REMSurveyUnitDto createRemSUFromMapping(SuIdMappingRecord mapping){ - return REMSurveyUnitDto.builder() - .repositoryId(mapping.repositoryId()) - .externalId(mapping.externalId()) - .build(); - - } - */ -} \ No newline at end of file diff --git a/src/test/java/fr/insee/protools/backend/integration/GetREMProcessTest.java b/src/test/java/fr/insee/protools/backend/integration/GetREMProcessTest.java new file mode 100644 index 00000000..2d4f441a --- /dev/null +++ b/src/test/java/fr/insee/protools/backend/integration/GetREMProcessTest.java @@ -0,0 +1,113 @@ +package fr.insee.protools.backend.integration; + +import com.fasterxml.jackson.databind.JsonNode; +import fr.insee.protools.backend.integration.delegate_and_services_stub.RemServiceStub; +import org.flowable.bpmn.model.*; +import org.flowable.engine.impl.persistence.entity.ExecutionEntityImpl; +import org.flowable.engine.impl.test.AbstractFlowableTestCase; +import org.flowable.engine.repository.Deployment; +import org.flowable.engine.repository.DeploymentBuilder; +import org.flowable.engine.repository.ProcessDefinition; +import org.flowable.spring.impl.test.FlowableSpringExtension; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.junit.jupiter.MockitoExtension; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.TestPropertySource; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import static fr.insee.protools.backend.service.FlowableVariableNameConstants.*; +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.assertEquals; + + +@ContextConfiguration(value = { + "classpath:fr/insee/protools/backend/integration/springTypicalUsageTest-context.xml", + "classpath:fr/insee/protools/backend/integration/springGetREMDelegate-context.xml" +}) +@TestPropertySource(locations = "/application-test.properties") +//@ExtendWith(PluggableFlowableExtension.class) +@ExtendWith(FlowableSpringExtension.class) +@ExtendWith(MockitoExtension.class) +public class GetREMProcessTest extends AbstractFlowableTestCase { + + final static String END_EVENT_ID ="endTask"; + + private List autoCleanedUpDeploymentIds = new ArrayList<>(); + + @BeforeEach + protected void setUp() throws Exception { + this.autoCleanedUpDeploymentIds.clear(); + } + + @Test + void test() { + String delegateExpression = "${remGetPartitionListOfInterroPaginatedTask}"; + String taskId = "testedServiceTask"; + String processDefinitionId=deployBPMN("testProcess.bpmn20.xml", + createOneServiceTaskProcess(delegateExpression, taskId)); + + Map variables = new HashMap<>(); + variables.put(VARNAME_CURRENT_PARTITION_ID, "1"); + //Start the process + ExecutionEntityImpl processInstance = (ExecutionEntityImpl) runtimeService.startProcessInstanceById(processDefinitionId,variables); + + //Verify + assertThat(runtimeService.createProcessInstanceQuery().count()).isZero(); + String currentActivityId = ((ExecutionEntityImpl) processInstance).getExecutions().get(0).getCurrentActivityId(); + assertEquals(END_EVENT_ID, currentActivityId,"We expected the process to be on its end event"); + + List interroList=processInstance.getVariable(VARNAME_REM_INTERRO_LIST,List.class); + Integer currentPage=processInstance.getVariable(VARNAME_INTERRO_LIST_PAGEABLE_CURRENT_PAGE,Integer.class); + Boolean isLastPage=processInstance.getVariable(VARNAME_INTERRO_LIST_PAGEABLE_IS_LAST_PAGE,Boolean.class); + assertEquals(RemServiceStub.defaultCurrentPage,currentPage); + assertEquals(RemServiceStub.isLastPage,isLastPage); + assertEquals(RemServiceStub.defaultInterroList,interroList); + + } + + private BpmnModel createOneServiceTaskProcess(String delegateExpression, String taskId) { + BpmnModel model = new BpmnModel(); + org.flowable.bpmn.model.Process process = new org.flowable.bpmn.model.Process(); + model.addProcess(process); + + process.setId("oneTaskProcess"); + process.setName("The one task process"); + + StartEvent startEvent = new StartEvent(); + startEvent.setId("start"); + process.addFlowElement(startEvent); + + ServiceTask serviceTask = new ServiceTask(); + serviceTask.setName("The org.flowable.task.service.Task"); + serviceTask.setId(taskId); + serviceTask.setImplementationType(ImplementationType.IMPLEMENTATION_TYPE_DELEGATEEXPRESSION); + serviceTask.setImplementation(delegateExpression); + process.addFlowElement(serviceTask); + + EndEvent endEvent = new EndEvent(); + endEvent.setId(END_EVENT_ID); + process.addFlowElement(endEvent); + + process.addFlowElement(new SequenceFlow("start", taskId)); + process.addFlowElement(new SequenceFlow(taskId, END_EVENT_ID)); + + return model; + } + + + private String deployBPMN(String ressourceName,BpmnModel model){ + + DeploymentBuilder deploymentBuilder = repositoryService.createDeployment(); + deploymentBuilder.addBpmnModel(ressourceName,model); + Deployment deployment = deploymentBuilder.deploy(); + ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery() + .deploymentId(deployment.getId()).singleResult(); + return processDefinition.getId(); + } +} diff --git a/src/test/java/fr/insee/protools/backend/integration/SimpleProcessTest.java b/src/test/java/fr/insee/protools/backend/integration/SimpleProcessTest.java new file mode 100644 index 00000000..4312b890 --- /dev/null +++ b/src/test/java/fr/insee/protools/backend/integration/SimpleProcessTest.java @@ -0,0 +1,64 @@ +package fr.insee.protools.backend.integration; + + +import fr.insee.protools.backend.integration.delegate_and_services_stub.TestDelegate; +import org.flowable.engine.ProcessEngine; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.TaskService; +import org.flowable.engine.test.Deployment; +import org.flowable.spring.impl.test.FlowableSpringExtension; +import org.flowable.task.api.Task; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.TestPropertySource; + +import static org.assertj.core.api.Assertions.assertThat; + + +@ContextConfiguration(value = { + "classpath:fr/insee/protools/backend/integration/springTypicalUsageTest-context.xml", + "classpath:fr/insee/protools/backend/integration/springTestDelegate-context.xml" +}) +@TestPropertySource(locations = "/application-test.properties") +@ExtendWith(FlowableSpringExtension.class) +public class SimpleProcessTest { + + //private ProcessEngine processEngine; + private RuntimeService runtimeService; + private TaskService taskService; + + @BeforeEach + void setUp(ProcessEngine processEngine) { + //this.processEngine = processEngine; + this.runtimeService = processEngine.getRuntimeService(); + this.taskService = processEngine.getTaskService(); + } + + @Test + @Deployment + void testSimpleProcess() { + runtimeService.startProcessInstanceByKey("simpleProcess"); + + Task task = taskService.createTaskQuery().singleResult(); + assertThat(task.getName()).isEqualTo("My User Task"); + + taskService.complete(task.getId()); + assertThat(runtimeService.createProcessInstanceQuery().count()).isZero(); + } + + @Test + @Deployment + void testDelegateProcess() { + runtimeService.startProcessInstanceByKey("delegateProcess"); + + Task task = taskService.createTaskQuery().singleResult(); + assertThat(task.getName()).isEqualTo("My User Task"); + + taskService.complete(task.getId()); + assertThat(runtimeService.createProcessInstanceQuery().count()).isZero(); + + } +} diff --git a/src/test/java/fr/insee/protools/backend/integration/delegate_and_services_stub/RemServiceStub.java b/src/test/java/fr/insee/protools/backend/integration/delegate_and_services_stub/RemServiceStub.java new file mode 100644 index 00000000..cc01e47a --- /dev/null +++ b/src/test/java/fr/insee/protools/backend/integration/delegate_and_services_stub/RemServiceStub.java @@ -0,0 +1,46 @@ +package fr.insee.protools.backend.integration.delegate_and_services_stub; + +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; +import fr.insee.protools.backend.restclient.pagination.PageResponse; +import fr.insee.protools.backend.service.rem.IRemService; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; + +@Service +public class RemServiceStub implements IRemService { + + private final static ObjectMapper objectMapper=new ObjectMapper(); + + public final static List defaultInterroList = List.of(objectMapper.createObjectNode().put("xx","yyy")); + public final static Integer defaultCurrentPage=0; + public final static Integer defaultPageCount=1; + public final static Boolean isLastPage=Boolean.TRUE; + + @Override + public PageResponse getPartitionAllInterroPaginated(String partitionId, long page) { + return PageResponse.builder().currentPage(defaultCurrentPage).pageCount(defaultPageCount).content(defaultInterroList).build(); + } + + @Override + public List getInterrogationIdsWithoutAccountForPartition(String partitionId) { + return null; + } + + @Override + public void patchInterrogationsSetAccounts(Map userByInterroId) { + return ; + } + + @Override + public void putContactsPlatine(List contactPlatineList) { + return ; + } + + @Override + public void postRemiseEnCollecte(List interroRemiseEnCollecteList) { + return ; + } +} diff --git a/src/test/java/fr/insee/protools/backend/integration/delegate_and_services_stub/TestDelegate.java b/src/test/java/fr/insee/protools/backend/integration/delegate_and_services_stub/TestDelegate.java new file mode 100644 index 00000000..03556bce --- /dev/null +++ b/src/test/java/fr/insee/protools/backend/integration/delegate_and_services_stub/TestDelegate.java @@ -0,0 +1,11 @@ +package fr.insee.protools.backend.integration.delegate_and_services_stub; + +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.JavaDelegate; + +public class TestDelegate implements JavaDelegate { + @Override + public void execute(DelegateExecution execution) { + + } +} diff --git a/src/test/java/fr/insee/protools/backend/service/platine/delegate/pilotatage/PlatinePilotageCreateCommunicationEventTaskRESTTestDelegate.java b/src/test/java/fr/insee/protools/backend/service/platine/delegate/pilotatage/PlatinePilotageCreateCommunicationEventTaskRESTTestDelegate.java index d8eef3e1..458b7ed5 100644 --- a/src/test/java/fr/insee/protools/backend/service/platine/delegate/pilotatage/PlatinePilotageCreateCommunicationEventTaskRESTTestDelegate.java +++ b/src/test/java/fr/insee/protools/backend/service/platine/delegate/pilotatage/PlatinePilotageCreateCommunicationEventTaskRESTTestDelegate.java @@ -7,7 +7,7 @@ import fr.insee.protools.backend.dto.platine.pilotage.PlatinePilotageCommunicationEventDto; import fr.insee.protools.backend.exception.ProtoolsProcessFlowBPMNError; -import fr.insee.protools.backend.service.platine.service.PlatinePilotageService; +import fr.insee.protools.backend.service.platine.service.PlatinePilotageServiceImpl; import fr.insee.protools.backend.service.utils.delegate.IDelegateWithVariables; import lombok.extern.slf4j.Slf4j; import org.flowable.engine.delegate.DelegateExecution; @@ -41,7 +41,7 @@ public class PlatinePilotageCreateCommunicationEventTaskRESTTestDelegate implements IDelegateWithVariables { @Mock - PlatinePilotageService platinePilotageService; + PlatinePilotageServiceImpl platinePilotageService; @InjectMocks PlatinePilotageCreateCommunicationEventTaskREST task; diff --git a/src/test/java/fr/insee/protools/backend/service/platine/delegate/pilotatage/PlatinePilotageCreateContextTaskRESTTestDelegate.java b/src/test/java/fr/insee/protools/backend/service/platine/delegate/pilotatage/PlatinePilotageCreateContextTaskRESTTestDelegate.java index 731ccc82..64d6057e 100644 --- a/src/test/java/fr/insee/protools/backend/service/platine/delegate/pilotatage/PlatinePilotageCreateContextTaskRESTTestDelegate.java +++ b/src/test/java/fr/insee/protools/backend/service/platine/delegate/pilotatage/PlatinePilotageCreateContextTaskRESTTestDelegate.java @@ -1,7 +1,7 @@ package fr.insee.protools.backend.service.platine.delegate.pilotatage; import com.fasterxml.jackson.databind.JsonNode; -import fr.insee.protools.backend.service.platine.service.PlatinePilotageService; +import fr.insee.protools.backend.service.platine.service.PlatinePilotageServiceImpl; import fr.insee.protools.backend.service.utils.delegate.TestDelegateWithContext; import org.flowable.engine.delegate.DelegateExecution; import org.flowable.engine.delegate.JavaDelegate; @@ -28,7 +28,7 @@ class PlatinePilotageCreateContextTaskRESTTestDelegate extends TestDelegateWithContext { @Mock - PlatinePilotageService platinePilotageService; + PlatinePilotageServiceImpl platinePilotageService; @InjectMocks PlatinePilotageCreateContextTaskREST platinePilotageTask; diff --git a/src/test/java/fr/insee/protools/backend/service/platine/delegate/pilotatage/PlatinePilotageCreateInterrogationListTaskRESTTestDelegate.java b/src/test/java/fr/insee/protools/backend/service/platine/delegate/pilotatage/PlatinePilotageCreateInterrogationListTaskRESTTestDelegate.java index 7ae44676..b9f0876d 100644 --- a/src/test/java/fr/insee/protools/backend/service/platine/delegate/pilotatage/PlatinePilotageCreateInterrogationListTaskRESTTestDelegate.java +++ b/src/test/java/fr/insee/protools/backend/service/platine/delegate/pilotatage/PlatinePilotageCreateInterrogationListTaskRESTTestDelegate.java @@ -1,7 +1,7 @@ package fr.insee.protools.backend.service.platine.delegate.pilotatage; import com.fasterxml.jackson.databind.JsonNode; -import fr.insee.protools.backend.service.platine.service.PlatinePilotageService; +import fr.insee.protools.backend.service.platine.service.PlatinePilotageServiceImpl; import fr.insee.protools.backend.service.utils.delegate.TestDelegateWithContext; import org.flowable.engine.delegate.DelegateExecution; import org.flowable.engine.delegate.JavaDelegate; @@ -28,7 +28,7 @@ class PlatinePilotageCreateInterrogationListTaskRESTTestDelegate extends TestDelegateWithContext { @Mock - PlatinePilotageService platinePilotageService; + PlatinePilotageServiceImpl platinePilotageService; @InjectMocks PlatinePilotageCreateInterrogationListTaskREST task; diff --git a/src/test/java/fr/insee/protools/backend/service/platine/delegate/pilotatage/PlatinePilotageGetListOfInterroToFollowUpPaginatedTaskRESTTest.java b/src/test/java/fr/insee/protools/backend/service/platine/delegate/pilotatage/PlatinePilotageGetListOfInterroToFollowUpPaginatedTaskRESTTest.java index 8b12e87e..9342ce3f 100644 --- a/src/test/java/fr/insee/protools/backend/service/platine/delegate/pilotatage/PlatinePilotageGetListOfInterroToFollowUpPaginatedTaskRESTTest.java +++ b/src/test/java/fr/insee/protools/backend/service/platine/delegate/pilotatage/PlatinePilotageGetListOfInterroToFollowUpPaginatedTaskRESTTest.java @@ -1,17 +1,14 @@ package fr.insee.protools.backend.service.platine.delegate.pilotatage; import fr.insee.protools.backend.restclient.pagination.PageResponse; -import fr.insee.protools.backend.service.platine.service.PlatinePilotageService; +import fr.insee.protools.backend.service.platine.service.PlatinePilotageServiceImpl; import fr.insee.protools.backend.service.utils.delegate.IDelegateWithVariableGetPaginated; -import fr.insee.protools.backend.service.utils.delegate.PaginationHelper; -import org.flowable.engine.delegate.DelegateExecution; import org.flowable.engine.delegate.JavaDelegate; import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; -import java.util.List; import java.util.Map; import static fr.insee.protools.backend.service.FlowableVariableNameConstants.VARNAME_CURRENT_PARTITION_ID; @@ -24,7 +21,7 @@ class PlatinePilotageGetListOfInterroToFollowUpPaginatedTaskRESTTest @Mock - PlatinePilotageService platinePilotageService; + PlatinePilotageServiceImpl platinePilotageService; @InjectMocks PlatinePilotageGetListOfInterroToFollowUpPaginatedTaskREST task; diff --git a/src/test/java/fr/insee/protools/backend/service/platine/delegate/questionnaire/PlatineQuestionnaireCreateContextTaskRESTTestDelegate.java b/src/test/java/fr/insee/protools/backend/service/platine/delegate/questionnaire/PlatineQuestionnaireCreateContextTaskRESTTestDelegate.java index 6fbb57e4..1cd9e3da 100644 --- a/src/test/java/fr/insee/protools/backend/service/platine/delegate/questionnaire/PlatineQuestionnaireCreateContextTaskRESTTestDelegate.java +++ b/src/test/java/fr/insee/protools/backend/service/platine/delegate/questionnaire/PlatineQuestionnaireCreateContextTaskRESTTestDelegate.java @@ -1,7 +1,7 @@ package fr.insee.protools.backend.service.platine.delegate.questionnaire; import com.fasterxml.jackson.databind.JsonNode; -import fr.insee.protools.backend.service.platine.service.PlatineQuestionnaireService; +import fr.insee.protools.backend.service.platine.service.PlatineQuestionnaireServiceImpl; import fr.insee.protools.backend.service.utils.delegate.TestDelegateWithContext; import org.flowable.engine.delegate.DelegateExecution; import org.flowable.engine.delegate.JavaDelegate; @@ -23,7 +23,7 @@ class PlatineQuestionnaireCreateContextTaskRESTTestDelegate extends TestDelegateWithContext { @Mock - PlatineQuestionnaireService platineQuestionnaireService; + PlatineQuestionnaireServiceImpl platineQuestionnaireService; @InjectMocks PlatineQuestionnaireCreateContextTaskREST platineQuestionnaireTask; diff --git a/src/test/java/fr/insee/protools/backend/service/platine/delegate/questionnaire/PlatineQuestionnaireCreateInterrogationListTaskRESTTestDelegate.java b/src/test/java/fr/insee/protools/backend/service/platine/delegate/questionnaire/PlatineQuestionnaireCreateInterrogationListTaskRESTTestDelegate.java index b9be1c66..0a3b7564 100644 --- a/src/test/java/fr/insee/protools/backend/service/platine/delegate/questionnaire/PlatineQuestionnaireCreateInterrogationListTaskRESTTestDelegate.java +++ b/src/test/java/fr/insee/protools/backend/service/platine/delegate/questionnaire/PlatineQuestionnaireCreateInterrogationListTaskRESTTestDelegate.java @@ -1,7 +1,7 @@ package fr.insee.protools.backend.service.platine.delegate.questionnaire; import com.fasterxml.jackson.databind.JsonNode; -import fr.insee.protools.backend.service.platine.service.PlatineQuestionnaireService; +import fr.insee.protools.backend.service.platine.service.PlatineQuestionnaireServiceImpl; import fr.insee.protools.backend.service.utils.delegate.TestDelegateWithContext; import org.flowable.engine.delegate.DelegateExecution; import org.flowable.engine.delegate.JavaDelegate; @@ -28,7 +28,7 @@ class PlatineQuestionnaireCreateInterrogationListTaskRESTTestDelegate extends TestDelegateWithContext { @Mock - PlatineQuestionnaireService platineQuestionnaireService; + PlatineQuestionnaireServiceImpl platineQuestionnaireService; @InjectMocks PlatineQuestionnaireCreateInterrogationListTaskREST task; diff --git a/src/test/java/fr/insee/protools/backend/service/platine/service/PlatinePilotageServiceTest.java b/src/test/java/fr/insee/protools/backend/service/platine/service/PlatinePilotageServiceTest.java index 0cdfbc22..7bb1ad4e 100644 --- a/src/test/java/fr/insee/protools/backend/service/platine/service/PlatinePilotageServiceTest.java +++ b/src/test/java/fr/insee/protools/backend/service/platine/service/PlatinePilotageServiceTest.java @@ -38,7 +38,7 @@ class PlatinePilotageServiceTest extends TestServiceWithRestClient { private static ObjectMapper objectMapper = new ObjectMapper(); @InjectMocks - PlatinePilotageService service; + PlatinePilotageServiceImpl service; @Value("${fr.insee.protools.api.platine-pilotage.interrogation.page.size:5000}") private int pageSizeGetInterro; diff --git a/src/test/java/fr/insee/protools/backend/service/platine/service/PlatineQuestionnaireServiceTest.java b/src/test/java/fr/insee/protools/backend/service/platine/service/PlatineQuestionnaireServiceTest.java index 479600c1..61f9606c 100644 --- a/src/test/java/fr/insee/protools/backend/service/platine/service/PlatineQuestionnaireServiceTest.java +++ b/src/test/java/fr/insee/protools/backend/service/platine/service/PlatineQuestionnaireServiceTest.java @@ -13,7 +13,6 @@ import java.util.stream.IntStream; import static fr.insee.protools.backend.restclient.configuration.ApiConfigProperties.KNOWN_API.KNOWN_API_PLATINE_QUESTIONNAIRE; -import static fr.insee.protools.backend.restclient.configuration.ApiConfigProperties.KNOWN_API.KNOWN_API_REM; import static fr.insee.protools.backend.utils.data.InterroExamples.generateEmptyInterro; import static org.mockito.Mockito.verify; @@ -21,7 +20,7 @@ class PlatineQuestionnaireServiceTest extends TestServiceWithRestClient { @InjectMocks - PlatineQuestionnaireService service; + PlatineQuestionnaireServiceImpl service; @Test void postContext_should_call_correctURIAndBody(){ diff --git a/src/test/java/fr/insee/protools/backend/service/rem/RemServiceTest.java b/src/test/java/fr/insee/protools/backend/service/rem/RemServiceImplTest.java similarity index 99% rename from src/test/java/fr/insee/protools/backend/service/rem/RemServiceTest.java rename to src/test/java/fr/insee/protools/backend/service/rem/RemServiceImplTest.java index 7e53c389..225658a4 100644 --- a/src/test/java/fr/insee/protools/backend/service/rem/RemServiceTest.java +++ b/src/test/java/fr/insee/protools/backend/service/rem/RemServiceImplTest.java @@ -20,7 +20,6 @@ import java.util.List; import java.util.Map; -import java.util.Optional; import java.util.UUID; import java.util.stream.Collectors; import java.util.stream.IntStream; @@ -34,10 +33,10 @@ import static org.mockito.Mockito.verify; @ExtendWith(MockitoExtension.class) -class RemServiceTest extends TestServiceWithRestClient { +class RemServiceImplTest extends TestServiceWithRestClient { static ObjectMapper objectMapper = new ObjectMapper(); @InjectMocks - RemService service; + RemServiceImpl service; @Value("${fr.insee.protools.api.rem.interrogation.page.size:5000}") private int pageSizeGetInterro; diff --git a/src/test/java/fr/insee/protools/backend/service/rem/delegate/RemGetPartitionListOfInterroPaginatedTaskTest.java b/src/test/java/fr/insee/protools/backend/service/rem/delegate/RemGetPartitionListOfInterroPaginatedTaskTest.java index d5ed8e15..561bd5d2 100644 --- a/src/test/java/fr/insee/protools/backend/service/rem/delegate/RemGetPartitionListOfInterroPaginatedTaskTest.java +++ b/src/test/java/fr/insee/protools/backend/service/rem/delegate/RemGetPartitionListOfInterroPaginatedTaskTest.java @@ -1,7 +1,7 @@ package fr.insee.protools.backend.service.rem.delegate; import fr.insee.protools.backend.restclient.pagination.PageResponse; -import fr.insee.protools.backend.service.rem.RemService; +import fr.insee.protools.backend.service.rem.RemServiceImpl; import fr.insee.protools.backend.service.utils.delegate.IDelegateWithVariableGetPaginated; import org.flowable.engine.delegate.JavaDelegate; import org.junit.jupiter.api.extension.ExtendWith; @@ -21,7 +21,7 @@ class RemGetPartitionListOfInterroPaginatedTaskTest implements IDelegateWithVariableGetPaginated { @Mock - RemService remService; + RemServiceImpl remService; @InjectMocks RemGetPartitionListOfInterroPaginatedTask task; diff --git a/src/test/java/fr/insee/protools/backend/service/rem/delegate/RemPostResmiseEnCollecteTaskRESTTest.java b/src/test/java/fr/insee/protools/backend/service/rem/delegate/RemPostResmiseEnCollecteTaskRESTTest.java index c7da1274..5915d534 100644 --- a/src/test/java/fr/insee/protools/backend/service/rem/delegate/RemPostResmiseEnCollecteTaskRESTTest.java +++ b/src/test/java/fr/insee/protools/backend/service/rem/delegate/RemPostResmiseEnCollecteTaskRESTTest.java @@ -6,9 +6,7 @@ import ch.qos.logback.core.read.ListAppender; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; -import fr.insee.protools.backend.exception.ProtoolsProcessFlowBPMNError; -import fr.insee.protools.backend.service.platine.delegate.pilotatage.PlatinePilotageCreateCommunicationEventTaskREST; -import fr.insee.protools.backend.service.rem.RemService; +import fr.insee.protools.backend.service.rem.RemServiceImpl; import fr.insee.protools.backend.service.utils.delegate.IDelegateWithVariables; import org.assertj.core.api.Assertions; import org.flowable.engine.delegate.DelegateExecution; @@ -42,7 +40,7 @@ class RemPostResmiseEnCollecteTaskRESTTest implements IDelegateWithVariables { private static ObjectMapper objectMapper = new ObjectMapper(); @Mock - RemService remService; + RemServiceImpl remService; @InjectMocks RemPostResmiseEnCollecteTaskREST task; diff --git a/src/test/java/fr/insee/protools/backend/service/rem/delegate/RemPutContactPlatineTaskRESTTest.java b/src/test/java/fr/insee/protools/backend/service/rem/delegate/RemPutContactPlatineTaskRESTTest.java index 1a435665..acace749 100644 --- a/src/test/java/fr/insee/protools/backend/service/rem/delegate/RemPutContactPlatineTaskRESTTest.java +++ b/src/test/java/fr/insee/protools/backend/service/rem/delegate/RemPutContactPlatineTaskRESTTest.java @@ -6,9 +6,7 @@ import ch.qos.logback.core.read.ListAppender; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; -import fr.insee.protools.backend.exception.ProtoolsProcessFlowBPMNError; -import fr.insee.protools.backend.service.platine.delegate.pilotatage.PlatinePilotageCreateCommunicationEventTaskREST; -import fr.insee.protools.backend.service.rem.RemService; +import fr.insee.protools.backend.service.rem.RemServiceImpl; import fr.insee.protools.backend.service.utils.delegate.IDelegateWithVariables; import org.assertj.core.api.Assertions; import org.flowable.engine.delegate.DelegateExecution; @@ -41,7 +39,7 @@ class RemPutContactPlatineTaskRESTTest implements IDelegateWithVariables { private static ObjectMapper objectMapper = new ObjectMapper(); @Mock - RemService remService; + RemServiceImpl remService; @InjectMocks RemPutContactPlatineTaskREST task; diff --git a/src/test/java/fr/insee/protools/backend/service/sugoi/SugoiServiceTest.java b/src/test/java/fr/insee/protools/backend/service/sugoi/SugoiServiceTest.java index 2bee71a1..623047bf 100644 --- a/src/test/java/fr/insee/protools/backend/service/sugoi/SugoiServiceTest.java +++ b/src/test/java/fr/insee/protools/backend/service/sugoi/SugoiServiceTest.java @@ -22,7 +22,7 @@ import java.util.List; import static fr.insee.protools.backend.restclient.configuration.ApiConfigProperties.KNOWN_API.KNOWN_API_SUGOI; -import static fr.insee.protools.backend.service.sugoi.SugoiService.STORAGE; +import static fr.insee.protools.backend.service.sugoi.SugoiServiceImpl.STORAGE; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.containsString; import static org.junit.jupiter.api.Assertions.assertEquals; @@ -38,7 +38,7 @@ class SugoiServiceTest extends TestServiceWithRestClient { @InjectMocks - SugoiService service; + SugoiServiceImpl service; @Value("${fr.insee.protools.api.sugoi.dmz-account-creation-realm:questionnaire-particuliers}") private String realm; diff --git a/src/test/java/fr/insee/protools/backend/service/sugoi_rem/delegate/SugoiREMCreateMissingAccountListTaskTest.java b/src/test/java/fr/insee/protools/backend/service/sugoi_rem/delegate/SugoiREMCreateMissingAccountListTaskTest.java index 178c8994..29a2bd57 100644 --- a/src/test/java/fr/insee/protools/backend/service/sugoi_rem/delegate/SugoiREMCreateMissingAccountListTaskTest.java +++ b/src/test/java/fr/insee/protools/backend/service/sugoi_rem/delegate/SugoiREMCreateMissingAccountListTaskTest.java @@ -6,8 +6,8 @@ import fr.insee.protools.backend.dto.ContexteProcessus; import fr.insee.protools.backend.dto.sugoi.Habilitation; import fr.insee.protools.backend.dto.sugoi.User; -import fr.insee.protools.backend.service.rem.RemService; -import fr.insee.protools.backend.service.sugoi.SugoiService; +import fr.insee.protools.backend.service.rem.RemServiceImpl; +import fr.insee.protools.backend.service.sugoi.SugoiServiceImpl; import fr.insee.protools.backend.service.utils.delegate.TestDelegateWithContext; import fr.insee.protools.backend.service.utils.password.PasswordService; import org.apache.commons.lang3.RandomStringUtils; @@ -39,10 +39,10 @@ class SugoiREMCreateMissingAccountListTaskTest extends TestDelegateWithContext { @Mock - RemService remService; + RemServiceImpl remService; @Mock - SugoiService sugoiService; + SugoiServiceImpl sugoiService; @Mock PasswordService passwordService; diff --git a/src/test/java/fr/insee/protools/backend/service/traiterxxxx/TraiterXXXServiceTest.java b/src/test/java/fr/insee/protools/backend/service/traiterxxxx/TraiterXXXServiceTest.java index 9cf02dbb..730055d1 100644 --- a/src/test/java/fr/insee/protools/backend/service/traiterxxxx/TraiterXXXServiceTest.java +++ b/src/test/java/fr/insee/protools/backend/service/traiterxxxx/TraiterXXXServiceTest.java @@ -24,7 +24,7 @@ class TraiterXXXServiceTest extends TestServiceWithRestClient { private static ObjectMapper objectMapper = new ObjectMapper(); @InjectMocks - TraiterXXXService service; + TraiterXXXServiceImpl service; @Test void postContext_should_call_correctURIAndBody() { diff --git a/src/test/java/fr/insee/protools/backend/service/traiterxxxx/delegate/TraiterXXXCreateContextTaskRESTTest.java b/src/test/java/fr/insee/protools/backend/service/traiterxxxx/delegate/TraiterXXXCreateContextTaskRESTTest.java index cca3486d..3021f6ca 100644 --- a/src/test/java/fr/insee/protools/backend/service/traiterxxxx/delegate/TraiterXXXCreateContextTaskRESTTest.java +++ b/src/test/java/fr/insee/protools/backend/service/traiterxxxx/delegate/TraiterXXXCreateContextTaskRESTTest.java @@ -1,7 +1,7 @@ package fr.insee.protools.backend.service.traiterxxxx.delegate; import com.fasterxml.jackson.databind.JsonNode; -import fr.insee.protools.backend.service.traiterxxxx.TraiterXXXService; +import fr.insee.protools.backend.service.traiterxxxx.TraiterXXXServiceImpl; import fr.insee.protools.backend.service.utils.delegate.TestDelegateWithContext; import org.flowable.engine.delegate.DelegateExecution; import org.flowable.engine.delegate.JavaDelegate; @@ -23,7 +23,7 @@ public class TraiterXXXCreateContextTaskRESTTest extends TestDelegateWithContext { @Mock - TraiterXXXService traiterService; + TraiterXXXServiceImpl traiterService; @InjectMocks TraiterXXXCreateContextTaskREST traiterCreateContextTask; diff --git a/src/test/java/fr/insee/protools/backend/service/traiterxxxx/delegate/TraiterXXXGetRemiseEnCollecteTaskRESTTest.java b/src/test/java/fr/insee/protools/backend/service/traiterxxxx/delegate/TraiterXXXGetRemiseEnCollecteTaskRESTTest.java index d05454fe..82d79367 100644 --- a/src/test/java/fr/insee/protools/backend/service/traiterxxxx/delegate/TraiterXXXGetRemiseEnCollecteTaskRESTTest.java +++ b/src/test/java/fr/insee/protools/backend/service/traiterxxxx/delegate/TraiterXXXGetRemiseEnCollecteTaskRESTTest.java @@ -2,7 +2,7 @@ import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; -import fr.insee.protools.backend.service.traiterxxxx.TraiterXXXService; +import fr.insee.protools.backend.service.traiterxxxx.TraiterXXXServiceImpl; import fr.insee.protools.backend.service.utils.delegate.IDelegateWithVariables; import org.flowable.engine.delegate.DelegateExecution; import org.flowable.engine.delegate.JavaDelegate; @@ -28,7 +28,7 @@ class TraiterXXXGetRemiseEnCollecteTaskRESTTest implements IDelegateWithVariable private static ObjectMapper objectMapper = new ObjectMapper(); @Mock - TraiterXXXService service; + TraiterXXXServiceImpl service; @InjectMocks TraiterXXXGetRemiseEnCollecteTaskREST task; diff --git a/src/test/java/fr/insee/protools/backend/service/utils/delegate/TestDelegateWithContext.java b/src/test/java/fr/insee/protools/backend/service/utils/delegate/TestDelegateWithContext.java index 97e51f5c..b31234d2 100644 --- a/src/test/java/fr/insee/protools/backend/service/utils/delegate/TestDelegateWithContext.java +++ b/src/test/java/fr/insee/protools/backend/service/utils/delegate/TestDelegateWithContext.java @@ -6,7 +6,7 @@ import fr.insee.protools.backend.ProtoolsTestUtils; import fr.insee.protools.backend.dto.ContexteProcessus; import fr.insee.protools.backend.service.DelegateContextVerifier; -import fr.insee.protools.backend.service.context.ContextService; +import fr.insee.protools.backend.service.context.IContextService; import fr.insee.protools.backend.service.context.exception.BadContexMissingBPMNError; import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; @@ -29,7 +29,7 @@ @Slf4j public abstract class TestDelegateWithContext implements IDelegateWithVariables{ - @Spy protected ContextService protoolsContext; + @Spy protected IContextService protoolsContext; private ObjectMapper objectMapper=new ObjectMapper(); diff --git a/src/test/resources/fr/insee/protools/backend/integration/SimpleProcessTest.testDelegateProcess.bpmn20.xml b/src/test/resources/fr/insee/protools/backend/integration/SimpleProcessTest.testDelegateProcess.bpmn20.xml new file mode 100644 index 00000000..4d2042a7 --- /dev/null +++ b/src/test/resources/fr/insee/protools/backend/integration/SimpleProcessTest.testDelegateProcess.bpmn20.xml @@ -0,0 +1,17 @@ + + + + + This is a process for testing purposes + + + + + + + + + + + + diff --git a/src/test/resources/fr/insee/protools/backend/integration/SimpleProcess.testSimpleProcess.bpmn20.xml b/src/test/resources/fr/insee/protools/backend/integration/SimpleProcessTest.testSimpleProcess.bpmn20.xml similarity index 65% rename from src/test/resources/fr/insee/protools/backend/integration/SimpleProcess.testSimpleProcess.bpmn20.xml rename to src/test/resources/fr/insee/protools/backend/integration/SimpleProcessTest.testSimpleProcess.bpmn20.xml index 47ffae90..e06d83c6 100644 --- a/src/test/resources/fr/insee/protools/backend/integration/SimpleProcess.testSimpleProcess.bpmn20.xml +++ b/src/test/resources/fr/insee/protools/backend/integration/SimpleProcessTest.testSimpleProcess.bpmn20.xml @@ -7,9 +7,9 @@ This is a process for testing purposes - - - + + + diff --git a/src/test/resources/fr/insee/protools/backend/integration/collecte_web_no_com.json b/src/test/resources/fr/insee/protools/backend/integration/collecte_web_no_com.json deleted file mode 100644 index 1693e245..00000000 --- a/src/test/resources/fr/insee/protools/backend/integration/collecte_web_no_com.json +++ /dev/null @@ -1,160 +0,0 @@ -{ - "id": "AAB2023A00", - "label": "Test FAMILLE 2023 - MARC", - "contexte": "household", - "metadonnees": { - "annee": 2023, - "periodicite": "A", - "periode": "A00", - "operationId": "AAB2023", - "operationLabelCourt": "MARC - Opération test FAMILLE 2023", - "operationLabelLong": "MARC - Super opération test FAMILLE 2023", - "serieId": "AAB", - "serieLabelCourt": "MARC - Enquête test FAMILLE", - "serieLabelLong": "MARC - Super enquête test FAMILLE", - "portailMesEnquetesOperation": false, - "objectifsCourts": "Cette enquête permet de tester...", - "objectifsLongs": "Cette enquête permet de tester des choses...", - "caractereObligatoire": true, - "qualiteStatistique": true, - "testNonLabellise": true, - "anneeVisa": 2023, - "numeroVisa": "2023xxxxxx", - "ministereTutelle": "de l'Économie, des Finances et de la Souveraineté Industrielle et Numérique", - "parutionJo": true, - "dateParutionJo": "2021-12-23", - "responsableOperationnel": "L’Institut national de la statistique et des études économiques (Insee)", - "responsableTraitement": "l'Insee", - "cnisUrl": "http://cnis/DOG2021", - "diffusionUrl": "http://diffusion/DOG2021", - "noticeUrl": "http://notice/DOG2021", - "specimenUrl": "http://specimenUrl/DOG2021", - "proprietaireId": "proprietaireTest", - "proprietaireLabel": "faux proprietaire de test", - "proprietaireLogo": "1", - "assistanceNiveau2Id": "assistance2Test", - "assistanceNiveau2Label": "fausse assistance niveau 2 de test", - "assistanceNiveau2Tel": "0000000000", - "assitanceNiveau2Mail": "mail", - "asssistanceNiveau2Pays": "France", - "assistanceNiveau2NumeroVoie": "1", - "assistanceNiveau2NomVoie": "rue de la Libération", - "assistanceNiveau2Commune": "Besançon", - "assistanceNiveau2CodePostal": "25000", - "mailBoiteRetour": "audrey.dorolle@insee.fr", - "urlEnquete": "https://enquetes.stat-publique.fr/fam", - "themeMieuxConnaitreMail": "les familles", - "serviceCollecteurSignataireFonction": "La directrice des statistiques démographiques et sociales de l’Insee", - "serviceCollecteurSignataireNom": "Christel Colin", - "prestataire": false, - "mailResponsableOperationnel": "contact-rgpd@insee.fr", - "logoPrestataire": "", - "urlLoiStatistique": "urlLoiStatistique_val", - "urlLoiRGPD": "urlLoiRGPD_val", - "urlLoiInformatique": "urlLoiInformatique_val" - }, - "partitions": [{ - "id": 43, - "typeEchantillon" : "logement", - "label": "premier lot FAMILLE 2023", - "dateDebutCollecte": "2023-04-16T14:07:23.001Z", - "dateFinCollecte": "2024-05-16T14:07:23.001Z", - "dateRetour": "2025-05-15T14:07:23.001Z", - "questionnaireModel": "quest_model_famille", - "quiRepond1": "Qui doit répondre paragraphe 1", - "quiRepond2": "Qui doit répondre paragraphe 2", - "quiRepond3": "Qui doit répondre paragraphe 3", - "sexe": "femmes", - "communications" :[ - { - "moyenCommunication" : "mail", - "phaseCommunication" : "ouverture", - "avecQuestionnairePapier" : false, - "protocole" : null, - "mode" : "web", - "typeModele" : "relance_libre", - "objetMail" : "Insee - enquêtes Familles 2024", - "relanceLibreMailParagraphe1" : "Vous avez récemment répondu à l’enquête de recensement de la population de l’Institut national de la statistique et des études économiques (Insee) et je vous en remercie.", - "relanceLibreMailParagraphe2" : "Votre foyer est retenu pour répondre à des questions supplémentaires sur le thème de la famille. Votre participation est essentielle pour connaître les situations et modes de vie des familles aujourd’hui.", - "relanceLibreMailParagraphe3" : "Dans votre foyer, chaque femme âgée de 18 ans ou plus est sollicitée pour répondre à un questionnaire court en ligne.", - "relanceLibreMailParagraphe4" : "Répondre prendra 15 minutes environ. Vous pouvez dès maintenant vous connecter.", - "complementConnexion" : "Il s’agit du mot de passe que vous avez utilisé pour répondre à l’enquête de recensement de la population.", - "echeances" : ["J+0"] - }, - { - "moyenCommunication" : "mail", - "phaseCommunication" : "relance", - "avecQuestionnairePapier" : false, - "protocole" : null, - "mode" : "web", - "typeModele" : "relance_libre", - "objetMail" : "Rappel Insee - enquêtes Familles 2024", - "relanceLibreMailParagraphe1" : "Vous avez été sollicité pour répondre à l'enquête Familles de l'institut national de la statistique et des études économiques (Insee).", - "relanceLibreMailParagraphe2" : "A ce jour nous n'avons pas reçu de réponse de votre part. Votre participation est essentielle pour connaître les situations et modes de vie des familles aujourd’hui.", - "relanceLibreMailParagraphe3" : "Dans votre foyer, chaque femme âgée de 18 ans ou plus est sollicitée pour répondre à un questionnaire court en ligne.", - "relanceLibreMailParagraphe4" : "Répondre prendra 15 minutes environ. Vous pouvez dès maintenant vous connecter.", - "complementConnexion" : "Il s’agit du mot de passe que vous avez utilisé pour répondre à l’enquête de recensement de la population.", - "echeances" : ["J+3","J+7","J+20"] - } - ] - }, - { - "id": 42, - "typeEchantillon" : "logement", - "label": "2nd lot lot FAMILLE 2023", - "dateDebutCollecte": "2023-04-16T14:07:23.001Z", - "dateFinCollecte": "2024-05-16T14:07:23.001Z", - "dateRetour": "2025-05-15T14:07:23.001Z", - "questionnaireModel": "quest_model_famille", - "quiRepond1": "Qui doit répondre paragraphe 1", - "quiRepond2": "Qui doit répondre paragraphe 2", - "quiRepond3": "Qui doit répondre paragraphe 3", - "sexe": "hommes", - "communications": [ - { - "moyenCommunication" : "mail", - "phaseCommunication" : "ouverture", - "avecQuestionnairePapier" : false, - "protocole" : null, - "mode" : "web", - "typeModele" : "relance_libre", - "objetMail" : "Insee - enquêtes Familles 2024", - "relanceLibreMailParagraphe1" : "Vous avez récemment répondu à l’enquête de recensement de la population de l’Institut national de la statistique et des études économiques (Insee) et je vous en remercie.", - "relanceLibreMailParagraphe2" : "Votre foyer est retenu pour répondre à des questions supplémentaires sur le thème de la famille. Votre participation est essentielle pour connaître les situations et modes de vie des familles aujourd’hui.", - "relanceLibreMailParagraphe3" : "Dans votre foyer, chaque homme âgé de 18 ans ou plus est sollicité pour répondre à un questionnaire court en ligne.", - "relanceLibreMailParagraphe4" : "Répondre prendra 15 minutes environ. Vous pouvez dès maintenant vous connecter.", - "complementConnexion" : "Il s’agit du mot de passe que vous avez utilisé pour répondre à l’enquête de recensement de la population.", - "echeances" : ["J+0"] - }, - { - "moyenCommunication" : "mail", - "phaseCommunication" : "relance", - "avecQuestionnairePapier" : false, - "protocole" : null, - "mode" : "web", - "typeModele" : "relance_libre", - "objetMail" : "Rappel Insee - enquêtes Familles 2024", - "relanceLibreMailParagraphe1" : "Vous avez été sollicité pour répondre à l'enquête Familles de l'institut national de la statistique et des études économiques (Insee).", - "relanceLibreMailParagraphe2" : "A ce jour nous n'avons pas reçu de réponse de votre part. Votre participation est essentielle pour connaître les situations et modes de vie des familles aujourd’hui.", - "relanceLibreMailParagraphe3" : "Dans votre foyer, chaque homme âgé de 18 ans ou plus est sollicité pour répondre à un questionnaire court en ligne.", - "relanceLibreMailParagraphe4" : "Répondre prendra 15 minutes environ. Vous pouvez dès maintenant vous connecter.", - "complementConnexion" : "Il s’agit du mot de passe que vous avez utilisé pour répondre à l’enquête de recensement de la population.", - "echeances" : ["J+3","J+7","J+20"] - } - ] - } - ], - "questionnaireModels": [{ - "id": "quest_model_famille", - "cheminRepertoire": "tests/coleman", - "label": "questionnaireModel de famille", - "requiredNomenclatureIds": [] - }, - { - "id": "quest_model_famille", - "cheminRepertoire": "tests/coleman", - "label": "questionnaireModel de famille", - "requiredNomenclatureIds": [] - }], - "nomenclatures": [] -} \ No newline at end of file diff --git a/src/test/resources/fr/insee/protools/backend/integration/noCTX_eraREM.bpmn20.xml b/src/test/resources/fr/insee/protools/backend/integration/noCTX_eraREM.bpmn20.xml deleted file mode 100644 index 38f9bc35..00000000 --- a/src/test/resources/fr/insee/protools/backend/integration/noCTX_eraREM.bpmn20.xml +++ /dev/null @@ -1,232 +0,0 @@ - - - - - - Crée le contexte d'une campagne web dans la plateforme Platine à partir des métadonnées de processus. - - Concerne les données questionnaire (nomenclatures, modèles de questionnaire) - - - Crée le contexte d'une campagne web dans la plateforme Platine à partir des métadonnées de processus. - - Concerne les données pilotage (partitions, dates de collecte...) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 2023-09-11T17:00:20+0200 - - - - - - - 00 32 * * * ? - - - - - 2023-09-15T22:00:20+0200 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/test/resources/fr/insee/protools/backend/integration/springGetREMDelegate-context.xml b/src/test/resources/fr/insee/protools/backend/integration/springGetREMDelegate-context.xml new file mode 100644 index 00000000..4f1d7fb5 --- /dev/null +++ b/src/test/resources/fr/insee/protools/backend/integration/springGetREMDelegate-context.xml @@ -0,0 +1,14 @@ + + + + + + + + + \ No newline at end of file diff --git a/src/test/resources/fr/insee/protools/backend/integration/springTestDelegate-context.xml b/src/test/resources/fr/insee/protools/backend/integration/springTestDelegate-context.xml new file mode 100644 index 00000000..ae2a77fe --- /dev/null +++ b/src/test/resources/fr/insee/protools/backend/integration/springTestDelegate-context.xml @@ -0,0 +1,12 @@ + + + + + + + \ No newline at end of file diff --git a/src/test/resources/fr/insee/protools/backend/integration/springTypicalUsageTest-context.xml b/src/test/resources/fr/insee/protools/backend/integration/springTypicalUsageTest-context.xml new file mode 100644 index 00000000..16ff97eb --- /dev/null +++ b/src/test/resources/fr/insee/protools/backend/integration/springTypicalUsageTest-context.xml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file From 051647edb26d71d3b90d6c8c1bb96824719d7fbc Mon Sep 17 00:00:00 2001 From: SNDIL - Marc Date: Thu, 26 Sep 2024 12:49:14 +0200 Subject: [PATCH 72/75] feat: sonarlint + intellij inspect suggestions --- .../configuration/SpringDocConfiguration.java | 5 ++-- .../backend/controller/StarterController.java | 3 +-- .../dto/meshuggah/MeshuggahComDetails.java | 20 ---------------- ...PlatinePilotageCommunicationEventType.java | 2 +- .../RestClientKeycloakHeadersInitializer.java | 10 ++++---- .../restclient/keycloak/KeycloakService.java | 6 ++--- .../backend/restclient/keycloak/Token.java | 9 +------ .../FlowableVariableNameConstants.java | 21 ---------------- .../service/context/ContextServiceImpl.java | 2 +- .../context/enums/CampaignContextEnum.java | 24 ------------------- .../enums/PartitionTypeEchantillon.java | 16 ------------- .../resolvers/PartitionCtxResolver.java | 3 +-- ...unicationForInterrogationListTaskREST.java | 2 +- ...lotageCreateInterrogationListTaskREST.java | 4 ++-- ...nnaireCreateInterrogationListTaskREST.java | 4 ++-- .../RemPostResmiseEnCollecteTaskREST.java | 2 +- .../RemPutContactPlatineTaskREST.java | 2 +- .../SugoiREMCreateMissingAccountListTask.java | 2 +- .../integration/GetREMProcessTest.java | 4 ++-- .../integration/SimpleProcessTest.java | 4 +--- 20 files changed, 26 insertions(+), 119 deletions(-) delete mode 100644 src/main/java/fr/insee/protools/backend/dto/meshuggah/MeshuggahComDetails.java delete mode 100644 src/main/java/fr/insee/protools/backend/service/context/enums/CampaignContextEnum.java delete mode 100644 src/main/java/fr/insee/protools/backend/service/context/enums/PartitionTypeEchantillon.java diff --git a/src/main/java/fr/insee/protools/backend/configuration/SpringDocConfiguration.java b/src/main/java/fr/insee/protools/backend/configuration/SpringDocConfiguration.java index a119760c..21035278 100644 --- a/src/main/java/fr/insee/protools/backend/configuration/SpringDocConfiguration.java +++ b/src/main/java/fr/insee/protools/backend/configuration/SpringDocConfiguration.java @@ -8,6 +8,7 @@ import io.swagger.v3.oas.models.security.OAuthFlows; import io.swagger.v3.oas.models.security.SecurityRequirement; import io.swagger.v3.oas.models.security.SecurityScheme; +import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springdoc.core.customizers.OperationCustomizer; import org.springframework.beans.factory.annotation.Autowired; @@ -19,12 +20,10 @@ @Configuration @Slf4j +@RequiredArgsConstructor public class SpringDocConfiguration { - @Autowired private InseeSpringdocProperties springdocProperties; - - @Autowired(required = false) private Optional buildProperties; diff --git a/src/main/java/fr/insee/protools/backend/controller/StarterController.java b/src/main/java/fr/insee/protools/backend/controller/StarterController.java index 07671d58..bfe21000 100644 --- a/src/main/java/fr/insee/protools/backend/controller/StarterController.java +++ b/src/main/java/fr/insee/protools/backend/controller/StarterController.java @@ -21,8 +21,7 @@ @RequiredArgsConstructor public class StarterController { - @Autowired(required = false) - private Optional buildProperties; + private final Optional buildProperties; private final RestClientHelper restClientHelper; diff --git a/src/main/java/fr/insee/protools/backend/dto/meshuggah/MeshuggahComDetails.java b/src/main/java/fr/insee/protools/backend/dto/meshuggah/MeshuggahComDetails.java deleted file mode 100644 index 289eed28..00000000 --- a/src/main/java/fr/insee/protools/backend/dto/meshuggah/MeshuggahComDetails.java +++ /dev/null @@ -1,20 +0,0 @@ -package fr.insee.protools.backend.dto.meshuggah; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -@Data -@Builder -@NoArgsConstructor @AllArgsConstructor -public class MeshuggahComDetails { - String campaignId; - String partitioningId; - String medium; - String phase; - String operation; - String mode; - String protocol; - boolean avecQuestionnaire; -} \ No newline at end of file diff --git a/src/main/java/fr/insee/protools/backend/dto/platine/pilotage/PlatinePilotageCommunicationEventType.java b/src/main/java/fr/insee/protools/backend/dto/platine/pilotage/PlatinePilotageCommunicationEventType.java index 1867c7ca..f305675c 100644 --- a/src/main/java/fr/insee/protools/backend/dto/platine/pilotage/PlatinePilotageCommunicationEventType.java +++ b/src/main/java/fr/insee/protools/backend/dto/platine/pilotage/PlatinePilotageCommunicationEventType.java @@ -8,7 +8,7 @@ public enum PlatinePilotageCommunicationEventType { public final String label; - private PlatinePilotageCommunicationEventType(String label) { + PlatinePilotageCommunicationEventType(String label) { this.label = label; } } diff --git a/src/main/java/fr/insee/protools/backend/restclient/RestClientKeycloakHeadersInitializer.java b/src/main/java/fr/insee/protools/backend/restclient/RestClientKeycloakHeadersInitializer.java index d6e62fe4..3389ecd4 100644 --- a/src/main/java/fr/insee/protools/backend/restclient/RestClientKeycloakHeadersInitializer.java +++ b/src/main/java/fr/insee/protools/backend/restclient/RestClientKeycloakHeadersInitializer.java @@ -15,22 +15,22 @@ */ class RestClientKeycloakHeadersInitializer implements ClientHttpRequestInitializer { - KeycloakService keycloakService; - //Configuration of the connexion to the auth server - private APIProperties.AuthProperties authProperties; + final KeycloakService keycloakService; + //Configuration of the connexion to the auth server + private final APIProperties.AuthProperties authProperties; public RestClientKeycloakHeadersInitializer(KeycloakService keycloakService, APIProperties.AuthProperties authProperties) { this.keycloakService = keycloakService; this.authProperties = authProperties; } - @Override + @Override public void initialize(ClientHttpRequest request) { try { request.getHeaders().setBearerAuth(keycloakService.getToken(authProperties)); } catch (KeycloakTokenConfigBPMNError e) { throw new KeycloakTokenConfigUncheckedBPMNError(e); } - request.getHeaders().setContentType(MediaType.APPLICATION_JSON); + request.getHeaders().setContentType(MediaType.APPLICATION_JSON); } } diff --git a/src/main/java/fr/insee/protools/backend/restclient/keycloak/KeycloakService.java b/src/main/java/fr/insee/protools/backend/restclient/keycloak/KeycloakService.java index 075fa09e..1c898f07 100644 --- a/src/main/java/fr/insee/protools/backend/restclient/keycloak/KeycloakService.java +++ b/src/main/java/fr/insee/protools/backend/restclient/keycloak/KeycloakService.java @@ -54,11 +54,11 @@ public String getToken(APIProperties.AuthProperties authProperties) throws Keycl logToken(token); //We refresh any expired token or that will expire within TOKEN_REFRESH_LIMIT_MILISECONDS - if(token==null || Instant.now().toEpochMilli() >= (token.endValidityTimeMillis- TOKEN_REFRESH_LIMIT_MILLISECONDS)){ + if(token==null || Instant.now().toEpochMilli() >= (token.endValidityTimeMillis()- TOKEN_REFRESH_LIMIT_MILLISECONDS)){ log.trace("Refresh the token"); refreshToken(authProperties); } - return tokenByAuthRealm.get(authProperties).value; + return tokenByAuthRealm.get(authProperties).value(); } private void refreshToken(APIProperties.AuthProperties authProperties) throws KeycloakTokenConfigBPMNError { @@ -125,7 +125,7 @@ private void logToken(Token token){ var currentDt = Instant.now().toEpochMilli(); if(token!=null) { log.trace("token.endValidityTimeMillis = {} - currentTimeMillis={} - diff={}", - token.endValidityTimeMillis,currentDt, token.endValidityTimeMillis-currentDt); + token.endValidityTimeMillis(),currentDt, token.endValidityTimeMillis()-currentDt); } else log.trace("token=null - currentTimeMillis={}",currentDt); diff --git a/src/main/java/fr/insee/protools/backend/restclient/keycloak/Token.java b/src/main/java/fr/insee/protools/backend/restclient/keycloak/Token.java index 5dd846d9..dce403c0 100644 --- a/src/main/java/fr/insee/protools/backend/restclient/keycloak/Token.java +++ b/src/main/java/fr/insee/protools/backend/restclient/keycloak/Token.java @@ -1,11 +1,4 @@ package fr.insee.protools.backend.restclient.keycloak; -class Token { - public final String value; - public final long endValidityTimeMillis; - - public Token(String value, long endValidityTimeMillis) { - this.value = value; - this.endValidityTimeMillis = endValidityTimeMillis; - } +record Token(String value, long endValidityTimeMillis) { } diff --git a/src/main/java/fr/insee/protools/backend/service/FlowableVariableNameConstants.java b/src/main/java/fr/insee/protools/backend/service/FlowableVariableNameConstants.java index 21a90ace..a1c49076 100644 --- a/src/main/java/fr/insee/protools/backend/service/FlowableVariableNameConstants.java +++ b/src/main/java/fr/insee/protools/backend/service/FlowableVariableNameConstants.java @@ -10,33 +10,12 @@ public class FlowableVariableNameConstants { public static final String VARNAME_CONTEXT="context"; //To treat partitions one by one (Long) public static final String VARNAME_CURRENT_PARTITION_ID="current_partition_id"; - //to pass a list of REM interrogation ids (List) - public static final String VARNAME_REM_INTERRO_ID_LIST ="rem_interrogation_id_list"; - //to pass a single REM survey unit's ID (Long) - public static final String VARNAME_REM_SURVEY_UNIT_IDENTIFIER ="rem_survey_unit_id"; - //to pass a REM survey unit content (JsonNode) - public static final String VARNAME_REM_INTERROGATION ="rem_interrogation"; - public static final String VARNAME_REM_PROTOOLS_INTERRO_LIST = "rem_protools_interrogation_list"; //Sugoi ID/PWD - public static final String VARNAME_DIRECTORYACCESS_ID_CONTACT ="directory_access_id_contact"; public static final String VARNAME_DIRECTORYACCESS_PWD_CONTACT ="directory_access_pwd_contact"; public static final String VARNAME_DIRECTORYACCESS_PWD_FOR_INTERRO_ID_MAP ="directory_access_pwd_contact_by_interroration_id"; - //ERA response - public static final String VARNAME_ERA_RESPONSE="era_response_list"; - public static final String VARNAME_ERA_QUERY_START_DATE="era_query_start_date"; - public static final String VARNAME_ERA_QUERY_END_DATE="era_query_end_date"; - //Platine Contact details - public static final String VARNAME_PLATINE_CONTACT="platine_contact"; - //Indicates whether a questioning should be follow up or not - public static final String VARNAME_SU_IS_TO_FOLLOWUP="survey_unit_is_to_follow_up"; - //List with for each SU the Instant when the opening communication has been sent - //each row is Tuple - public static final String VARNAME_SU_CREATION_ITEM="su_creation_date_item"; - - //For communication public static final String VARNAME_CURRENT_COMMUNICATION_ID="current_communication_id"; public static final String VARNAME_COMMUNICATION_REQUEST_ID_FOR_INTERRO_ID_MAP="communication_request_id_by_interrogation_id"; diff --git a/src/main/java/fr/insee/protools/backend/service/context/ContextServiceImpl.java b/src/main/java/fr/insee/protools/backend/service/context/ContextServiceImpl.java index ae9b1143..b3434938 100644 --- a/src/main/java/fr/insee/protools/backend/service/context/ContextServiceImpl.java +++ b/src/main/java/fr/insee/protools/backend/service/context/ContextServiceImpl.java @@ -263,7 +263,7 @@ private Set analyseProcess(FlowElement flowElement, ContexteProcessus co } } else if (flowElement instanceof SubProcess subProcessFlowElement) { Set errors = new HashSet<>(); - subProcessFlowElement.getFlowElements().stream() + subProcessFlowElement.getFlowElements() .forEach(subFlowElement -> errors.addAll(analyseProcess(subFlowElement, contexteProcessus))); return errors; } diff --git a/src/main/java/fr/insee/protools/backend/service/context/enums/CampaignContextEnum.java b/src/main/java/fr/insee/protools/backend/service/context/enums/CampaignContextEnum.java deleted file mode 100644 index fe7a7142..00000000 --- a/src/main/java/fr/insee/protools/backend/service/context/enums/CampaignContextEnum.java +++ /dev/null @@ -1,24 +0,0 @@ -package fr.insee.protools.backend.service.context.enums; - -public enum CampaignContextEnum { - HOUSEHOLD("household"), - BUSINESS("business"); - - final String contexte; - - CampaignContextEnum(String contexte) { - this.contexte = contexte; - } - - public String getAsString() { - return contexte; - } - - public static CampaignContextEnum fromLabel(String label) { - return switch (label.toLowerCase()) { - case "household" -> HOUSEHOLD; - case "business" -> BUSINESS; - default -> throw new IllegalStateException("Unexpected value for CampaignContextEnum: " + label); - }; - } -} diff --git a/src/main/java/fr/insee/protools/backend/service/context/enums/PartitionTypeEchantillon.java b/src/main/java/fr/insee/protools/backend/service/context/enums/PartitionTypeEchantillon.java deleted file mode 100644 index bedf304a..00000000 --- a/src/main/java/fr/insee/protools/backend/service/context/enums/PartitionTypeEchantillon.java +++ /dev/null @@ -1,16 +0,0 @@ -package fr.insee.protools.backend.service.context.enums; - -public enum PartitionTypeEchantillon { - LOGEMENT("logement"), - INDIVIDU("individu"); - - final String val; - - PartitionTypeEchantillon(String val) { - this.val = val; - } - - public String getAsString() { - return val; - } -} diff --git a/src/main/java/fr/insee/protools/backend/service/context/resolvers/PartitionCtxResolver.java b/src/main/java/fr/insee/protools/backend/service/context/resolvers/PartitionCtxResolver.java index 7f029109..e4815214 100644 --- a/src/main/java/fr/insee/protools/backend/service/context/resolvers/PartitionCtxResolver.java +++ b/src/main/java/fr/insee/protools/backend/service/context/resolvers/PartitionCtxResolver.java @@ -147,8 +147,7 @@ else if(nextCommEcheance == null || nextCommEcheance.isAfter(communication.getEc execution.getRootProcessInstance().setVariableLocal(VARNAME_ALREADY_SCHEDULED_COMMUNICATION_ID_SET,sentCommunicationIds); } - //TODO: remove - System.out.println("part="+partitionId+" - nextCom="+TimeLogUtils.format(nextCommEcheance)); + log.info("part="+partitionId+" - nextCom="+TimeLogUtils.format(nextCommEcheance)); return nextCommEcheance; } diff --git a/src/main/java/fr/insee/protools/backend/service/meshuggah/delegate/MeshuggahSendCommunicationForInterrogationListTaskREST.java b/src/main/java/fr/insee/protools/backend/service/meshuggah/delegate/MeshuggahSendCommunicationForInterrogationListTaskREST.java index 5f4c25fb..7b64072f 100644 --- a/src/main/java/fr/insee/protools/backend/service/meshuggah/delegate/MeshuggahSendCommunicationForInterrogationListTaskREST.java +++ b/src/main/java/fr/insee/protools/backend/service/meshuggah/delegate/MeshuggahSendCommunicationForInterrogationListTaskREST.java @@ -35,7 +35,7 @@ public void execute(DelegateExecution execution) { meshuggahService.postCommunicationRequest(String.valueOf(context.getId()), currentCommunicationId, interroList); - log.info("ProcessInstanceId={} - currentCommunicationId - end", + log.info("ProcessInstanceId={} - currentCommunicationId={} - end", execution.getProcessInstanceId(), currentCommunicationId); } } diff --git a/src/main/java/fr/insee/protools/backend/service/platine/delegate/pilotatage/PlatinePilotageCreateInterrogationListTaskREST.java b/src/main/java/fr/insee/protools/backend/service/platine/delegate/pilotatage/PlatinePilotageCreateInterrogationListTaskREST.java index 6e60c8b0..7dba1557 100644 --- a/src/main/java/fr/insee/protools/backend/service/platine/delegate/pilotatage/PlatinePilotageCreateInterrogationListTaskREST.java +++ b/src/main/java/fr/insee/protools/backend/service/platine/delegate/pilotatage/PlatinePilotageCreateInterrogationListTaskREST.java @@ -30,8 +30,8 @@ public void execute(DelegateExecution execution) { String currentPartitionId = FlowableVariableUtils.getVariableOrThrow(execution, VARNAME_CURRENT_PARTITION_ID, String.class); List interroList = FlowableVariableUtils.getVariableOrThrow(execution, VARNAME_REM_INTERRO_LIST, List.class); - log.info("ProcessInstanceId={} - currentPartitionId={} - begin",currentPartitionId); + log.info("ProcessInstanceId={} - currentPartitionId={} - begin",execution.getProcessInstanceId(),currentPartitionId); platinePilotageService.postInterrogations(String.valueOf(context.getId()),interroList); - log.info("ProcessInstanceId={} - currentPartitionId={} - end",currentPartitionId); + log.info("ProcessInstanceId={} - currentPartitionId={} - end",execution.getProcessInstanceId(),currentPartitionId); } } diff --git a/src/main/java/fr/insee/protools/backend/service/platine/delegate/questionnaire/PlatineQuestionnaireCreateInterrogationListTaskREST.java b/src/main/java/fr/insee/protools/backend/service/platine/delegate/questionnaire/PlatineQuestionnaireCreateInterrogationListTaskREST.java index cd744729..b5c7d6ba 100644 --- a/src/main/java/fr/insee/protools/backend/service/platine/delegate/questionnaire/PlatineQuestionnaireCreateInterrogationListTaskREST.java +++ b/src/main/java/fr/insee/protools/backend/service/platine/delegate/questionnaire/PlatineQuestionnaireCreateInterrogationListTaskREST.java @@ -30,8 +30,8 @@ public void execute(DelegateExecution execution) { String currentPartitionId = FlowableVariableUtils.getVariableOrThrow(execution, VARNAME_CURRENT_PARTITION_ID, String.class); List interroList = FlowableVariableUtils.getVariableOrThrow(execution, VARNAME_REM_INTERRO_LIST, List.class); - log.info("ProcessInstanceId={} - currentPartitionId={} - begin",currentPartitionId); + log.info("ProcessInstanceId={} - currentPartitionId={} - begin",execution.getProcessInstanceId(),currentPartitionId); platineQuestionnaireService.postInterrogations(String.valueOf(context.getId()),interroList); - log.info("ProcessInstanceId={} - currentPartitionId={} - end",currentPartitionId); + log.info("ProcessInstanceId={} - currentPartitionId={} - end",execution.getProcessInstanceId(),currentPartitionId); } } diff --git a/src/main/java/fr/insee/protools/backend/service/rem/delegate/RemPostResmiseEnCollecteTaskREST.java b/src/main/java/fr/insee/protools/backend/service/rem/delegate/RemPostResmiseEnCollecteTaskREST.java index 7aaf3532..3703d712 100644 --- a/src/main/java/fr/insee/protools/backend/service/rem/delegate/RemPostResmiseEnCollecteTaskREST.java +++ b/src/main/java/fr/insee/protools/backend/service/rem/delegate/RemPostResmiseEnCollecteTaskREST.java @@ -19,7 +19,7 @@ @RequiredArgsConstructor public class RemPostResmiseEnCollecteTaskREST implements JavaDelegate, DelegateContextVerifier { - IRemService remService; + private final IRemService remService; @Override public void execute(DelegateExecution execution) { diff --git a/src/main/java/fr/insee/protools/backend/service/rem/delegate/RemPutContactPlatineTaskREST.java b/src/main/java/fr/insee/protools/backend/service/rem/delegate/RemPutContactPlatineTaskREST.java index a0239be9..b68e1356 100644 --- a/src/main/java/fr/insee/protools/backend/service/rem/delegate/RemPutContactPlatineTaskREST.java +++ b/src/main/java/fr/insee/protools/backend/service/rem/delegate/RemPutContactPlatineTaskREST.java @@ -19,7 +19,7 @@ @RequiredArgsConstructor public class RemPutContactPlatineTaskREST implements JavaDelegate, DelegateContextVerifier { - IRemService remService; + private final IRemService remService; @Override public void execute(DelegateExecution execution) { diff --git a/src/main/java/fr/insee/protools/backend/service/sugoi_rem/delegate/SugoiREMCreateMissingAccountListTask.java b/src/main/java/fr/insee/protools/backend/service/sugoi_rem/delegate/SugoiREMCreateMissingAccountListTask.java index 0ef1f94c..e84216ce 100644 --- a/src/main/java/fr/insee/protools/backend/service/sugoi_rem/delegate/SugoiREMCreateMissingAccountListTask.java +++ b/src/main/java/fr/insee/protools/backend/service/sugoi_rem/delegate/SugoiREMCreateMissingAccountListTask.java @@ -60,7 +60,7 @@ public void execute(DelegateExecution execution) { sugoiService.postInitPassword(createdUser.getUsername(), userPassword); userByInterroId.put(interrogationId,createdUser.getUsername()); pwdByInterroId.put(interrogationId,userPassword); - log.debug("ProcessInstanceId={} - username={} ", createdUser.getUsername()); + log.debug("ProcessInstanceId={} - username={} ", execution.getProcessInstanceId(),createdUser.getUsername()); } remService.patchInterrogationsSetAccounts(userByInterroId); diff --git a/src/test/java/fr/insee/protools/backend/integration/GetREMProcessTest.java b/src/test/java/fr/insee/protools/backend/integration/GetREMProcessTest.java index 2d4f441a..103be1f1 100644 --- a/src/test/java/fr/insee/protools/backend/integration/GetREMProcessTest.java +++ b/src/test/java/fr/insee/protools/backend/integration/GetREMProcessTest.java @@ -34,9 +34,9 @@ //@ExtendWith(PluggableFlowableExtension.class) @ExtendWith(FlowableSpringExtension.class) @ExtendWith(MockitoExtension.class) -public class GetREMProcessTest extends AbstractFlowableTestCase { +class GetREMProcessTest extends AbstractFlowableTestCase { - final static String END_EVENT_ID ="endTask"; + static final String END_EVENT_ID ="endTask"; private List autoCleanedUpDeploymentIds = new ArrayList<>(); diff --git a/src/test/java/fr/insee/protools/backend/integration/SimpleProcessTest.java b/src/test/java/fr/insee/protools/backend/integration/SimpleProcessTest.java index 4312b890..9a73698a 100644 --- a/src/test/java/fr/insee/protools/backend/integration/SimpleProcessTest.java +++ b/src/test/java/fr/insee/protools/backend/integration/SimpleProcessTest.java @@ -1,7 +1,6 @@ package fr.insee.protools.backend.integration; -import fr.insee.protools.backend.integration.delegate_and_services_stub.TestDelegate; import org.flowable.engine.ProcessEngine; import org.flowable.engine.RuntimeService; import org.flowable.engine.TaskService; @@ -11,7 +10,6 @@ import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.TestPropertySource; @@ -24,7 +22,7 @@ }) @TestPropertySource(locations = "/application-test.properties") @ExtendWith(FlowableSpringExtension.class) -public class SimpleProcessTest { +class SimpleProcessTest { //private ProcessEngine processEngine; private RuntimeService runtimeService; From 1ec1ae3a90747de69525868a3add37a5ba2a66c9 Mon Sep 17 00:00:00 2001 From: SNDIL - Marc Date: Thu, 26 Sep 2024 12:56:54 +0200 Subject: [PATCH 73/75] feat: sonarlint + intellij inspect suggestions (records et espaces) --- .../configuration/SpringDocConfiguration.java | 1 - .../backend/controller/StarterController.java | 1 - .../PlatinePilotageCommunicationEventDto.java | 17 ++++++--------- ...otageCreateCommunicationEventTaskREST.java | 21 ++++++++----------- .../traiterxxxx/ITraiterXXXService.java | 1 + ...ommunicationEventTaskRESTTestDelegate.java | 8 +++---- .../service/PlatinePilotageServiceTest.java | 5 +---- 7 files changed, 21 insertions(+), 33 deletions(-) diff --git a/src/main/java/fr/insee/protools/backend/configuration/SpringDocConfiguration.java b/src/main/java/fr/insee/protools/backend/configuration/SpringDocConfiguration.java index 21035278..8b728825 100644 --- a/src/main/java/fr/insee/protools/backend/configuration/SpringDocConfiguration.java +++ b/src/main/java/fr/insee/protools/backend/configuration/SpringDocConfiguration.java @@ -11,7 +11,6 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springdoc.core.customizers.OperationCustomizer; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.info.BuildProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; diff --git a/src/main/java/fr/insee/protools/backend/controller/StarterController.java b/src/main/java/fr/insee/protools/backend/controller/StarterController.java index bfe21000..08aa5213 100644 --- a/src/main/java/fr/insee/protools/backend/controller/StarterController.java +++ b/src/main/java/fr/insee/protools/backend/controller/StarterController.java @@ -3,7 +3,6 @@ import com.fasterxml.jackson.databind.JsonNode; import fr.insee.protools.backend.restclient.RestClientHelper; import lombok.RequiredArgsConstructor; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.info.BuildProperties; import org.springframework.core.io.ClassPathResource; import org.springframework.core.io.Resource; diff --git a/src/main/java/fr/insee/protools/backend/dto/platine/pilotage/PlatinePilotageCommunicationEventDto.java b/src/main/java/fr/insee/protools/backend/dto/platine/pilotage/PlatinePilotageCommunicationEventDto.java index c107094b..a0e70db5 100644 --- a/src/main/java/fr/insee/protools/backend/dto/platine/pilotage/PlatinePilotageCommunicationEventDto.java +++ b/src/main/java/fr/insee/protools/backend/dto/platine/pilotage/PlatinePilotageCommunicationEventDto.java @@ -1,13 +1,8 @@ package fr.insee.protools.backend.dto.platine.pilotage; -import lombok.Builder; -import lombok.Data; - -@Builder -@Data -public class PlatinePilotageCommunicationEventDto { - String interrogationId; - String communicationRequestId; - String communcationId; - PlatinePilotageCommunicationEventType state; -} +public record PlatinePilotageCommunicationEventDto( + String interrogationId, + String communicationId, + String communicationRequestId, + PlatinePilotageCommunicationEventType state +) {} \ No newline at end of file diff --git a/src/main/java/fr/insee/protools/backend/service/platine/delegate/pilotatage/PlatinePilotageCreateCommunicationEventTaskREST.java b/src/main/java/fr/insee/protools/backend/service/platine/delegate/pilotatage/PlatinePilotageCreateCommunicationEventTaskREST.java index 8f10b27b..cedb4883 100644 --- a/src/main/java/fr/insee/protools/backend/service/platine/delegate/pilotatage/PlatinePilotageCreateCommunicationEventTaskREST.java +++ b/src/main/java/fr/insee/protools/backend/service/platine/delegate/pilotatage/PlatinePilotageCreateCommunicationEventTaskREST.java @@ -25,39 +25,36 @@ public class PlatinePilotageCreateCommunicationEventTaskREST implements JavaDele @Override public void execute(DelegateExecution execution) { - String currentCommunicationId= FlowableVariableUtils.getVariableOrThrow(execution, VARNAME_CURRENT_COMMUNICATION_ID, String.class); + String currentCommunicationId = FlowableVariableUtils.getVariableOrThrow(execution, VARNAME_CURRENT_COMMUNICATION_ID, String.class); String currentPartitionId = FlowableVariableUtils.getVariableOrThrow(execution, VARNAME_CURRENT_PARTITION_ID, String.class); log.info("ProcessInstanceId={} currentPartitionId={} - currentCommunicationId{} - begin", - execution.getProcessInstanceId(),currentPartitionId, currentCommunicationId); - Map communicationRequestIdByInterroIdMap = FlowableVariableUtils.getVariableOrThrow(execution, VARNAME_COMMUNICATION_REQUEST_ID_FOR_INTERRO_ID_MAP, Map.class); + execution.getProcessInstanceId(), currentPartitionId, currentCommunicationId); + Map communicationRequestIdByInterroIdMap = FlowableVariableUtils.getVariableOrThrow(execution, VARNAME_COMMUNICATION_REQUEST_ID_FOR_INTERRO_ID_MAP, Map.class); - if(currentCommunicationId.isBlank()){ + if (currentCommunicationId.isBlank()) { log.error("ProcessInstanceId={} currentPartitionId={} - currentCommunicationId{} : currentCommunicationId cannot be blank", - execution.getProcessInstanceId(),currentPartitionId, currentCommunicationId); + execution.getProcessInstanceId(), currentPartitionId, currentCommunicationId); throw new ProtoolsProcessFlowBPMNError("PlatinePilotageCreateCommunicationEventTaskREST: communicationId cannot be empty"); } //If nothing to do ==> Directly return - if(communicationRequestIdByInterroIdMap.isEmpty()){ + if (communicationRequestIdByInterroIdMap.isEmpty()) { log.info("ProcessInstanceId={} currentPartitionId={} - currentCommunicationId{} - end : Nothing to do", - execution.getProcessInstanceId(),currentPartitionId, currentCommunicationId); + execution.getProcessInstanceId(), currentPartitionId, currentCommunicationId); return; } List platinePilotageCommunicationEventList = communicationRequestIdByInterroIdMap.entrySet() .stream() .map(entry -> - PlatinePilotageCommunicationEventDto.builder() - .communcationId(currentCommunicationId) - .communicationRequestId(entry.getValue()) - .interrogationId(entry.getKey()).state(COMMUNICATION_STATE_SENT).build()) + new PlatinePilotageCommunicationEventDto(entry.getKey(), currentCommunicationId, entry.getValue(), COMMUNICATION_STATE_SENT)) .toList(); //Check ctx? platinePilotageService.postCommunicationEvents(platinePilotageCommunicationEventList); - log.info("ProcessInstanceId={} end",execution.getProcessInstanceId()); + log.info("ProcessInstanceId={} end", execution.getProcessInstanceId()); } } \ No newline at end of file diff --git a/src/main/java/fr/insee/protools/backend/service/traiterxxxx/ITraiterXXXService.java b/src/main/java/fr/insee/protools/backend/service/traiterxxxx/ITraiterXXXService.java index 8515cb46..d2d750b4 100644 --- a/src/main/java/fr/insee/protools/backend/service/traiterxxxx/ITraiterXXXService.java +++ b/src/main/java/fr/insee/protools/backend/service/traiterxxxx/ITraiterXXXService.java @@ -1,6 +1,7 @@ package fr.insee.protools.backend.service.traiterxxxx; import com.fasterxml.jackson.databind.JsonNode; + import java.util.List; public interface ITraiterXXXService { diff --git a/src/test/java/fr/insee/protools/backend/service/platine/delegate/pilotatage/PlatinePilotageCreateCommunicationEventTaskRESTTestDelegate.java b/src/test/java/fr/insee/protools/backend/service/platine/delegate/pilotatage/PlatinePilotageCreateCommunicationEventTaskRESTTestDelegate.java index 458b7ed5..2737678f 100644 --- a/src/test/java/fr/insee/protools/backend/service/platine/delegate/pilotatage/PlatinePilotageCreateCommunicationEventTaskRESTTestDelegate.java +++ b/src/test/java/fr/insee/protools/backend/service/platine/delegate/pilotatage/PlatinePilotageCreateCommunicationEventTaskRESTTestDelegate.java @@ -103,15 +103,15 @@ void execute_should_work_whenEverythingOk(Map commIdByInterro, S //check that we passed the correct items Set requiredInterroIds = new HashSet<>(commIdByInterro.keySet()); for (var comEventDto : actualArgument) { - String idInterro = comEventDto.getInterrogationId(); + String idInterro = comEventDto.interrogationId(); if (requiredInterroIds.contains(idInterro)) { //ComRequestId is correct String expectedCommId = commIdByInterro.get(idInterro); - String actualCommId = comEventDto.getCommunicationRequestId(); - assertEquals(expectedCommId, actualCommId, + String actualCommReqId = comEventDto.communicationRequestId(); + assertEquals(expectedCommId, actualCommReqId, "Communcation Request ID is not the one expected for idInterro=" + idInterro + " - "); - assertEquals(communcationId,comEventDto.getCommuncationId()); + assertEquals(communcationId,comEventDto.communicationId()); //CommId is requiredInterroIds.remove(idInterro); //this id has correctly been sent } diff --git a/src/test/java/fr/insee/protools/backend/service/platine/service/PlatinePilotageServiceTest.java b/src/test/java/fr/insee/protools/backend/service/platine/service/PlatinePilotageServiceTest.java index 7bb1ad4e..89ef0d3d 100644 --- a/src/test/java/fr/insee/protools/backend/service/platine/service/PlatinePilotageServiceTest.java +++ b/src/test/java/fr/insee/protools/backend/service/platine/service/PlatinePilotageServiceTest.java @@ -83,10 +83,7 @@ void postCommunicationEvents_should_makeCorrectCall() { //Prepare List eventList = IntStream.range(0, 10) .mapToObj(i -> - PlatinePilotageCommunicationEventDto.builder() - .interrogationId(UUID.randomUUID().toString()) - .state(PlatinePilotageCommunicationEventType.COMMUNICATION_STATE_SENT) - .communcationId(UUID.randomUUID().toString()).build() + new PlatinePilotageCommunicationEventDto(UUID.randomUUID().toString(),UUID.randomUUID().toString(),"comRequestId-xxx",PlatinePilotageCommunicationEventType.COMMUNICATION_STATE_SENT) ) // Call your function and get the JsonNode .collect(Collectors.toList()); From 9623927ff743484c5941893049192fa1a4f2ff66 Mon Sep 17 00:00:00 2001 From: "farid.ait-karra" Date: Thu, 26 Sep 2024 14:26:50 +0200 Subject: [PATCH 74/75] =?UTF-8?q?feat/implementation-mongo=20:=20-=20Ajout?= =?UTF-8?q?=20de=20la=20v=C3=A9rification=20de=20la=20fin=20de=20traitemen?= =?UTF-8?q?t=20du=20commandengine=20-=20test=202?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../configuration/SchedulerCondition.java | 13 ++ .../configuration/SpringMongoConfig.java | 10 - .../backend/repository/IUniteEnquetee.java | 6 +- .../backend/repository/UniteEnqueteeImpl.java | 38 ++- .../platine_sabiane/QuestionnaireHelper.java | 4 +- ...uestionnaireCreateSurveyUnitTaskAsync.java | 32 ++- .../service/scheduled/TaskService.java | 5 +- src/main/resources/application-dev.properties | 3 +- src/main/resources/processes/poc-all-su.bpmn | 221 ------------------ ...ocess_context_using_protools_endpoint.http | 2 +- 10 files changed, 82 insertions(+), 252 deletions(-) create mode 100644 src/main/java/fr/insee/protools/backend/configuration/SchedulerCondition.java delete mode 100644 src/main/java/fr/insee/protools/backend/configuration/SpringMongoConfig.java delete mode 100644 src/main/resources/processes/poc-all-su.bpmn diff --git a/src/main/java/fr/insee/protools/backend/configuration/SchedulerCondition.java b/src/main/java/fr/insee/protools/backend/configuration/SchedulerCondition.java new file mode 100644 index 00000000..d4bd5104 --- /dev/null +++ b/src/main/java/fr/insee/protools/backend/configuration/SchedulerCondition.java @@ -0,0 +1,13 @@ +package fr.insee.protools.backend.configuration; + +import org.springframework.context.annotation.Condition; +import org.springframework.context.annotation.ConditionContext; +import org.springframework.core.type.AnnotatedTypeMetadata; + +public class SchedulerCondition implements Condition { + @Override + public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) { + return false; + } + +} \ No newline at end of file diff --git a/src/main/java/fr/insee/protools/backend/configuration/SpringMongoConfig.java b/src/main/java/fr/insee/protools/backend/configuration/SpringMongoConfig.java deleted file mode 100644 index ec0f90b1..00000000 --- a/src/main/java/fr/insee/protools/backend/configuration/SpringMongoConfig.java +++ /dev/null @@ -1,10 +0,0 @@ -package fr.insee.protools.backend.configuration; - -import org.springframework.context.annotation.Configuration; - -@Configuration -public class SpringMongoConfig{ - -// TODO remove _class - -} \ No newline at end of file diff --git a/src/main/java/fr/insee/protools/backend/repository/IUniteEnquetee.java b/src/main/java/fr/insee/protools/backend/repository/IUniteEnquetee.java index 65a32439..043f05bd 100644 --- a/src/main/java/fr/insee/protools/backend/repository/IUniteEnquetee.java +++ b/src/main/java/fr/insee/protools/backend/repository/IUniteEnquetee.java @@ -10,9 +10,11 @@ public interface IUniteEnquetee { @Transactional void addManyUniteEnquetee(List listeUe); - void addManyUniteEnquetee(List listeUe, String processInstanceId, String campaignId, String questionnaireId); + void addManyUniteEnquetee(List listeUe, String processDefinitionId, String processInstanceId, String currentActivityId, String campaignId, String questionnaireId); void addManyUniteEnqueteeDeleteColonneClass(List listeUe); - boolean isTerminated(); + boolean isTerminated(String processInstanceId, String currentActivityId, long numberCommandes); + + long getCommandesByProcessInstanceIdAndCurrentActivityId(String processInstanceId, String currentActivityId); } \ No newline at end of file diff --git a/src/main/java/fr/insee/protools/backend/repository/UniteEnqueteeImpl.java b/src/main/java/fr/insee/protools/backend/repository/UniteEnqueteeImpl.java index cbacdc40..eb6f5831 100644 --- a/src/main/java/fr/insee/protools/backend/repository/UniteEnqueteeImpl.java +++ b/src/main/java/fr/insee/protools/backend/repository/UniteEnqueteeImpl.java @@ -23,6 +23,8 @@ import static com.fasterxml.jackson.databind.DeserializationFeature.FAIL_ON_MISSING_CREATOR_PROPERTIES; import static com.fasterxml.jackson.databind.DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES; import static org.codehaus.groovy.runtime.DefaultGroovyMethods.collect; +import static org.springframework.data.mongodb.core.query.Criteria.where; +import static org.springframework.data.mongodb.core.query.Query.query; @Repository @Slf4j @@ -32,9 +34,15 @@ public class UniteEnqueteeImpl implements IUniteEnquetee { private MongoTemplate mongoTemplate; @Setter + @Getter + private String processDefinitionId; + @Setter @Getter private String processInstanceId; @Setter + @Getter + private String currentActivityId; + @Setter @Getter private String idCampaign; @Setter @@ -60,7 +68,9 @@ private BasicDBObject getUEUpdate(JsonNode test){ keyValuePairs.put("correlationID", correlationID); keyValuePairs.put("inProgress", false); keyValuePairs.put("done", false); + keyValuePairs.put("processDefinitionID", getProcessDefinitionId()); keyValuePairs.put("processInstanceID", getProcessInstanceId()); + keyValuePairs.put("currentActivityID", getCurrentActivityId()); keyValuePairs.put("CampaignID", getIdCampaign()); keyValuePairs.put("questionnaireID", getQuestionnaireId()); dbObject.putAll(keyValuePairs); @@ -90,8 +100,10 @@ public void addManyUniteEnqueteeDeleteColonneClass(List listeUe) { } @Override - public void addManyUniteEnquetee(List listeUe, String processInstanceId, String campaignId, String questionnaireId) { + public void addManyUniteEnquetee(List listeUe, String processDefinitionId, String processInstanceId, String currentActivityId, String campaignId, String questionnaireId) { + this.setProcessDefinitionId(processDefinitionId); this.setProcessInstanceId(processInstanceId); + this.setCurrentActivityId(currentActivityId); this.setIdCampaign(campaignId); this.setQuestionnaireId(questionnaireId); List bo = listeUe.parallelStream() @@ -106,12 +118,28 @@ public void addManyUniteEnquetee(List listeUe, String processInstanceI } @Override - public boolean isTerminated() { - log.info("UniteEnqueteeImpl.isTerminated."); + public boolean isTerminated(String processInstanceId, String currentActivityId, long numberCommandes) { + log.debug("UniteEnqueteeImpl.isTerminated."); boolean result=false; Query query = new Query(); - query.addCriteria(Criteria.where("inProgress").is(true).and("done").is(true)); - mongoTemplate.find(query, String.class, "commandes"); + query.addCriteria(Criteria.where("processInstanceID").is(processInstanceId)); + query.addCriteria(Criteria.where("currentActivityID").is(currentActivityId)); + query.addCriteria(where("inProgress").is(true).and("done").is(true)); + List listeCommandes = mongoTemplate.find(query, String.class, "commandes"); + if(!listeCommandes.isEmpty() && listeCommandes.size()==numberCommandes){ + result=true; + } + return result; + } + + @Override + public long getCommandesByProcessInstanceIdAndCurrentActivityId(String processInstanceId, String currentActivityId) { + log.debug("getCommandesByProcessInstanceIdAndCurrentActivityId : " + processInstanceId + "|" + currentActivityId); + long result=0; + Query query = new Query(); + query.addCriteria(Criteria.where("processInstanceID").is(processInstanceId)); + query.addCriteria(Criteria.where("currentActivityID").is(currentActivityId)); + result = mongoTemplate.count(query, String.class, "commandes"); return result; } diff --git a/src/main/java/fr/insee/protools/backend/service/common/platine_sabiane/QuestionnaireHelper.java b/src/main/java/fr/insee/protools/backend/service/common/platine_sabiane/QuestionnaireHelper.java index f99a549a..83aabc8c 100644 --- a/src/main/java/fr/insee/protools/backend/service/common/platine_sabiane/QuestionnaireHelper.java +++ b/src/main/java/fr/insee/protools/backend/service/common/platine_sabiane/QuestionnaireHelper.java @@ -410,10 +410,12 @@ public static void createSUTaskPlatineAsync(DelegateExecution execution, Context String questionnaireId = currentPartitionNode.path(CTX_PARTITION_QUESTIONNAIRE_MODEL).asText(); log.info("parallele="+parallele+"- Boolean.FALSE.equals(parallele)="+Boolean.FALSE.equals(parallele)); + String processDefinitionId = execution.getProcessDefinitionId(); String processInstanceId = execution.getProcessInstanceId(); + String currentActivityId = execution.getCurrentActivityId(); String campaignId = contextRootNode.path(CTX_CAMPAGNE_ID).asText(); - iUniteEnquetee.addManyUniteEnquetee(listeUe, processInstanceId, campaignId, questionnaireId); + iUniteEnquetee.addManyUniteEnquetee(listeUe, processDefinitionId, processInstanceId, currentActivityId, campaignId, questionnaireId); // iUniteEnquetee.addManyUniteEnqueteeDeleteColonneClass(listeUe); } diff --git a/src/main/java/fr/insee/protools/backend/service/platine/delegate/PlatineQuestionnaireCreateSurveyUnitTaskAsync.java b/src/main/java/fr/insee/protools/backend/service/platine/delegate/PlatineQuestionnaireCreateSurveyUnitTaskAsync.java index 81d2a611..c0991e3f 100644 --- a/src/main/java/fr/insee/protools/backend/service/platine/delegate/PlatineQuestionnaireCreateSurveyUnitTaskAsync.java +++ b/src/main/java/fr/insee/protools/backend/service/platine/delegate/PlatineQuestionnaireCreateSurveyUnitTaskAsync.java @@ -12,10 +12,14 @@ import org.flowable.engine.delegate.DelegateExecution; import org.flowable.engine.delegate.JavaDelegate; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; import java.util.Set; +import java.util.concurrent.Executors; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.ScheduledFuture; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicInteger; import static fr.insee.protools.backend.service.context.ContextConstants.CTX_CAMPAGNE_CONTEXTE; @@ -32,6 +36,7 @@ public class PlatineQuestionnaireCreateSurveyUnitTaskAsync implements JavaDelega @Override public void execute(DelegateExecution execution) { + Boolean start = Boolean.FALSE; JsonNode contextRootNode = protoolsContext.getContextByProcessInstance(execution.getProcessInstanceId()); //TODO: delete this log if necessary log.debug("ProcessInstanceId={} - campagne={} - begin" @@ -39,21 +44,30 @@ public void execute(DelegateExecution execution) { checkContextOrThrow(log,execution.getProcessInstanceId(), contextRootNode); QuestionnaireHelper.createSUTaskPlatineAsync(execution,protoolsContext,iUniteEnquetee,platineQuestionnaireService); + +// TODO gestion des timeouts + while (!start) { + log.info("start : "+ start); + try { + long nbInterogation = iUniteEnquetee.getCommandesByProcessInstanceIdAndCurrentActivityId(execution.getProcessInstanceId(), execution.getCurrentActivityId()); + start = taskService.isTerminated(execution.getProcessInstanceId(), execution.getCurrentActivityId(), nbInterogation); + log.info("Tâche planifiée en cours pour le processInstanceId : " + execution.getProcessInstanceId() + ", le currentActivityId " + execution.getCurrentActivityId() + ",et le nbInterogation totale " + nbInterogation); + Thread.sleep(5000); + if (start) { + break; + } + } catch (InterruptedException e) { + throw new RuntimeException(e); + } + } log.debug("ProcessInstanceId={} - campagne={} - end", execution.getProcessInstanceId(),contextRootNode.path(CTX_CAMPAGNE_CONTEXTE).asText()); } - @Scheduled(fixedDelay = 5000) - public void scheduledTask() throws InterruptedException { - // Logique de la tâche planifiée - log.info("Tâche planifiée exécutée..."); - System.out.println("Tâche planifiée exécutée..."); - taskService.isTerminated(); - } - @Override public Set getContextErrors(JsonNode contextRootNode) { return QuestionnaireHelper.getCreateSUContextErrorsPlatine(contextRootNode); } + } diff --git a/src/main/java/fr/insee/protools/backend/service/scheduled/TaskService.java b/src/main/java/fr/insee/protools/backend/service/scheduled/TaskService.java index 28bcc51b..deaaf9ed 100644 --- a/src/main/java/fr/insee/protools/backend/service/scheduled/TaskService.java +++ b/src/main/java/fr/insee/protools/backend/service/scheduled/TaskService.java @@ -14,9 +14,10 @@ public TaskService(IUniteEnquetee iUniteEnquetee) { this.iUniteEnquetee = iUniteEnquetee; } - public void isTerminated() throws InterruptedException { + public boolean isTerminated(String processInstanceId, String currentActivityId, long nbInterogation) throws InterruptedException { log.info("IUniteEnquetee.isTerminated"); - iUniteEnquetee.isTerminated(); +// TODO : iUniteEnquetee.getCommandesBygetProcessInstanceIdAndIdTask(1,2) + return iUniteEnquetee.isTerminated(processInstanceId, currentActivityId, nbInterogation); } diff --git a/src/main/resources/application-dev.properties b/src/main/resources/application-dev.properties index 71479ab4..69c6a88e 100644 --- a/src/main/resources/application-dev.properties +++ b/src/main/resources/application-dev.properties @@ -42,7 +42,8 @@ fr.insee.protools.api.platine-pilotage.auth.url=${fr.insee.protools.keycloak-dmz #platine questionnaire fr.insee.protools.api.platine-questionnaire.enabled=true -fr.insee.protools.api.platine-questionnaire.url=https://api-questionnaire-enquetes.developpement3.insee.fr +#fr.insee.protools.api.platine-questionnaire.url=https://api-questionnaire-enquetes.developpement3.insee.fr +fr.insee.protools.api.platine-questionnaire.url=http://localhost:8080 fr.insee.protools.api.platine-questionnaire.auth.url=${fr.insee.protools.keycloak-dmz-auth-url} fr.insee.protools.api.platine-questionnaire.auth.realm=questionnaire-particuliers fr.insee.protools.api.platine-questionnaire.auth.client-id=${fr.insee.protools.keycloak.client.id} diff --git a/src/main/resources/processes/poc-all-su.bpmn b/src/main/resources/processes/poc-all-su.bpmn deleted file mode 100644 index 650a1328..00000000 --- a/src/main/resources/processes/poc-all-su.bpmn +++ /dev/null @@ -1,221 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/test/httpRequests/2_Start_process_context_using_protools_endpoint.http b/src/test/httpRequests/2_Start_process_context_using_protools_endpoint.http index bd1e2743..26f4c034 100644 --- a/src/test/httpRequests/2_Start_process_context_using_protools_endpoint.http +++ b/src/test/httpRequests/2_Start_process_context_using_protools_endpoint.http @@ -1,7 +1,7 @@ ### GET TOKEN --- SET HOST < {% client.global.set("host", "https://api-orchestration-protocole-enquete.developpement.insee.fr/"); - client.global.set("host", "http://localhost:8080/"); + // client.global.set("host", "http://localhost:8080/"); %} POST https://auth.insee.test/auth/realms/{{realm}}/protocol/openid-connect/token Content-Type: application/x-www-form-urlencoded From 3616edfdeb36934f30c9f4aafe7eca916c77a0c7 Mon Sep 17 00:00:00 2001 From: "farid.ait-karra" Date: Thu, 26 Sep 2024 15:40:16 +0200 Subject: [PATCH 75/75] =?UTF-8?q?feat/implementation-mongo=20:=20-=20R?= =?UTF-8?q?=C3=A9alignement=20branches=20feat/pagination=20protools?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../configuration/SpringDocConfiguration.java | 4 +- .../backend/repository/IUniteEnquetee.java | 2 +- .../backend/repository/UniteEnqueteeImpl.java | 30 ++++-------- .../restclient/keycloak/KeycloakService.java | 3 +- ...uestionnaireCreateSurveyUnitTaskAsync.java | 44 +++++++++--------- ...neQuestionnaireCreateSurveyUnitTaskv2.java | 46 ------------------- .../delegate/RemGetPartitionListOfSuTask.java | 44 ------------------ .../RemGetPartitionListOfSuTaskv2.java | 38 --------------- 8 files changed, 33 insertions(+), 178 deletions(-) delete mode 100644 src/main/java/fr/insee/protools/backend/service/platine/delegate/PlatineQuestionnaireCreateSurveyUnitTaskv2.java delete mode 100644 src/main/java/fr/insee/protools/backend/service/rem/delegate/RemGetPartitionListOfSuTask.java delete mode 100644 src/main/java/fr/insee/protools/backend/service/rem/delegate/RemGetPartitionListOfSuTaskv2.java diff --git a/src/main/java/fr/insee/protools/backend/configuration/SpringDocConfiguration.java b/src/main/java/fr/insee/protools/backend/configuration/SpringDocConfiguration.java index 8b728825..ee20ab57 100644 --- a/src/main/java/fr/insee/protools/backend/configuration/SpringDocConfiguration.java +++ b/src/main/java/fr/insee/protools/backend/configuration/SpringDocConfiguration.java @@ -22,8 +22,8 @@ @RequiredArgsConstructor public class SpringDocConfiguration { - private InseeSpringdocProperties springdocProperties; - private Optional buildProperties; + private final InseeSpringdocProperties springdocProperties; + private final Optional buildProperties; public static final String OAUTHSCHEME = "oAuth"; diff --git a/src/main/java/fr/insee/protools/backend/repository/IUniteEnquetee.java b/src/main/java/fr/insee/protools/backend/repository/IUniteEnquetee.java index 043f05bd..136a6f1c 100644 --- a/src/main/java/fr/insee/protools/backend/repository/IUniteEnquetee.java +++ b/src/main/java/fr/insee/protools/backend/repository/IUniteEnquetee.java @@ -10,7 +10,7 @@ public interface IUniteEnquetee { @Transactional void addManyUniteEnquetee(List listeUe); - void addManyUniteEnquetee(List listeUe, String processDefinitionId, String processInstanceId, String currentActivityId, String campaignId, String questionnaireId); + void addManyUniteEnquetee(List listeUe, String processInstanceId, String currentActivityId); void addManyUniteEnqueteeDeleteColonneClass(List listeUe); diff --git a/src/main/java/fr/insee/protools/backend/repository/UniteEnqueteeImpl.java b/src/main/java/fr/insee/protools/backend/repository/UniteEnqueteeImpl.java index eb6f5831..5b358063 100644 --- a/src/main/java/fr/insee/protools/backend/repository/UniteEnqueteeImpl.java +++ b/src/main/java/fr/insee/protools/backend/repository/UniteEnqueteeImpl.java @@ -5,6 +5,7 @@ import com.fasterxml.jackson.databind.ObjectMapper; import com.mongodb.BasicDBObject; import lombok.Getter; +import lombok.RequiredArgsConstructor; import lombok.Setter; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; @@ -26,28 +27,19 @@ import static org.springframework.data.mongodb.core.query.Criteria.where; import static org.springframework.data.mongodb.core.query.Query.query; +@RequiredArgsConstructor @Repository @Slf4j public class UniteEnqueteeImpl implements IUniteEnquetee { - @Autowired - private MongoTemplate mongoTemplate; + private final MongoTemplate mongoTemplate; @Setter - @Getter - private String processDefinitionId; - @Setter @Getter private String processInstanceId; @Setter @Getter private String currentActivityId; - @Setter - @Getter - private String idCampaign; - @Setter - @Getter - private String questionnaireId; private static final ObjectMapper objectMapper = new ObjectMapper() @@ -68,11 +60,8 @@ private BasicDBObject getUEUpdate(JsonNode test){ keyValuePairs.put("correlationID", correlationID); keyValuePairs.put("inProgress", false); keyValuePairs.put("done", false); - keyValuePairs.put("processDefinitionID", getProcessDefinitionId()); keyValuePairs.put("processInstanceID", getProcessInstanceId()); keyValuePairs.put("currentActivityID", getCurrentActivityId()); - keyValuePairs.put("CampaignID", getIdCampaign()); - keyValuePairs.put("questionnaireID", getQuestionnaireId()); dbObject.putAll(keyValuePairs); return dbObject; } @@ -100,21 +89,18 @@ public void addManyUniteEnqueteeDeleteColonneClass(List listeUe) { } @Override - public void addManyUniteEnquetee(List listeUe, String processDefinitionId, String processInstanceId, String currentActivityId, String campaignId, String questionnaireId) { - this.setProcessDefinitionId(processDefinitionId); + public void addManyUniteEnquetee(List listeUe, String processInstanceId, String currentActivityId) { this.setProcessInstanceId(processInstanceId); this.setCurrentActivityId(currentActivityId); - this.setIdCampaign(campaignId); - this.setQuestionnaireId(questionnaireId); - List bo = listeUe.parallelStream() - .map(this::getUEUpdate) - .toList(); +// List bo = listeUe.parallelStream() +// .map(this::getUEUpdate) +// .toList(); //remove _class MappingMongoConverter converter = new MappingMongoConverter(mongoTemplate.getMongoDatabaseFactory(), new MongoMappingContext()); converter.setTypeMapper(new DefaultMongoTypeMapper(null)); MongoTemplate mongoTemplate2 = new MongoTemplate(mongoTemplate.getMongoDatabaseFactory(), converter); - mongoTemplate2.insert(bo, "commandes"); + mongoTemplate2.insert(listeUe, "commandes"); } @Override diff --git a/src/main/java/fr/insee/protools/backend/restclient/keycloak/KeycloakService.java b/src/main/java/fr/insee/protools/backend/restclient/keycloak/KeycloakService.java index 1c898f07..47a2a125 100644 --- a/src/main/java/fr/insee/protools/backend/restclient/keycloak/KeycloakService.java +++ b/src/main/java/fr/insee/protools/backend/restclient/keycloak/KeycloakService.java @@ -1,6 +1,5 @@ package fr.insee.protools.backend.restclient.keycloak; -import fr.insee.protools.backend.configuration.testcoverage.ExcludeFromJacocoGeneratedReport; import fr.insee.protools.backend.restclient.configuration.APIProperties; import fr.insee.protools.backend.restclient.exception.KeycloakTokenConfigBPMNError; import io.netty.handler.logging.LogLevel; @@ -119,7 +118,7 @@ boolean isValidURL(String url) { } } - @ExcludeFromJacocoGeneratedReport +// @ExcludeFromJacocoGeneratedReport private void logToken(Token token){ if(log.isTraceEnabled()){ var currentDt = Instant.now().toEpochMilli(); diff --git a/src/main/java/fr/insee/protools/backend/service/platine/delegate/PlatineQuestionnaireCreateSurveyUnitTaskAsync.java b/src/main/java/fr/insee/protools/backend/service/platine/delegate/PlatineQuestionnaireCreateSurveyUnitTaskAsync.java index c0991e3f..632283f3 100644 --- a/src/main/java/fr/insee/protools/backend/service/platine/delegate/PlatineQuestionnaireCreateSurveyUnitTaskAsync.java +++ b/src/main/java/fr/insee/protools/backend/service/platine/delegate/PlatineQuestionnaireCreateSurveyUnitTaskAsync.java @@ -1,12 +1,13 @@ package fr.insee.protools.backend.service.platine.delegate; import com.fasterxml.jackson.databind.JsonNode; +import fr.insee.protools.backend.dto.ContexteProcessus; import fr.insee.protools.backend.repository.IUniteEnquetee; import fr.insee.protools.backend.service.DelegateContextVerifier; -import fr.insee.protools.backend.service.common.platine_sabiane.QuestionnaireHelper; -import fr.insee.protools.backend.service.context.ContextService; -import fr.insee.protools.backend.service.platine.questionnaire.PlatineQuestionnaireService; +import fr.insee.protools.backend.service.context.IContextService; +import fr.insee.protools.backend.service.platine.service.IPlatineQuestionnaireService; import fr.insee.protools.backend.service.scheduled.TaskService; +import fr.insee.protools.backend.service.utils.FlowableVariableUtils; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.flowable.engine.delegate.DelegateExecution; @@ -14,22 +15,18 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; +import java.util.List; import java.util.Set; -import java.util.concurrent.Executors; -import java.util.concurrent.ScheduledExecutorService; -import java.util.concurrent.ScheduledFuture; -import java.util.concurrent.TimeUnit; -import java.util.concurrent.atomic.AtomicInteger; -import static fr.insee.protools.backend.service.context.ContextConstants.CTX_CAMPAGNE_CONTEXTE; +import static fr.insee.protools.backend.service.FlowableVariableNameConstants.VARNAME_REM_INTERRO_LIST; @Slf4j @Component @RequiredArgsConstructor public class PlatineQuestionnaireCreateSurveyUnitTaskAsync implements JavaDelegate, DelegateContextVerifier { - private final ContextService protoolsContext; - private final PlatineQuestionnaireService platineQuestionnaireService; + private final IContextService protoolsContext; + private final IPlatineQuestionnaireService platineQuestionnaireService; private final IUniteEnquetee iUniteEnquetee; @Autowired TaskService taskService; @@ -37,13 +34,21 @@ public class PlatineQuestionnaireCreateSurveyUnitTaskAsync implements JavaDelega @Override public void execute(DelegateExecution execution) { Boolean start = Boolean.FALSE; - JsonNode contextRootNode = protoolsContext.getContextByProcessInstance(execution.getProcessInstanceId()); + ContexteProcessus context = protoolsContext.getContextDtoByProcessInstance(execution.getProcessInstanceId()); //TODO: delete this log if necessary log.debug("ProcessInstanceId={} - campagne={} - begin" - ,execution.getProcessInstanceId(),contextRootNode.path(CTX_CAMPAGNE_CONTEXTE).asText()); + ,execution.getProcessInstanceId(),context.getId()); - checkContextOrThrow(log,execution.getProcessInstanceId(), contextRootNode); - QuestionnaireHelper.createSUTaskPlatineAsync(execution,protoolsContext,iUniteEnquetee,platineQuestionnaireService); + checkContextOrThrow(log,execution.getProcessInstanceId(), context); + +// QuestionnaireHelper.createSUTaskPlatineAsync(execution,protoolsContext,iUniteEnquetee,platineQuestionnaireService); + + List listeUe = FlowableVariableUtils.getVariableOrThrow(execution, VARNAME_REM_INTERRO_LIST, List.class); + String processInstanceId = execution.getProcessInstanceId(); + String currentActivityId = execution.getCurrentActivityId(); + iUniteEnquetee.addManyUniteEnquetee(listeUe, processInstanceId, currentActivityId); + +// iUniteEnquetee.addManyUniteEnqueteeDeleteColonneClass(listeUe); // TODO gestion des timeouts while (!start) { @@ -61,13 +66,6 @@ public void execute(DelegateExecution execution) { } } log.debug("ProcessInstanceId={} - campagne={} - end", - execution.getProcessInstanceId(),contextRootNode.path(CTX_CAMPAGNE_CONTEXTE).asText()); - } - - @Override - public Set getContextErrors(JsonNode contextRootNode) { - return QuestionnaireHelper.getCreateSUContextErrorsPlatine(contextRootNode); + execution.getProcessInstanceId(),context.getId()); } - - } diff --git a/src/main/java/fr/insee/protools/backend/service/platine/delegate/PlatineQuestionnaireCreateSurveyUnitTaskv2.java b/src/main/java/fr/insee/protools/backend/service/platine/delegate/PlatineQuestionnaireCreateSurveyUnitTaskv2.java deleted file mode 100644 index 1c7d0a53..00000000 --- a/src/main/java/fr/insee/protools/backend/service/platine/delegate/PlatineQuestionnaireCreateSurveyUnitTaskv2.java +++ /dev/null @@ -1,46 +0,0 @@ -package fr.insee.protools.backend.service.platine.delegate; - -import com.fasterxml.jackson.databind.JsonNode; -import fr.insee.protools.backend.service.DelegateContextVerifier; -import fr.insee.protools.backend.service.common.platine_sabiane.QuestionnaireHelper; -import fr.insee.protools.backend.service.context.ContextService; -import fr.insee.protools.backend.service.platine.questionnaire.PlatineQuestionnaireService; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.flowable.engine.delegate.DelegateExecution; -import org.flowable.engine.delegate.JavaDelegate; -import org.springframework.stereotype.Component; - -import java.util.Set; - -import static fr.insee.protools.backend.service.context.ContextConstants.CTX_CAMPAGNE_CONTEXTE; - -@Slf4j -@Component -@RequiredArgsConstructor -public class PlatineQuestionnaireCreateSurveyUnitTaskv2 implements JavaDelegate, DelegateContextVerifier { - - private final ContextService protoolsContext; - private final PlatineQuestionnaireService platineQuestionnaireService; - - @Override - public void execute(DelegateExecution execution) { - JsonNode contextRootNode = protoolsContext.getContextByProcessInstance(execution.getProcessInstanceId()); - //TODO: delete this log if necessary - log.debug("ProcessInstanceId={} - campagne={} - begin" - ,execution.getProcessInstanceId(),contextRootNode.path(CTX_CAMPAGNE_CONTEXTE).asText()); - - checkContextOrThrow(log,execution.getProcessInstanceId(), contextRootNode); - QuestionnaireHelper.createAllSUTaskPlatine(execution,protoolsContext,platineQuestionnaireService); - log.debug("ProcessInstanceId={} - campagne={} - end", - execution.getProcessInstanceId(),contextRootNode.path(CTX_CAMPAGNE_CONTEXTE).asText()); - - - } - - @Override - public Set getContextErrors(JsonNode contextRootNode) { - return QuestionnaireHelper.getCreateSUContextErrorsPlatine(contextRootNode); - } - -} diff --git a/src/main/java/fr/insee/protools/backend/service/rem/delegate/RemGetPartitionListOfSuTask.java b/src/main/java/fr/insee/protools/backend/service/rem/delegate/RemGetPartitionListOfSuTask.java deleted file mode 100644 index ab8faa93..00000000 --- a/src/main/java/fr/insee/protools/backend/service/rem/delegate/RemGetPartitionListOfSuTask.java +++ /dev/null @@ -1,44 +0,0 @@ -package fr.insee.protools.backend.service.rem.delegate; - -import com.fasterxml.jackson.databind.JsonNode; -import fr.insee.protools.backend.dto.rem.REMSurveyUnitDto; -import fr.insee.protools.backend.service.DelegateContextVerifier; -import fr.insee.protools.backend.service.rem.RemService; -import fr.insee.protools.backend.service.utils.FlowableVariableUtils; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.flowable.engine.delegate.DelegateExecution; -import org.flowable.engine.delegate.JavaDelegate; -import org.springframework.stereotype.Component; - -import java.util.Arrays; -import java.util.List; -import java.util.stream.Collectors; - -import static fr.insee.protools.backend.service.FlowableVariableNameConstants.*; - -@Slf4j -@Component -@RequiredArgsConstructor -public class RemGetPartitionListOfSuTask implements JavaDelegate, DelegateContextVerifier { - - private final RemService remService; - - @Override - public void execute(DelegateExecution execution) { - Long currentPartitionId = FlowableVariableUtils.getVariableOrThrow(execution,VARNAME_CURRENT_PARTITION_ID, Long.class); - //No need protools context ==> no checkContextOrThrow - log.info("ProcessInstanceId={} - partition={} begin",execution.getProcessInstanceId(),currentPartitionId); - - JsonNode[] partitionSUs = remService.getPartitionAllSU(currentPartitionId); - // Convert JsonNode array to List using streams - //List remSUList = Arrays.stream(partitionSUs) - // .map(JsonNode::toString) - // .collect(Collectors.toList()); - // log.trace("remSUList.length="+partitionSUs.length); - // execution.getParent().setVariableLocal(VARNAME_REM_SU_LIST, remSUList); - List remSUList = List.of(partitionSUs); - execution.getParent().setVariableLocal(VARNAME_REM_SU_LIST, remSUList); - log.debug("ProcessInstanceId={} - partition={} - partitionSUs.size={} end",execution.getProcessInstanceId(),currentPartitionId,partitionSUs.length); - } -} \ No newline at end of file diff --git a/src/main/java/fr/insee/protools/backend/service/rem/delegate/RemGetPartitionListOfSuTaskv2.java b/src/main/java/fr/insee/protools/backend/service/rem/delegate/RemGetPartitionListOfSuTaskv2.java deleted file mode 100644 index 0b023620..00000000 --- a/src/main/java/fr/insee/protools/backend/service/rem/delegate/RemGetPartitionListOfSuTaskv2.java +++ /dev/null @@ -1,38 +0,0 @@ -package fr.insee.protools.backend.service.rem.delegate; - -import com.fasterxml.jackson.databind.JsonNode; -import fr.insee.protools.backend.service.DelegateContextVerifier; -import fr.insee.protools.backend.service.rem.RemService; -import fr.insee.protools.backend.service.utils.FlowableVariableUtils; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.flowable.engine.delegate.DelegateExecution; -import org.flowable.engine.delegate.JavaDelegate; -import org.springframework.stereotype.Component; - -import java.util.Arrays; -import java.util.List; -import java.util.stream.Collectors; - -import static fr.insee.protools.backend.service.FlowableVariableNameConstants.VARNAME_CURRENT_PARTITION_ID; -import static fr.insee.protools.backend.service.FlowableVariableNameConstants.VARNAME_REM_SU_LIST; - -@Slf4j -@Component -@RequiredArgsConstructor -public class RemGetPartitionListOfSuTaskv2 implements JavaDelegate, DelegateContextVerifier { - - private final RemService remService; - - @Override - public void execute(DelegateExecution execution) { - Long currentPartitionId = FlowableVariableUtils.getVariableOrThrow(execution,VARNAME_CURRENT_PARTITION_ID, Long.class); - //No need protools context ==> no checkContextOrThrow - log.info("ProcessInstanceId={} - partition={} begin",execution.getProcessInstanceId(),currentPartitionId); - - JsonNode[] partitionSUs = remService.getPartitionAllSU(currentPartitionId); - log.trace("remSUList.length="+partitionSUs.length); - execution.getParent().setVariableLocal(VARNAME_REM_SU_LIST, partitionSUs); - log.debug("ProcessInstanceId={} - partition={} - remSUList.size={} end",execution.getProcessInstanceId(),currentPartitionId,partitionSUs.length); - } -} \ No newline at end of file