diff --git a/commons/commons-vitam/src/main/java/fr/gouv/vitamui/commons/vitam/api/administration/RuleService.java b/commons/commons-vitam/src/main/java/fr/gouv/vitamui/commons/vitam/api/administration/RuleService.java index 4d62b6df38be0f3d5e6cc2ce451d6db13d2c809d..eeaecaede164dfc175a68b1da26ac7a9349e1e06 100644 --- a/commons/commons-vitam/src/main/java/fr/gouv/vitamui/commons/vitam/api/administration/RuleService.java +++ b/commons/commons-vitam/src/main/java/fr/gouv/vitamui/commons/vitam/api/administration/RuleService.java @@ -37,26 +37,40 @@ package fr.gouv.vitamui.commons.vitam.api.administration; import java.io.InputStream; +import java.util.Optional; import org.springframework.beans.factory.annotation.Autowired; +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.gouv.vitam.access.external.client.AdminExternalClient; import fr.gouv.vitam.access.external.common.exception.AccessExternalClientException; import fr.gouv.vitam.common.client.VitamContext; +import fr.gouv.vitam.common.database.builder.query.QueryHelper; +import fr.gouv.vitam.common.database.builder.request.exception.InvalidCreateOperationException; +import fr.gouv.vitam.common.database.builder.request.single.Select; import fr.gouv.vitam.common.exception.InvalidParseOperationException; import fr.gouv.vitam.common.exception.VitamClientException; import fr.gouv.vitam.common.model.RequestResponse; import fr.gouv.vitam.common.model.administration.FileRulesModel; +import fr.gouv.vitamui.commons.api.exception.UnexpectedDataException; +import fr.gouv.vitamui.commons.vitam.api.dto.RuleNodeResponseDto; +import fr.gouv.vitamui.commons.vitam.api.model.RuleMeasurementEnum; public class RuleService { private final AdminExternalClient adminExternalClient; - + + private ObjectMapper objectMapper; + @Autowired public RuleService(final AdminExternalClient adminExternalClient) { this.adminExternalClient = adminExternalClient; + objectMapper = new ObjectMapper(); + objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); } @SuppressWarnings("rawtypes") @@ -68,4 +82,24 @@ public class RuleService { public RequestResponse<FileRulesModel> findRules(final VitamContext vitamContext, final JsonNode select) throws VitamClientException { return adminExternalClient.findRules(vitamContext, select); } + + public Optional<Long> findRulesDurationByRuleId(final VitamContext vitamContext, final String ruleId) + throws VitamClientException, InvalidCreateOperationException, JsonProcessingException { + final Select select = new Select(); + select.setQuery(QueryHelper.eq("RuleId", ruleId)); + RequestResponse<FileRulesModel> rulesVitamResponse = + this.findRules(vitamContext, select.getFinalSelect()); + if (rulesVitamResponse.isOk()) { + RuleNodeResponseDto ruleNodeResponseDto = objectMapper + .treeToValue(rulesVitamResponse.toJsonNode(), RuleNodeResponseDto.class); + FileRulesModel rule = ruleNodeResponseDto.getResults().get(0); + if (RuleMeasurementEnum.YEAR.equals(RuleMeasurementEnum.getEnumFromType(rule.getRuleMeasurement()))) { + return Optional.of(Long.parseLong(rule.getRuleDuration())); + } + else { + throw new UnexpectedDataException("The rule duration measurement should be in years."); + } + } + return Optional.empty(); + } } diff --git a/commons/commons-vitam/src/test/java/fr/gouv/vitamui/commons/vitam/api/administration/RuleServiceTest.java b/commons/commons-vitam/src/test/java/fr/gouv/vitamui/commons/vitam/api/administration/RuleServiceTest.java new file mode 100644 index 0000000000000000000000000000000000000000..27820f4318d55cc28ba53ad731a5630c6be14225 --- /dev/null +++ b/commons/commons-vitam/src/test/java/fr/gouv/vitamui/commons/vitam/api/administration/RuleServiceTest.java @@ -0,0 +1,89 @@ +package fr.gouv.vitamui.commons.vitam.api.administration; + +import static org.mockito.Mockito.when; + +import java.util.Optional; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; +import org.junit.jupiter.api.Assertions; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.mockito.MockitoAnnotations; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.JsonNode; + +import fr.gouv.vitam.access.external.client.AdminExternalClient; +import fr.gouv.vitam.common.client.VitamContext; +import fr.gouv.vitam.common.database.builder.request.exception.InvalidCreateOperationException; +import fr.gouv.vitam.common.exception.VitamClientException; +import fr.gouv.vitam.common.model.RequestResponseOK; +import fr.gouv.vitam.common.model.administration.FileRulesModel; +import fr.gouv.vitamui.commons.api.exception.UnexpectedDataException; +import fr.gouv.vitamui.commons.vitam.api.model.RuleMeasurementEnum; + +public class RuleServiceTest { + + @Mock + private AdminExternalClient adminExternalClient; + + @InjectMocks + private RuleService ruleService; + + private static final String RULE_ID = "FC-1"; + + private static final int TENANT_IDENTIFIER = 9; + + private static final Long RULE_DURATION = 10L; + + @Before + public void setUp() { + MockitoAnnotations.initMocks(this); + } + + @Test + public void testfindRulesDurationByRuleId() throws VitamClientException, JsonProcessingException, InvalidCreateOperationException { + // Prepare + final var fileRule = buildFileRuleModel(RuleMeasurementEnum.YEAR); + final var requestResponseOk = new RequestResponseOK<FileRulesModel>().addResult(fileRule); + when(adminExternalClient.findRules(Mockito.any(VitamContext.class), Mockito.any(JsonNode.class))).thenReturn(requestResponseOk); + // Do + Optional<Long> ruleDuration = ruleService.findRulesDurationByRuleId(new VitamContext(TENANT_IDENTIFIER), RULE_ID); + // Verify + Assertions.assertTrue(ruleDuration.isPresent(), "The rule duration should be present"); + Assertions.assertEquals(RULE_DURATION, ruleDuration.get(), "The rule duration value should match the duration"); + } + + @Test + public void testfindRulesDurationByRuleId_with_rule_duration_in_months() + throws VitamClientException, JsonProcessingException, InvalidCreateOperationException { + // Prepare + final var fileRule = buildFileRuleModel(RuleMeasurementEnum.MONTH); + final var requestResponseOk = new RequestResponseOK<FileRulesModel>().addResult(fileRule); + when(adminExternalClient.findRules(Mockito.any(VitamContext.class), Mockito.any(JsonNode.class))).thenReturn(requestResponseOk); + // Do and Verify + var thrownException = Assertions.assertThrows(UnexpectedDataException.class, () -> { + ruleService.findRulesDurationByRuleId(new VitamContext(TENANT_IDENTIFIER), RULE_ID); + }); + Assertions.assertEquals("The rule duration measurement should be in years.", thrownException.getMessage(), + "The exception message should match"); + } + + @After + public void destroy() { + ruleService = null; + adminExternalClient = null; + } + + private static FileRulesModel buildFileRuleModel(RuleMeasurementEnum ruleMeasurementEnum) { + final var rule = new FileRulesModel(); + rule.setRuleId(RULE_ID); + rule.setRuleDuration(RULE_DURATION.toString()); + rule.setRuleMeasurement(ruleMeasurementEnum.getType()); + return rule; + } + +}