Skip to content
This repository has been archived by the owner on Oct 15, 2024. It is now read-only.

Commit

Permalink
[SELC-5192] feat: Persist onboarding status 200 when it exists (#520)
Browse files Browse the repository at this point in the history
  • Loading branch information
eugenbegiqi authored Jul 2, 2024
1 parent e3c24ca commit 0137335
Show file tree
Hide file tree
Showing 7 changed files with 57 additions and 17 deletions.
10 changes: 10 additions & 0 deletions app/src/main/resources/swagger/api-docs.json
Original file line number Diff line number Diff line change
Expand Up @@ -1751,6 +1751,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" : {
Expand Down
2 changes: 1 addition & 1 deletion connector-api/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@
<dependency>
<groupId>it.pagopa.selfcare</groupId>
<artifactId>onboarding-sdk-product</artifactId>
<version>0.1.14</version>
<version>0.1.15</version>
</dependency>
</dependencies>

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,6 @@ public interface OnboardingService {

void verifyOnboardingInfoByFilters(VerifyOnboardingFilters filters);

Institution persistOnboarding(String institutionId, String productId, Onboarding onboarding);
Institution persistOnboarding(String institutionId, String productId, Onboarding onboarding, StringBuilder httpStatus);

}
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@
import it.pagopa.selfcare.mscore.model.institution.Onboarding;
import it.pagopa.selfcare.mscore.model.onboarding.VerifyOnboardingFilters;
import lombok.extern.slf4j.Slf4j;

import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Service;

import java.time.OffsetDateTime;
Expand Down Expand Up @@ -62,7 +64,7 @@ public void verifyOnboardingInfoByFilters(VerifyOnboardingFilters filters) {

@Override
public Institution persistOnboarding(String institutionId, String
productId, Onboarding onboarding) {
productId, Onboarding onboarding, StringBuilder httpStatus) {

log.trace("persistForUpdate start");
log.debug("persistForUpdate institutionId = {}, productId = {}", institutionId, productId);
Expand All @@ -79,16 +81,17 @@ public Institution persistOnboarding(String institutionId, String
if (Optional.ofNullable(institution.getOnboarding()).flatMap(onboardings -> onboardings.stream()
.filter(item -> item.getProductId().equals(productId) && UtilEnumList.VALID_RELATIONSHIP_STATES.contains(item.getStatus()))
.findAny()).isPresent()) {
throw new InvalidRequestException(String.format(CustomError.PRODUCT_ALREADY_ONBOARDED.getMessage(), institution.getTaxCode(), productId),
CustomError.PRODUCT_ALREADY_ONBOARDED.getCode());

httpStatus.append(HttpStatus.OK.value());
return institution;
}

try {
//If not exists, persist a new onboarding for product
final Institution institutionUpdated = institutionConnector.findAndUpdate(institutionId, onboarding, List.of(), null);

log.trace("persistForUpdate end");

httpStatus.append(HttpStatus.CREATED.value());
return institutionUpdated;
} catch (Exception e) {
onboardingDao.rollbackPersistOnboarding(institutionId, onboarding);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.*;
import org.mockito.junit.jupiter.MockitoExtension;
import org.springframework.http.HttpStatus;
import org.springframework.test.context.ContextConfiguration;

import java.time.LocalDate;
Expand Down Expand Up @@ -120,7 +121,7 @@ void testVerifyOnboardingInfo5() {
}

@Test
void persistOnboarding_shouldThrowIfOnboardingExists() {
void persistOnboarding_whenUserExistsOnRegistry() {

Onboarding onboarding = dummyOnboarding();
onboarding.setStatus(UtilEnumList.VALID_RELATIONSHIP_STATES.get(0));
Expand All @@ -134,9 +135,13 @@ void persistOnboarding_shouldThrowIfOnboardingExists() {

String productId = onboarding.getProductId();
Onboarding onb = new Onboarding();

StringBuilder statusCode = new StringBuilder();

assertThrows(InvalidRequestException.class, () -> onboardingServiceImpl.persistOnboarding(institutionId,
productId, onb));
onboardingServiceImpl.persistOnboarding(institutionId,
productId, onb, statusCode);

assertEquals(HttpStatus.OK.value(), Integer.parseInt(statusCode.toString()));
}


Expand Down Expand Up @@ -166,7 +171,8 @@ void persistOnboarding_shouldRollback() {
when(institutionConnector.findAndUpdate(any(), any(), any(), any())).thenThrow(new RuntimeException());
String institutionId = institution.getId();

Assertions.assertThrows(InvalidRequestException.class, () -> onboardingServiceImpl.persistOnboarding(institutionId, productId, onboardingToPersist));
Assertions.assertThrows(InvalidRequestException.class, () -> onboardingServiceImpl.persistOnboarding(
institutionId, productId, onboardingToPersist, new StringBuilder()));

verify(onboardingDao, times(1))
.rollbackPersistOnboarding(any(), any());
Expand Down Expand Up @@ -210,16 +216,19 @@ void persistOnboarding_whenUserNotExistsOnRegistry() {

when(institutionConnector.findById(institution.getId())).thenReturn(institution);
when(institutionConnector.findAndUpdate(any(), any(), any(), any())).thenReturn(institution);

StringBuilder statusCode = new StringBuilder();

onboardingServiceImpl.persistOnboarding(institution.getId(), productId, onboardingToPersist);

onboardingServiceImpl.persistOnboarding(institution.getId(), productId, onboardingToPersist, statusCode);

ArgumentCaptor<Onboarding> captor = ArgumentCaptor.forClass(Onboarding.class);
verify(institutionConnector, times(1))
.findAndUpdate(any(), captor.capture(), any(), any());
Onboarding actual = captor.getValue();
assertEquals(billing, actual.getBilling());
assertEquals(actual.getCreatedAt().getDayOfYear(), LocalDate.now().getDayOfYear());
assertEquals(HttpStatus.CREATED.value(), Integer.parseInt(statusCode.toString()));

}

private Onboarding dummyOnboarding() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import io.swagger.annotations.ApiResponse;
import io.swagger.annotations.ApiResponses;
import io.swagger.v3.oas.annotations.tags.Tag;
import io.swagger.v3.oas.annotations.tags.Tags;
import it.pagopa.selfcare.commons.base.security.SelfCareUser;
Expand Down Expand Up @@ -340,19 +342,30 @@ public ResponseEntity<InstitutionResponse> updateInstitution(@ApiParam("${swagge
*
* @param request OnboardingInstitutionUsersRequest
* @return no content
* * Code: 204, Message: successful operation
* * Code: 200, Message: Ok
* * Code: 201, Message: Created
* * Code: 404, Message: Not found, DataType: Problem
* * Code: 400, Message: Invalid request, DataType: Problem
*/
@ApiResponses(value = {
@ApiResponse(code = 200, message = "User already exists an onboarding in status ACTIVE or SUSPENDED with that productId"),
@ApiResponse(code = 201, message = "Created"),
@ApiResponse(code = 400, message = "Bad Request"),
@ApiResponse(code = 404, message = "Not Found")
})
@ResponseStatus(HttpStatus.CREATED)
@ApiOperation(value = "${swagger.mscore.onboarding.users}", notes = "${swagger.mscore.onboarding.users}")
@PostMapping(value = "/{id}/onboarding", produces = MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity<InstitutionResponse> onboardingInstitution(@RequestBody @Valid InstitutionOnboardingRequest request,
@PathVariable("id") String id) {
CustomExceptionMessage.setCustomMessage(GenericError.ONBOARDING_OPERATION_ERROR);
Institution institution = onboardingService.persistOnboarding(id, request.getProductId(), onboardingResourceMapper.toOnboarding(request));

StringBuilder httpStatus = new StringBuilder();

Institution institution = onboardingService.persistOnboarding(id, request.getProductId(), onboardingResourceMapper.toOnboarding(request), httpStatus);

return ResponseEntity
.status(HttpStatus.CREATED)
.status(HttpStatus.valueOf(Integer.parseInt(httpStatus.toString())))
.body(institutionResourceMapper.toInstitutionResponse(institution));
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
import org.mockito.*;
import org.mockito.junit.jupiter.MockitoExtension;
import org.springframework.data.web.PageableHandlerMethodArgumentResolver;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContext;
Expand Down Expand Up @@ -1353,8 +1354,12 @@ void institutionOnboarding() throws Exception {
request.setProductId("id");
request.setIsAggregator(true);

when(onboardingService.persistOnboarding(any(), any(), any()))
.thenReturn(new Institution());
when(onboardingService.persistOnboarding(any(), any(), any(), any()))
.thenAnswer(invocation -> {
StringBuilder status = invocation.getArgument(3);
status.append(HttpStatus.CREATED.value());
return new Institution();
});

MockHttpServletRequestBuilder requestBuilder = MockMvcRequestBuilders
.post(BASE_URL + "/{id}/onboarding/", institutionId)
Expand Down

0 comments on commit 0137335

Please sign in to comment.