Skip to content

Commit

Permalink
[SELC-5010] refactor: semply user group logic (#475)
Browse files Browse the repository at this point in the history
  • Loading branch information
giulia-tremolada authored Aug 6, 2024
1 parent c8bb495 commit 3c18906
Show file tree
Hide file tree
Showing 27 changed files with 481 additions and 312 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,9 @@ class SwaggerConfigTest {
@MockBean
private UserMapperV2 userMapperImpl;

@MockBean
private GroupMapperV2 groupMapperImpl;

@MockBean
private UserGroupV2Service userGroupServiceV2Mock;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,8 @@
import it.pagopa.selfcare.dashboard.connector.model.institution.Institution;
import it.pagopa.selfcare.dashboard.connector.model.institution.InstitutionBase;
import it.pagopa.selfcare.dashboard.connector.model.user.*;
import it.pagopa.selfcare.dashboard.connector.model.user.User;
import it.pagopa.selfcare.dashboard.connector.model.user.UserInfo;
import it.pagopa.selfcare.dashboard.connector.model.user.UserInstitution;

import java.util.Collection;

import java.util.List;

public interface UserApiConnector {
Expand All @@ -33,6 +29,8 @@ public interface UserApiConnector {

Collection<UserInfo> getUsers(String institutionId, UserInfo.UserInfoFilter userInfoFilter, String loggedUserId);

UserInfo getUserByUserIdInstitutionIdAndProductAndStates(String userId, String institutionId, String productId, List<String> states);

List<String> retrieveFilteredUserInstitution(String institutionId, UserInfo.UserInfoFilter userInfoFilter);

List<UserInstitution> retrieveFilteredUser(String userId, String institutionId, String productId);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,6 @@
package it.pagopa.selfcare.dashboard.connector.api;

import it.pagopa.selfcare.dashboard.connector.model.groups.CreateUserGroup;
import it.pagopa.selfcare.dashboard.connector.model.groups.UpdateUserGroup;
import it.pagopa.selfcare.dashboard.connector.model.groups.UserGroupFilter;
import it.pagopa.selfcare.dashboard.connector.model.groups.UserGroupInfo;
import it.pagopa.selfcare.dashboard.connector.model.groups.*;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;

Expand All @@ -28,6 +25,6 @@ public interface UserGroupConnector {

void deleteMemberFromUserGroup(String id, UUID userId);

Page<UserGroupInfo> getUserGroups(UserGroupFilter filter, Pageable pageable);
Page<UserGroup> getUserGroups(UserGroupFilter filter, Pageable pageable);

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package it.pagopa.selfcare.dashboard.connector.model.groups;

import lombok.Data;

import java.time.Instant;
import java.util.List;

@Data
public class UserGroup {
private String id;
private String institutionId;
private String productId;
private String description;
private String name;
private UserGroupStatus status;
private List<String> members;
private Instant createdAt;
private String createdBy;
private Instant modifiedAt;
private String modifiedBy;
}
Original file line number Diff line number Diff line change
Expand Up @@ -193,6 +193,22 @@ public Collection<UserInfo> getUsers(String institutionId, UserInfo.UserInfoFilt
.orElse(Collections.emptyList());
}

@Override
public UserInfo getUserByUserIdInstitutionIdAndProductAndStates(String userId, String institutionId, String productId, List<String> states) {
log.trace("getUserByUserIdInstitutionIdAndProduct start");
List<UserDataResponse> institutionResponses = userApiRestClient._usersUserIdInstitutionInstitutionIdGet(institutionId, userId, userId, null, List.of(productId), null, states)
.getBody();

if (CollectionUtils.isEmpty(institutionResponses) || institutionResponses.size() != 1){
throw new ResourceNotFoundException(String.format("InstitutionId %s and userId %s not found", institutionId, userId));
}

log.debug("getProducts result = {}", institutionResponses);
log.trace("getProducts end");
return userMapper.toUserInfo(institutionResponses.get(0));

}

@Override
public List<String> retrieveFilteredUserInstitution(String institutionId, UserInfo.UserInfoFilter userInfoFilter) {

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,6 @@
import io.github.resilience4j.retry.annotation.Retry;
import it.pagopa.selfcare.dashboard.connector.api.UserGroupConnector;
import it.pagopa.selfcare.dashboard.connector.model.groups.*;
import it.pagopa.selfcare.dashboard.connector.model.user.User;
import it.pagopa.selfcare.dashboard.connector.model.user.UserInfo;
import it.pagopa.selfcare.dashboard.connector.rest.client.UserGroupRestClient;
import it.pagopa.selfcare.dashboard.connector.rest.model.mapper.GroupMapper;
import it.pagopa.selfcare.group.generated.openapi.v1.dto.CreateUserGroupDto;
Expand All @@ -22,9 +20,7 @@

import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.UUID;
import java.util.function.Function;

@Slf4j
@Service
Expand All @@ -36,39 +32,6 @@ public class UserGroupConnectorImpl implements UserGroupConnector {

static final String REQUIRED_GROUP_ID_MESSAGE = "A user group id is required";

static final Function<UserGroupResource, UserGroupInfo> GROUP_RESPONSE_TO_GROUP_INFO = groupResponse -> {
UserGroupInfo groupInfo = new UserGroupInfo();
groupInfo.setId(groupResponse.getId());
groupInfo.setInstitutionId(groupResponse.getInstitutionId());
groupInfo.setProductId(groupResponse.getProductId());
groupInfo.setName(groupResponse.getName());
groupInfo.setDescription(groupResponse.getDescription());
if(Objects.nonNull(groupResponse.getStatus())) {
groupInfo.setStatus(UserGroupStatus.valueOf(groupResponse.getStatus().getValue()));
}
if (groupResponse.getMembers() != null) {
List<UserInfo> members = groupResponse.getMembers().stream().map(id -> {
UserInfo member = new UserInfo();
member.setId(id.toString());
return member;
}).toList();
groupInfo.setMembers(members);
}
groupInfo.setCreatedAt(groupResponse.getCreatedAt());
groupInfo.setModifiedAt(groupResponse.getModifiedAt());
User createdBy = new User();
createdBy.setId(groupResponse.getCreatedBy());
groupInfo.setCreatedBy(createdBy);

if (groupResponse.getModifiedBy() != null) {
User userInfo = new User();
userInfo.setId(groupResponse.getModifiedBy());
groupInfo.setModifiedBy(userInfo);
}

return groupInfo;
};

@Override
public String createUserGroup(CreateUserGroup userGroup) {
log.trace("createUserGroup start");
Expand Down Expand Up @@ -140,7 +103,7 @@ public UserGroupInfo getUserGroupById(String id) {
log.debug("getUseGroupById id = {}", id);
Assert.hasText(id, REQUIRED_GROUP_ID_MESSAGE);
UserGroupResource response = restClient._getUserGroupUsingGET(id).getBody();
UserGroupInfo groupInfo = GROUP_RESPONSE_TO_GROUP_INFO.apply(response);
UserGroupInfo groupInfo = groupMapper.toUserGroupInfo(response);
log.debug("getUseGroupById groupInfo = {}", groupInfo);
log.trace("getUserGroupById end");
return groupInfo;
Expand Down Expand Up @@ -168,7 +131,7 @@ public void deleteMemberFromUserGroup(String id, UUID userId) {

@Override
@Retry(name = "retryTimeout")
public Page<UserGroupInfo> getUserGroups(UserGroupFilter filter, Pageable pageable) {
public Page<UserGroup> getUserGroups(UserGroupFilter filter, Pageable pageable) {
log.trace("getUserGroups start");
log.debug("getUserGroups institutionId = {}, productId = {}, userId = {}, pageable = {}", filter.getInstitutionId(), filter.getProductId(), filter.getUserId(), pageable);

Expand All @@ -186,15 +149,15 @@ public Page<UserGroupInfo> getUserGroups(UserGroupFilter filter, Pageable pageab
String.join(",", UserGroupStatus.ACTIVE.name(), UserGroupStatus.SUSPENDED.name())).getBody();

assert userGroupResources != null;
final Page<UserGroupInfo> userGroups = convertToUserGroupInfoPage(userGroupResources, pageable);
final Page<UserGroup> userGroups = convertToUserGroupInfoPage(userGroupResources, pageable);
log.debug("getUserGroups result = {}", userGroups);
log.trace("getUserGroups end");
return userGroups;
}

private Page<UserGroupInfo> convertToUserGroupInfoPage(PageOfUserGroupResource userGroupResources, Pageable pageable) {
private Page<UserGroup> convertToUserGroupInfoPage(PageOfUserGroupResource userGroupResources, Pageable pageable) {
return new PageImpl<>(
userGroupResources.getContent().stream().map(GROUP_RESPONSE_TO_GROUP_INFO).toList(),
userGroupResources.getContent().stream().map(groupMapper::toUserGroup).toList(),
pageable,
userGroupResources.getTotalElements()
);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,53 @@

import it.pagopa.selfcare.dashboard.connector.model.groups.CreateUserGroup;
import it.pagopa.selfcare.dashboard.connector.model.groups.UpdateUserGroup;
import it.pagopa.selfcare.dashboard.connector.model.groups.UserGroup;
import it.pagopa.selfcare.dashboard.connector.model.groups.UserGroupInfo;
import it.pagopa.selfcare.dashboard.connector.model.user.User;
import it.pagopa.selfcare.dashboard.connector.model.user.UserInfo;
import it.pagopa.selfcare.group.generated.openapi.v1.dto.CreateUserGroupDto;
import it.pagopa.selfcare.group.generated.openapi.v1.dto.UpdateUserGroupDto;
import it.pagopa.selfcare.group.generated.openapi.v1.dto.UserGroupResource;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.Named;

import java.util.Collections;
import java.util.List;
import java.util.UUID;

@Mapper(componentModel = "spring")
public interface GroupMapper {

CreateUserGroupDto toCreateUserGroupDto(CreateUserGroup createUserGroup);

UpdateUserGroupDto toUpdateUserGroupDto(UpdateUserGroup updateUserGroup);
UserGroup toUserGroup(UserGroupResource userGroupResource);

@Mapping(target = "createdBy", expression = "java(toUser(userGroupResource.getCreatedBy()))")
@Mapping(target = "modifiedBy", expression = "java(toUser(userGroupResource.getModifiedBy()))")
@Mapping(target = "members", expression = "java(toUserInfo(userGroupResource.getMembers()))")
UserGroupInfo toUserGroupInfo(UserGroupResource userGroupResource);

@Named("toUserInfo")
default List<UserInfo> toUserInfo(List<UUID> uuidList) {
if(uuidList == null) {
return Collections.emptyList();
}
return uuidList.stream().map(id -> {
UserInfo member = new UserInfo();
member.setId(id.toString());
return member;
}).toList();
}

@Named("toUser")
default User toUser(String userId) {
if(userId == null) {
return null;
}
User user = new User();
user.setId(userId);
return user;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,8 @@
import it.pagopa.selfcare.dashboard.connector.rest.model.mapper.InstitutionMapperImpl;
import it.pagopa.selfcare.dashboard.connector.rest.model.mapper.UserMapper;
import it.pagopa.selfcare.dashboard.connector.rest.model.mapper.UserMapperImpl;
import it.pagopa.selfcare.user.generated.openapi.v1.dto.*;
import it.pagopa.selfcare.user.generated.openapi.v1.dto.OnboardedProductWithActions;
import it.pagopa.selfcare.user.generated.openapi.v1.dto.*;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
Expand Down Expand Up @@ -635,4 +635,80 @@ void retrieveFilteredUserInstitutionReturnsEmptyListWhenNoUserInstitutions() {
assertEquals(0, result.size());
}

@Test
void getUserByUserIdInstitutionIdAndProductAndStates() throws IOException{

// given
String institutionId = "institutionId";
String userId = "userId";
String productId = "productId";
List<String> statusFilter = List.of(ACTIVE.name(), SUSPENDED.name());


// Simulate response from API by reading from a JSON file
ClassPathResource resourceResponse = new ClassPathResource("stubs/UserDataResponse.json");
byte[] responseData = Files.readAllBytes(resourceResponse.getFile().toPath());
List<UserDataResponse> userDataResponseList = objectMapper.readValue(responseData, new TypeReference<>() {});

UserInfo expectedUserInfo = userMapper.toUserInfo(userDataResponseList.get(0));

when(userApiRestClient._usersUserIdInstitutionInstitutionIdGet(
institutionId,
userId,
userId,
null,
List.of(productId),
null,
statusFilter))
.thenReturn(ResponseEntity.ok(userDataResponseList));

// when
UserInfo result = userConnector.getUserByUserIdInstitutionIdAndProductAndStates(userId, institutionId, productId, statusFilter);

// then
assertNotNull(result);
assertEquals(expectedUserInfo, result);
verify(userApiRestClient, times(1))._usersUserIdInstitutionInstitutionIdGet(
institutionId,
userId,
userId,
null,
List.of(productId),
null,
statusFilter);
}

@Test
void getUserByUserIdInstitutionIdAndProductAndStates_throwsResourceNotFoundException() {
// given
String institutionId = "institutionId";
String userId = "userId";
String productId = "productId";
List<String> statusFilter = List.of(ACTIVE.name(), SUSPENDED.name());

when(userApiRestClient._usersUserIdInstitutionInstitutionIdGet(
institutionId,
userId,
userId,
null,
List.of(productId),
null,
statusFilter))
.thenReturn(ResponseEntity.ok(Collections.emptyList()));

// when
Executable executable = () -> userConnector.getUserByUserIdInstitutionIdAndProductAndStates(userId, institutionId, productId, statusFilter);

// then
assertThrows(ResourceNotFoundException.class, executable);
verify(userApiRestClient, times(1))._usersUserIdInstitutionInstitutionIdGet(
institutionId,
userId,
userId,
null,
List.of(productId),
null,
statusFilter);
}

}
Loading

0 comments on commit 3c18906

Please sign in to comment.