Skip to content

Commit

Permalink
Merge branch 'main' into feature/SELC-4660
Browse files Browse the repository at this point in the history
# Conflicts:
#	core/src/test/java/it/pagopa/selfcare/dashboard/core/InstitutionServiceImplTest.java
  • Loading branch information
giulia-tremolada committed Apr 19, 2024
2 parents 5b43edc + ed44ad2 commit 2d68cca
Show file tree
Hide file tree
Showing 8 changed files with 131 additions and 70 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@ public List<InstitutionBase> getUserInstitutions(String userId) {

List<InstitutionBase> result = userInfoResponse.getInstitutions().stream()
.map(institutionMapper::toInstitutionBase)
.sorted(Comparator.comparing(InstitutionBase::getName))
.sorted(Comparator.comparing(InstitutionBase::getName, Comparator.nullsLast(String::compareTo)))
.toList();
log.debug("getUserProducts result = {}", result);
log.trace("getUserProducts end");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -78,11 +78,12 @@ void getUserProductsFound() {
when(userApiRestClient._usersUserIdInstitutionsGet("userID", null,
List.of(ACTIVE.name(), PENDING.name(), TOBEVALIDATED.name()))).thenReturn(ResponseEntity.ok(userProductsResponse));
List<InstitutionBase> result = userConnector.getUserInstitutions("userID");
Assertions.assertEquals(3, result.size());
Assertions.assertEquals(4, result.size());
Assertions.assertEquals(ACTIVE.name(), result.get(0).getStatus());
Assertions.assertEquals("a", result.get(0).getName());
Assertions.assertEquals("b", result.get(1).getName());
Assertions.assertEquals("c", result.get(2).getName());
Assertions.assertNull(result.get(3).getName());
}

private static UserInfoResponse getUserProductsResponse() {
Expand All @@ -100,13 +101,20 @@ private static UserInfoResponse getUserProductsResponse() {
institutionProducts2.setStatus(OnboardedProductState.ACTIVE);
institutionProducts2.setRole(PartyRole.MANAGER);

UserInstitutionRoleResponse institutionProducts4 = new UserInstitutionRoleResponse();
institutionProducts4.setInstitutionId("institutionId3");
institutionProducts4.setStatus(OnboardedProductState.ACTIVE);
institutionProducts4.setRole(PartyRole.MANAGER);

UserInstitutionRoleResponse institutionProducts3 = new UserInstitutionRoleResponse();
institutionProducts3.setInstitutionId("institutionId3");
institutionProducts3.setInstitutionName("a");
institutionProducts3.setStatus(OnboardedProductState.ACTIVE);
institutionProducts3.setRole(PartyRole.MANAGER);

userProductsResponse.setInstitutions(List.of(institutionProducts, institutionProducts2,institutionProducts3));


userProductsResponse.setInstitutions(List.of(institutionProducts, institutionProducts2,institutionProducts4, institutionProducts3));
return userProductsResponse;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,8 @@ public interface InstitutionService {

InstitutionInfo getInstitution(String institutionId);

Institution getInstitutionById(String institutionId);

Collection<InstitutionInfo> getInstitutions(String userId);

void updateInstitutionGeographicTaxonomy(String institutionId, GeographicTaxonomyList geographicTaxonomies);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,7 @@ public InstitutionServiceImpl(@Value("${dashboard.institution.getUsers.filter.st
? Optional.empty()
: Optional.of(EnumSet.copyOf(Arrays.stream(allowedStates)
.map(RelationshipState::valueOf)
.collect(Collectors.toList())));
.toList()));
this.userRegistryConnector = userRegistryConnector;
this.productsConnector = productsConnector;
this.msCoreConnector = msCoreConnector;
Expand All @@ -86,6 +86,16 @@ public InstitutionInfo getInstitution(String institutionId) {
return result;
}


@Override
public Institution getInstitutionById(String institutionId) {
log.trace("getInstitution start");
Institution result = msCoreConnector.getInstitution(institutionId);
log.debug(LogUtils.CONFIDENTIAL_MARKER, "getInstitution result = {}", result);
log.trace("getInstitution end");
return result;
}

@Override
public void updateInstitutionGeographicTaxonomy(String institutionId, GeographicTaxonomyList geographicTaxonomies) {
log.trace("updateInstitutionGeographicTaxonomy start");
Expand Down Expand Up @@ -319,7 +329,7 @@ public Institution findInstitutionById(String institutionId) {
.filter(product -> userAuthProducts.containsKey(product.getProductId()))
.peek(product -> product.setAuthorized(true))
.peek(product -> product.setUserRole(LIMITED.name()))
.collect(Collectors.toList()));
.toList());
} else {
institution.getOnboarding().forEach(product -> {
product.setAuthorized(userAuthProducts.containsKey(product.getProductId()));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,13 +9,12 @@
import it.pagopa.selfcare.dashboard.connector.api.ProductsConnector;
import it.pagopa.selfcare.dashboard.connector.api.UserRegistryConnector;
import it.pagopa.selfcare.dashboard.connector.exception.ResourceNotFoundException;
import it.pagopa.selfcare.dashboard.connector.model.institution.OnboardedProduct;
import it.pagopa.selfcare.dashboard.connector.model.institution.*;
import it.pagopa.selfcare.dashboard.connector.model.product.Product;
import it.pagopa.selfcare.dashboard.connector.model.product.ProductRoleInfo;
import it.pagopa.selfcare.dashboard.connector.model.product.ProductTree;
import it.pagopa.selfcare.dashboard.connector.model.institution.OnboardedProduct;
import it.pagopa.selfcare.dashboard.connector.model.product.*;
import it.pagopa.selfcare.dashboard.connector.model.user.*;
import it.pagopa.selfcare.dashboard.connector.model.user.User.Fields;
import it.pagopa.selfcare.dashboard.connector.onboarding.OnboardingRequestInfo;
import it.pagopa.selfcare.dashboard.core.config.CoreTestConfig;
import it.pagopa.selfcare.dashboard.core.exception.InvalidProductRoleException;
import org.junit.jupiter.api.Assertions;
Expand Down Expand Up @@ -47,6 +46,7 @@
import static it.pagopa.selfcare.dashboard.connector.model.institution.RelationshipState.SUSPENDED;
import static it.pagopa.selfcare.dashboard.connector.model.user.User.Fields.*;
import static it.pagopa.selfcare.dashboard.core.InstitutionServiceImpl.REQUIRED_GEOGRAPHIC_TAXONOMIES;
import static it.pagopa.selfcare.dashboard.core.InstitutionServiceImpl.REQUIRED_TOKEN_ID_MESSAGE;
import static it.pagopa.selfcare.dashboard.core.PnPGInstitutionServiceImpl.REQUIRED_INSTITUTION_MESSAGE;
import static it.pagopa.selfcare.dashboard.core.PnPGInstitutionServiceImpl.REQUIRED_UPDATE_RESOURCE_MESSAGE;
import static org.junit.jupiter.api.Assertions.*;
Expand Down Expand Up @@ -85,6 +85,22 @@ void beforeEach() {
SecurityContextHolder.clearContext();
}

@Test
void getInstitutionById() {
// Given
String institutionId = "institutionId";
Institution institution = new Institution();
when(msCoreConnectorMock.getInstitution(institutionId)).thenReturn(institution);

// When
Institution result = institutionService.getInstitutionById(institutionId);

// Then
verify(msCoreConnectorMock, times(1)).getInstitution(institutionId);
assertEquals(institution, result);
}


@Test
void getInstitution() {
// given
Expand Down Expand Up @@ -370,7 +386,7 @@ void getInstitutionProductUsers_nullAllowedStates() {
assertNull(capturedFilter.getRole());
assertEquals(productId, capturedFilter.getProductId());
assertNull(capturedFilter.getProductRoles());
assertNull( capturedFilter.getUserId());
assertNull(capturedFilter.getUserId());
assertNull(capturedFilter.getAllowedStates());
ArgumentCaptor<EnumSet<Fields>> filedsCaptor = ArgumentCaptor.forClass(EnumSet.class);
verify(userRegistryConnector, times(1))
Expand Down Expand Up @@ -1079,7 +1095,7 @@ void addUserProductRoles(PartyRole partyRole) {
assertDoesNotThrow(executable);
verify(msCoreConnectorMock, times(1))
.createUsers(Mockito.eq(institutionId), Mockito.eq(productId), Mockito.eq(userId), createUserDtoCaptor.capture(), eq("setTitle"));
createUserDtoCaptor.getValue().getRoles().forEach(role1 -> {
createUserDtoCaptor.getValue().getRoles().forEach(role1 -> {
createUserDto.getRoles().forEach(role -> {
if (role.getLabel().equals(role1.getLabel())) {
Assertions.assertEquals(role.getPartyRole(), role1.getPartyRole());
Expand Down Expand Up @@ -1150,7 +1166,7 @@ void updateInstitutionDescription_hasNullDescription() {
}

@Test
void findInstitutionByIdTest2(){
void findInstitutionByIdTest2() {
ProductGrantedAuthority productGrantedAuthority = new ProductGrantedAuthority(MANAGER, "productRole", "productId");
TestingAuthenticationToken authentication = new TestingAuthenticationToken(null,
null,
Expand All @@ -1169,7 +1185,7 @@ void findInstitutionByIdTest2(){
}

@Test
void findInstitutionByIdTest(){
void findInstitutionByIdTest() {
ProductGrantedAuthority productGrantedAuthority = new ProductGrantedAuthority(OPERATOR, "productRole", "productId");
TestingAuthenticationToken authentication = new TestingAuthenticationToken(null,
null,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -85,20 +85,20 @@ default String toUserRole(String userRole) {
return null;
}

@Mapping(target = "name", source = "institutionInfo.description")
@Mapping(target = "aooParent", source = "institutionInfo.aooParentCode")
@Mapping(target = "subUnitType", source = "institutionInfo.subunitType")
@Mapping(target = "subUnitCode", source = "institutionInfo.subunitCode")
@Mapping(target = "rootParent", expression = "java(toRootParent(institutionInfo))")
@Mapping(target = "name", source = "institution.description")
@Mapping(target = "aooParent", source = "institution.aooParentCode")
@Mapping(target = "subUnitType", source = "institution.subunitType")
@Mapping(target = "subUnitCode", source = "institution.subunitCode")
@Mapping(target = "rootParent", expression = "java(toRootParent(institution))")
@Mapping(target = "roles", expression = "java(toRoles(productGrantedAuthorities, isBillingToken))")
ExchangeTokenServiceV2.Institution toInstitution(InstitutionInfo institutionInfo, List<ProductGrantedAuthority> productGrantedAuthorities, boolean isBillingToken);
ExchangeTokenServiceV2.Institution toInstitution(it.pagopa.selfcare.dashboard.connector.model.institution.Institution institution, List<ProductGrantedAuthority> productGrantedAuthorities, boolean isBillingToken);

@Named("toRootParent")
default ExchangeTokenServiceV2.RootParent toRootParent(InstitutionInfo institutionInfo) {
default ExchangeTokenServiceV2.RootParent toRootParent(it.pagopa.selfcare.dashboard.connector.model.institution.Institution institutionInfo) {
ExchangeTokenServiceV2.RootParent rootParent = new ExchangeTokenServiceV2.RootParent();
if(institutionInfo != null) {
rootParent.setId(institutionInfo.getId());
rootParent.setDescription(institutionInfo.getDescription());
if(institutionInfo != null && institutionInfo.getRootParent() != null) {
rootParent.setId(institutionInfo.getRootParent().getId());
rootParent.setDescription(institutionInfo.getRootParent().getDescription());
}
return rootParent;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,9 +12,10 @@
import it.pagopa.selfcare.dashboard.connector.api.ProductsConnector;
import it.pagopa.selfcare.dashboard.connector.api.UserApiConnector;
import it.pagopa.selfcare.dashboard.connector.model.groups.UserGroupInfo;
import it.pagopa.selfcare.dashboard.connector.model.institution.InstitutionInfo;
import it.pagopa.selfcare.dashboard.connector.model.product.Product;
import it.pagopa.selfcare.dashboard.connector.model.user.OnboardedProduct;
import it.pagopa.selfcare.dashboard.connector.model.user.User;
import it.pagopa.selfcare.dashboard.connector.model.user.UserInstitution;
import it.pagopa.selfcare.dashboard.core.InstitutionService;
import it.pagopa.selfcare.dashboard.core.UserGroupService;
import it.pagopa.selfcare.dashboard.core.UserService;
Expand Down Expand Up @@ -42,9 +43,10 @@
import java.security.spec.RSAPrivateCrtKeySpec;
import java.time.Duration;
import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.Stream;

import static java.util.stream.Collectors.groupingBy;

@Slf4j
@Service
public class ExchangeTokenServiceV2 {
Expand Down Expand Up @@ -102,15 +104,18 @@ public ExchangedToken exchange(String institutionId, String productId, Optional<
}
SelfCareUser selfCareUser = (SelfCareUser) authentication.getPrincipal();
String userId = selfCareUser.getId();
Map<String, ProductGrantedAuthority> productGrantedAuthorityMap = retrieveProductsFromInstitutionAndUser(institutionId, userId);
UserInstitution userInstitution = userApiConnector.getProducts(institutionId, userId);

Map<String, ProductGrantedAuthority> productGrantedAuthorityMap = retrieveProductsFromInstitutionAndUser(userInstitution);
final ProductGrantedAuthority productGrantedAuthority = Optional.ofNullable(productGrantedAuthorityMap.get(productId))
.orElseThrow(() -> new IllegalArgumentException(String.format("A Product Granted SelfCareAuthority is required for product '%s' and institution '%s'", productId, institutionId)));

InstitutionInfo institutionInfo = institutionService.getInstitution(institutionId);
Assert.notNull(institutionInfo, "Institution info is required");
Institution institution = institutionResourceMapper.toInstitution(institutionInfo, List.of(productGrantedAuthority), false);
retrieveAndSetGroups(institution, institutionId, productId, userId);
TokenExchangeClaims claims = retrieveAndSetClaims(authentication.getCredentials().toString(), institution, userId);

it.pagopa.selfcare.dashboard.connector.model.institution.Institution institution = institutionService.getInstitutionById(institutionId);
Assert.notNull(institution, "Institution info is required");
ExchangeTokenServiceV2.Institution institutionExchange = institutionResourceMapper.toInstitution(institution, List.of(productGrantedAuthority), false);
retrieveAndSetGroups(institutionExchange, institutionId, productId, userId);
TokenExchangeClaims claims = retrieveAndSetClaims(authentication.getCredentials().toString(), institutionExchange, userId, userInstitution.getUserMailUuid());

Product product = productsConnector.getProduct(productId);

Expand Down Expand Up @@ -142,15 +147,17 @@ public ExchangedToken retrieveBillingExchangedToken(String institutionId) {

final List<ProductGrantedAuthority> productGrantedAuthorities = new ArrayList<>();

Map<String, ProductGrantedAuthority> productGrantedAuthorityMap = retrieveProductsFromInstitutionAndUser(institutionId, userId);
UserInstitution userInstitution = userApiConnector.getProducts(institutionId, userId);

Map<String, ProductGrantedAuthority> productGrantedAuthorityMap = retrieveProductsFromInstitutionAndUser(userInstitution);
addProductIfIsInvoiceable(productGrantedAuthorityMap, invoiceableProductList, productGrantedAuthorities);
InstitutionInfo institutionInfo = institutionService.getInstitution(institutionId);
it.pagopa.selfcare.dashboard.connector.model.institution.Institution institutionInfo = institutionService.getInstitutionById(institutionId);
Assert.notNull(institutionInfo, "Institution info is required");
Institution institution = institutionResourceMapper.toInstitution(institutionInfo, productGrantedAuthorities, true);
ExchangeTokenServiceV2.Institution institution = institutionResourceMapper.toInstitution(institutionInfo, productGrantedAuthorities, true);

retrieveAndSetGroups(institution, institutionId, null, userId);

TokenExchangeClaims claims = retrieveAndSetClaims(credentials, institution, userId);
TokenExchangeClaims claims = retrieveAndSetClaims(credentials, institution, userId, userInstitution.getUserMailUuid());
claims.setAudience(billingAudience);

log.debug(LogUtils.CONFIDENTIAL_MARKER, "Exchanged claims = {}", claims);
Expand All @@ -176,15 +183,15 @@ private List<String> retrieveInvoiceableProductList() {
.toList();
}

private TokenExchangeClaims retrieveAndSetClaims(String credential, Institution institution, String userId) {
private TokenExchangeClaims retrieveAndSetClaims(String credential, Institution institution, String userId, String userMailUuid) {
Claims selcClaims = jwtService.getClaims(credential);
Assert.notNull(selcClaims, "Session token claims is required");
TokenExchangeClaims claims = new TokenExchangeClaims(selcClaims);
claims.setId(UUID.randomUUID().toString());
claims.setIssuer(issuer);
User user = userService.getUserByInternalId(UUID.fromString(userId));

String email = Optional.ofNullable(user.getWorkContact(institution.getId()))
String email = Optional.ofNullable(user.getWorkContact(userMailUuid))
.map(workContract -> Objects.nonNull(workContract.getEmail())
? workContract.getEmail().getValue()
: ""
Expand All @@ -201,13 +208,17 @@ private TokenExchangeClaims retrieveAndSetClaims(String credential, Institution
}


private Map<String, ProductGrantedAuthority> retrieveProductsFromInstitutionAndUser(String institutionId, String userId) {
return this.userApiConnector.getProducts(institutionId, userId)
private Map<String, ProductGrantedAuthority> retrieveProductsFromInstitutionAndUser(UserInstitution userInstitution) {
Map<String, ProductGrantedAuthority> map = new HashMap<>();
userInstitution
.getProducts()
.stream()
.collect(Collectors.toMap(
it.pagopa.selfcare.dashboard.connector.model.user.OnboardedProduct::getProductId,
product -> new ProductGrantedAuthority(product.getRole(), List.of(product.getProductRole()), product.getProductId())));
.collect(groupingBy(OnboardedProduct::getProductId))
.forEach((key, value) -> map.put(key, new ProductGrantedAuthority(
value.get(0).getRole(),
value.stream().map(OnboardedProduct::getProductRole).toList(),
key)));
return map;
}


Expand Down
Loading

0 comments on commit 2d68cca

Please sign in to comment.