diff --git a/apps/onboarding-cdc/src/main/openapi/onboarding_functions.json b/apps/onboarding-cdc/src/main/openapi/onboarding_functions.json index ecef61d09..ebb6b79bb 100644 --- a/apps/onboarding-cdc/src/main/openapi/onboarding_functions.json +++ b/apps/onboarding-cdc/src/main/openapi/onboarding_functions.json @@ -506,7 +506,8 @@ "DELEGATE", "SUB_DELEGATE", "OPERATOR", - "ADMIN_EA" + "ADMIN_EA", + "ADMIN_EA_IO" ], "type": "string" }, diff --git a/apps/onboarding-functions/pom.xml b/apps/onboarding-functions/pom.xml index 08f08b176..287994259 100644 --- a/apps/onboarding-functions/pom.xml +++ b/apps/onboarding-functions/pom.xml @@ -23,7 +23,7 @@ true 3.1.2 1.5.5.Final - 0.6.6 + 0.6.7 diff --git a/apps/onboarding-functions/src/main/java/it/pagopa/selfcare/onboarding/service/CompletionServiceDefault.java b/apps/onboarding-functions/src/main/java/it/pagopa/selfcare/onboarding/service/CompletionServiceDefault.java index e951f8764..93e7ca76f 100644 --- a/apps/onboarding-functions/src/main/java/it/pagopa/selfcare/onboarding/service/CompletionServiceDefault.java +++ b/apps/onboarding-functions/src/main/java/it/pagopa/selfcare/onboarding/service/CompletionServiceDefault.java @@ -324,10 +324,10 @@ private InstitutionsResponse getInstitutions(Institution institution) { InstitutionsResponse institutionsResponse; if(StringUtils.isNotBlank(institution.getTaxCode())) { - institutionsResponse = institutionApi.getInstitutionsUsingGET(institution.getTaxCode(), institution.getSubunitCode(), null, null); + institutionsResponse = institutionApi.getInstitutionsUsingGET(institution.getTaxCode(), institution.getSubunitCode(), null, null, null); } else { String origin = Objects.nonNull(institution.getOrigin()) ? institution.getOrigin().getValue() : null; - institutionsResponse = institutionApi.getInstitutionsUsingGET(null, null, origin, institution.getOriginId()); + institutionsResponse = institutionApi.getInstitutionsUsingGET(null, null, origin, institution.getOriginId(), null); } return institutionsResponse; } diff --git a/apps/onboarding-functions/src/main/openapi/core.json b/apps/onboarding-functions/src/main/openapi/core.json index 74a56890e..530862aeb 100644 --- a/apps/onboarding-functions/src/main/openapi/core.json +++ b/apps/onboarding-functions/src/main/openapi/core.json @@ -788,6 +788,15 @@ "schema" : { "type" : "string" } + }, { + "name" : "productId", + "in" : "query", + "description" : "productId", + "required" : false, + "style" : "form", + "schema" : { + "type" : "string" + } } ], "responses" : { "200" : { @@ -2086,7 +2095,7 @@ "style" : "simple", "schema" : { "type" : "string", - "enum" : [ "AS", "CON", "GSP", "PA", "PG", "PRV", "PSP", "PT", "REC", "SA", "SCP", "GPU" ] + "enum" : [ "AS", "CON", "GPU", "GSP", "PA", "PG", "PRV", "PSP", "PT", "REC", "SA", "SCP" ] } } ], "responses" : { @@ -2964,7 +2973,7 @@ }, "institutionType" : { "type" : "string", - "enum" : [ "AS", "CON", "GSP", "PA", "PG", "PRV", "PSP", "PT", "REC", "SA", "SCP", "GPU" ] + "enum" : [ "AS", "CON", "GPU", "GSP", "PA", "PG", "PRV", "PSP", "PT", "REC", "SA", "SCP" ] }, "subunitCode" : { "type" : "string" @@ -3226,7 +3235,7 @@ }, "institutionType" : { "type" : "string", - "enum" : [ "AS", "CON", "GSP", "PA", "PG", "PRV", "PSP", "PT", "REC", "SA", "SCP", "GPU" ] + "enum" : [ "AS", "CON", "GPU", "GSP", "PA", "PG", "PRV", "PSP", "PT", "REC", "SA", "SCP" ] }, "onboarding" : { "type" : "array", @@ -3440,7 +3449,7 @@ }, "institutionType" : { "type" : "string", - "enum" : [ "AS", "CON", "GSP", "PA", "PG", "PRV", "PSP", "PT", "REC", "SA", "SCP", "GPU" ] + "enum" : [ "AS", "CON", "GPU", "GSP", "PA", "PG", "PRV", "PSP", "PT", "REC", "SA", "SCP" ] }, "ivassCode" : { "type" : "string" @@ -3817,7 +3826,7 @@ }, "role" : { "type" : "string", - "enum" : [ "DELEGATE", "MANAGER", "OPERATOR", "SUB_DELEGATE" ] + "enum" : [ "ADMIN_EA", "ADMIN_EA_IO", "DELEGATE", "MANAGER", "OPERATOR", "SUB_DELEGATE" ] }, "roleLabel" : { "type" : "string" diff --git a/apps/onboarding-functions/src/test/java/it/pagopa/selfcare/onboarding/service/CompletionServiceDefaultTest.java b/apps/onboarding-functions/src/test/java/it/pagopa/selfcare/onboarding/service/CompletionServiceDefaultTest.java index 9f9104132..d8a4a2f6d 100644 --- a/apps/onboarding-functions/src/test/java/it/pagopa/selfcare/onboarding/service/CompletionServiceDefaultTest.java +++ b/apps/onboarding-functions/src/test/java/it/pagopa/selfcare/onboarding/service/CompletionServiceDefaultTest.java @@ -36,7 +36,9 @@ import org.openapi.quarkus.party_registry_proxy_json.api.InfocamereApi; import org.openapi.quarkus.party_registry_proxy_json.api.NationalRegistriesApi; import org.openapi.quarkus.party_registry_proxy_json.api.UoApi; -import org.openapi.quarkus.party_registry_proxy_json.model.*; +import org.openapi.quarkus.party_registry_proxy_json.model.AOOResource; +import org.openapi.quarkus.party_registry_proxy_json.model.InstitutionResource; +import org.openapi.quarkus.party_registry_proxy_json.model.UOResource; import org.openapi.quarkus.user_registry_json.api.UserApi; import org.openapi.quarkus.user_registry_json.model.UserResource; import org.openapi.quarkus.user_registry_json.model.WorkContactResource; @@ -122,7 +124,7 @@ void createInstitutionAndPersistInstitutionId_shouldThrowExceptionIfMoreInstitut InstitutionsResponse response = new InstitutionsResponse(); response.setInstitutions(List.of(new InstitutionResponse(), new InstitutionResponse())); when(institutionApi.getInstitutionsUsingGET(onboarding.getInstitution().getTaxCode(), - onboarding.getInstitution().getSubunitCode(), null, null)) + onboarding.getInstitution().getSubunitCode(), null, null, null)) .thenReturn(response); assertThrows(GenericOnboardingException.class, () -> completionServiceDefault.createInstitutionAndPersistInstitutionId(onboarding)); @@ -137,7 +139,7 @@ void createInstitutionAndPersistInstitutionId_foundInstitution() { institutionResponse.setId("actual-id"); response.setInstitutions(List.of(institutionResponse)); when(institutionApi.getInstitutionsUsingGET(onboarding.getInstitution().getTaxCode(), - onboarding.getInstitution().getSubunitCode(), null, null)) + onboarding.getInstitution().getSubunitCode(), null, null, null)) .thenReturn(response); mockOnboardingUpdateAndExecuteCreateInstitution(onboarding); @@ -156,7 +158,7 @@ void createOrRetrieveInstitutionSuccess() { institutionResponse.setId("actual-id"); response.setInstitutions(List.of(institutionResponse)); - when(institutionApi.getInstitutionsUsingGET(institution.getTaxCode(), null, null, null)) + when(institutionApi.getInstitutionsUsingGET(institution.getTaxCode(), null, null, null, null)) .thenReturn(response); InstitutionResponse serviceResponse = completionServiceDefault.createOrRetrieveInstitution(onboarding); @@ -177,7 +179,7 @@ void createOrRetrieveInstitutionFailure() { InstitutionResponse institutionResponse = new InstitutionResponse(); response.setInstitutions(List.of(institutionResponse, institutionResponse)); - when(institutionApi.getInstitutionsUsingGET(institution.getTaxCode(), null, null, null)) + when(institutionApi.getInstitutionsUsingGET(institution.getTaxCode(), null, null, null, null)) .thenReturn(response); assertThrows(GenericOnboardingException.class, () -> completionServiceDefault.createOrRetrieveInstitution(onboarding)); @@ -244,7 +246,7 @@ void createInstitutionAndPersistInstitutionId_notFoundInstitutionAndCreateSaAnac InstitutionsResponse response = new InstitutionsResponse(); when(institutionApi.getInstitutionsUsingGET(onboarding.getInstitution().getTaxCode(), - onboarding.getInstitution().getSubunitCode(), null, null)) + onboarding.getInstitution().getSubunitCode(), null, null, null)) .thenReturn(response); InstitutionResponse institutionResponse = dummyInstitutionResponse(); @@ -265,7 +267,7 @@ void createInstitutionAndPersistInstitutionId_notFoundInstitutionAndCreateAsIvas InstitutionsResponse response = new InstitutionsResponse(); when(institutionApi.getInstitutionsUsingGET(onboarding.getInstitution().getTaxCode(), - onboarding.getInstitution().getSubunitCode(), null, null)) + onboarding.getInstitution().getSubunitCode(), null, null, null)) .thenReturn(response); InstitutionResponse institutionResponse = dummyInstitutionResponse(); @@ -285,7 +287,7 @@ void createInstitutionAndPersistInstitutionId_notFoundInstitutionAndCreateAsIvas onboarding.setInstitution(institution); InstitutionsResponse response = new InstitutionsResponse(); - when(institutionApi.getInstitutionsUsingGET(null, null, Origin.IVASS.getValue(), "originId")) + when(institutionApi.getInstitutionsUsingGET(null, null, Origin.IVASS.getValue(), "originId", null)) .thenReturn(response); InstitutionResponse institutionResponse = dummyInstitutionResponse(); @@ -306,7 +308,7 @@ void createInstitutionAndPersistInstitutionId_notFoundInstitutionAndCreatePgAde( InstitutionsResponse response = new InstitutionsResponse(); when(institutionApi.getInstitutionsUsingGET(onboarding.getInstitution().getTaxCode(), - onboarding.getInstitution().getSubunitCode(), null, null)) + onboarding.getInstitution().getSubunitCode(), null, null, null)) .thenReturn(response); InstitutionResponse institutionResponse = dummyInstitutionResponse(); @@ -332,7 +334,7 @@ void createInstitutionAndPersistInstitutionId_notFoundInstitutionAndCreatePaAOO( InstitutionsResponse response = new InstitutionsResponse(); when(institutionApi.getInstitutionsUsingGET(onboarding.getInstitution().getTaxCode(), - onboarding.getInstitution().getSubunitCode(), null, null)) + onboarding.getInstitution().getSubunitCode(), null, null, null)) .thenReturn(response); InstitutionResponse institutionResponse = dummyInstitutionResponse(); @@ -368,7 +370,7 @@ void createInstitutionAndPersistInstitutionId_notFoundInstitutionAndCreatePaUO() InstitutionsResponse response = new InstitutionsResponse(); when(institutionApi.getInstitutionsUsingGET(onboarding.getInstitution().getTaxCode(), - onboarding.getInstitution().getSubunitCode(), null, null)) + onboarding.getInstitution().getSubunitCode(), null, null, null)) .thenReturn(response); InstitutionResponse institutionResponse = dummyInstitutionResponse(); @@ -402,7 +404,7 @@ void createInstitutionAndPersistInstitutionId_notFoundInstitutionAndCreatePa() { InstitutionsResponse response = new InstitutionsResponse(); when(institutionApi.getInstitutionsUsingGET(onboarding.getInstitution().getTaxCode(), - null, null, null)) + null, null, null, null)) .thenReturn(response); InstitutionResponse institutionResponse = dummyInstitutionResponse(); @@ -434,7 +436,7 @@ void createInstitutionAndPersistInstitutionId_notFoundInstitutionAndCreate() { InstitutionsResponse response = new InstitutionsResponse(); when(institutionApi.getInstitutionsUsingGET(onboarding.getInstitution().getTaxCode(), - null, null, null)) + null, null, null, null)) .thenReturn(response); InstitutionResponse institutionResponse = dummyInstitutionResponse(); @@ -842,7 +844,7 @@ void forceInstitutionCreationFlagTrue(){ InstitutionsResponse institutionsResponse = new InstitutionsResponse(); institutionsResponse.setInstitutions(List.of(dummyInstitutionResponse())); - when(institutionApi.getInstitutionsUsingGET(any(), any(), any(), any())) + when(institutionApi.getInstitutionsUsingGET(any(), any(), any(), any(), any())) .thenReturn(institutionsResponse); PanacheUpdate panacheUpdateMock = mock(PanacheUpdate.class); @@ -853,7 +855,7 @@ void forceInstitutionCreationFlagTrue(){ completionServiceDefault.createInstitutionAndPersistInstitutionId(onboarding); // then - verify(institutionApi, times(1)).getInstitutionsUsingGET(any(), any(), any(), any()); + verify(institutionApi, times(1)).getInstitutionsUsingGET(any(), any(), any(), any(), any()); } @Test diff --git a/apps/onboarding-ms/pom.xml b/apps/onboarding-ms/pom.xml index 0531884d9..1f9ebe8cc 100644 --- a/apps/onboarding-ms/pom.xml +++ b/apps/onboarding-ms/pom.xml @@ -24,7 +24,7 @@ true 3.1.2 2.4.1 - 0.6.6 + 0.6.7 diff --git a/apps/onboarding-ms/src/main/docs/openapi.json b/apps/onboarding-ms/src/main/docs/openapi.json index 37a46bfb5..3d039b5f0 100644 --- a/apps/onboarding-ms/src/main/docs/openapi.json +++ b/apps/onboarding-ms/src/main/docs/openapi.json @@ -627,7 +627,7 @@ "content" : { "application/json" : { "schema" : { - "$ref" : "#/components/schemas/OnboardingResponse" + "$ref" : "#/components/schemas/OnboardingResponseV1" } } } @@ -689,7 +689,7 @@ "schema" : { "type" : "array", "items" : { - "$ref" : "#/components/schemas/OnboardingResponse" + "$ref" : "#/components/schemas/OnboardingResponseV1" } } } @@ -805,7 +805,7 @@ "content" : { "application/json" : { "schema" : { - "$ref" : "#/components/schemas/OnboardingResponse" + "$ref" : "#/components/schemas/OnboardingResponseV1" } } } @@ -881,7 +881,7 @@ "content" : { "application/json" : { "schema" : { - "$ref" : "#/components/schemas/OnboardingResponse" + "$ref" : "#/components/schemas/OnboardingResponseV1" } } } @@ -957,7 +957,7 @@ "content" : { "application/json" : { "schema" : { - "$ref" : "#/components/schemas/OnboardingResponse" + "$ref" : "#/components/schemas/OnboardingResponseV1" } } } @@ -1807,6 +1807,222 @@ "SecurityScheme" : [ ] } ] } + }, + "/v2/onboarding/completion" : { + "post" : { + "tags" : [ "Onboarding Controller", "internal-v1" ], + "summary" : "Complete onboarding request and set status to COMPLETED.", + "description" : "Perform onboarding as /onboarding but completing the onboarding request to COMPLETED phase.", + "operationId" : "onboardingCompletionV2", + "requestBody" : { + "content" : { + "application/json" : { + "schema" : { + "$ref" : "#/components/schemas/OnboardingDefaultRequest" + } + } + } + }, + "responses" : { + "200" : { + "description" : "OK", + "content" : { + "application/json" : { + "schema" : { + "$ref" : "#/components/schemas/OnboardingResponse" + } + } + } + }, + "401" : { + "description" : "Not Authorized" + }, + "403" : { + "description" : "Not Allowed" + } + }, + "security" : [ { + "SecurityScheme" : [ ] + } ] + } + }, + "/v2/onboarding/institutionOnboardings" : { + "get" : { + "tags" : [ "support", "internal-v1", "Onboarding" ], + "summary" : "Get onboardings by institution taxCode, subunitCode, origin, or originId.", + "description" : "Returns onboardings record by institution taxCode/subunitCode/origin/originId", + "operationId" : "onboardingInstitutionUsingGETV2", + "parameters" : [ { + "name" : "origin", + "in" : "query", + "schema" : { + "type" : "string" + } + }, { + "name" : "originId", + "in" : "query", + "schema" : { + "type" : "string" + } + }, { + "name" : "status", + "in" : "query", + "schema" : { + "$ref" : "#/components/schemas/OnboardingStatus" + } + }, { + "name" : "subunitCode", + "in" : "query", + "schema" : { + "type" : "string" + } + }, { + "name" : "taxCode", + "in" : "query", + "schema" : { + "type" : "string" + } + } ], + "responses" : { + "200" : { + "description" : "OK", + "content" : { + "application/json" : { + "schema" : { + "type" : "array", + "items" : { + "$ref" : "#/components/schemas/OnboardingResponse" + } + } + } + } + }, + "401" : { + "description" : "Not Authorized" + }, + "403" : { + "description" : "Not Allowed" + } + }, + "security" : [ { + "SecurityScheme" : [ ] + } ], + "x-legacy-api" : "true" + } + }, + "/v2/onboarding/pa/completion" : { + "post" : { + "tags" : [ "Onboarding Controller", "internal-v1" ], + "summary" : "Complete PA onboarding request and set status to COMPLETED.", + "description" : "Perform onboarding as /onboarding/pa but completing the onboarding request to COMPLETED phase.", + "operationId" : "onboardingPaCompletionV2", + "requestBody" : { + "content" : { + "application/json" : { + "schema" : { + "$ref" : "#/components/schemas/OnboardingPaRequest" + } + } + } + }, + "responses" : { + "200" : { + "description" : "OK", + "content" : { + "application/json" : { + "schema" : { + "$ref" : "#/components/schemas/OnboardingResponse" + } + } + } + }, + "401" : { + "description" : "Not Authorized" + }, + "403" : { + "description" : "Not Allowed" + } + }, + "security" : [ { + "SecurityScheme" : [ ] + } ] + } + }, + "/v2/onboarding/pg/completion" : { + "post" : { + "tags" : [ "Onboarding Controller", "internal-pnpg" ], + "summary" : "Complete PG onboarding request on PNPG domain and set status to COMPLETED.", + "description" : "Perform onboarding as /onboarding/psp but completing the onboarding request to COMPLETED phase.", + "operationId" : "onboardingPgCompletionV2", + "requestBody" : { + "content" : { + "application/json" : { + "schema" : { + "$ref" : "#/components/schemas/OnboardingPgRequest" + } + } + } + }, + "responses" : { + "200" : { + "description" : "OK", + "content" : { + "application/json" : { + "schema" : { + "$ref" : "#/components/schemas/OnboardingResponse" + } + } + } + }, + "401" : { + "description" : "Not Authorized" + }, + "403" : { + "description" : "Not Allowed" + } + }, + "security" : [ { + "SecurityScheme" : [ ] + } ] + } + }, + "/v2/onboarding/psp/completion" : { + "post" : { + "tags" : [ "Onboarding Controller", "internal-v1" ], + "summary" : "Complete PSP onboarding request and set status to COMPLETED.", + "description" : "Perform onboarding as /onboarding/psp but completing the onboarding request to COMPLETED phase.", + "operationId" : "onboardingPspCompletionV2", + "requestBody" : { + "content" : { + "application/json" : { + "schema" : { + "$ref" : "#/components/schemas/OnboardingPspRequest" + } + } + } + }, + "responses" : { + "200" : { + "description" : "OK", + "content" : { + "application/json" : { + "schema" : { + "$ref" : "#/components/schemas/OnboardingResponse" + } + } + } + }, + "401" : { + "description" : "Not Authorized" + }, + "403" : { + "description" : "Not Allowed" + } + }, + "security" : [ { + "SecurityScheme" : [ ] + } ] + } } }, "components" : { @@ -2832,6 +3048,53 @@ } } }, + "OnboardingResponseV1" : { + "type" : "object", + "properties" : { + "id" : { + "type" : "string" + }, + "productId" : { + "type" : "string" + }, + "workflowType" : { + "type" : "string" + }, + "institution" : { + "$ref" : "#/components/schemas/InstitutionResponse" + }, + "pricingPlan" : { + "type" : "string" + }, + "users" : { + "type" : "array", + "items" : { + "$ref" : "#/components/schemas/UserOnboardingResponseV1" + } + }, + "billing" : { + "$ref" : "#/components/schemas/BillingResponse" + }, + "status" : { + "type" : "string" + }, + "additionalInformations" : { + "$ref" : "#/components/schemas/AdditionalInformationsDto" + }, + "userRequestUid" : { + "type" : "string" + }, + "isAggregator" : { + "type" : "boolean" + }, + "createdAt" : { + "$ref" : "#/components/schemas/LocalDateTime" + }, + "updatedAt" : { + "$ref" : "#/components/schemas/LocalDateTime" + } + } + }, "OnboardingStatus" : { "enum" : [ "REQUEST", "TOBEVALIDATED", "PENDING", "COMPLETED", "FAILED", "REJECTED", "DELETED" ], "type" : "string" @@ -2899,6 +3162,10 @@ "type" : "string" }, "PartyRole" : { + "enum" : [ "MANAGER", "DELEGATE", "SUB_DELEGATE", "OPERATOR", "ADMIN_EA", "ADMIN_EA_IO" ], + "type" : "string" + }, + "PartyRoleV1" : { "enum" : [ "MANAGER", "DELEGATE", "SUB_DELEGATE", "OPERATOR", "ADMIN_EA" ], "type" : "string" }, @@ -3024,6 +3291,23 @@ } } }, + "UserOnboardingResponseV1" : { + "type" : "object", + "properties" : { + "id" : { + "type" : "string" + }, + "role" : { + "$ref" : "#/components/schemas/PartyRoleV1" + }, + "productRole" : { + "type" : "string" + }, + "userMailUuid" : { + "type" : "string" + } + } + }, "UserRequest" : { "type" : "object", "properties" : { diff --git a/apps/onboarding-ms/src/main/docs/openapi.yaml b/apps/onboarding-ms/src/main/docs/openapi.yaml index bad53480c..da630d8a8 100644 --- a/apps/onboarding-ms/src/main/docs/openapi.yaml +++ b/apps/onboarding-ms/src/main/docs/openapi.yaml @@ -456,7 +456,7 @@ paths: content: application/json: schema: - $ref: "#/components/schemas/OnboardingResponse" + $ref: "#/components/schemas/OnboardingResponseV1" "401": description: Not Authorized "403": @@ -501,7 +501,7 @@ paths: schema: type: array items: - $ref: "#/components/schemas/OnboardingResponse" + $ref: "#/components/schemas/OnboardingResponseV1" "401": description: Not Authorized "403": @@ -590,7 +590,7 @@ paths: content: application/json: schema: - $ref: "#/components/schemas/OnboardingResponse" + $ref: "#/components/schemas/OnboardingResponseV1" "401": description: Not Authorized "403": @@ -643,7 +643,7 @@ paths: content: application/json: schema: - $ref: "#/components/schemas/OnboardingResponse" + $ref: "#/components/schemas/OnboardingResponseV1" "401": description: Not Authorized "403": @@ -699,7 +699,7 @@ paths: content: application/json: schema: - $ref: "#/components/schemas/OnboardingResponse" + $ref: "#/components/schemas/OnboardingResponseV1" "401": description: Not Authorized "403": @@ -1328,6 +1328,160 @@ paths: description: Not Allowed security: - SecurityScheme: [] + /v2/onboarding/completion: + post: + tags: + - Onboarding Controller + - internal-v1 + summary: Complete onboarding request and set status to COMPLETED. + description: Perform onboarding as /onboarding but completing the onboarding + request to COMPLETED phase. + operationId: onboardingCompletionV2 + requestBody: + content: + application/json: + schema: + $ref: "#/components/schemas/OnboardingDefaultRequest" + responses: + "200": + description: OK + content: + application/json: + schema: + $ref: "#/components/schemas/OnboardingResponse" + "401": + description: Not Authorized + "403": + description: Not Allowed + security: + - SecurityScheme: [] + /v2/onboarding/institutionOnboardings: + get: + tags: + - support + - internal-v1 + - Onboarding + summary: "Get onboardings by institution taxCode, subunitCode, origin, or originId." + description: Returns onboardings record by institution taxCode/subunitCode/origin/originId + operationId: onboardingInstitutionUsingGETV2 + parameters: + - name: origin + in: query + schema: + type: string + - name: originId + in: query + schema: + type: string + - name: status + in: query + schema: + $ref: "#/components/schemas/OnboardingStatus" + - name: subunitCode + in: query + schema: + type: string + - name: taxCode + in: query + schema: + type: string + responses: + "200": + description: OK + content: + application/json: + schema: + type: array + items: + $ref: "#/components/schemas/OnboardingResponse" + "401": + description: Not Authorized + "403": + description: Not Allowed + security: + - SecurityScheme: [] + x-legacy-api: "true" + /v2/onboarding/pa/completion: + post: + tags: + - Onboarding Controller + - internal-v1 + summary: Complete PA onboarding request and set status to COMPLETED. + description: Perform onboarding as /onboarding/pa but completing the onboarding + request to COMPLETED phase. + operationId: onboardingPaCompletionV2 + requestBody: + content: + application/json: + schema: + $ref: "#/components/schemas/OnboardingPaRequest" + responses: + "200": + description: OK + content: + application/json: + schema: + $ref: "#/components/schemas/OnboardingResponse" + "401": + description: Not Authorized + "403": + description: Not Allowed + security: + - SecurityScheme: [] + /v2/onboarding/pg/completion: + post: + tags: + - Onboarding Controller + - internal-pnpg + summary: Complete PG onboarding request on PNPG domain and set status to COMPLETED. + description: Perform onboarding as /onboarding/psp but completing the onboarding + request to COMPLETED phase. + operationId: onboardingPgCompletionV2 + requestBody: + content: + application/json: + schema: + $ref: "#/components/schemas/OnboardingPgRequest" + responses: + "200": + description: OK + content: + application/json: + schema: + $ref: "#/components/schemas/OnboardingResponse" + "401": + description: Not Authorized + "403": + description: Not Allowed + security: + - SecurityScheme: [] + /v2/onboarding/psp/completion: + post: + tags: + - Onboarding Controller + - internal-v1 + summary: Complete PSP onboarding request and set status to COMPLETED. + description: Perform onboarding as /onboarding/psp but completing the onboarding + request to COMPLETED phase. + operationId: onboardingPspCompletionV2 + requestBody: + content: + application/json: + schema: + $ref: "#/components/schemas/OnboardingPspRequest" + responses: + "200": + description: OK + content: + application/json: + schema: + $ref: "#/components/schemas/OnboardingResponse" + "401": + description: Not Authorized + "403": + description: Not Allowed + security: + - SecurityScheme: [] components: schemas: AdditionalInformationsDto: @@ -2062,6 +2216,37 @@ components: $ref: "#/components/schemas/LocalDateTime" updatedAt: $ref: "#/components/schemas/LocalDateTime" + OnboardingResponseV1: + type: object + properties: + id: + type: string + productId: + type: string + workflowType: + type: string + institution: + $ref: "#/components/schemas/InstitutionResponse" + pricingPlan: + type: string + users: + type: array + items: + $ref: "#/components/schemas/UserOnboardingResponseV1" + billing: + $ref: "#/components/schemas/BillingResponse" + status: + type: string + additionalInformations: + $ref: "#/components/schemas/AdditionalInformationsDto" + userRequestUid: + type: string + isAggregator: + type: boolean + createdAt: + $ref: "#/components/schemas/LocalDateTime" + updatedAt: + $ref: "#/components/schemas/LocalDateTime" OnboardingStatus: enum: - REQUEST @@ -2131,6 +2316,15 @@ components: - PDND_INFOCAMERE type: string PartyRole: + enum: + - MANAGER + - DELEGATE + - SUB_DELEGATE + - OPERATOR + - ADMIN_EA + - ADMIN_EA_IO + type: string + PartyRoleV1: enum: - MANAGER - DELEGATE @@ -2227,6 +2421,17 @@ components: type: string userMailUuid: type: string + UserOnboardingResponseV1: + type: object + properties: + id: + type: string + role: + $ref: "#/components/schemas/PartyRoleV1" + productRole: + type: string + userMailUuid: + type: string UserRequest: type: object properties: 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 227eb7933..fde567b18 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 @@ -1,7 +1,5 @@ package it.pagopa.selfcare.onboarding.controller; -import static it.pagopa.selfcare.onboarding.util.Utils.retrieveContractFromFormData; - import io.quarkus.security.Authenticated; import io.quarkus.security.identity.CurrentIdentityAssociation; import io.smallrye.jwt.auth.principal.DefaultJWTCallerPrincipal; @@ -9,18 +7,11 @@ import it.pagopa.selfcare.onboarding.common.OnboardingStatus; import it.pagopa.selfcare.onboarding.common.WorkflowType; import it.pagopa.selfcare.onboarding.constants.CustomError; -import it.pagopa.selfcare.onboarding.controller.request.OnboardingDefaultRequest; -import it.pagopa.selfcare.onboarding.controller.request.OnboardingImportPspRequest; -import it.pagopa.selfcare.onboarding.controller.request.OnboardingImportRequest; -import it.pagopa.selfcare.onboarding.controller.request.OnboardingPaRequest; -import it.pagopa.selfcare.onboarding.controller.request.OnboardingPgRequest; -import it.pagopa.selfcare.onboarding.controller.request.OnboardingPspRequest; -import it.pagopa.selfcare.onboarding.controller.request.OnboardingUserPgRequest; -import it.pagopa.selfcare.onboarding.controller.request.OnboardingUserRequest; -import it.pagopa.selfcare.onboarding.controller.request.ReasonRequest; +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.controller.response.OnboardingResponseV1; import it.pagopa.selfcare.onboarding.entity.Billing; import it.pagopa.selfcare.onboarding.entity.CheckManagerResponse; import it.pagopa.selfcare.onboarding.entity.Onboarding; @@ -33,24 +24,11 @@ import jakarta.inject.Inject; import jakarta.validation.Valid; import jakarta.validation.constraints.NotNull; -import jakarta.ws.rs.Consumes; -import jakarta.ws.rs.DefaultValue; -import jakarta.ws.rs.GET; -import jakarta.ws.rs.HEAD; -import jakarta.ws.rs.InternalServerErrorException; -import jakarta.ws.rs.POST; -import jakarta.ws.rs.PUT; -import jakarta.ws.rs.Path; -import jakarta.ws.rs.PathParam; -import jakarta.ws.rs.Produces; -import jakarta.ws.rs.QueryParam; +import jakarta.ws.rs.*; import jakarta.ws.rs.core.Context; import jakarta.ws.rs.core.MediaType; import jakarta.ws.rs.core.Response; import jakarta.ws.rs.core.SecurityContext; -import java.io.File; -import java.util.List; -import java.util.Objects; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.http.HttpStatus; @@ -60,6 +38,12 @@ import org.jboss.resteasy.reactive.RestForm; import org.jboss.resteasy.reactive.server.core.ResteasyReactiveRequestContext; +import java.io.File; +import java.util.List; +import java.util.Objects; + +import static it.pagopa.selfcare.onboarding.util.Utils.retrieveContractFromFormData; + @Authenticated @Path("/v1/onboarding") @Tag(name = "Onboarding Controller") @@ -191,10 +175,11 @@ public Uni onboardingPsp(@Valid OnboardingPspRequest onboard @Tag(name = "internal-v1") @Consumes(MediaType.APPLICATION_JSON) @Produces(MediaType.APPLICATION_JSON) - public Uni onboardingCompletion(@Valid OnboardingDefaultRequest onboardingRequest, @Context SecurityContext ctx) { + public Uni onboardingCompletion(@Valid OnboardingDefaultRequest onboardingRequest, @Context SecurityContext ctx) { return readUserIdFromToken(ctx) .onItem().transformToUni(userId -> onboardingService - .onboardingCompletion(fillUserId(onboardingMapper.toEntity(onboardingRequest), userId), onboardingRequest.getUsers())); + .onboardingCompletion(fillUserId(onboardingMapper.toEntity(onboardingRequest), userId), onboardingRequest.getUsers()) + .map(onboardingMapper::toOnboardingResponseV1)); } @Operation( @@ -207,10 +192,11 @@ public Uni onboardingCompletion(@Valid OnboardingDefaultRequ @Tag(name = "internal-v1") @Consumes(MediaType.APPLICATION_JSON) @Produces(MediaType.APPLICATION_JSON) - public Uni onboardingPaCompletion(@Valid OnboardingPaRequest onboardingRequest, @Context SecurityContext ctx) { + public Uni onboardingPaCompletion(@Valid OnboardingPaRequest onboardingRequest, @Context SecurityContext ctx) { return readUserIdFromToken(ctx) .onItem().transformToUni(userId -> onboardingService - .onboardingCompletion(fillUserId(onboardingMapper.toEntity(onboardingRequest), userId), onboardingRequest.getUsers())); + .onboardingCompletion(fillUserId(onboardingMapper.toEntity(onboardingRequest), userId), onboardingRequest.getUsers()) + .map(onboardingMapper::toOnboardingResponseV1)); } @Operation( @@ -251,10 +237,11 @@ public Uni onboardingPspImport(@Valid OnboardingImportPspReq @Tag(name = "internal-v1") @Consumes(MediaType.APPLICATION_JSON) @Produces(MediaType.APPLICATION_JSON) - public Uni onboardingPspCompletion(@Valid OnboardingPspRequest onboardingRequest, @Context SecurityContext ctx) { + public Uni onboardingPspCompletion(@Valid OnboardingPspRequest onboardingRequest, @Context SecurityContext ctx) { return readUserIdFromToken(ctx) .onItem().transformToUni(userId -> onboardingService - .onboardingCompletion(fillUserId(onboardingMapper.toEntity(onboardingRequest), userId), onboardingRequest.getUsers())); + .onboardingCompletion(fillUserId(onboardingMapper.toEntity(onboardingRequest), userId), onboardingRequest.getUsers()) + .map(onboardingMapper::toOnboardingResponseV1)); } @Operation( @@ -267,10 +254,11 @@ public Uni onboardingPspCompletion(@Valid OnboardingPspReque @Tag(name = "internal-pnpg") @Consumes(MediaType.APPLICATION_JSON) @Produces(MediaType.APPLICATION_JSON) - public Uni onboardingPgCompletion(@Valid OnboardingPgRequest onboardingRequest, @Context SecurityContext ctx) { + public Uni onboardingPgCompletion(@Valid OnboardingPgRequest onboardingRequest, @Context SecurityContext ctx) { return readUserIdFromToken(ctx) .onItem().transformToUni(userId -> onboardingService - .onboardingPgCompletion(fillUserId(onboardingMapper.toEntity(onboardingRequest), userId), onboardingRequest.getUsers())); + .onboardingPgCompletion(fillUserId(onboardingMapper.toEntity(onboardingRequest), userId), onboardingRequest.getUsers()) + .map(onboardingMapper::toOnboardingResponseV1)); } @Operation( @@ -461,12 +449,16 @@ public Uni getOnboardingPending(@PathParam(value = "onboardingId" @Tag(name = "Onboarding") @Produces(MediaType.APPLICATION_JSON) @Path("/institutionOnboardings") - public Uni> getOnboardingPending(@QueryParam(value = "taxCode") String taxCode, + public Uni> getOnboardingPending(@QueryParam(value = "taxCode") String taxCode, @QueryParam(value = "subunitCode") String subunitCode, @QueryParam(value = "origin") String origin, @QueryParam(value = "originId") String originId, @QueryParam(value = "status") OnboardingStatus status) { - return onboardingService.institutionOnboardings(taxCode, subunitCode, origin, originId, status); + return onboardingService.institutionOnboardings(taxCode, subunitCode, origin, originId, status) + .map(onboardingResponses -> onboardingResponses.stream() + .map(onboardingMapper::toOnboardingResponseV1) + .toList() + ); } private Onboarding fillUserId(Onboarding onboarding, String userRequestUid) { diff --git a/apps/onboarding-ms/src/main/java/it/pagopa/selfcare/onboarding/controller/OnboardingV2Controller.java b/apps/onboarding-ms/src/main/java/it/pagopa/selfcare/onboarding/controller/OnboardingV2Controller.java new file mode 100644 index 000000000..e89b0419e --- /dev/null +++ b/apps/onboarding-ms/src/main/java/it/pagopa/selfcare/onboarding/controller/OnboardingV2Controller.java @@ -0,0 +1,156 @@ +package it.pagopa.selfcare.onboarding.controller; + +import io.quarkus.security.Authenticated; +import io.quarkus.security.identity.CurrentIdentityAssociation; +import io.smallrye.jwt.auth.principal.DefaultJWTCallerPrincipal; +import io.smallrye.mutiny.Uni; +import it.pagopa.selfcare.onboarding.common.OnboardingStatus; +import it.pagopa.selfcare.onboarding.controller.request.OnboardingDefaultRequest; +import it.pagopa.selfcare.onboarding.controller.request.OnboardingPaRequest; +import it.pagopa.selfcare.onboarding.controller.request.OnboardingPgRequest; +import it.pagopa.selfcare.onboarding.controller.request.OnboardingPspRequest; +import it.pagopa.selfcare.onboarding.controller.response.OnboardingResponse; +import it.pagopa.selfcare.onboarding.entity.Onboarding; +import it.pagopa.selfcare.onboarding.mapper.OnboardingMapper; +import it.pagopa.selfcare.onboarding.service.OnboardingService; +import jakarta.inject.Inject; +import jakarta.validation.Valid; +import jakarta.ws.rs.*; +import jakarta.ws.rs.core.Context; +import jakarta.ws.rs.core.MediaType; +import jakarta.ws.rs.core.SecurityContext; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.eclipse.microprofile.openapi.annotations.Operation; +import org.eclipse.microprofile.openapi.annotations.extensions.Extension; +import org.eclipse.microprofile.openapi.annotations.tags.Tag; + +import java.util.List; + +@Authenticated +@Path("/v2/onboarding") +@Tag(name = "Onboarding Controller") +@AllArgsConstructor +@Slf4j +public class OnboardingV2Controller { + + private final OnboardingService onboardingService; + private final OnboardingMapper onboardingMapper; + @Inject + CurrentIdentityAssociation currentIdentityAssociation; + + @Operation( + summary = "Complete onboarding request and set status to COMPLETED.", + description = "Perform onboarding as /onboarding but completing the onboarding request to COMPLETED phase.", + operationId = "onboardingCompletionV2" + ) + @Path("/completion") + @POST + @Tag(name = "Onboarding Controller") + @Tag(name = "internal-v1") + @Consumes(MediaType.APPLICATION_JSON) + @Produces(MediaType.APPLICATION_JSON) + public Uni onboardingCompletion(@Valid OnboardingDefaultRequest onboardingRequest, @Context SecurityContext ctx) { + return readUserIdFromToken(ctx) + .onItem().transformToUni(userId -> onboardingService + .onboardingCompletion(fillUserId(onboardingMapper.toEntity(onboardingRequest), userId), onboardingRequest.getUsers())); + } + + @Operation( + summary = "Complete PA onboarding request and set status to COMPLETED.", + description = + "Perform onboarding as /onboarding/pa but completing the onboarding request to COMPLETED phase.", + operationId = "onboardingPaCompletionV2" + ) + @POST + @Path("/pa/completion") + @Tag(name = "Onboarding Controller") + @Tag(name = "internal-v1") + @Consumes(MediaType.APPLICATION_JSON) + @Produces(MediaType.APPLICATION_JSON) + public Uni onboardingPaCompletion(@Valid OnboardingPaRequest onboardingRequest, @Context SecurityContext ctx) { + return readUserIdFromToken(ctx) + .onItem().transformToUni(userId -> onboardingService + .onboardingCompletion(fillUserId(onboardingMapper.toEntity(onboardingRequest), userId), onboardingRequest.getUsers())); + } + + + @Operation( + summary = "Complete PSP onboarding request and set status to COMPLETED.", + description = + "Perform onboarding as /onboarding/psp but completing the onboarding request to COMPLETED phase.", + operationId = "onboardingPspCompletionV2" + ) + @POST + @Path("/psp/completion") + @Tag(name = "Onboarding Controller") + @Tag(name = "internal-v1") + @Consumes(MediaType.APPLICATION_JSON) + @Produces(MediaType.APPLICATION_JSON) + public Uni onboardingPspCompletion(@Valid OnboardingPspRequest onboardingRequest, @Context SecurityContext ctx) { + return readUserIdFromToken(ctx) + .onItem().transformToUni(userId -> onboardingService + .onboardingCompletion(fillUserId(onboardingMapper.toEntity(onboardingRequest), userId), onboardingRequest.getUsers())); + } + + @Operation( + summary = "Complete PG onboarding request on PNPG domain and set status to COMPLETED.", + description = "Perform onboarding as /onboarding/psp but completing the onboarding request to COMPLETED phase.", + operationId = "onboardingPgCompletionV2" + ) + @POST + @Path("/pg/completion") + @Tag(name = "Onboarding Controller") + @Tag(name = "internal-pnpg") + @Consumes(MediaType.APPLICATION_JSON) + @Produces(MediaType.APPLICATION_JSON) + public Uni onboardingPgCompletion(@Valid OnboardingPgRequest onboardingRequest, @Context SecurityContext ctx) { + return readUserIdFromToken(ctx) + .onItem().transformToUni(userId -> onboardingService + .onboardingPgCompletion(fillUserId(onboardingMapper.toEntity(onboardingRequest), userId), onboardingRequest.getUsers())); + } + + + private Uni readUserIdFromToken(SecurityContext ctx) { + return currentIdentityAssociation.getDeferredIdentity() + .onItem().transformToUni(identity -> { + if (ctx.getUserPrincipal() == null || !ctx.getUserPrincipal().getName().equals(identity.getPrincipal().getName())) { + return Uni.createFrom().failure(new InternalServerErrorException("Principal and JsonWebToken names do not match")); + } + + if (identity.getPrincipal() instanceof DefaultJWTCallerPrincipal jwtCallerPrincipal) { + String uid = jwtCallerPrincipal.getClaim("uid"); + return Uni.createFrom().item(uid); + } + + return Uni.createFrom().nullItem(); + }); + } + + + @Operation( + summary = "Get onboardings by institution taxCode, subunitCode, origin, or originId.", + description = "Returns onboardings record by institution taxCode/subunitCode/origin/originId", + operationId = "onboardingInstitutionUsingGETV2", + extensions = @Extension(name = "x-legacy-api", value = "true") + ) + @GET + @Tag(name = "support") + @Tag(name = "internal-v1") + @Tag(name = "Onboarding") + @Produces(MediaType.APPLICATION_JSON) + @Path("/institutionOnboardings") + public Uni> getOnboardingPending(@QueryParam(value = "taxCode") String taxCode, + @QueryParam(value = "subunitCode") String subunitCode, + @QueryParam(value = "origin") String origin, + @QueryParam(value = "originId") String originId, + @QueryParam(value = "status") OnboardingStatus status) { + return onboardingService.institutionOnboardings(taxCode, subunitCode, origin, originId, status); + } + + private Onboarding fillUserId(Onboarding onboarding, String userRequestUid) { + onboarding.setUserRequestUid(userRequestUid); + return onboarding; + } + +} diff --git a/apps/onboarding-ms/src/main/java/it/pagopa/selfcare/onboarding/controller/response/OnboardingResponseV1.java b/apps/onboarding-ms/src/main/java/it/pagopa/selfcare/onboarding/controller/response/OnboardingResponseV1.java new file mode 100644 index 000000000..7ea7e794e --- /dev/null +++ b/apps/onboarding-ms/src/main/java/it/pagopa/selfcare/onboarding/controller/response/OnboardingResponseV1.java @@ -0,0 +1,26 @@ +package it.pagopa.selfcare.onboarding.controller.response; + +import it.pagopa.selfcare.onboarding.controller.request.AdditionalInformationsDto; +import lombok.Data; + +import java.time.LocalDateTime; +import java.util.List; + +@Data +public class OnboardingResponseV1 { + + private String id; + private String productId; + private String workflowType; + private InstitutionResponse institution; + private String pricingPlan; + private List users; + private BillingResponse billing; + private String status; + private AdditionalInformationsDto additionalInformations; + private String userRequestUid; + private Boolean isAggregator; + private LocalDateTime createdAt; + private LocalDateTime updatedAt; + +} diff --git a/apps/onboarding-ms/src/main/java/it/pagopa/selfcare/onboarding/controller/response/PartyRoleV1.java b/apps/onboarding-ms/src/main/java/it/pagopa/selfcare/onboarding/controller/response/PartyRoleV1.java new file mode 100644 index 000000000..fe3237e06 --- /dev/null +++ b/apps/onboarding-ms/src/main/java/it/pagopa/selfcare/onboarding/controller/response/PartyRoleV1.java @@ -0,0 +1,9 @@ +package it.pagopa.selfcare.onboarding.controller.response; + +public enum PartyRoleV1 { + MANAGER, + DELEGATE, + SUB_DELEGATE, + OPERATOR, + ADMIN_EA +} diff --git a/apps/onboarding-ms/src/main/java/it/pagopa/selfcare/onboarding/controller/response/UserOnboardingResponseV1.java b/apps/onboarding-ms/src/main/java/it/pagopa/selfcare/onboarding/controller/response/UserOnboardingResponseV1.java new file mode 100644 index 000000000..c9516cb8c --- /dev/null +++ b/apps/onboarding-ms/src/main/java/it/pagopa/selfcare/onboarding/controller/response/UserOnboardingResponseV1.java @@ -0,0 +1,12 @@ +package it.pagopa.selfcare.onboarding.controller.response; + +import lombok.Data; + +@Data +public class UserOnboardingResponseV1 { + + private String id; + private PartyRoleV1 role; + private String productRole; + private String userMailUuid; +} diff --git a/apps/onboarding-ms/src/main/java/it/pagopa/selfcare/onboarding/mapper/OnboardingMapper.java b/apps/onboarding-ms/src/main/java/it/pagopa/selfcare/onboarding/mapper/OnboardingMapper.java index 099a83c4f..9d01f249d 100644 --- a/apps/onboarding-ms/src/main/java/it/pagopa/selfcare/onboarding/mapper/OnboardingMapper.java +++ b/apps/onboarding-ms/src/main/java/it/pagopa/selfcare/onboarding/mapper/OnboardingMapper.java @@ -2,37 +2,23 @@ import it.pagopa.selfcare.onboarding.common.OnboardingStatus; import it.pagopa.selfcare.onboarding.common.WorkflowType; -import it.pagopa.selfcare.onboarding.controller.request.OnboardingDefaultRequest; -import it.pagopa.selfcare.onboarding.controller.request.OnboardingImportContract; -import it.pagopa.selfcare.onboarding.controller.request.OnboardingImportPspRequest; -import it.pagopa.selfcare.onboarding.controller.request.OnboardingImportRequest; -import it.pagopa.selfcare.onboarding.controller.request.OnboardingPaRequest; -import it.pagopa.selfcare.onboarding.controller.request.OnboardingPgRequest; -import it.pagopa.selfcare.onboarding.controller.request.OnboardingPspRequest; -import it.pagopa.selfcare.onboarding.controller.request.OnboardingSaRequest; -import it.pagopa.selfcare.onboarding.controller.request.OnboardingUserPgRequest; -import it.pagopa.selfcare.onboarding.controller.request.OnboardingUserRequest; -import it.pagopa.selfcare.onboarding.controller.response.OnboardingGet; -import it.pagopa.selfcare.onboarding.controller.response.OnboardingResponse; +import it.pagopa.selfcare.onboarding.controller.request.*; +import it.pagopa.selfcare.onboarding.controller.response.*; import it.pagopa.selfcare.onboarding.entity.Onboarding; import it.pagopa.selfcare.onboarding.entity.User; -import it.pagopa.selfcare.onboarding.model.Aggregate; -import it.pagopa.selfcare.onboarding.model.AggregateUser; -import it.pagopa.selfcare.onboarding.model.CsvAggregateAppIo; -import it.pagopa.selfcare.onboarding.model.CsvAggregatePagoPa; -import it.pagopa.selfcare.onboarding.model.CsvAggregateSend; +import it.pagopa.selfcare.onboarding.model.*; +import org.mapstruct.Context; +import org.mapstruct.Mapper; +import org.mapstruct.Mapping; +import org.mapstruct.Named; +import org.openapi.quarkus.onboarding_functions_json.model.PartyRole; + import java.time.LocalDateTime; import java.time.OffsetDateTime; import java.util.Collections; import java.util.List; import java.util.Objects; import java.util.UUID; -import java.util.stream.Collectors; -import org.mapstruct.Context; -import org.mapstruct.Mapper; -import org.mapstruct.Mapping; -import org.mapstruct.Named; -import org.openapi.quarkus.onboarding_functions_json.model.PartyRole; @Mapper(componentModel = "cdi", imports = { UUID.class, WorkflowType.class, OnboardingStatus.class }) public interface OnboardingMapper { @@ -48,6 +34,36 @@ public interface OnboardingMapper { @Mapping(target = "institution.gpuData", source = "gpuData") @Mapping(target = "institution", source = "institution") Onboarding toEntity(OnboardingDefaultRequest request); + + @Mapping(target = "users", source = "users", qualifiedByName = "toUsersList") + OnboardingResponseV1 toOnboardingResponseV1(OnboardingResponse request); + + @Named("toUsersList") + default List toUsersList(List list) { + if(Objects.isNull(list) || list.isEmpty()) { + return Collections.emptyList(); + } + return list.stream() + .map(this::toUserOnboardingResponseV1) + .toList(); + } + + + @Mapping(target = "role", source = "role", qualifiedByName = "toPartyRoleV1") + UserOnboardingResponseV1 toUserOnboardingResponseV1(UserOnboardingResponse userOnboardingResponse); + + @Named("toPartyRoleV1") + default PartyRoleV1 toPartyRoleV1(PartyRole partyRole) { + return switch (partyRole) { + case MANAGER -> PartyRoleV1.MANAGER; + case DELEGATE -> PartyRoleV1.DELEGATE; + case SUB_DELEGATE -> PartyRoleV1.SUB_DELEGATE; + case OPERATOR -> PartyRoleV1.OPERATOR; + case ADMIN_EA -> PartyRoleV1.ADMIN_EA; + default -> null; + }; + } + @Mapping(target = "id", expression = "java(UUID.randomUUID().toString())") @Mapping(target = "billing.recipientCode", source = "billing.recipientCode", qualifiedByName = "toUpperCase") @Mapping(target = "status", expression = "java((newStatus != null) ? newStatus : null)") @@ -157,7 +173,7 @@ default List mapCsvSendAggregatesToAggregates(List } return csvAggregateSendList.stream() .map(this::csvToAggregateSend) - .collect(Collectors.toList()); + .toList(); } default List mapCsvAppIoAggregatesToAggregates(List csvAggregateAppIoList) { @@ -166,7 +182,7 @@ default List mapCsvAppIoAggregatesToAggregates(List mapUsers(CsvAggregateSend csvAggregateSend) { 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 3d1cbfaba..9f3748265 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 @@ -1,18 +1,5 @@ package it.pagopa.selfcare.onboarding.service; -import static it.pagopa.selfcare.onboarding.common.ProductId.PROD_INTEROP; -import static it.pagopa.selfcare.onboarding.common.ProductId.PROD_PAGOPA; -import static it.pagopa.selfcare.onboarding.constants.CustomError.DEFAULT_ERROR; -import static it.pagopa.selfcare.onboarding.constants.CustomError.INSTITUTION_NOT_FOUND; -import static it.pagopa.selfcare.onboarding.constants.CustomError.USERS_UPDATE_NOT_ALLOWED; -import static it.pagopa.selfcare.onboarding.util.ErrorMessage.GENERIC_ERROR; -import static it.pagopa.selfcare.onboarding.util.ErrorMessage.INVALID_REFERENCE_ONBORADING; -import static it.pagopa.selfcare.onboarding.util.ErrorMessage.ONBOARDING_EXPIRED; -import static it.pagopa.selfcare.onboarding.util.ErrorMessage.ONBOARDING_NOT_TO_BE_VALIDATED; -import static it.pagopa.selfcare.onboarding.util.ErrorMessage.PRODUCT_ALREADY_ONBOARDED; -import static it.pagopa.selfcare.onboarding.util.ErrorMessage.PRODUCT_NOT_ONBOARDED; -import static it.pagopa.selfcare.product.utils.ProductUtils.validRoles; - import io.quarkus.logging.Log; import io.quarkus.mongodb.panache.common.reactive.Panache; import io.quarkus.mongodb.panache.reactive.ReactivePanacheQuery; @@ -22,12 +9,7 @@ import io.smallrye.mutiny.tuples.Tuple2; import io.smallrye.mutiny.unchecked.Unchecked; import it.pagopa.selfcare.azurestorage.AzureBlobClient; -import it.pagopa.selfcare.onboarding.common.InstitutionType; -import it.pagopa.selfcare.onboarding.common.OnboardingStatus; -import it.pagopa.selfcare.onboarding.common.Origin; -import it.pagopa.selfcare.onboarding.common.PartyRole; -import it.pagopa.selfcare.onboarding.common.TokenType; -import it.pagopa.selfcare.onboarding.common.WorkflowType; +import it.pagopa.selfcare.onboarding.common.*; import it.pagopa.selfcare.onboarding.constants.CustomError; import it.pagopa.selfcare.onboarding.controller.request.AggregateInstitutionRequest; import it.pagopa.selfcare.onboarding.controller.request.OnboardingImportContract; @@ -37,11 +19,7 @@ import it.pagopa.selfcare.onboarding.controller.response.OnboardingGetResponse; import it.pagopa.selfcare.onboarding.controller.response.OnboardingResponse; import it.pagopa.selfcare.onboarding.controller.response.UserResponse; -import it.pagopa.selfcare.onboarding.entity.CheckManagerResponse; -import it.pagopa.selfcare.onboarding.entity.Institution; -import it.pagopa.selfcare.onboarding.entity.Onboarding; -import it.pagopa.selfcare.onboarding.entity.Token; -import it.pagopa.selfcare.onboarding.entity.User; +import it.pagopa.selfcare.onboarding.entity.*; import it.pagopa.selfcare.onboarding.entity.registry.RegistryManager; import it.pagopa.selfcare.onboarding.entity.registry.RegistryResourceFactory; import it.pagopa.selfcare.onboarding.exception.InvalidRequestException; @@ -66,22 +44,6 @@ import jakarta.enterprise.context.ApplicationScoped; import jakarta.inject.Inject; import jakarta.ws.rs.WebApplicationException; - -import java.io.IOException; -import java.nio.file.Files; -import java.time.LocalDateTime; -import java.time.OffsetDateTime; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.Map; -import java.util.Objects; -import java.util.Optional; -import java.util.UUID; -import java.util.function.Function; -import java.util.function.Supplier; -import java.util.stream.Collectors; - import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.bson.Document; @@ -103,12 +65,22 @@ import org.openapi.quarkus.party_registry_proxy_json.model.GetInstitutionsByLegalDto; import org.openapi.quarkus.party_registry_proxy_json.model.GetInstitutionsByLegalFilterDto; import org.openapi.quarkus.user_registry_json.api.UserApi; -import org.openapi.quarkus.user_registry_json.model.CertifiableFieldResourceOfstring; -import org.openapi.quarkus.user_registry_json.model.MutableUserFieldsDto; -import org.openapi.quarkus.user_registry_json.model.SaveUserDto; -import org.openapi.quarkus.user_registry_json.model.UserResource; -import org.openapi.quarkus.user_registry_json.model.UserSearchDto; -import org.openapi.quarkus.user_registry_json.model.WorkContactResource; +import org.openapi.quarkus.user_registry_json.model.*; + +import java.io.IOException; +import java.nio.file.Files; +import java.time.LocalDateTime; +import java.time.OffsetDateTime; +import java.util.*; +import java.util.function.Function; +import java.util.function.Supplier; +import java.util.stream.Collectors; + +import static it.pagopa.selfcare.onboarding.common.ProductId.PROD_INTEROP; +import static it.pagopa.selfcare.onboarding.common.ProductId.PROD_PAGOPA; +import static it.pagopa.selfcare.onboarding.constants.CustomError.*; +import static it.pagopa.selfcare.onboarding.util.ErrorMessage.*; +import static it.pagopa.selfcare.product.utils.ProductUtils.validRoles; @ApplicationScoped public class OnboardingServiceDefault implements OnboardingService { @@ -1642,13 +1614,13 @@ private Uni getInstitutionFromUserRequest(OnboardingUserReq if (Objects.nonNull(request.getTaxCode()) && Objects.nonNull(request.getSubunitCode())) { responseUni = institutionApi.getInstitutionsUsingGET( - request.getTaxCode(), request.getSubunitCode(), null, null); + request.getTaxCode(), request.getSubunitCode(), null, null, null); } else if (Objects.nonNull(request.getTaxCode())) { - responseUni = institutionApi.getInstitutionsUsingGET(request.getTaxCode(), null, null, null); + responseUni = institutionApi.getInstitutionsUsingGET(request.getTaxCode(), null, null, null, null); } else { responseUni = institutionApi.getInstitutionsUsingGET( - null, null, request.getOrigin(), request.getOriginId()); + null, null, request.getOrigin(), request.getOriginId(), null); } return responseUni .onFailure(WebApplicationException.class) diff --git a/apps/onboarding-ms/src/main/openapi/core.json b/apps/onboarding-ms/src/main/openapi/core.json index 6a7e35ae3..530862aeb 100644 --- a/apps/onboarding-ms/src/main/openapi/core.json +++ b/apps/onboarding-ms/src/main/openapi/core.json @@ -1,7 +1,7 @@ { "openapi" : "3.0.3", "info" : { - "title" : "selc-ms-core", + "title" : "institution-ms", "version" : "1.0-SNAPSHOT" }, "servers" : [ { @@ -33,9 +33,6 @@ }, { "name" : "Onboarding", "description" : "Onboarding Controller" - }, { - "name" : "kafka", - "description" : "Queue Notification Controller" } ], "paths" : { "/delegations" : { @@ -89,16 +86,6 @@ "schema" : { "type" : "string" } - }, { - "name" : "mode", - "in" : "query", - "description" : "Mode (full or normal) to retreieve institution's delegations", - "required" : false, - "style" : "form", - "schema" : { - "type" : "string", - "enum" : [ "FULL", "NORMAL" ] - } }, { "name" : "order", "in" : "query", @@ -232,7 +219,7 @@ }, "/delegations/from-taxcode" : { "post" : { - "tags" : [ "Delegation" ], + "tags" : [ "Delegation", "internal-v1" ], "summary" : "Create an association between institution and technical partner using taxCode for both instead of internal id. It is useful when we don't know institution's internal id.", "description" : "Create an association between institution and technical partner using taxCode for both instead of internal id. It is useful when we don't know institution's internal id.", "operationId" : "createDelegationFromInstitutionsTaxCodeUsingPOST", @@ -348,22 +335,87 @@ } ] } }, - "/external/institutions" : { + "/v2/delegations" : { "get" : { - "tags" : [ "External" ], - "summary" : "Gets the corresponding institution using internal institution id", - "description" : "Gets the corresponding institution using internal institution id", - "operationId" : "retrieveInstitutionByIdsUsingGET", + "tags" : [ "Delegation" ], + "summary" : "Retrieve institution's delegations with pagination", + "description" : "Retrieve institution's delegations with pagination", + "operationId" : "getDelegationsUsingGET_1", "parameters" : [ { - "name" : "ids", + "name" : "institutionId", "in" : "query", - "description" : "List of Institution to onboard", - "required" : true, + "description" : "The internal identifier of the institution", + "required" : false, + "style" : "form", + "schema" : { + "type" : "string" + } + }, { + "name" : "brokerId", + "in" : "query", + "description" : "The internal identifier of the institution", + "required" : false, + "style" : "form", + "schema" : { + "type" : "string" + } + }, { + "name" : "productId", + "in" : "query", + "description" : "Product's unique identifier", + "required" : false, + "style" : "form", + "schema" : { + "type" : "string" + } + }, { + "name" : "search", + "in" : "query", + "description" : "Description ente", + "required" : false, + "style" : "form", + "schema" : { + "type" : "string" + } + }, { + "name" : "taxCode", + "in" : "query", + "description" : "Institution's tax code", + "required" : false, "style" : "form", - "explode" : true, "schema" : { "type" : "string" } + }, { + "name" : "order", + "in" : "query", + "description" : "Order to show response NONE, ASC, DESC", + "required" : false, + "style" : "form", + "schema" : { + "type" : "string", + "enum" : [ "ASC", "DESC", "NONE" ] + } + }, { + "name" : "page", + "in" : "query", + "description" : "page", + "required" : false, + "style" : "form", + "schema" : { + "type" : "integer", + "format" : "int32" + } + }, { + "name" : "size", + "in" : "query", + "description" : "size", + "required" : false, + "style" : "form", + "schema" : { + "type" : "integer", + "format" : "int32" + } } ], "responses" : { "200" : { @@ -371,10 +423,7 @@ "content" : { "application/json" : { "schema" : { - "type" : "array", - "items" : { - "$ref" : "#/components/schemas/InstitutionResponse" - } + "$ref" : "#/components/schemas/DelegationWithPaginationResponse" } } } @@ -405,28 +454,33 @@ } ] } }, - "/external/institutions/pn-pg" : { - "post" : { + "/external/institutions" : { + "get" : { "tags" : [ "External" ], - "summary" : "create an institution (PG) using external institution id fetching data from info-camere", - "description" : "create an institution (PG) using external institution id fetching data from info-camere", - "operationId" : "createPnPgInstitutionUsingPOST", - "requestBody" : { - "content" : { - "application/json" : { - "schema" : { - "$ref" : "#/components/schemas/CreatePnPgInstitutionRequest" - } - } + "summary" : "Gets the corresponding institution using internal institution id", + "description" : "Gets the corresponding institution using internal institution id", + "operationId" : "retrieveInstitutionByIdsUsingGET", + "parameters" : [ { + "name" : "ids", + "in" : "query", + "description" : "List of Institution to onboard", + "required" : true, + "style" : "form", + "explode" : true, + "schema" : { + "type" : "string" } - }, + } ], "responses" : { - "201" : { - "description" : "Created", + "200" : { + "description" : "OK", "content" : { "application/json" : { "schema" : { - "$ref" : "#/components/schemas/InstitutionPnPgResponse" + "type" : "array", + "items" : { + "$ref" : "#/components/schemas/InstitutionResponse" + } } } } @@ -450,16 +504,6 @@ } } } - }, - "409" : { - "description" : "Conflict", - "content" : { - "application/problem+json" : { - "schema" : { - "$ref" : "#/components/schemas/Problem" - } - } - } } }, "security" : [ { @@ -704,7 +748,7 @@ }, "/institutions" : { "get" : { - "tags" : [ "Institution", "external-v2", "support" ], + "tags" : [ "Institution", "external-v2", "support", "support-pnpg" ], "summary" : "Gets institutions filtering by taxCode and/or subunitCode", "description" : "Gets institutions filtering by taxCode and/or subunitCode", "operationId" : "getInstitutionsUsingGET", @@ -744,6 +788,15 @@ "schema" : { "type" : "string" } + }, { + "name" : "productId", + "in" : "query", + "description" : "productId", + "required" : false, + "style" : "form", + "schema" : { + "type" : "string" + } } ], "responses" : { "200" : { @@ -1504,7 +1557,7 @@ }, "/institutions/{id}" : { "get" : { - "tags" : [ "Institution", "external-v2" ], + "tags" : [ "Institution", "external-pnpg", "external-v2", "internal-v1" ], "summary" : "Gets the corresponding institution using internal institution id", "description" : "Gets the corresponding institution using internal institution id", "operationId" : "retrieveInstitutionByIdUsingGET", @@ -1707,6 +1760,16 @@ } }, "responses" : { + "200" : { + "description" : "User already exists an onboarding in status ACTIVE or SUSPENDED with that productId", + "content" : { + "application/json" : { + "schema" : { + "$ref" : "#/components/schemas/InstitutionResponse" + } + } + } + }, "201" : { "description" : "Created", "content" : { @@ -1817,9 +1880,74 @@ } ] } }, - "/institutions/{institutionId}/createdAt" : { - "put" : { + "/institutions/{id}/products/{productId}" : { + "delete" : { "tags" : [ "Institution" ], + "summary" : "The service set DELETE status on onboarding association with the product and institutionId", + "description" : "The service set DELETE status on onboarding association with the product and institutionId", + "operationId" : "deleteOnboardedInstitutionUsingDELETE", + "parameters" : [ { + "name" : "productId", + "in" : "path", + "description" : "productId", + "required" : true, + "style" : "simple", + "schema" : { + "type" : "string" + } + }, { + "name" : "id", + "in" : "path", + "description" : "id", + "required" : true, + "style" : "simple", + "schema" : { + "type" : "string" + } + } ], + "responses" : { + "204" : { + "description" : "No Content" + }, + "400" : { + "description" : "Bad Request", + "content" : { + "application/problem+json" : { + "schema" : { + "$ref" : "#/components/schemas/Problem" + } + } + } + }, + "404" : { + "description" : "Not Found", + "content" : { + "application/problem+json" : { + "schema" : { + "$ref" : "#/components/schemas/Problem" + } + } + } + }, + "409" : { + "description" : "Conflict", + "content" : { + "application/problem+json" : { + "schema" : { + "$ref" : "#/components/schemas/Problem" + } + } + } + } + }, + "security" : [ { + "bearerAuth" : [ "global" ] + } ] + } + }, + "/institutions/{institutionId}/created-at" : { + "put" : { + "tags" : [ "Institution", "internal-v1" ], "summary" : "The service updates the createdAt field for the institution-product pair", "description" : "The service updates the createdAt field for the institution-product pair", "operationId" : "updateCreatedAtUsingPUT", @@ -1967,7 +2095,7 @@ "style" : "simple", "schema" : { "type" : "string", - "enum" : [ "AS", "CON", "GSP", "PA", "PG", "PSP", "PT", "REC", "SA", "SCP", "PRV", "GPU" ] + "enum" : [ "AS", "CON", "GPU", "GSP", "PA", "PG", "PRV", "PSP", "PT", "REC", "SA", "SCP" ] } } ], "responses" : { @@ -2281,71 +2409,6 @@ "bearerAuth" : [ "global" ] } ] } - }, - "/notification-event/contracts" : { - "put" : { - "tags" : [ "kafka" ], - "summary" : "resendContractsByInstitutionIdAndTokenId", - "description" : "Function to send a specific onboarding using institutionId and tokenId ", - "operationId" : "resendContractsByInstitutionIdAndTokenIdUsingPUT", - "parameters" : [ { - "name" : "tokenId", - "in" : "query", - "description" : "tokenId", - "required" : true, - "style" : "form", - "schema" : { - "type" : "string" - } - }, { - "name" : "institutionId", - "in" : "query", - "description" : "institutionId", - "required" : true, - "style" : "form", - "schema" : { - "type" : "string" - } - } ], - "responses" : { - "200" : { - "description" : "OK" - }, - "400" : { - "description" : "Bad Request", - "content" : { - "application/problem+json" : { - "schema" : { - "$ref" : "#/components/schemas/Problem" - } - } - } - }, - "403" : { - "description" : "Forbidden", - "content" : { - "application/problem+json" : { - "schema" : { - "$ref" : "#/components/schemas/Problem" - } - } - } - }, - "404" : { - "description" : "Not Found", - "content" : { - "application/problem+json" : { - "schema" : { - "$ref" : "#/components/schemas/Problem" - } - } - } - } - }, - "security" : [ { - "bearerAuth" : [ "global" ] - } ] - } } }, "components" : { @@ -2423,6 +2486,9 @@ "recipientCode" : { "type" : "string" }, + "taxCodeInvoicing" : { + "type" : "string" + }, "vatNumber" : { "type" : "string" } @@ -2438,6 +2504,9 @@ "recipientCode" : { "type" : "string" }, + "taxCodeInvoicing" : { + "type" : "string" + }, "vatNumber" : { "type" : "string" } @@ -2453,6 +2522,9 @@ "recipientCode" : { "type" : "string" }, + "taxCodeInvoicing" : { + "type" : "string" + }, "vatNumber" : { "type" : "string" } @@ -2503,8 +2575,7 @@ "type" : "string" }, "institutionType" : { - "type" : "string", - "enum" : [ "AS", "CON", "GSP", "PA", "PG", "PSP", "PT", "REC", "SA", "SCP" ] + "type" : "string" }, "origin" : { "type" : "string" @@ -2602,18 +2673,6 @@ } } }, - "CreatePnPgInstitutionRequest" : { - "title" : "CreatePnPgInstitutionRequest", - "type" : "object", - "properties" : { - "description" : { - "type" : "string" - }, - "taxId" : { - "type" : "string" - } - } - }, "CreatedAtRequest" : { "title" : "CreatedAtRequest", "type" : "object", @@ -2686,6 +2745,9 @@ "institutionFromName" : { "type" : "string" }, + "institutionFromRootName" : { + "type" : "string" + }, "institutionToName" : { "type" : "string" }, @@ -2697,7 +2759,7 @@ }, "type" : { "type" : "string", - "enum" : [ "AOO", "PT" ] + "enum" : [ "AOO", "EA", "PT" ] } } }, @@ -2728,7 +2790,7 @@ }, "type" : { "type" : "string", - "enum" : [ "AOO", "PT" ] + "enum" : [ "AOO", "EA", "PT" ] } } }, @@ -2765,8 +2827,7 @@ "type" : "string" }, "institutionType" : { - "type" : "string", - "enum" : [ "AS", "CON", "GSP", "PA", "PG", "PSP", "PT", "REC", "SA", "SCP" ] + "type" : "string" }, "productId" : { "type" : "string" @@ -2780,7 +2841,7 @@ }, "type" : { "type" : "string", - "enum" : [ "AOO", "PT" ] + "enum" : [ "AOO", "EA", "PT" ] }, "updatedAt" : { "type" : "string", @@ -2788,6 +2849,21 @@ } } }, + "DelegationWithPaginationResponse" : { + "title" : "DelegationWithPaginationResponse", + "type" : "object", + "properties" : { + "delegations" : { + "type" : "array", + "items" : { + "$ref" : "#/components/schemas/DelegationResponse" + } + }, + "pageInfo" : { + "$ref" : "#/components/schemas/PageInfo" + } + } + }, "GeoTaxonomies" : { "title" : "GeoTaxonomies", "type" : "object", @@ -2859,12 +2935,11 @@ "type" : "string" }, "institutionType" : { - "type" : "string", - "enum" : [ "AS", "CON", "GSP", "PA", "PG", "PSP", "PT", "REC", "SA", "SCP" ] + "type" : "string" }, "origin" : { "type" : "string", - "enum" : [ "ADE", "ANAC", "INFOCAMERE", "IPA", "IVASS", "MOCK", "SELC", "UNKNOWN", "PDND_INFOCAMERE" ] + "enum" : [ "ADE", "ANAC", "INFOCAMERE", "IPA", "IVASS", "MOCK", "PDND_INFOCAMERE", "SELC", "UNKNOWN" ] }, "originId" : { "type" : "string" @@ -2898,7 +2973,7 @@ }, "institutionType" : { "type" : "string", - "enum" : [ "AS", "CON", "GSP", "PA", "PG", "PSP", "PT", "REC", "SA", "SCP" ] + "enum" : [ "AS", "CON", "GPU", "GSP", "PA", "PG", "PRV", "PSP", "PT", "REC", "SA", "SCP" ] }, "subunitCode" : { "type" : "string" @@ -2907,6 +2982,12 @@ "type" : "string", "enum" : [ "AOO", "UO" ] }, + "supportEmail" : { + "type" : "string" + }, + "supportPhone" : { + "type" : "string" + }, "taxCode" : { "type" : "string" } @@ -2950,6 +3031,9 @@ "contractPath" : { "type" : "string" }, + "isAggregator" : { + "type" : "boolean" + }, "pricingPlan" : { "type" : "string" }, @@ -2958,12 +3042,6 @@ }, "tokenId" : { "type" : "string" - }, - "users" : { - "type" : "array", - "items" : { - "$ref" : "#/components/schemas/Person" - } } } }, @@ -3015,8 +3093,7 @@ "type" : "boolean" }, "institutionType" : { - "type" : "string", - "enum" : [ "AS", "CON", "GSP", "PA", "PG", "PSP", "PT", "REC", "SA", "SCP" ] + "type" : "string" }, "onboardings" : { "type" : "object", @@ -3063,15 +3140,6 @@ } } }, - "InstitutionPnPgResponse" : { - "title" : "InstitutionPnPgResponse", - "type" : "object", - "properties" : { - "id" : { - "type" : "string" - } - } - }, "InstitutionProduct" : { "title" : "InstitutionProduct", "type" : "object", @@ -3100,6 +3168,9 @@ "items" : { "type" : "string" } + }, + "parentDescription" : { + "type" : "string" } } }, @@ -3164,7 +3235,7 @@ }, "institutionType" : { "type" : "string", - "enum" : [ "AS", "CON", "GSP", "PA", "PG", "PSP", "PT", "REC", "SA", "SCP" ] + "enum" : [ "AS", "CON", "GPU", "GSP", "PA", "PG", "PRV", "PSP", "PT", "REC", "SA", "SCP" ] }, "onboarding" : { "type" : "array", @@ -3265,8 +3336,13 @@ "type" : "boolean" }, "institutionType" : { - "type" : "string", - "enum" : [ "AS", "CON", "GSP", "PA", "PG", "PSP", "PT", "REC", "SA", "SCP" ] + "type" : "string" + }, + "istatCode" : { + "type" : "string" + }, + "logo" : { + "type" : "string" }, "onboarding" : { "type" : "array", @@ -3307,9 +3383,6 @@ "taxCode" : { "type" : "string" }, - "taxCodeSfe" : { - "type" : "string" - }, "updatedAt" : { "type" : "string", "format" : "date-time" @@ -3376,11 +3449,14 @@ }, "institutionType" : { "type" : "string", - "enum" : [ "AS", "CON", "GSP", "PA", "PG", "PSP", "PT", "REC", "SA", "SCP" ] + "enum" : [ "AS", "CON", "GPU", "GSP", "PA", "PG", "PRV", "PSP", "PT", "REC", "SA", "SCP" ] }, "ivassCode" : { "type" : "string" }, + "parentDescription" : { + "type" : "string" + }, "paymentServiceProvider" : { "$ref" : "#/components/schemas/PaymentServiceProvider" }, @@ -3416,6 +3492,21 @@ } } }, + "InvalidParam" : { + "title" : "InvalidParam", + "required" : [ "name", "reason" ], + "type" : "object", + "properties" : { + "name" : { + "type" : "string", + "description" : "Invalid parameter name." + }, + "reason" : { + "type" : "string", + "description" : "Invalid parameter reason." + } + } + }, "OnboardedProductResponse" : { "title" : "OnboardedProductResponse", "type" : "object", @@ -3427,6 +3518,9 @@ "type" : "string", "format" : "date-time" }, + "isAggregator" : { + "type" : "boolean" + }, "productId" : { "type" : "string" }, @@ -3524,6 +3618,9 @@ "type" : "string", "format" : "date-time" }, + "isAggregator" : { + "type" : "boolean" + }, "pricingPlan" : { "type" : "string" }, @@ -3555,6 +3652,28 @@ } } }, + "PageInfo" : { + "title" : "PageInfo", + "type" : "object", + "properties" : { + "pageNo" : { + "type" : "integer", + "format" : "int64" + }, + "pageSize" : { + "type" : "integer", + "format" : "int64" + }, + "totalElements" : { + "type" : "integer", + "format" : "int64" + }, + "totalPages" : { + "type" : "integer", + "format" : "int64" + } + } + }, "PaymentServiceProvider" : { "title" : "PaymentServiceProvider", "type" : "object", @@ -3636,60 +3755,42 @@ } } }, - "Person" : { - "title" : "Person", + "Problem" : { + "title" : "Problem", + "required" : [ "status", "title" ], "type" : "object", "properties" : { - "email" : { - "type" : "string" - }, - "env" : { + "detail" : { "type" : "string", - "enum" : [ "COLL", "DEV", "PROD", "ROOT" ] - }, - "id" : { - "type" : "string" - }, - "name" : { - "type" : "string" - }, - "productRole" : { - "type" : "string" + "description" : "Human-readable description of this specific problem." }, - "role" : { + "instance" : { "type" : "string", - "enum" : [ "DELEGATE", "MANAGER", "OPERATOR", "SUB_DELEGATE" ] - }, - "roleLabel" : { - "type" : "string" - }, - "surname" : { - "type" : "string" + "description" : "A URI that describes where the problem occurred." }, - "taxCode" : { - "type" : "string" - } - } - }, - "Problem" : { - "title" : "Problem", - "type" : "object", - "properties" : { - "errors" : { + "invalidParams" : { "type" : "array", + "description" : "A list of invalid parameters details.", "items" : { - "$ref" : "#/components/schemas/ProblemError" + "$ref" : "#/components/schemas/InvalidParam" } }, "status" : { "type" : "integer", - "format" : "int32" + "description" : "The HTTP status code.", + "format" : "int32", + "example" : 500 + }, + "title" : { + "type" : "string", + "description" : "Short human-readable summary of the problem." + }, + "type" : { + "type" : "string", + "description" : "A URL to a page with more details regarding the problem." } - } - }, - "ProblemError" : { - "title" : "ProblemError", - "type" : "object" + }, + "description" : "A \"problem detail\" as a way to carry machine-readable details of errors (https://datatracker.ietf.org/doc/html/rfc7807)" }, "RootParentResponse" : { "title" : "RootParentResponse", @@ -3725,7 +3826,7 @@ }, "role" : { "type" : "string", - "enum" : [ "DELEGATE", "MANAGER", "OPERATOR", "SUB_DELEGATE" ] + "enum" : [ "ADMIN_EA", "ADMIN_EA_IO", "DELEGATE", "MANAGER", "OPERATOR", "SUB_DELEGATE" ] }, "roleLabel" : { "type" : "string" diff --git a/apps/onboarding-ms/src/main/openapi/onboarding_functions.json b/apps/onboarding-ms/src/main/openapi/onboarding_functions.json index b58258f4b..f88ded2b5 100644 --- a/apps/onboarding-ms/src/main/openapi/onboarding_functions.json +++ b/apps/onboarding-ms/src/main/openapi/onboarding_functions.json @@ -472,7 +472,9 @@ "MANAGER", "DELEGATE", "SUB_DELEGATE", - "OPERATOR" + "OPERATOR", + "ADMIN_EA", + "ADMIN_EA_IO" ], "type": "string" }, 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 356d7fd7b..67a381480 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 @@ -1,19 +1,5 @@ package it.pagopa.selfcare.onboarding.controller; -import static io.restassured.RestAssured.given; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertFalse; -import static org.junit.jupiter.api.Assertions.assertNotEquals; -import static org.junit.jupiter.api.Assertions.assertNotNull; -import static org.junit.jupiter.api.Assertions.assertNull; -import static org.junit.jupiter.api.Assertions.assertTrue; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.Mockito.anyString; -import static org.mockito.Mockito.eq; -import static org.mockito.Mockito.times; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; - import io.quarkus.test.InjectMock; import io.quarkus.test.common.QuarkusTestResource; import io.quarkus.test.common.http.TestHTTPEndpoint; @@ -23,34 +9,10 @@ import io.restassured.http.ContentType; import io.restassured.response.Response; import io.smallrye.mutiny.Uni; -import it.pagopa.selfcare.onboarding.common.InstitutionType; -import it.pagopa.selfcare.onboarding.common.OnboardingStatus; -import it.pagopa.selfcare.onboarding.common.Origin; -import it.pagopa.selfcare.onboarding.common.WorkflowType; +import it.pagopa.selfcare.onboarding.common.*; import it.pagopa.selfcare.onboarding.constants.CustomError; -import it.pagopa.selfcare.onboarding.controller.request.AggregateInstitutionRequest; -import it.pagopa.selfcare.onboarding.controller.request.BillingPaRequest; -import it.pagopa.selfcare.onboarding.controller.request.BillingRequest; -import it.pagopa.selfcare.onboarding.controller.request.DataProtectionOfficerRequest; -import it.pagopa.selfcare.onboarding.controller.request.InstitutionBaseRequest; -import it.pagopa.selfcare.onboarding.controller.request.InstitutionImportRequest; -import it.pagopa.selfcare.onboarding.controller.request.InstitutionPspRequest; -import it.pagopa.selfcare.onboarding.controller.request.OnboardingDefaultRequest; -import it.pagopa.selfcare.onboarding.controller.request.OnboardingImportContract; -import it.pagopa.selfcare.onboarding.controller.request.OnboardingImportPspRequest; -import it.pagopa.selfcare.onboarding.controller.request.OnboardingImportRequest; -import it.pagopa.selfcare.onboarding.controller.request.OnboardingPaRequest; -import it.pagopa.selfcare.onboarding.controller.request.OnboardingPgRequest; -import it.pagopa.selfcare.onboarding.controller.request.OnboardingPspRequest; -import it.pagopa.selfcare.onboarding.controller.request.OnboardingUserPgRequest; -import it.pagopa.selfcare.onboarding.controller.request.OnboardingUserRequest; -import it.pagopa.selfcare.onboarding.controller.request.PaymentServiceProviderRequest; -import it.pagopa.selfcare.onboarding.controller.request.ReasonRequest; -import it.pagopa.selfcare.onboarding.controller.request.UserRequest; -import it.pagopa.selfcare.onboarding.controller.response.InstitutionResponse; -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.controller.request.*; +import it.pagopa.selfcare.onboarding.controller.response.*; import it.pagopa.selfcare.onboarding.entity.Billing; import it.pagopa.selfcare.onboarding.entity.CheckManagerResponse; import it.pagopa.selfcare.onboarding.entity.Onboarding; @@ -59,19 +21,22 @@ import it.pagopa.selfcare.onboarding.model.OnboardingGetFilters; import it.pagopa.selfcare.onboarding.model.RecipientCodeStatus; import it.pagopa.selfcare.onboarding.service.OnboardingService; -import java.io.File; -import java.time.LocalDateTime; -import java.time.format.DateTimeFormatter; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.ValueSource; import org.mockito.ArgumentCaptor; import org.mockito.Mockito; +import java.io.File; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.*; + +import static io.restassured.RestAssured.given; +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.*; + @QuarkusTest @TestHTTPEndpoint(OnboardingController.class) @QuarkusTestResource(MongoTestResource.class) @@ -86,6 +51,8 @@ class OnboardingControllerTest { static final InstitutionPspRequest institutionPsp; static final OnboardingUserPgRequest onboardingUserPgValid; + static final OnboardingResponse onboardingResponse; + static final UserOnboardingResponse userResponse; @InjectMock OnboardingService onboardingService; @@ -135,6 +102,11 @@ class OnboardingControllerTest { onboardingUserPgValid.setUsers(List.of(userDTO)); onboardingUserPgValid.setOrigin(Origin.ADE); + /* response */ + userResponse = new UserOnboardingResponse(); + onboardingResponse = new OnboardingResponse(); + onboardingResponse.setUsers(List.of(userResponse)); + } @Test @@ -608,23 +580,31 @@ void onboardingCompletion() { OnboardingDefaultRequest onboardingDefaultRequest = dummyOnboardingDefaultRequest(); + onboardingResponse.setUsers(null); + Mockito.when(onboardingService.onboardingCompletion(any(), any())) - .thenReturn(Uni.createFrom().item(new OnboardingResponse())); + .thenReturn(Uni.createFrom().item(onboardingResponse)); - given() + Response response = given() .when() .body(onboardingDefaultRequest) .contentType(ContentType.JSON) .post("/completion") .then() - .statusCode(200); + .statusCode(200) + .extract() + .response(); + + OnboardingResponseV1 onboardingResponse = response.as(OnboardingResponseV1.class); + ArgumentCaptor captor = ArgumentCaptor.forClass(Onboarding.class); Mockito.verify(onboardingService, times(1)).onboardingCompletion(captor.capture(), any()); assertEquals(InstitutionType.PRV, captor.getValue().getInstitution().getInstitutionType()); + assertEquals(Collections.EMPTY_LIST, onboardingResponse.getUsers()); } - private static OnboardingDefaultRequest dummyOnboardingDefaultRequest() { + static OnboardingDefaultRequest dummyOnboardingDefaultRequest() { OnboardingDefaultRequest onboardingDefaultRequest = new OnboardingDefaultRequest(); InstitutionBaseRequest institution = new InstitutionBaseRequest(); onboardingDefaultRequest.setProductId("productId"); @@ -643,20 +623,28 @@ void onboardingPaCompletion() { OnboardingPaRequest onboardingPaRequest = dummyOnboardingPa(); + userResponse.setRole(PartyRole.MANAGER); + onboardingResponse.setUsers(List.of(userResponse)); + Mockito.when(onboardingService.onboardingCompletion(any(), any())) - .thenReturn(Uni.createFrom().item(new OnboardingResponse())); + .thenReturn(Uni.createFrom().item(onboardingResponse)); - given() + Response response = given() .when() .body(onboardingPaRequest) .contentType(ContentType.JSON) .post("/pa/completion") .then() - .statusCode(200); + .statusCode(200) + .extract() + .response(); + + OnboardingResponseV1 onboardingResponse = response.as(OnboardingResponseV1.class); ArgumentCaptor captor = ArgumentCaptor.forClass(Onboarding.class); Mockito.verify(onboardingService, times(1)).onboardingCompletion(captor.capture(), any()); assertEquals(InstitutionType.PA, captor.getValue().getInstitution().getInstitutionType()); + assertEquals(PartyRole.MANAGER.name(), onboardingResponse.getUsers().get(0).getRole().name()); } @Test @@ -665,26 +653,34 @@ void onboardingPspCompletion() { OnboardingPspRequest onboardingPspRequest = getOnboardingPspRequest(); + userResponse.setRole(PartyRole.ADMIN_EA_IO); + Mockito.when(onboardingService.onboardingCompletion(any(), any())) - .thenReturn(Uni.createFrom().item(new OnboardingResponse())); + .thenReturn(Uni.createFrom().item(onboardingResponse)); - given() + Response response = given() .when() .body(onboardingPspRequest) .contentType(ContentType.JSON) .post("/psp/completion") .then() - .statusCode(200); + .statusCode(200) + .extract() + .response(); + + OnboardingResponseV1 actualOnboardingResponse = response.as(OnboardingResponseV1.class); ArgumentCaptor captor = ArgumentCaptor.forClass(Onboarding.class); Mockito.verify(onboardingService, times(1)).onboardingCompletion(captor.capture(), any()); assertEquals(InstitutionType.PSP, captor.getValue().getInstitution().getInstitutionType()); + assertNull(actualOnboardingResponse.getUsers().get(0).getRole()); } - private static OnboardingPspRequest getOnboardingPspRequest() { + static OnboardingPspRequest getOnboardingPspRequest() { OnboardingPspRequest onboardingPspRequest = new OnboardingPspRequest(); InstitutionPspRequest institution = new InstitutionPspRequest(); onboardingPspRequest.setProductId("productId"); + userDTO.setRole(PartyRole.MANAGER); onboardingPspRequest.setUsers(List.of(userDTO)); institution.setTaxCode("taxCode"); institution.setDigitalAddress("digital@address.it"); @@ -707,20 +703,27 @@ void onboardingCompletePg() { onboardingPgRequest.setDigitalAddress("digital@address.it"); onboardingPgRequest.setOrigin(Origin.INFOCAMERE); + userResponse.setRole(PartyRole.SUB_DELEGATE); + Mockito.when(onboardingService.onboardingPgCompletion(any(), any())) - .thenReturn(Uni.createFrom().item(new OnboardingResponse())); + .thenReturn(Uni.createFrom().item(onboardingResponse)); - given() + Response response = given() .when() .body(onboardingPgRequest) .contentType(ContentType.JSON) .post("/pg/completion") .then() - .statusCode(200); + .statusCode(200) + .extract() + .response(); + + OnboardingResponseV1 actualOnboardingResponse = response.as(OnboardingResponseV1.class); ArgumentCaptor captor = ArgumentCaptor.forClass(Onboarding.class); Mockito.verify(onboardingService, times(1)).onboardingPgCompletion(captor.capture(), any()); assertEquals(InstitutionType.PG, captor.getValue().getInstitution().getInstitutionType()); + assertEquals(PartyRole.SUB_DELEGATE.name(), actualOnboardingResponse.getUsers().get(0).getRole().name()); } @Test @@ -854,34 +857,48 @@ void onboardingImportPSP_bad_request() { @TestSecurity(user = "userJwt") void getInstitutionOnboardings() { // given - OnboardingResponse onboardingResponse = dummyOnboardingResponse(); + OnboardingResponse dummyOnboardingResponse = dummyOnboardingResponse(); + UserOnboardingResponse userOnboardingResponse = new UserOnboardingResponse(); + userOnboardingResponse.setRole(PartyRole.ADMIN_EA); + UserOnboardingResponse userOnboardingResponse2 = new UserOnboardingResponse(); + userOnboardingResponse2.setRole(PartyRole.DELEGATE); + UserOnboardingResponse userOnboardingResponse3 = new UserOnboardingResponse(); + userOnboardingResponse3.setRole(PartyRole.OPERATOR); + dummyOnboardingResponse.setUsers(List.of(userOnboardingResponse, userOnboardingResponse2, userOnboardingResponse3)); List onboardingResponses = new ArrayList<>(); - onboardingResponses.add(onboardingResponse); + onboardingResponses.add(dummyOnboardingResponse); when(onboardingService.institutionOnboardings("taxCode", "subunitCode", "origin", "originId", OnboardingStatus.PENDING)) .thenReturn(Uni.createFrom().item(onboardingResponses)); Map queryParameterMap = getStringStringMapOnboardings(); // when - given() + Response response = given() .when() .queryParams(queryParameterMap) .get("/institutionOnboardings") .then() - .statusCode(200); + .statusCode(200) + .extract() + .response(); + + List onboardingResponseList = response.jsonPath().getList("", OnboardingResponseV1.class); // then verify(onboardingService, times(1)) .institutionOnboardings("taxCode", "subunitCode", "origin", "originId", OnboardingStatus.PENDING); - assertNotNull(onboardingResponses); + assertNotNull(onboardingResponseList); + assertEquals(PartyRole.ADMIN_EA.name(), onboardingResponseList.get(0).getUsers().get(0).getRole().name()); + assertEquals(PartyRole.DELEGATE.name(), onboardingResponseList.get(0).getUsers().get(1).getRole().name()); + assertEquals(PartyRole.OPERATOR.name(), onboardingResponseList.get(0).getUsers().get(2).getRole().name()); } @Test @TestSecurity(user = "userJwt") void verifyOnboardingNoContentType() { - OnboardingResponse onboardingResponse = dummyOnboardingResponse(); + OnboardingResponse dummyOnboardingResponse = dummyOnboardingResponse(); List onboardingResponses = new ArrayList<>(); - onboardingResponses.add(onboardingResponse); + onboardingResponses.add(dummyOnboardingResponse); when(onboardingService.verifyOnboarding("taxCode", "subunitCode", "origin", "originId", OnboardingStatus.COMPLETED, "prod-interop")) .thenReturn(Uni.createFrom().item(onboardingResponses)); @@ -1004,7 +1021,7 @@ private static Map getStringStringMap() { return queryParameterMap; } - private static Map getStringStringMapOnboardings() { + static Map getStringStringMapOnboardings() { Map queryParameterMap = new HashMap<>(); queryParameterMap.put("taxCode", "taxCode"); queryParameterMap.put("subunitCode", "subunitCode"); @@ -1035,7 +1052,7 @@ private static OnboardingGet dummyOnboardingGet() { return onboarding; } - private static OnboardingResponse dummyOnboardingResponse() { + static OnboardingResponse dummyOnboardingResponse() { String str = "2025-01-09 11:36"; DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm"); LocalDateTime dateTime = LocalDateTime.parse(str, formatter); @@ -1062,7 +1079,7 @@ private OnboardingUserRequest dummyOnboardingUser() { return onboardingUserRequest; } - private OnboardingPaRequest dummyOnboardingPa() { + static OnboardingPaRequest dummyOnboardingPa() { OnboardingPaRequest onboardingPaValid = new OnboardingPaRequest(); onboardingPaValid.setProductId("productId"); @@ -1072,6 +1089,7 @@ private OnboardingPaRequest dummyOnboardingPa() { institution.setInstitutionType(InstitutionType.PA); + userDTO.setRole(PartyRole.ADMIN_EA_IO); onboardingPaValid.setUsers(List.of(userDTO)); onboardingPaValid.setInstitution(institution); onboardingPaValid.setBilling(billingPaRequest); diff --git a/apps/onboarding-ms/src/test/java/it/pagopa/selfcare/onboarding/controller/OnboardingV2ControllerTest.java b/apps/onboarding-ms/src/test/java/it/pagopa/selfcare/onboarding/controller/OnboardingV2ControllerTest.java new file mode 100644 index 000000000..dd1d98fb5 --- /dev/null +++ b/apps/onboarding-ms/src/test/java/it/pagopa/selfcare/onboarding/controller/OnboardingV2ControllerTest.java @@ -0,0 +1,167 @@ +package it.pagopa.selfcare.onboarding.controller; + +import io.quarkus.test.InjectMock; +import io.quarkus.test.common.QuarkusTestResource; +import io.quarkus.test.common.http.TestHTTPEndpoint; +import io.quarkus.test.junit.QuarkusTest; +import io.quarkus.test.mongodb.MongoTestResource; +import io.quarkus.test.security.TestSecurity; +import io.restassured.http.ContentType; +import io.smallrye.mutiny.Uni; +import it.pagopa.selfcare.onboarding.common.InstitutionType; +import it.pagopa.selfcare.onboarding.common.OnboardingStatus; +import it.pagopa.selfcare.onboarding.common.Origin; +import it.pagopa.selfcare.onboarding.controller.request.*; +import it.pagopa.selfcare.onboarding.controller.response.OnboardingResponse; +import it.pagopa.selfcare.onboarding.entity.Onboarding; +import it.pagopa.selfcare.onboarding.service.OnboardingService; +import org.junit.jupiter.api.Test; +import org.mockito.ArgumentCaptor; +import org.mockito.Mockito; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import static io.restassured.RestAssured.given; +import static it.pagopa.selfcare.onboarding.controller.OnboardingControllerTest.*; +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.Mockito.*; + +@QuarkusTest +@TestHTTPEndpoint(OnboardingV2Controller.class) +@QuarkusTestResource(MongoTestResource.class) +class OnboardingV2ControllerTest { + + static final UserRequest userDTO; + @InjectMock + OnboardingService onboardingService; + + static { + userDTO = new UserRequest(); + userDTO.setTaxCode("taxCode"); + } + + @Test + @TestSecurity(user = "userJwt") + void onboardingCompletion() { + + OnboardingDefaultRequest onboardingDefaultRequest = dummyOnboardingDefaultRequest(); + + Mockito.when(onboardingService.onboardingCompletion(any(), any())) + .thenReturn(Uni.createFrom().item(new OnboardingResponse())); + + given() + .when() + .body(onboardingDefaultRequest) + .contentType(ContentType.JSON) + .post("/completion") + .then() + .statusCode(200); + + ArgumentCaptor captor = ArgumentCaptor.forClass(Onboarding.class); + Mockito.verify(onboardingService, times(1)).onboardingCompletion(captor.capture(), any()); + assertEquals(InstitutionType.PRV, captor.getValue().getInstitution().getInstitutionType()); + } + + @Test + @TestSecurity(user = "userJwt") + void onboardingPaCompletion() { + + OnboardingPaRequest onboardingPaRequest = dummyOnboardingPa(); + + Mockito.when(onboardingService.onboardingCompletion(any(), any())) + .thenReturn(Uni.createFrom().item(new OnboardingResponse())); + + given() + .when() + .body(onboardingPaRequest) + .contentType(ContentType.JSON) + .post("/pa/completion") + .then() + .statusCode(200); + + ArgumentCaptor captor = ArgumentCaptor.forClass(Onboarding.class); + Mockito.verify(onboardingService, times(1)).onboardingCompletion(captor.capture(), any()); + assertEquals(InstitutionType.PA, captor.getValue().getInstitution().getInstitutionType()); + } + + @Test + @TestSecurity(user = "userJwt") + void onboardingCompletePg() { + + OnboardingPgRequest onboardingPgRequest = new OnboardingPgRequest(); + onboardingPgRequest.setProductId("productId"); + onboardingPgRequest.setUsers(List.of(userDTO)); + onboardingPgRequest.setTaxCode("taxCode"); + onboardingPgRequest.setDigitalAddress("digital@address.it"); + onboardingPgRequest.setOrigin(Origin.INFOCAMERE); + + Mockito.when(onboardingService.onboardingPgCompletion(any(), any())) + .thenReturn(Uni.createFrom().item(new OnboardingResponse())); + + given() + .when() + .body(onboardingPgRequest) + .contentType(ContentType.JSON) + .post("/pg/completion") + .then() + .statusCode(200); + + ArgumentCaptor captor = ArgumentCaptor.forClass(Onboarding.class); + Mockito.verify(onboardingService, times(1)).onboardingPgCompletion(captor.capture(), any()); + assertEquals(InstitutionType.PG, captor.getValue().getInstitution().getInstitutionType()); + } + + @Test + @TestSecurity(user = "userJwt") + void onboardingPspCompletion() { + + OnboardingPspRequest onboardingPspRequest = getOnboardingPspRequest(); + + Mockito.when(onboardingService.onboardingCompletion(any(), any())) + .thenReturn(Uni.createFrom().item(new OnboardingResponse())); + + given() + .when() + .body(onboardingPspRequest) + .contentType(ContentType.JSON) + .post("/psp/completion") + .then() + .statusCode(200); + + ArgumentCaptor captor = ArgumentCaptor.forClass(Onboarding.class); + Mockito.verify(onboardingService, times(1)).onboardingCompletion(captor.capture(), any()); + assertEquals(InstitutionType.PSP, captor.getValue().getInstitution().getInstitutionType()); + } + + @Test + @TestSecurity(user = "userJwt") + void getInstitutionOnboardings() { + // given + OnboardingResponse onboardingResponse = dummyOnboardingResponse(); + List onboardingResponses = new ArrayList<>(); + onboardingResponses.add(onboardingResponse); + when(onboardingService.institutionOnboardings("taxCode", "subunitCode", "origin", "originId", OnboardingStatus.PENDING)) + .thenReturn(Uni.createFrom().item(onboardingResponses)); + + Map queryParameterMap = getStringStringMapOnboardings(); + + // when + given() + .when() + .queryParams(queryParameterMap) + .get("/institutionOnboardings") + .then() + .statusCode(200); + + // then + verify(onboardingService, times(1)) + .institutionOnboardings("taxCode", "subunitCode", "origin", "originId", OnboardingStatus.PENDING); + assertNotNull(onboardingResponses); + } + + +} \ No newline at end of file diff --git a/apps/onboarding-ms/src/test/java/it/pagopa/selfcare/onboarding/mapper/OnboardingMapperTest.java b/apps/onboarding-ms/src/test/java/it/pagopa/selfcare/onboarding/mapper/OnboardingMapperTest.java index 9bba175d9..bbcdff1fc 100644 --- a/apps/onboarding-ms/src/test/java/it/pagopa/selfcare/onboarding/mapper/OnboardingMapperTest.java +++ b/apps/onboarding-ms/src/test/java/it/pagopa/selfcare/onboarding/mapper/OnboardingMapperTest.java @@ -1,6 +1,12 @@ package it.pagopa.selfcare.onboarding.mapper; -import it.pagopa.selfcare.onboarding.model.*; +import it.pagopa.selfcare.onboarding.controller.response.OnboardingResponse; +import it.pagopa.selfcare.onboarding.controller.response.OnboardingResponseV1; +import it.pagopa.selfcare.onboarding.controller.response.UserOnboardingResponse; +import it.pagopa.selfcare.onboarding.model.Aggregate; +import it.pagopa.selfcare.onboarding.model.AggregateUser; +import it.pagopa.selfcare.onboarding.model.CsvAggregateAppIo; +import it.pagopa.selfcare.onboarding.model.CsvAggregateSend; import org.junit.jupiter.api.Test; import org.openapi.quarkus.onboarding_functions_json.model.PartyRole; import org.openapi.quarkus.onboarding_functions_json.model.WorkflowType; @@ -157,4 +163,18 @@ void mapUsers_withNullCsvAggregateSend_returnsEmptyList() { assertNotNull(result); assertTrue(result.isEmpty()); } + + @Test + void toOnboardingResponseV1() { + OnboardingResponse onboardingResponse = new OnboardingResponse(); + onboardingResponse.setId("id"); + UserOnboardingResponse userOnboardingResponse = new UserOnboardingResponse(); + userOnboardingResponse.setId("userId"); + userOnboardingResponse.setRole(it.pagopa.selfcare.onboarding.common.PartyRole.ADMIN_EA_IO); + onboardingResponse.setUsers(List.of(userOnboardingResponse)); + + OnboardingResponseV1 response = mapper.toOnboardingResponseV1(onboardingResponse); + assertNotNull(response); + assertNull(response.getUsers().get(0).getRole()); + } } diff --git a/apps/onboarding-ms/src/test/java/it/pagopa/selfcare/onboarding/service/AggregatesServiceDefaultTest.java b/apps/onboarding-ms/src/test/java/it/pagopa/selfcare/onboarding/service/AggregatesServiceDefaultTest.java index bf1342d26..99eb3590d 100644 --- a/apps/onboarding-ms/src/test/java/it/pagopa/selfcare/onboarding/service/AggregatesServiceDefaultTest.java +++ b/apps/onboarding-ms/src/test/java/it/pagopa/selfcare/onboarding/service/AggregatesServiceDefaultTest.java @@ -34,6 +34,7 @@ import java.io.File; import java.util.List; +import static it.pagopa.selfcare.onboarding.common.PartyRole.DELEGATE; import static org.mockito.Mockito.*; @@ -345,21 +346,21 @@ private static VerifyAggregateResponse mockResponseForSEND() { aggregateUserUO.setSurname("Rossi"); aggregateUserUO.setTaxCode("RSSMRA66A01H501W"); aggregateUserUO.setEmail("mario.rossi@acme.it"); - aggregateUserUO.setRole(org.openapi.quarkus.core_json.model.Person.RoleEnum.DELEGATE.name()); + aggregateUserUO.setRole(DELEGATE.name()); AggregateUser aggregateUser = new AggregateUser(); aggregateUser.setName("Guendalina"); aggregateUser.setSurname("Giordano"); aggregateUser.setTaxCode("GRDGDL66A01H501W"); aggregateUser.setEmail("guendalina.giordano@test.it"); - aggregateUser.setRole(org.openapi.quarkus.core_json.model.Person.RoleEnum.DELEGATE.name()); + aggregateUser.setRole(DELEGATE.name()); AggregateUser aggregateUserAOO = new AggregateUser(); aggregateUserAOO.setName("Ma"); aggregateUserAOO.setSurname("Re"); aggregateUserAOO.setTaxCode("REXMAX66A01H501W"); aggregateUserAOO.setEmail("ma.re@test.it"); - aggregateUserAOO.setRole(org.openapi.quarkus.core_json.model.Person.RoleEnum.DELEGATE.name()); + aggregateUserAOO.setRole(DELEGATE.name()); VerifyAggregateResponse verifyAggregateResponse = new VerifyAggregateResponse(); Aggregate aggregateUO = new Aggregate(); 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 e3242537c..fdec6c989 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 @@ -1,27 +1,5 @@ package it.pagopa.selfcare.onboarding.service; -import static it.pagopa.selfcare.onboarding.common.InstitutionType.PSP; -import static it.pagopa.selfcare.onboarding.common.ProductId.*; -import static it.pagopa.selfcare.onboarding.common.WorkflowType.INCREMENT_REGISTRATION_AGGREGATOR; -import static it.pagopa.selfcare.onboarding.service.OnboardingServiceDefault.USERS_FIELD_LIST; -import static it.pagopa.selfcare.onboarding.service.OnboardingServiceDefault.USERS_FIELD_TAXCODE; -import static org.assertj.core.api.Assertions.assertThat; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertFalse; -import static org.junit.jupiter.api.Assertions.assertNotNull; -import static org.junit.jupiter.api.Assertions.assertThrows; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.ArgumentMatchers.anyString; -import static org.mockito.Mockito.anyInt; -import static org.mockito.Mockito.doNothing; -import static org.mockito.Mockito.doThrow; -import static org.mockito.Mockito.eq; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.times; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; -import static org.openapi.quarkus.core_json.model.InstitutionProduct.StateEnum.PENDING; - import io.quarkus.mongodb.panache.common.reactive.ReactivePanacheUpdate; import io.quarkus.mongodb.panache.reactive.ReactivePanacheQuery; import io.quarkus.panache.mock.PanacheMock; @@ -36,32 +14,14 @@ import io.smallrye.mutiny.Uni; import io.smallrye.mutiny.helpers.test.UniAssertSubscriber; import it.pagopa.selfcare.azurestorage.AzureBlobClient; -import it.pagopa.selfcare.onboarding.common.InstitutionPaSubunitType; -import it.pagopa.selfcare.onboarding.common.InstitutionType; -import it.pagopa.selfcare.onboarding.common.OnboardingStatus; -import it.pagopa.selfcare.onboarding.common.Origin; -import it.pagopa.selfcare.onboarding.common.PartyRole; -import it.pagopa.selfcare.onboarding.common.WorkflowType; +import it.pagopa.selfcare.onboarding.common.*; import it.pagopa.selfcare.onboarding.constants.CustomError; import it.pagopa.selfcare.onboarding.controller.request.AggregateInstitutionRequest; import it.pagopa.selfcare.onboarding.controller.request.OnboardingImportContract; import it.pagopa.selfcare.onboarding.controller.request.OnboardingUserRequest; import it.pagopa.selfcare.onboarding.controller.request.UserRequest; -import it.pagopa.selfcare.onboarding.controller.response.BillingResponse; -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.controller.response.UserOnboardingResponse; -import it.pagopa.selfcare.onboarding.controller.response.UserResponse; -import it.pagopa.selfcare.onboarding.entity.AdditionalInformations; -import it.pagopa.selfcare.onboarding.entity.AggregateInstitution; -import it.pagopa.selfcare.onboarding.entity.Billing; -import it.pagopa.selfcare.onboarding.entity.CheckManagerResponse; -import it.pagopa.selfcare.onboarding.entity.Institution; -import it.pagopa.selfcare.onboarding.entity.Onboarding; -import it.pagopa.selfcare.onboarding.entity.PaymentServiceProvider; -import it.pagopa.selfcare.onboarding.entity.Token; -import it.pagopa.selfcare.onboarding.entity.User; +import it.pagopa.selfcare.onboarding.controller.response.*; +import it.pagopa.selfcare.onboarding.entity.*; import it.pagopa.selfcare.onboarding.exception.InvalidRequestException; import it.pagopa.selfcare.onboarding.exception.OnboardingNotAllowedException; import it.pagopa.selfcare.onboarding.exception.ResourceConflictException; @@ -82,17 +42,6 @@ import jakarta.inject.Inject; import jakarta.ws.rs.WebApplicationException; import jakarta.ws.rs.core.Response; - -import java.io.File; -import java.time.LocalDateTime; -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Optional; -import java.util.UUID; - import org.apache.http.HttpStatus; import org.bson.Document; import org.eclipse.microprofile.rest.client.inject.RestClient; @@ -108,22 +57,8 @@ import org.openapi.quarkus.core_json.model.InstitutionsResponse; import org.openapi.quarkus.onboarding_functions_json.api.OrchestrationApi; import org.openapi.quarkus.onboarding_functions_json.model.OrchestrationResponse; -import org.openapi.quarkus.party_registry_proxy_json.api.AooApi; -import org.openapi.quarkus.party_registry_proxy_json.api.GeographicTaxonomiesApi; -import org.openapi.quarkus.party_registry_proxy_json.api.InfocamereApi; -import org.openapi.quarkus.party_registry_proxy_json.api.InfocamerePdndApi; -import org.openapi.quarkus.party_registry_proxy_json.api.InsuranceCompaniesApi; -import org.openapi.quarkus.party_registry_proxy_json.api.NationalRegistriesApi; -import org.openapi.quarkus.party_registry_proxy_json.api.UoApi; -import org.openapi.quarkus.party_registry_proxy_json.model.AOOResource; -import org.openapi.quarkus.party_registry_proxy_json.model.BusinessResource; -import org.openapi.quarkus.party_registry_proxy_json.model.BusinessesResource; -import org.openapi.quarkus.party_registry_proxy_json.model.GeographicTaxonomyResource; -import org.openapi.quarkus.party_registry_proxy_json.model.InstitutionResource; -import org.openapi.quarkus.party_registry_proxy_json.model.InsuranceCompanyResource; -import org.openapi.quarkus.party_registry_proxy_json.model.LegalVerificationResult; -import org.openapi.quarkus.party_registry_proxy_json.model.PDNDBusinessResource; -import org.openapi.quarkus.party_registry_proxy_json.model.UOResource; +import org.openapi.quarkus.party_registry_proxy_json.api.*; +import org.openapi.quarkus.party_registry_proxy_json.model.*; import org.openapi.quarkus.user_json.model.UserInstitutionResponse; import org.openapi.quarkus.user_registry_json.api.UserApi; import org.openapi.quarkus.user_registry_json.model.CertifiableFieldResourceOfstring; @@ -131,6 +66,22 @@ import org.openapi.quarkus.user_registry_json.model.UserResource; import org.openapi.quarkus.user_registry_json.model.WorkContactResource; +import java.io.File; +import java.time.LocalDateTime; +import java.util.*; + +import static it.pagopa.selfcare.onboarding.common.InstitutionType.PSP; +import static it.pagopa.selfcare.onboarding.common.ProductId.*; +import static it.pagopa.selfcare.onboarding.common.WorkflowType.INCREMENT_REGISTRATION_AGGREGATOR; +import static it.pagopa.selfcare.onboarding.service.OnboardingServiceDefault.USERS_FIELD_LIST; +import static it.pagopa.selfcare.onboarding.service.OnboardingServiceDefault.USERS_FIELD_TAXCODE; +import static org.assertj.core.api.Assertions.assertThat; +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.openapi.quarkus.core_json.model.InstitutionProduct.StateEnum.PENDING; + @QuarkusTest @QuarkusTestResource(MongoTestResource.class) class OnboardingServiceDefaultTest { @@ -2439,7 +2390,7 @@ void onboardingUsers(UniAsserter asserter) { institutionResponse.setOriginId("originId"); InstitutionsResponse response = new InstitutionsResponse(); response.setInstitutions(List.of(institutionResponse)); - asserter.execute(() -> when(institutionApi.getInstitutionsUsingGET(any(), any(), any(), any())) + asserter.execute(() -> when(institutionApi.getInstitutionsUsingGET(any(), any(), any(), any(), any())) .thenReturn(Uni.createFrom().item(response))); asserter.assertThat(() -> onboardingService.onboardingUsers(request, "userId", WorkflowType.USERS), Assertions::assertNotNull); @@ -2472,7 +2423,7 @@ void onboardingUsersWithNullOnboardingReeferenceId(UniAsserter asserter) { institutionResponse.setOriginId("originId"); InstitutionsResponse response = new InstitutionsResponse(); response.setInstitutions(List.of(institutionResponse)); - when(institutionApi.getInstitutionsUsingGET(any(), any(), any(), any())) + when(institutionApi.getInstitutionsUsingGET(any(), any(), any(), any(), any())) .thenReturn(Uni.createFrom().item(response)); asserter.assertFailedWith(() -> onboardingService.onboardingUsers(request, "userId", WorkflowType.USERS_EA), ResourceNotFoundException.class); @@ -2493,7 +2444,7 @@ void onboardingUsersWithInstitutionNotFound() { institutionResponse.setOriginId("originId"); InstitutionsResponse response = new InstitutionsResponse(); response.setInstitutions(List.of(institutionResponse, institutionResponse)); - when(institutionApi.getInstitutionsUsingGET("taxCode", "subunitCode", null, null)) + when(institutionApi.getInstitutionsUsingGET("taxCode", "subunitCode", null, null, null)) .thenReturn(Uni.createFrom().item(response)); onboardingService diff --git a/apps/pom.xml b/apps/pom.xml index b668f68a0..ab8a88302 100644 --- a/apps/pom.xml +++ b/apps/pom.xml @@ -13,7 +13,7 @@ pom - 0.6.6 + 0.6.7 diff --git a/libs/onboarding-sdk-azure-storage/pom.xml b/libs/onboarding-sdk-azure-storage/pom.xml index 87527437a..d5643c59c 100644 --- a/libs/onboarding-sdk-azure-storage/pom.xml +++ b/libs/onboarding-sdk-azure-storage/pom.xml @@ -6,7 +6,7 @@ it.pagopa.selfcare onboarding-sdk-pom - 0.6.6 + 0.6.7 ../onboarding-sdk-pom diff --git a/libs/onboarding-sdk-common/pom.xml b/libs/onboarding-sdk-common/pom.xml index 9f0561143..5e5156a26 100644 --- a/libs/onboarding-sdk-common/pom.xml +++ b/libs/onboarding-sdk-common/pom.xml @@ -4,7 +4,7 @@ it.pagopa.selfcare onboarding-sdk-pom - 0.6.6 + 0.6.7 ../onboarding-sdk-pom onboarding-sdk-common diff --git a/libs/onboarding-sdk-common/src/main/java/it/pagopa/selfcare/onboarding/common/PartyRole.java b/libs/onboarding-sdk-common/src/main/java/it/pagopa/selfcare/onboarding/common/PartyRole.java index 50add63ad..3ce27760f 100644 --- a/libs/onboarding-sdk-common/src/main/java/it/pagopa/selfcare/onboarding/common/PartyRole.java +++ b/libs/onboarding-sdk-common/src/main/java/it/pagopa/selfcare/onboarding/common/PartyRole.java @@ -5,6 +5,7 @@ public enum PartyRole { DELEGATE, SUB_DELEGATE, OPERATOR, - ADMIN_EA + ADMIN_EA, + ADMIN_EA_IO } diff --git a/libs/onboarding-sdk-crypto/pom.xml b/libs/onboarding-sdk-crypto/pom.xml index 9294a2446..312110111 100644 --- a/libs/onboarding-sdk-crypto/pom.xml +++ b/libs/onboarding-sdk-crypto/pom.xml @@ -4,7 +4,7 @@ it.pagopa.selfcare onboarding-sdk-pom - 0.6.6 + 0.6.7 ../onboarding-sdk-pom onboarding-sdk-crypto diff --git a/libs/onboarding-sdk-pom/pom.xml b/libs/onboarding-sdk-pom/pom.xml index 1d16404ed..9d47fcc3e 100644 --- a/libs/onboarding-sdk-pom/pom.xml +++ b/libs/onboarding-sdk-pom/pom.xml @@ -5,7 +5,7 @@ onboarding-sdk-pom pom onboarding-sdk-pom - 0.6.6 + 0.6.7 17 diff --git a/libs/onboarding-sdk-product/pom.xml b/libs/onboarding-sdk-product/pom.xml index 8f45054a8..86e645eec 100644 --- a/libs/onboarding-sdk-product/pom.xml +++ b/libs/onboarding-sdk-product/pom.xml @@ -4,12 +4,12 @@ it.pagopa.selfcare onboarding-sdk-pom - 0.6.6 + 0.6.7 ../onboarding-sdk-pom onboarding-sdk-product onboarding-sdk-product - 0.6.6 + 0.6.7 2.15.2 diff --git a/test-coverage/pom.xml b/test-coverage/pom.xml index 31a3674fa..1db950049 100644 --- a/test-coverage/pom.xml +++ b/test-coverage/pom.xml @@ -19,7 +19,7 @@ **/utils/**, **/*Constant*, **/*Config.java, **/error/**, **/filter/**, org/** https://sonarcloud.io - 0.6.6 + 0.6.7