From 7c9169a7c8fb1e3c24c41433f4b2973f3027f5f9 Mon Sep 17 00:00:00 2001 From: gianmarcoplutino <119858159+gianmarcoplutino@users.noreply.github.com> Date: Wed, 17 Jul 2024 14:21:16 +0200 Subject: [PATCH] [SELC - 4984] feat: added verifyOnboarding API (#402) --- apps/onboarding-ms/pom.xml | 644 +++++++++--------- apps/onboarding-ms/src/main/docs/openapi.json | 54 ++ apps/onboarding-ms/src/main/docs/openapi.yaml | 37 + .../onboarding/constants/CustomError.java | 2 + .../controller/OnboardingController.java | 21 + .../onboarding/service/OnboardingService.java | 3 + .../service/OnboardingServiceDefault.java | 10 + .../selfcare/onboarding/util/QueryUtils.java | 14 + .../controller/OnboardingControllerTest.java | 43 ++ .../service/OnboardingServiceDefaultTest.java | 17 + 10 files changed, 527 insertions(+), 318 deletions(-) diff --git a/apps/onboarding-ms/pom.xml b/apps/onboarding-ms/pom.xml index 5278afca3..b37d5d6ae 100644 --- a/apps/onboarding-ms/pom.xml +++ b/apps/onboarding-ms/pom.xml @@ -1,331 +1,339 @@ - - 4.0.0 - - it.pagopa.selfcare - onboarding-apps - 0.0.1 - + + 4.0.0 + + it.pagopa.selfcare + onboarding-apps + 0.0.1 + - onboarding-ms - 1.0.0-SNAPSHOT - - 3.11.0 - 1.18.28 - 1.5.5.Final - 17 - UTF-8 - UTF-8 - quarkus-bom - io.quarkus.platform - 3.11.2 - true - 3.1.2 - 0.1.18 - 2.4.1 - - + onboarding-ms + 1.0.0-SNAPSHOT + + 3.11.0 + 1.18.28 + 1.5.5.Final + 17 + UTF-8 + UTF-8 + quarkus-bom + io.quarkus.platform + 3.11.2 + true + 3.1.2 + 0.1.18 + 2.4.1 + + + + + ${quarkus.platform.group-id} + ${quarkus.platform.artifact-id} + ${quarkus.platform.version} + pom + import + + + - - ${quarkus.platform.group-id} - ${quarkus.platform.artifact-id} - ${quarkus.platform.version} - pom - import - - - - - - io.quarkus - quarkus-resteasy-reactive - - - io.quarkus - quarkus-arc - - - io.quarkiverse.openapi.generator - quarkus-openapi-generator - ${quarkus-openapi-generator.version} - - - io.quarkus - quarkus-junit5 - test - - - io.quarkus - quarkus-junit5-mockito - test - - - io.rest-assured - rest-assured - test - - - io.quarkus - quarkus-test-mongodb - - - org.projectlombok - lombok - ${lombok.version} - provided - - - io.quarkus - quarkus-hibernate-validator - - - io.quarkus - quarkus-resteasy-reactive-jackson - - - io.quarkus - quarkus-rest-client-reactive-jackson - - - io.quarkus - quarkus-smallrye-health - - - org.mapstruct - mapstruct - ${mapstruct.version} - - - io.quarkus - quarkus-smallrye-jwt - - - io.quarkus - quarkus-test-security - test - - - io.quarkus - quarkus-smallrye-openapi - - - io.quarkus - quarkus-mongodb-panache - - - io.quarkus - quarkus-smallrye-context-propagation - + + io.quarkus + quarkus-resteasy-reactive + + + io.quarkus + quarkus-arc + + + io.quarkiverse.openapi.generator + quarkus-openapi-generator + ${quarkus-openapi-generator.version} + + + io.quarkus + quarkus-junit5 + test + + + io.quarkus + quarkus-junit5-mockito + test + + + io.rest-assured + rest-assured + test + + + io.quarkus + quarkus-test-mongodb + + + org.projectlombok + lombok + ${lombok.version} + provided + + + io.quarkus + quarkus-hibernate-validator + + + io.quarkus + quarkus-resteasy-reactive-jackson + + + io.quarkus + quarkus-rest-client-reactive-jackson + + + io.quarkus + quarkus-smallrye-health + + + org.mapstruct + mapstruct + ${mapstruct.version} + + + io.quarkus + quarkus-smallrye-jwt + + + io.quarkus + quarkus-test-security + test + + + io.quarkus + quarkus-smallrye-openapi + + + io.quarkus + quarkus-mongodb-panache + + + io.quarkus + quarkus-smallrye-context-propagation + - - io.quarkus - quarkus-panache-mock - test - - - io.quarkus - quarkus-test-hibernate-reactive-panache - test - - - io.quarkus - quarkus-jacoco - test - - - io.quarkus - quarkus-test-security-jwt - test - - - it.pagopa.selfcare - onboarding-sdk-common - ${onboarding-sdk.version} - + + io.quarkus + quarkus-panache-mock + test + + + io.quarkus + quarkus-test-hibernate-reactive-panache + test + + + io.quarkus + quarkus-jacoco + test + + + io.quarkus + quarkus-test-security-jwt + test + + + it.pagopa.selfcare + onboarding-sdk-common + ${onboarding-sdk.version} + - - it.pagopa.selfcare - onboarding-sdk-azure-storage - ${onboarding-sdk.version} - - - it.pagopa.selfcare - onboarding-sdk-product - ${onboarding-sdk.version} - + + it.pagopa.selfcare + onboarding-sdk-azure-storage + ${onboarding-sdk.version} + + + it.pagopa.selfcare + onboarding-sdk-product + ${onboarding-sdk.version} + - - - eu.europa.ec.joinup.sd-dss - dss-test - 5.12.1 - test - - - - eu.europa.ec.joinup.sd-dss - dss-utils - 5.12.1 - - - eu.europa.ec.joinup.sd-dss - dss-model - 5.12.1 - compile - - - - eu.europa.ec.joinup.sd-dss - dss-service - 5.12.1 - - - - eu.europa.ec.joinup.sd-dss - dss-tsl-validation - 5.12.1 - - - - eu.europa.ec.joinup.sd-dss - dss-utils-google-guava - 5.12.1 - - - eu.europa.ec.joinup.sd-dss - dss-pades - 5.12.1 - - - eu.europa.ec.joinup.sd-dss - dss-pades-pdfbox - 5.12.1 - - - eu.europa.ec.joinup.sd-dss - dss-cades - 5.12.1 - - - eu.europa.ec.joinup.sd-dss - dss-utils-apache-commons - 5.12.1 - - - eu.europa.ec.joinup.sd-dss - dss-crl-parser-stream - 5.12.1 - + + + eu.europa.ec.joinup.sd-dss + dss-test + 5.12.1 + test + + + + eu.europa.ec.joinup.sd-dss + dss-utils + 5.12.1 + + + eu.europa.ec.joinup.sd-dss + dss-model + 5.12.1 + compile + + + + eu.europa.ec.joinup.sd-dss + dss-service + 5.12.1 + + + + eu.europa.ec.joinup.sd-dss + dss-tsl-validation + 5.12.1 + + + + eu.europa.ec.joinup.sd-dss + dss-utils-google-guava + 5.12.1 + + + eu.europa.ec.joinup.sd-dss + dss-pades + 5.12.1 + + + eu.europa.ec.joinup.sd-dss + dss-pades-pdfbox + 5.12.1 + + + eu.europa.ec.joinup.sd-dss + dss-cades + 5.12.1 + + + eu.europa.ec.joinup.sd-dss + dss-utils-apache-commons + 5.12.1 + + + eu.europa.ec.joinup.sd-dss + dss-crl-parser-stream + 5.12.1 + - - javax.xml.bind - jaxb-api - 2.3.1 - + + javax.xml.bind + jaxb-api + 2.3.1 + - - jakarta.activation - jakarta.activation-api - 2.1.0 - - - com.sun.xml.bind - jaxb-impl - 2.3.4 - + + jakarta.activation + jakarta.activation-api + 2.1.0 + + + com.sun.xml.bind + jaxb-impl + 2.3.4 + - - - com.opencsv - opencsv - 5.7.1 - + + + com.opencsv + opencsv + 5.7.1 + + + com.github.tomakehurst + wiremock-jre8-standalone + 2.32.0 + compile + - - - - - ${quarkus.platform.group-id} - quarkus-maven-plugin - ${quarkus.platform.version} - true - - - - build - generate-code - generate-code-tests - - - - - - maven-compiler-plugin - ${compiler-plugin.version} - - - -parameters - - - - org.mapstruct - mapstruct-processor - ${mapstruct.version} - - - org.projectlombok - lombok - ${lombok.version} - - - org.projectlombok - lombok-mapstruct-binding - 0.2.0 - - - io.quarkus - quarkus-panache-common - ${quarkus.platform.version} - - - - - - maven-failsafe-plugin - ${surefire-plugin.version} - - - - integration-test - verify - - - - ${project.build.directory}/${project.build.finalName}-runner - org.jboss.logmanager.LogManager - ${maven.home} - - - - - - - - - - native - - - native - - - - false - native - - - + + + + + ${quarkus.platform.group-id} + quarkus-maven-plugin + ${quarkus.platform.version} + true + + + + build + generate-code + generate-code-tests + + + + + + maven-compiler-plugin + ${compiler-plugin.version} + + + -parameters + + + + org.mapstruct + mapstruct-processor + ${mapstruct.version} + + + org.projectlombok + lombok + ${lombok.version} + + + org.projectlombok + lombok-mapstruct-binding + 0.2.0 + + + io.quarkus + quarkus-panache-common + ${quarkus.platform.version} + + + + + + maven-failsafe-plugin + ${surefire-plugin.version} + + + + integration-test + verify + + + + ${project.build.directory}/${project.build.finalName}-runner + + org.jboss.logmanager.LogManager + ${maven.home} + + + + + + + + + + native + + + native + + + + false + native + + + diff --git a/apps/onboarding-ms/src/main/docs/openapi.json b/apps/onboarding-ms/src/main/docs/openapi.json index 72c801659..acb419a35 100644 --- a/apps/onboarding-ms/src/main/docs/openapi.json +++ b/apps/onboarding-ms/src/main/docs/openapi.json @@ -680,6 +680,60 @@ } ] } }, + "/v1/onboarding/verify" : { + "head" : { + "tags" : [ "Onboarding Controller" ], + "summary" : "Verify if the onboarded product is already onboarded for the institution", + "parameters" : [ { + "name" : "origin", + "in" : "query", + "schema" : { + "type" : "string" + } + }, { + "name" : "originId", + "in" : "query", + "schema" : { + "type" : "string" + } + }, { + "name" : "productId", + "in" : "query", + "schema" : { + "type" : "string" + } + }, { + "name" : "subunitCode", + "in" : "query", + "schema" : { + "type" : "string" + } + }, { + "name" : "taxCode", + "in" : "query", + "schema" : { + "type" : "string" + } + } ], + "responses" : { + "200" : { + "description" : "OK", + "content" : { + "application/json" : { } + } + }, + "401" : { + "description" : "Not Authorized" + }, + "403" : { + "description" : "Not Allowed" + } + }, + "security" : [ { + "SecurityScheme" : [ ] + } ] + } + }, "/v1/onboarding/{onboardingId}" : { "get" : { "tags" : [ "Onboarding Controller" ], diff --git a/apps/onboarding-ms/src/main/docs/openapi.yaml b/apps/onboarding-ms/src/main/docs/openapi.yaml index b3d6119a9..0ef776773 100644 --- a/apps/onboarding-ms/src/main/docs/openapi.yaml +++ b/apps/onboarding-ms/src/main/docs/openapi.yaml @@ -471,6 +471,43 @@ paths: description: Not Allowed security: - SecurityScheme: [] + /v1/onboarding/verify: + head: + tags: + - Onboarding Controller + summary: Verify if the onboarded product is already onboarded for the institution + parameters: + - name: origin + in: query + schema: + type: string + - name: originId + in: query + schema: + type: string + - name: productId + in: query + schema: + type: string + - name: subunitCode + in: query + schema: + type: string + - name: taxCode + in: query + schema: + type: string + responses: + "200": + description: OK + content: + application/json: {} + "401": + description: Not Authorized + "403": + description: Not Allowed + security: + - SecurityScheme: [] /v1/onboarding/{onboardingId}: get: tags: diff --git a/apps/onboarding-ms/src/main/java/it/pagopa/selfcare/onboarding/constants/CustomError.java b/apps/onboarding-ms/src/main/java/it/pagopa/selfcare/onboarding/constants/CustomError.java index b1866b3de..283a3b1c2 100644 --- a/apps/onboarding-ms/src/main/java/it/pagopa/selfcare/onboarding/constants/CustomError.java +++ b/apps/onboarding-ms/src/main/java/it/pagopa/selfcare/onboarding/constants/CustomError.java @@ -7,6 +7,8 @@ public enum CustomError { ROLES_NOT_ADMITTED_ERROR("0034","Roles %s are not admitted for this operation"), AOO_NOT_FOUND("0000","AOO %s not found"), UO_NOT_FOUND("0000","UO %s not found"), + ONBOARDING_INFO_FILTERS_ERROR("0052", "Invalid filters parameters to retrieve onboarding info"), + INSTITUTION_NOT_ONBOARDED_BY_FILTERS("0004", "Has not been found an onboarded Institution with the provided filters"), INSTITUTION_NOT_FOUND("0000","Institution with taxCode %s origin %s originId %s subunitCode %s not found"), USERS_UPDATE_NOT_ALLOWED("0025", "Invalid users information provided"); diff --git a/apps/onboarding-ms/src/main/java/it/pagopa/selfcare/onboarding/controller/OnboardingController.java b/apps/onboarding-ms/src/main/java/it/pagopa/selfcare/onboarding/controller/OnboardingController.java index a60391f6f..6a854c475 100644 --- a/apps/onboarding-ms/src/main/java/it/pagopa/selfcare/onboarding/controller/OnboardingController.java +++ b/apps/onboarding-ms/src/main/java/it/pagopa/selfcare/onboarding/controller/OnboardingController.java @@ -5,11 +5,13 @@ import io.smallrye.jwt.auth.principal.DefaultJWTCallerPrincipal; import io.smallrye.mutiny.Uni; import it.pagopa.selfcare.onboarding.common.OnboardingStatus; +import it.pagopa.selfcare.onboarding.constants.CustomError; import it.pagopa.selfcare.onboarding.controller.request.*; import it.pagopa.selfcare.onboarding.controller.response.OnboardingGet; import it.pagopa.selfcare.onboarding.controller.response.OnboardingGetResponse; import it.pagopa.selfcare.onboarding.controller.response.OnboardingResponse; import it.pagopa.selfcare.onboarding.entity.Onboarding; +import it.pagopa.selfcare.onboarding.exception.ResourceNotFoundException; import it.pagopa.selfcare.onboarding.mapper.OnboardingMapper; import it.pagopa.selfcare.onboarding.model.OnboardingGetFilters; import it.pagopa.selfcare.onboarding.service.OnboardingService; @@ -346,4 +348,23 @@ public Uni onboardingAggregationCompletion(@Valid Onboarding .onItem().transformToUni(userId -> onboardingService .onboardingAggregationCompletion(fillUserId(onboardingMapper.toEntity(onboardingRequest), userId), onboardingRequest.getUsers())); } + + @HEAD + @Path("/verify") + @Operation(summary = "Verify if the onboarded product is already onboarded for the institution") + public Uni verifyOnboardingInfoByFilters(@QueryParam("productId") String productId, + @QueryParam("taxCode") String taxCode, + @QueryParam("origin") String origin, + @QueryParam("originId") String originId, + @QueryParam("subunitCode") String subunitCode) { + return onboardingService.verifyOnboarding(taxCode, subunitCode, origin, originId, OnboardingStatus.COMPLETED, productId) + .onItem().transform(onboardingList -> { + if (onboardingList.isEmpty()) { + throw new ResourceNotFoundException(CustomError.INSTITUTION_NOT_ONBOARDED_BY_FILTERS.getMessage(), + CustomError.INSTITUTION_NOT_ONBOARDED_BY_FILTERS.getCode()); + } else { + return Response.status(HttpStatus.SC_NO_CONTENT).build(); + } + }); + } } diff --git a/apps/onboarding-ms/src/main/java/it/pagopa/selfcare/onboarding/service/OnboardingService.java b/apps/onboarding-ms/src/main/java/it/pagopa/selfcare/onboarding/service/OnboardingService.java index d3f42c0bf..cf116da6e 100644 --- a/apps/onboarding-ms/src/main/java/it/pagopa/selfcare/onboarding/service/OnboardingService.java +++ b/apps/onboarding-ms/src/main/java/it/pagopa/selfcare/onboarding/service/OnboardingService.java @@ -42,6 +42,8 @@ public interface OnboardingService { Uni> institutionOnboardings(String taxCode, String subunitCode, String origin, String originId, OnboardingStatus status); + Uni> verifyOnboarding(String taxCode, String subunitCode, String origin, String originId, OnboardingStatus status, String productId); + Uni onboardingGet(String onboardingId); Uni onboardingGetWithUserInfo(String onboardingId); @@ -49,4 +51,5 @@ public interface OnboardingService { Uni updateOnboarding(String onboardingId, Onboarding onboarding); Uni checkManager(OnboardingUserRequest onboardingUserRequest); + } diff --git a/apps/onboarding-ms/src/main/java/it/pagopa/selfcare/onboarding/service/OnboardingServiceDefault.java b/apps/onboarding-ms/src/main/java/it/pagopa/selfcare/onboarding/service/OnboardingServiceDefault.java index b38b0f590..65ac3197e 100644 --- a/apps/onboarding-ms/src/main/java/it/pagopa/selfcare/onboarding/service/OnboardingServiceDefault.java +++ b/apps/onboarding-ms/src/main/java/it/pagopa/selfcare/onboarding/service/OnboardingServiceDefault.java @@ -904,6 +904,16 @@ public Uni> institutionOnboardings(String taxCode, Stri .collect().asList(); } + @Override + public Uni> verifyOnboarding(String taxCode, String subunitCode, String origin, String originId, OnboardingStatus status, String productId) { + Map queryParameter = QueryUtils.createMapForVerifyOnboardingQueryParameter(taxCode, subunitCode, origin, originId, status, productId); + Document query = QueryUtils.buildQuery(queryParameter); + return Onboarding.find(query).stream() + .map(Onboarding.class::cast) + .map(onboardingMapper::toResponse) + .collect().asList(); + } + @Override public Uni onboardingGet(String onboardingId) { return Onboarding.findByIdOptional(onboardingId) diff --git a/apps/onboarding-ms/src/main/java/it/pagopa/selfcare/onboarding/util/QueryUtils.java b/apps/onboarding-ms/src/main/java/it/pagopa/selfcare/onboarding/util/QueryUtils.java index f2f2c7044..cacc15112 100644 --- a/apps/onboarding-ms/src/main/java/it/pagopa/selfcare/onboarding/util/QueryUtils.java +++ b/apps/onboarding-ms/src/main/java/it/pagopa/selfcare/onboarding/util/QueryUtils.java @@ -102,6 +102,20 @@ public static Map createMapForInstitutionOnboardingsQueryParamet return queryParameterMap; } + public static Map createMapForVerifyOnboardingQueryParameter(String taxCode, String subunitCode, String origin, String originId, OnboardingStatus status, String productId) { + Map queryParameterMap = new HashMap<>(); + + Optional.ofNullable(taxCode).ifPresent(value -> queryParameterMap.put(INSTITUTION_TAX_CODE, value)); + Optional.ofNullable(origin).ifPresent(value -> queryParameterMap.put(INSTITUTION_ORIGIN, value)); + Optional.ofNullable(originId).ifPresent(value -> queryParameterMap.put(INSTITUTION_ORIGIN_ID, value)); + Optional.ofNullable(status).ifPresent(value -> queryParameterMap.put(STATUS, value.name())); + Optional.ofNullable(productId).ifPresent(value -> queryParameterMap.put(PRODUCT, value)); + + queryParameterMap.put(INSTITUTION_SUBUNIT_CODE, subunitCode); + + return queryParameterMap; + } + public static Map createMapForOnboardingReject(String reasonForReject, String onboardingStatus) { Map queryParameterMap = new HashMap<>(); Optional.ofNullable(reasonForReject).ifPresent(value -> queryParameterMap.put("reasonForReject", value)); diff --git a/apps/onboarding-ms/src/test/java/it/pagopa/selfcare/onboarding/controller/OnboardingControllerTest.java b/apps/onboarding-ms/src/test/java/it/pagopa/selfcare/onboarding/controller/OnboardingControllerTest.java index 08466f557..901d86d17 100644 --- a/apps/onboarding-ms/src/test/java/it/pagopa/selfcare/onboarding/controller/OnboardingControllerTest.java +++ b/apps/onboarding-ms/src/test/java/it/pagopa/selfcare/onboarding/controller/OnboardingControllerTest.java @@ -620,6 +620,48 @@ void getInstitutionOnboardings() { .institutionOnboardings("taxCode", "subunitCode", "origin", "originId", OnboardingStatus.PENDING); } + @Test + @TestSecurity(user = "userJwt") + void verifyOnboardingNoContentType() { + OnboardingResponse onboardingResponse = dummyOnboardingResponse(); + List onboardingResponses = new ArrayList<>(); + onboardingResponses.add(onboardingResponse); + when(onboardingService.verifyOnboarding("taxCode", "subunitCode", "origin", "originId", OnboardingStatus.COMPLETED, "prod-interop")) + .thenReturn(Uni.createFrom().item(onboardingResponses)); + + Map queryParameterMap = getStringStringMapOnboardings(); + + given() + .when() + .queryParams(queryParameterMap) + .head("/verify") + .then() + .statusCode(204); + + verify(onboardingService, times(1)) + .verifyOnboarding("taxCode", "subunitCode", "origin", "originId", OnboardingStatus.COMPLETED, "prod-interop"); + } + + @Test + @TestSecurity(user = "userJwt") + void verifyOnboardingResourceNotFound() { + List onboardingResponses = new ArrayList<>(); + when(onboardingService.verifyOnboarding("taxCode", "subunitCode", "origin", "originId", OnboardingStatus.COMPLETED, "prod-interop")) + .thenReturn(Uni.createFrom().item(onboardingResponses)); + + Map queryParameterMap = getStringStringMapOnboardings(); + + given() + .when() + .queryParams(queryParameterMap) + .head("/verify") + .then() + .statusCode(404); + + verify(onboardingService, times(1)) + .verifyOnboarding("taxCode", "subunitCode", "origin", "originId", OnboardingStatus.COMPLETED, "prod-interop"); + } + private static Map getStringStringMap() { Map queryParameterMap = new HashMap<>(); queryParameterMap.put("productId", "prod-io"); @@ -637,6 +679,7 @@ private static Map getStringStringMapOnboardings() { queryParameterMap.put("origin", "origin"); queryParameterMap.put("originId", "originId"); queryParameterMap.put("status", "PENDING"); + queryParameterMap.put("productId", "prod-interop"); return queryParameterMap; } diff --git a/apps/onboarding-ms/src/test/java/it/pagopa/selfcare/onboarding/service/OnboardingServiceDefaultTest.java b/apps/onboarding-ms/src/test/java/it/pagopa/selfcare/onboarding/service/OnboardingServiceDefaultTest.java index 2e3803674..293b0d77b 100644 --- a/apps/onboarding-ms/src/test/java/it/pagopa/selfcare/onboarding/service/OnboardingServiceDefaultTest.java +++ b/apps/onboarding-ms/src/test/java/it/pagopa/selfcare/onboarding/service/OnboardingServiceDefaultTest.java @@ -1581,6 +1581,23 @@ void testInstitutionOnboardings() { assertEquals(1, response.size()); } + @Test + void testVerifyOnboardingNonEmptyList() { + Onboarding onboarding = mock(Onboarding.class); + PanacheMock.mock(Onboarding.class); + ReactivePanacheQuery query = Mockito.mock(ReactivePanacheQuery.class); + when(query.stream()).thenReturn(Multi.createFrom().item(onboarding)); + when(Onboarding.find(any())).thenReturn(query); + UniAssertSubscriber> subscriber = onboardingService + .verifyOnboarding("taxCode", "subunitCode", "origin", "originId", OnboardingStatus.COMPLETED, "prod-interop") + .subscribe() + .withSubscriber(UniAssertSubscriber.create()); + + List response = subscriber.assertCompleted().awaitItem().getItem(); + assertFalse(response.isEmpty()); + assertEquals(1, response.size()); + } + @Nested @TestProfile(OnboardingTestProfile.class) @TestInstance(TestInstance.Lifecycle.PER_CLASS)