Skip to content

Commit fcc5fbe

Browse files
[SELC-6286] feat: using enums PartyRole and OnboardedProductState. added enum validation in new users count api
1 parent 900f5f3 commit fcc5fbe

File tree

13 files changed

+133
-51
lines changed

13 files changed

+133
-51
lines changed

apps/user-ms/src/main/docs/openapi.json

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1575,6 +1575,10 @@
15751575
}
15761576
}
15771577
},
1578+
"PartyRole" : {
1579+
"enum" : [ "MANAGER", "DELEGATE", "SUB_DELEGATE", "OPERATOR", "ADMIN_EA" ],
1580+
"type" : "string"
1581+
},
15781582
"PermissionTypeEnum" : {
15791583
"enum" : [ "ADMIN", "ANY" ],
15801584
"type" : "string"
@@ -2012,13 +2016,13 @@
20122016
"roles" : {
20132017
"type" : "array",
20142018
"items" : {
2015-
"type" : "string"
2019+
"$ref" : "#/components/schemas/PartyRole"
20162020
}
20172021
},
20182022
"status" : {
20192023
"type" : "array",
20202024
"items" : {
2021-
"type" : "string"
2025+
"$ref" : "#/components/schemas/OnboardedProductState"
20222026
}
20232027
},
20242028
"count" : {

apps/user-ms/src/main/docs/openapi.yaml

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1140,6 +1140,14 @@ components:
11401140
type: array
11411141
items:
11421142
type: string
1143+
PartyRole:
1144+
enum:
1145+
- MANAGER
1146+
- DELEGATE
1147+
- SUB_DELEGATE
1148+
- OPERATOR
1149+
- ADMIN_EA
1150+
type: string
11431151
PermissionTypeEnum:
11441152
enum:
11451153
- ADMIN
@@ -1456,11 +1464,11 @@ components:
14561464
roles:
14571465
type: array
14581466
items:
1459-
type: string
1467+
$ref: "#/components/schemas/PartyRole"
14601468
status:
14611469
type: array
14621470
items:
1463-
type: string
1471+
$ref: "#/components/schemas/OnboardedProductState"
14641472
count:
14651473
format: int64
14661474
type: integer

apps/user-ms/src/main/java/it/pagopa/selfcare/user/controller/InstitutionController.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,14 @@
33
import io.quarkus.security.Authenticated;
44
import io.smallrye.mutiny.Multi;
55
import io.smallrye.mutiny.Uni;
6+
import it.pagopa.selfcare.onboarding.common.PartyRole;
67
import it.pagopa.selfcare.user.controller.request.UpdateDescriptionDto;
78
import it.pagopa.selfcare.user.controller.response.UserInstitutionResponse;
89
import it.pagopa.selfcare.user.controller.response.UserProductResponse;
910
import it.pagopa.selfcare.user.controller.response.UsersCountResponse;
11+
import it.pagopa.selfcare.user.model.constants.OnboardedProductState;
1012
import it.pagopa.selfcare.user.service.UserService;
13+
import it.pagopa.selfcare.user.util.GeneralUtils;
1114
import jakarta.validation.Valid;
1215
import jakarta.ws.rs.*;
1316
import jakarta.ws.rs.core.MediaType;
@@ -84,7 +87,9 @@ public Uni<UsersCountResponse> getUsersCount(@PathParam(value = "institutionId")
8487
@PathParam(value = "productId") String productId,
8588
@QueryParam(value = "roles") List<String> roles,
8689
@QueryParam(value = "status") List<String> status) {
87-
return userService.getUsersCount(institutionId, productId, roles, status);
90+
final List<PartyRole> roleList = GeneralUtils.parseEnumList(roles, PartyRole.class);
91+
final List<OnboardedProductState> statusList = GeneralUtils.parseEnumList(status, OnboardedProductState.class);
92+
return userService.getUsersCount(institutionId, productId, roleList, statusList);
8893
}
8994

9095
@Operation(

apps/user-ms/src/main/java/it/pagopa/selfcare/user/controller/response/UsersCountResponse.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package it.pagopa.selfcare.user.controller.response;
22

3+
import it.pagopa.selfcare.onboarding.common.PartyRole;
4+
import it.pagopa.selfcare.user.model.constants.OnboardedProductState;
35
import lombok.AllArgsConstructor;
46
import lombok.Data;
57
import lombok.NoArgsConstructor;
@@ -13,8 +15,8 @@ public class UsersCountResponse {
1315

1416
private String institutionId;
1517
private String productId;
16-
private List<String> roles;
17-
private List<String> status;
18+
private List<PartyRole> roles;
19+
private List<OnboardedProductState> status;
1820
private Long count;
1921

2022
}

apps/user-ms/src/main/java/it/pagopa/selfcare/user/service/UserInstitutionService.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,6 @@ public interface UserInstitutionService {
4949

5050
Uni<Long> updateInstitutionDescription(String institutionId, UpdateDescriptionDto updateDescriptionDto);
5151

52-
Uni<Long> countUsers(String institutionId, String productId, List<String> roles, List<String> status);
52+
Uni<Long> countUsers(String institutionId, String productId, List<PartyRole> roles, List<OnboardedProductState> status);
5353

5454
}

apps/user-ms/src/main/java/it/pagopa/selfcare/user/service/UserInstitutionServiceDefault.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -263,7 +263,7 @@ public Uni<Boolean> runUserInstitutionCountQuery(Document query) {
263263
}
264264

265265
@Override
266-
public Uni<Long> countUsers(String institutionId, String productId, List<String> roles, List<String> status) {
266+
public Uni<Long> countUsers(String institutionId, String productId, List<PartyRole> roles, List<OnboardedProductState> status) {
267267
final Map<String, Object> userFilter = UserInstitutionFilter.builder()
268268
.institutionId(institutionId)
269269
.build().constructMap();

apps/user-ms/src/main/java/it/pagopa/selfcare/user/service/UserService.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,5 +60,5 @@ public interface UserService {
6060

6161
Uni<UserInstitutionWithActions> getUserInstitutionWithPermission(String userId, String institutionId, String productId);
6262

63-
Uni<UsersCountResponse> getUsersCount(String institutionId, String productId, List<String> roles, List<String> status);
63+
Uni<UsersCountResponse> getUsersCount(String institutionId, String productId, List<PartyRole> roles, List<OnboardedProductState> status);
6464
}

apps/user-ms/src/main/java/it/pagopa/selfcare/user/service/UserServiceImpl.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -814,9 +814,9 @@ private List<OnboardedProductWithActions> filterProductAndAddActions(UserInstitu
814814
}
815815

816816
@Override
817-
public Uni<UsersCountResponse> getUsersCount(String institutionId, String productId, List<String> roles, List<String> status) {
818-
final List<String> roleList = Optional.ofNullable(roles).filter(l -> !l.isEmpty()).orElse(null);
819-
final List<String> statusList = Optional.ofNullable(status).filter(l -> !l.isEmpty()).orElse(List.of(ACTIVE.name()));
817+
public Uni<UsersCountResponse> getUsersCount(String institutionId, String productId, List<PartyRole> roles, List<OnboardedProductState> status) {
818+
final List<PartyRole> roleList = Optional.ofNullable(roles).filter(l -> !l.isEmpty()).orElse(List.of(PartyRole.values()));
819+
final List<OnboardedProductState> statusList = Optional.ofNullable(status).filter(l -> !l.isEmpty()).orElse(List.of(OnboardedProductState.ACTIVE));
820820
return userInstitutionService.countUsers(institutionId, productId, roleList, statusList)
821821
.onItem().transform(count -> new UsersCountResponse(institutionId, productId, roleList, statusList, count));
822822
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,42 @@
11
package it.pagopa.selfcare.user.util;
22

3+
import it.pagopa.selfcare.user.exception.InvalidRequestException;
4+
35
import java.util.Arrays;
6+
import java.util.Collections;
47
import java.util.List;
58
import java.util.Objects;
69

710
public class GeneralUtils {
811

912
private static final String DELIMITER = ",";
1013

14+
private GeneralUtils() {}
15+
1116
public static List<String> formatQueryParameterList(List<String> list) {
1217
if(Objects.nonNull(list) && list.size() == 1 && list.get(0).contains(DELIMITER)) {
1318
return Arrays.asList(list.get(0).split(DELIMITER));
1419
}
1520
return list;
1621
}
22+
23+
/**
24+
* Convert a list of string in a list of values of an enum.
25+
* Throw an InvalidRequestException when a string doesn't match a value inside the enum.
26+
*
27+
* @param values a list of strings
28+
* @param enumClass the enum class
29+
* @return a list of enum values
30+
* @param <T> the enum type
31+
*/
32+
public static <T extends Enum<T>> List<T> parseEnumList(List<String> values, Class<T> enumClass) {
33+
return values != null ? values.stream().map(v -> {
34+
try {
35+
return Enum.valueOf(enumClass, v);
36+
} catch (IllegalArgumentException ex) {
37+
throw new InvalidRequestException(String.format("Invalid value %s for %s", v, enumClass.getSimpleName()));
38+
}
39+
}).toList() : Collections.emptyList();
40+
}
41+
1742
}

apps/user-ms/src/test/java/it/pagopa/selfcare/user/controller/InstitutionControllerTest.java

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,13 @@
77
import io.restassured.http.ContentType;
88
import io.smallrye.mutiny.Multi;
99
import io.smallrye.mutiny.Uni;
10+
import it.pagopa.selfcare.onboarding.common.PartyRole;
1011
import it.pagopa.selfcare.user.controller.request.UpdateDescriptionDto;
1112
import it.pagopa.selfcare.user.controller.response.UserInstitutionResponse;
1213
import it.pagopa.selfcare.user.controller.response.UserProductResponse;
1314
import it.pagopa.selfcare.user.controller.response.UsersCountResponse;
1415
import it.pagopa.selfcare.user.exception.ResourceNotFoundException;
16+
import it.pagopa.selfcare.user.model.constants.OnboardedProductState;
1517
import it.pagopa.selfcare.user.service.UserService;
1618
import org.junit.jupiter.api.Test;
1719
import org.mockito.Mockito;
@@ -212,8 +214,8 @@ void updateInstitutionDescription_NotAuthorized() {
212214
void getUsersCount() {
213215
final String institutionId = "institutionId";
214216
final String productId = "productId";
215-
final List<String> roles = List.of("role1", "role2");
216-
final List<String> status = List.of("status1", "status2");
217+
final List<PartyRole> roles = List.of(PartyRole.MANAGER, PartyRole.DELEGATE);
218+
final List<OnboardedProductState> status = List.of(OnboardedProductState.ACTIVE, OnboardedProductState.PENDING);
217219

218220
Mockito.when(userService.getUsersCount(institutionId, productId, roles, status))
219221
.thenReturn(Uni.createFrom().item(new UsersCountResponse(institutionId, productId, roles, status, 2L)));
@@ -223,8 +225,8 @@ void getUsersCount() {
223225
.contentType(ContentType.JSON)
224226
.pathParam("institutionId", institutionId)
225227
.pathParam("productId", productId)
226-
.queryParam("roles", roles)
227-
.queryParam("status", status)
228+
.queryParam("roles", List.of("MANAGER", "DELEGATE"))
229+
.queryParam("status", List.of("ACTIVE", "PENDING"))
228230
.get("/{institutionId}/products/{productId}/users/count")
229231
.then()
230232
.statusCode(200);

0 commit comments

Comments
 (0)