From 05a1a7de547c52db93eb2f40d773bc69f6c62ce4 Mon Sep 17 00:00:00 2001 From: yhampe Date: Thu, 4 Jul 2024 15:04:12 +0200 Subject: [PATCH 1/3] RED-9393: user stats endpoint added endpoint --- .../impl/controller/UserStatsController.java | 56 +++++++++++++++++++ .../v1/api/external/model/UserStats.java | 18 ++++++ .../external/resource/UserStatsResource.java | 38 +++++++++++++ 3 files changed, 112 insertions(+) create mode 100644 persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/UserStatsController.java create mode 100644 persistence-service-v1/persistence-service-external-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/external/model/UserStats.java create mode 100644 persistence-service-v1/persistence-service-external-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/external/resource/UserStatsResource.java diff --git a/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/UserStatsController.java b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/UserStatsController.java new file mode 100644 index 000000000..25135a9ec --- /dev/null +++ b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/UserStatsController.java @@ -0,0 +1,56 @@ +package com.iqser.red.persistence.service.v1.external.api.impl.controller; + +import java.util.List; +import java.util.stream.Collectors; + +import org.springframework.web.bind.annotation.RestController; + +import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.DossierEntity; +import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.FileEntity; +import com.iqser.red.service.persistence.management.v1.processor.service.DossierService; +import com.iqser.red.service.persistence.management.v1.processor.service.FileStatusManagementService; +import com.iqser.red.service.persistence.management.v1.processor.service.persistence.FileStatusPersistenceService; +import com.iqser.red.service.persistence.management.v1.processor.service.users.UserService; +import com.iqser.red.service.persistence.service.v1.api.external.model.UserStats; +import com.iqser.red.service.persistence.service.v1.api.external.resource.UserStatsResource; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +@Slf4j +@RestController +@RequiredArgsConstructor +public class UserStatsController implements UserStatsResource { + + private final UserService userService; + private final DossierService dossierService; + private final FileStatusManagementService fileStatusManagementService; + private final FileStatusPersistenceService fileStatusPersistenceService; + + + @Override + public UserStats getUserStats(String userId) { + + if (userService.getUserById(userId) == null) { + return null; + } + List allDossiers = dossierService.getAllDossiers(); + List allFiels = fileStatusPersistenceService.getAllFiles() + .stream() + .filter(file -> file.getAssignee().equals(userId)) + .collect(Collectors.toList()); + int numberOfDossierOwnerships = allDossiers.stream() + .filter(dossier -> dossier.getOwnerId().equals(userId)) + .collect(Collectors.toList()).size(); + int numberOfDossierMemberships = allDossiers.stream() + .filter(dossier -> dossier.getMemberIds().contains(userId)) + .collect(Collectors.toList()).size(); + int numberOfAssignedFiles = allFiels.size(); + return UserStats.builder() + .numberOfDossierOwnerships(numberOfDossierOwnerships) + .numberOfDossierMemberships(numberOfDossierMemberships) + .numberOfAssignedFiles(numberOfAssignedFiles) + .build(); + } + +} diff --git a/persistence-service-v1/persistence-service-external-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/external/model/UserStats.java b/persistence-service-v1/persistence-service-external-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/external/model/UserStats.java new file mode 100644 index 000000000..b42656c94 --- /dev/null +++ b/persistence-service-v1/persistence-service-external-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/external/model/UserStats.java @@ -0,0 +1,18 @@ +package com.iqser.red.service.persistence.service.v1.api.external.model; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class UserStats { + + private int numberOfDossierMemberships; + private int numberOfDossierOwnerships; + private int numberOfAssignedFiles; + +} diff --git a/persistence-service-v1/persistence-service-external-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/external/resource/UserStatsResource.java b/persistence-service-v1/persistence-service-external-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/external/resource/UserStatsResource.java new file mode 100644 index 000000000..3ee71c2cd --- /dev/null +++ b/persistence-service-v1/persistence-service-external-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/external/resource/UserStatsResource.java @@ -0,0 +1,38 @@ +package com.iqser.red.service.persistence.service.v1.api.external.resource; + +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.ResponseStatus; + +import com.iqser.red.service.persistence.service.v1.api.external.model.UserStats; + +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import io.swagger.v3.oas.annotations.responses.ApiResponses; + +@ApiResponses(value = {@ApiResponse(responseCode = "429", description = "Too many requests.")}) +public interface UserStatsResource { + + String USER_PATH = "/users"; + + String USER_ID_PARAM = "userId"; + + String USER_ID_PATH_VARIABLE = "/{" + USER_ID_PARAM + "}"; + + String STATS_PATH = "/stats"; + + String PATH = ExternalApi.BASE_PATH + STATS_PATH + USER_PATH; + + + @ResponseStatus(value = HttpStatus.OK) + @ResponseBody + @GetMapping(value = PATH+ USER_ID_PATH_VARIABLE, produces = MediaType.APPLICATION_JSON_VALUE) + @Operation(summary = "Gets user stats for user specified by id.", description = "") + @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "OK"), @ApiResponse(responseCode = "404", description = "Not found")}) + UserStats getUserStats(@Parameter(name = USER_ID_PARAM, description = "The unique identifier of the user whose statistics we want to retrieve.", required = true) @PathVariable(USER_ID_PARAM) String userId); + +} From 21ed61bc61f99f0184fb6c07f4d3f189c6cdc2cd Mon Sep 17 00:00:00 2001 From: yhampe Date: Wed, 10 Jul 2024 08:27:39 +0200 Subject: [PATCH 2/3] RED-9393: user stats endpoint added endpoint --- .../impl/controller/UserStatsController.java | 19 ++++++++++--------- .../v1/api/external/model/UserStats.java | 2 +- .../v1/processor/roles/ActionRoles.java | 4 ++++ 3 files changed, 15 insertions(+), 10 deletions(-) diff --git a/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/UserStatsController.java b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/UserStatsController.java index 25135a9ec..45891c46e 100644 --- a/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/UserStatsController.java +++ b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/UserStatsController.java @@ -1,14 +1,16 @@ package com.iqser.red.persistence.service.v1.external.api.impl.controller; +import static com.iqser.red.service.persistence.management.v1.processor.roles.ActionRoles.READ_USER_STATS; + import java.util.List; import java.util.stream.Collectors; +import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.web.bind.annotation.RestController; import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.DossierEntity; import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.FileEntity; import com.iqser.red.service.persistence.management.v1.processor.service.DossierService; -import com.iqser.red.service.persistence.management.v1.processor.service.FileStatusManagementService; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.FileStatusPersistenceService; import com.iqser.red.service.persistence.management.v1.processor.service.users.UserService; import com.iqser.red.service.persistence.service.v1.api.external.model.UserStats; @@ -24,33 +26,32 @@ public class UserStatsController implements UserStatsResource { private final UserService userService; private final DossierService dossierService; - private final FileStatusManagementService fileStatusManagementService; private final FileStatusPersistenceService fileStatusPersistenceService; @Override + @PreAuthorize("hasAuthority('" + READ_USER_STATS + "')") public UserStats getUserStats(String userId) { if (userService.getUserById(userId) == null) { return null; } List allDossiers = dossierService.getAllDossiers(); - List allFiels = fileStatusPersistenceService.getAllFiles() + List allFiles = fileStatusPersistenceService.getAllFiles() .stream() + .filter(fileEntity -> fileEntity.getAssignee() != null) .filter(file -> file.getAssignee().equals(userId)) .collect(Collectors.toList()); int numberOfDossierOwnerships = allDossiers.stream() + .filter(fileEntity -> fileEntity.getOwnerId() != null) .filter(dossier -> dossier.getOwnerId().equals(userId)) .collect(Collectors.toList()).size(); int numberOfDossierMemberships = allDossiers.stream() + .filter(fileEntity -> fileEntity.getMemberIds() != null) .filter(dossier -> dossier.getMemberIds().contains(userId)) .collect(Collectors.toList()).size(); - int numberOfAssignedFiles = allFiels.size(); - return UserStats.builder() - .numberOfDossierOwnerships(numberOfDossierOwnerships) - .numberOfDossierMemberships(numberOfDossierMemberships) - .numberOfAssignedFiles(numberOfAssignedFiles) - .build(); + int numberOfAssignedFiles = allFiles.size(); + return new UserStats(numberOfDossierMemberships, numberOfDossierOwnerships, numberOfAssignedFiles); } } diff --git a/persistence-service-v1/persistence-service-external-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/external/model/UserStats.java b/persistence-service-v1/persistence-service-external-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/external/model/UserStats.java index b42656c94..1988b77b1 100644 --- a/persistence-service-v1/persistence-service-external-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/external/model/UserStats.java +++ b/persistence-service-v1/persistence-service-external-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/external/model/UserStats.java @@ -4,10 +4,10 @@ import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; +import lombok.Setter; @Data @Builder -@NoArgsConstructor @AllArgsConstructor public class UserStats { diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/roles/ActionRoles.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/roles/ActionRoles.java index cb81b38d3..3db46c5a1 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/roles/ActionRoles.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/roles/ActionRoles.java @@ -171,6 +171,10 @@ public final class ActionRoles { // RSS public static final String GET_RSS = "red-get-rss"; + // USER STATS + + public static final String READ_USER_STATS = "red-get-user-stats"; + // Multitenancy public static final String CREATE_TENANT = "red-create-tenant"; public static final String GET_TENANTS = "red-get-tenants"; From f231a757226a7b40c746ba2a6ee53899e52a0673 Mon Sep 17 00:00:00 2001 From: yhampe Date: Wed, 10 Jul 2024 09:17:58 +0200 Subject: [PATCH 3/3] RED-9393: user stats endpoint checkstyle --- .../persistence/service/v1/api/external/model/UserStats.java | 4 ---- 1 file changed, 4 deletions(-) diff --git a/persistence-service-v1/persistence-service-external-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/external/model/UserStats.java b/persistence-service-v1/persistence-service-external-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/external/model/UserStats.java index 1988b77b1..93d9390cf 100644 --- a/persistence-service-v1/persistence-service-external-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/external/model/UserStats.java +++ b/persistence-service-v1/persistence-service-external-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/external/model/UserStats.java @@ -1,13 +1,9 @@ package com.iqser.red.service.persistence.service.v1.api.external.model; import lombok.AllArgsConstructor; -import lombok.Builder; import lombok.Data; -import lombok.NoArgsConstructor; -import lombok.Setter; @Data -@Builder @AllArgsConstructor public class UserStats {