Skip to content

Commit

Permalink
[SELC - 4984] feat: added verifyOnboarding API (#402)
Browse files Browse the repository at this point in the history
  • Loading branch information
gianmarcoplutino authored Jul 17, 2024
1 parent 30ebbf2 commit 7c9169a
Show file tree
Hide file tree
Showing 10 changed files with 527 additions and 318 deletions.
644 changes: 326 additions & 318 deletions apps/onboarding-ms/pom.xml

Large diffs are not rendered by default.

54 changes: 54 additions & 0 deletions apps/onboarding-ms/src/main/docs/openapi.json
Original file line number Diff line number Diff line change
Expand Up @@ -680,6 +680,60 @@
} ]
}
},
"/v1/onboarding/verify" : {
"head" : {
"tags" : [ "Onboarding Controller" ],
"summary" : "Verify if the onboarded product is already onboarded for the institution",
"parameters" : [ {
"name" : "origin",
"in" : "query",
"schema" : {
"type" : "string"
}
}, {
"name" : "originId",
"in" : "query",
"schema" : {
"type" : "string"
}
}, {
"name" : "productId",
"in" : "query",
"schema" : {
"type" : "string"
}
}, {
"name" : "subunitCode",
"in" : "query",
"schema" : {
"type" : "string"
}
}, {
"name" : "taxCode",
"in" : "query",
"schema" : {
"type" : "string"
}
} ],
"responses" : {
"200" : {
"description" : "OK",
"content" : {
"application/json" : { }
}
},
"401" : {
"description" : "Not Authorized"
},
"403" : {
"description" : "Not Allowed"
}
},
"security" : [ {
"SecurityScheme" : [ ]
} ]
}
},
"/v1/onboarding/{onboardingId}" : {
"get" : {
"tags" : [ "Onboarding Controller" ],
Expand Down
37 changes: 37 additions & 0 deletions apps/onboarding-ms/src/main/docs/openapi.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -471,6 +471,43 @@ paths:
description: Not Allowed
security:
- SecurityScheme: []
/v1/onboarding/verify:
head:
tags:
- Onboarding Controller
summary: Verify if the onboarded product is already onboarded for the institution
parameters:
- name: origin
in: query
schema:
type: string
- name: originId
in: query
schema:
type: string
- name: productId
in: query
schema:
type: string
- name: subunitCode
in: query
schema:
type: string
- name: taxCode
in: query
schema:
type: string
responses:
"200":
description: OK
content:
application/json: {}
"401":
description: Not Authorized
"403":
description: Not Allowed
security:
- SecurityScheme: []
/v1/onboarding/{onboardingId}:
get:
tags:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@ public enum CustomError {
ROLES_NOT_ADMITTED_ERROR("0034","Roles %s are not admitted for this operation"),
AOO_NOT_FOUND("0000","AOO %s not found"),
UO_NOT_FOUND("0000","UO %s not found"),
ONBOARDING_INFO_FILTERS_ERROR("0052", "Invalid filters parameters to retrieve onboarding info"),
INSTITUTION_NOT_ONBOARDED_BY_FILTERS("0004", "Has not been found an onboarded Institution with the provided filters"),

INSTITUTION_NOT_FOUND("0000","Institution with taxCode %s origin %s originId %s subunitCode %s not found"),
USERS_UPDATE_NOT_ALLOWED("0025", "Invalid users information provided");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,13 @@
import io.smallrye.jwt.auth.principal.DefaultJWTCallerPrincipal;
import io.smallrye.mutiny.Uni;
import it.pagopa.selfcare.onboarding.common.OnboardingStatus;
import it.pagopa.selfcare.onboarding.constants.CustomError;
import it.pagopa.selfcare.onboarding.controller.request.*;
import it.pagopa.selfcare.onboarding.controller.response.OnboardingGet;
import it.pagopa.selfcare.onboarding.controller.response.OnboardingGetResponse;
import it.pagopa.selfcare.onboarding.controller.response.OnboardingResponse;
import it.pagopa.selfcare.onboarding.entity.Onboarding;
import it.pagopa.selfcare.onboarding.exception.ResourceNotFoundException;
import it.pagopa.selfcare.onboarding.mapper.OnboardingMapper;
import it.pagopa.selfcare.onboarding.model.OnboardingGetFilters;
import it.pagopa.selfcare.onboarding.service.OnboardingService;
Expand Down Expand Up @@ -346,4 +348,23 @@ public Uni<OnboardingResponse> onboardingAggregationCompletion(@Valid Onboarding
.onItem().transformToUni(userId -> onboardingService
.onboardingAggregationCompletion(fillUserId(onboardingMapper.toEntity(onboardingRequest), userId), onboardingRequest.getUsers()));
}

@HEAD
@Path("/verify")
@Operation(summary = "Verify if the onboarded product is already onboarded for the institution")
public Uni<Response> verifyOnboardingInfoByFilters(@QueryParam("productId") String productId,
@QueryParam("taxCode") String taxCode,
@QueryParam("origin") String origin,
@QueryParam("originId") String originId,
@QueryParam("subunitCode") String subunitCode) {
return onboardingService.verifyOnboarding(taxCode, subunitCode, origin, originId, OnboardingStatus.COMPLETED, productId)
.onItem().transform(onboardingList -> {
if (onboardingList.isEmpty()) {
throw new ResourceNotFoundException(CustomError.INSTITUTION_NOT_ONBOARDED_BY_FILTERS.getMessage(),
CustomError.INSTITUTION_NOT_ONBOARDED_BY_FILTERS.getCode());
} else {
return Response.status(HttpStatus.SC_NO_CONTENT).build();
}
});
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -42,11 +42,14 @@ public interface OnboardingService {

Uni<List<OnboardingResponse>> institutionOnboardings(String taxCode, String subunitCode, String origin, String originId, OnboardingStatus status);

Uni<List<OnboardingResponse>> verifyOnboarding(String taxCode, String subunitCode, String origin, String originId, OnboardingStatus status, String productId);

Uni<OnboardingGet> onboardingGet(String onboardingId);

Uni<OnboardingGet> onboardingGetWithUserInfo(String onboardingId);

Uni<Long> updateOnboarding(String onboardingId, Onboarding onboarding);

Uni<Boolean> checkManager(OnboardingUserRequest onboardingUserRequest);

}
Original file line number Diff line number Diff line change
Expand Up @@ -904,6 +904,16 @@ public Uni<List<OnboardingResponse>> institutionOnboardings(String taxCode, Stri
.collect().asList();
}

@Override
public Uni<List<OnboardingResponse>> verifyOnboarding(String taxCode, String subunitCode, String origin, String originId, OnboardingStatus status, String productId) {
Map<String, String> queryParameter = QueryUtils.createMapForVerifyOnboardingQueryParameter(taxCode, subunitCode, origin, originId, status, productId);
Document query = QueryUtils.buildQuery(queryParameter);
return Onboarding.find(query).stream()
.map(Onboarding.class::cast)
.map(onboardingMapper::toResponse)
.collect().asList();
}

@Override
public Uni<OnboardingGet> onboardingGet(String onboardingId) {
return Onboarding.findByIdOptional(onboardingId)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -102,6 +102,20 @@ public static Map<String, String> createMapForInstitutionOnboardingsQueryParamet
return queryParameterMap;
}

public static Map<String, String> createMapForVerifyOnboardingQueryParameter(String taxCode, String subunitCode, String origin, String originId, OnboardingStatus status, String productId) {
Map<String, String> queryParameterMap = new HashMap<>();

Optional.ofNullable(taxCode).ifPresent(value -> queryParameterMap.put(INSTITUTION_TAX_CODE, value));
Optional.ofNullable(origin).ifPresent(value -> queryParameterMap.put(INSTITUTION_ORIGIN, value));
Optional.ofNullable(originId).ifPresent(value -> queryParameterMap.put(INSTITUTION_ORIGIN_ID, value));
Optional.ofNullable(status).ifPresent(value -> queryParameterMap.put(STATUS, value.name()));
Optional.ofNullable(productId).ifPresent(value -> queryParameterMap.put(PRODUCT, value));

queryParameterMap.put(INSTITUTION_SUBUNIT_CODE, subunitCode);

return queryParameterMap;
}

public static Map<String, Object> createMapForOnboardingReject(String reasonForReject, String onboardingStatus) {
Map<String, Object> queryParameterMap = new HashMap<>();
Optional.ofNullable(reasonForReject).ifPresent(value -> queryParameterMap.put("reasonForReject", value));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -620,6 +620,48 @@ void getInstitutionOnboardings() {
.institutionOnboardings("taxCode", "subunitCode", "origin", "originId", OnboardingStatus.PENDING);
}

@Test
@TestSecurity(user = "userJwt")
void verifyOnboardingNoContentType() {
OnboardingResponse onboardingResponse = dummyOnboardingResponse();
List<OnboardingResponse> onboardingResponses = new ArrayList<>();
onboardingResponses.add(onboardingResponse);
when(onboardingService.verifyOnboarding("taxCode", "subunitCode", "origin", "originId", OnboardingStatus.COMPLETED, "prod-interop"))
.thenReturn(Uni.createFrom().item(onboardingResponses));

Map<String, String> queryParameterMap = getStringStringMapOnboardings();

given()
.when()
.queryParams(queryParameterMap)
.head("/verify")
.then()
.statusCode(204);

verify(onboardingService, times(1))
.verifyOnboarding("taxCode", "subunitCode", "origin", "originId", OnboardingStatus.COMPLETED, "prod-interop");
}

@Test
@TestSecurity(user = "userJwt")
void verifyOnboardingResourceNotFound() {
List<OnboardingResponse> onboardingResponses = new ArrayList<>();
when(onboardingService.verifyOnboarding("taxCode", "subunitCode", "origin", "originId", OnboardingStatus.COMPLETED, "prod-interop"))
.thenReturn(Uni.createFrom().item(onboardingResponses));

Map<String, String> queryParameterMap = getStringStringMapOnboardings();

given()
.when()
.queryParams(queryParameterMap)
.head("/verify")
.then()
.statusCode(404);

verify(onboardingService, times(1))
.verifyOnboarding("taxCode", "subunitCode", "origin", "originId", OnboardingStatus.COMPLETED, "prod-interop");
}

private static Map<String, String> getStringStringMap() {
Map<String, String> queryParameterMap = new HashMap<>();
queryParameterMap.put("productId", "prod-io");
Expand All @@ -637,6 +679,7 @@ private static Map<String, String> getStringStringMapOnboardings() {
queryParameterMap.put("origin", "origin");
queryParameterMap.put("originId", "originId");
queryParameterMap.put("status", "PENDING");
queryParameterMap.put("productId", "prod-interop");
return queryParameterMap;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1581,6 +1581,23 @@ void testInstitutionOnboardings() {
assertEquals(1, response.size());
}

@Test
void testVerifyOnboardingNonEmptyList() {
Onboarding onboarding = mock(Onboarding.class);
PanacheMock.mock(Onboarding.class);
ReactivePanacheQuery query = Mockito.mock(ReactivePanacheQuery.class);
when(query.stream()).thenReturn(Multi.createFrom().item(onboarding));
when(Onboarding.find(any())).thenReturn(query);
UniAssertSubscriber<List<OnboardingResponse>> subscriber = onboardingService
.verifyOnboarding("taxCode", "subunitCode", "origin", "originId", OnboardingStatus.COMPLETED, "prod-interop")
.subscribe()
.withSubscriber(UniAssertSubscriber.create());

List<OnboardingResponse> response = subscriber.assertCompleted().awaitItem().getItem();
assertFalse(response.isEmpty());
assertEquals(1, response.size());
}

@Nested
@TestProfile(OnboardingTestProfile.class)
@TestInstance(TestInstance.Lifecycle.PER_CLASS)
Expand Down

0 comments on commit 7c9169a

Please sign in to comment.