From 05a1a7de547c52db93eb2f40d773bc69f6c62ce4 Mon Sep 17 00:00:00 2001 From: yhampe Date: Thu, 4 Jul 2024 15:04:12 +0200 Subject: [PATCH 01/12] 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); + +} -- 2.47.2 From 21ed61bc61f99f0184fb6c07f4d3f189c6cdc2cd Mon Sep 17 00:00:00 2001 From: yhampe Date: Wed, 10 Jul 2024 08:27:39 +0200 Subject: [PATCH 02/12] 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"; -- 2.47.2 From f231a757226a7b40c746ba2a6ee53899e52a0673 Mon Sep 17 00:00:00 2001 From: yhampe Date: Wed, 10 Jul 2024 09:17:58 +0200 Subject: [PATCH 03/12] 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 { -- 2.47.2 From 98c2aed8ba8cd88bf9d9807bb23f524aeee8496c Mon Sep 17 00:00:00 2001 From: yhampe Date: Thu, 4 Jul 2024 15:04:12 +0200 Subject: [PATCH 04/12] 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); + +} -- 2.47.2 From ecddef18512b5cd80f85f93035f3caf82de456e8 Mon Sep 17 00:00:00 2001 From: yhampe Date: Wed, 10 Jul 2024 08:27:39 +0200 Subject: [PATCH 05/12] 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"; -- 2.47.2 From 8f3cec426b7f14717687e5562e151911d49466a9 Mon Sep 17 00:00:00 2001 From: yhampe Date: Wed, 10 Jul 2024 09:17:58 +0200 Subject: [PATCH 06/12] 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 { -- 2.47.2 From b5819178b3a2044c15b45b3c8d55034c14a93203 Mon Sep 17 00:00:00 2001 From: yhampe Date: Wed, 10 Jul 2024 09:56:39 +0200 Subject: [PATCH 07/12] RED-9393: user stats endpoint checkstyle --- .../v1/external/api/impl/controller/UserStatsController.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) 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 45891c46e..1931772ec 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 @@ -51,7 +51,8 @@ public class UserStatsController implements UserStatsResource { .filter(dossier -> dossier.getMemberIds().contains(userId)) .collect(Collectors.toList()).size(); int numberOfAssignedFiles = allFiles.size(); - return new UserStats(numberOfDossierMemberships, numberOfDossierOwnerships, numberOfAssignedFiles); + UserStats userStats = new UserStats(numberOfDossierMemberships, numberOfDossierOwnerships, numberOfAssignedFiles); + return userStats; } } -- 2.47.2 From a6b275a928ae97eb3771d8fc31a1bfd675724914 Mon Sep 17 00:00:00 2001 From: yhampe Date: Wed, 10 Jul 2024 10:05:02 +0200 Subject: [PATCH 08/12] RED-9393: user stats endpoint checkstyle --- .../service/v1/api/external/model/UserStats.java | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 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 93d9390cf..568d185b8 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,12 +1,18 @@ package com.iqser.red.service.persistence.service.v1.api.external.model; -import lombok.AllArgsConstructor; import lombok.Data; @Data -@AllArgsConstructor public class UserStats { + public UserStats(int numberOfDossierMemberships, int numberOfDossierOwnerships, int numberOfAssignedFiles) { + + this.numberOfDossierMemberships = numberOfDossierMemberships; + this.numberOfDossierOwnerships = numberOfDossierOwnerships; + this.numberOfAssignedFiles = numberOfAssignedFiles; + } + + private int numberOfDossierMemberships; private int numberOfDossierOwnerships; private int numberOfAssignedFiles; -- 2.47.2 From 019bec4496cc17cdb1d6150d7318c67646bfd3b0 Mon Sep 17 00:00:00 2001 From: yhampe Date: Wed, 10 Jul 2024 13:05:22 +0200 Subject: [PATCH 09/12] RED-9393: user stats endpoint fix pipeline --- .../v1/external/api/impl/model/UserStats.java | 14 ++++++++++++++ 1 file changed, 14 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/model/UserStats.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/model/UserStats.java b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/model/UserStats.java new file mode 100644 index 000000000..a71fc0805 --- /dev/null +++ b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/model/UserStats.java @@ -0,0 +1,14 @@ +package com.iqser.red.persistence.service.v1.external.api.impl.model; + +import lombok.AllArgsConstructor; +import lombok.Data; + +@Data +@AllArgsConstructor +public class UserStats { + + private int numberOfDossierMemberships; + private int numberOfDossierOwnerships; + private int numberOfAssignedFiles; + +} -- 2.47.2 From e114291f566ece5eab6679f9b2da5584a002d97b Mon Sep 17 00:00:00 2001 From: yhampe Date: Wed, 10 Jul 2024 13:10:49 +0200 Subject: [PATCH 10/12] RED-9393: user stats endpoint qualitiy gate --- .../api/impl/controller/UserStatsController.java | 12 +++++------- 1 file changed, 5 insertions(+), 7 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 1931772ec..ee8c2357a 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 @@ -3,7 +3,6 @@ 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; @@ -33,7 +32,7 @@ public class UserStatsController implements UserStatsResource { @PreAuthorize("hasAuthority('" + READ_USER_STATS + "')") public UserStats getUserStats(String userId) { - if (userService.getUserById(userId) == null) { + if (!userService.getUserById(userId).isEmpty()) { return null; } List allDossiers = dossierService.getAllDossiers(); @@ -41,18 +40,17 @@ public class UserStatsController implements UserStatsResource { .stream() .filter(fileEntity -> fileEntity.getAssignee() != null) .filter(file -> file.getAssignee().equals(userId)) - .collect(Collectors.toList()); + .toList(); int numberOfDossierOwnerships = allDossiers.stream() .filter(fileEntity -> fileEntity.getOwnerId() != null) .filter(dossier -> dossier.getOwnerId().equals(userId)) - .collect(Collectors.toList()).size(); + .toList().size(); int numberOfDossierMemberships = allDossiers.stream() .filter(fileEntity -> fileEntity.getMemberIds() != null) .filter(dossier -> dossier.getMemberIds().contains(userId)) - .collect(Collectors.toList()).size(); + .toList().size(); int numberOfAssignedFiles = allFiles.size(); - UserStats userStats = new UserStats(numberOfDossierMemberships, numberOfDossierOwnerships, numberOfAssignedFiles); - return userStats; + return new UserStats(numberOfDossierMemberships, numberOfDossierOwnerships, numberOfAssignedFiles); } } -- 2.47.2 From d8c162918e2f970a303b63e54a5637efeee5761e Mon Sep 17 00:00:00 2001 From: yhampe Date: Wed, 10 Jul 2024 13:35:19 +0200 Subject: [PATCH 11/12] RED-9393: user stats endpoint added queries --- .../impl/controller/UserStatsController.java | 25 +++---------------- .../entity/dossier/DossierEntity.java | 23 ++++++++--------- .../v1/processor/service/DossierService.java | 12 +++++++++ .../DossierPersistenceService.java | 14 +++++++++++ .../FileStatusPersistenceService.java | 16 +++++++++--- .../repository/DossierRepository.java | 8 ++++++ .../repository/FileRepository.java | 4 +++ 7 files changed, 66 insertions(+), 36 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 ee8c2357a..916b0aba4 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 @@ -2,13 +2,9 @@ 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 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.persistence.FileStatusPersistenceService; import com.iqser.red.service.persistence.management.v1.processor.service.users.UserService; @@ -32,25 +28,12 @@ public class UserStatsController implements UserStatsResource { @PreAuthorize("hasAuthority('" + READ_USER_STATS + "')") public UserStats getUserStats(String userId) { - if (!userService.getUserById(userId).isEmpty()) { + if (userService.getUserById(userId).isEmpty()) { return null; } - List allDossiers = dossierService.getAllDossiers(); - List allFiles = fileStatusPersistenceService.getAllFiles() - .stream() - .filter(fileEntity -> fileEntity.getAssignee() != null) - .filter(file -> file.getAssignee().equals(userId)) - .toList(); - int numberOfDossierOwnerships = allDossiers.stream() - .filter(fileEntity -> fileEntity.getOwnerId() != null) - .filter(dossier -> dossier.getOwnerId().equals(userId)) - .toList().size(); - int numberOfDossierMemberships = allDossiers.stream() - .filter(fileEntity -> fileEntity.getMemberIds() != null) - .filter(dossier -> dossier.getMemberIds().contains(userId)) - .toList().size(); - int numberOfAssignedFiles = allFiles.size(); - return new UserStats(numberOfDossierMemberships, numberOfDossierOwnerships, numberOfAssignedFiles); + return new UserStats(this.dossierService.getNumberOfDossierMemberships(userId), + this.dossierService.getNumberOfDossierOwnerships(userId), + this.fileStatusPersistenceService.getNumberOfAssignedFiles(userId)); } } diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/dossier/DossierEntity.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/dossier/DossierEntity.java index feeb1226b..b0886bc76 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/dossier/DossierEntity.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/dossier/DossierEntity.java @@ -6,6 +6,17 @@ import java.util.HashSet; import java.util.List; import java.util.Set; +import org.hibernate.annotations.Fetch; +import org.hibernate.annotations.FetchMode; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.iqser.red.service.persistence.management.v1.processor.entity.configuration.TypeEntity; +import com.iqser.red.service.persistence.management.v1.processor.entity.configuration.WatermarkEntity; +import com.iqser.red.service.persistence.management.v1.processor.utils.JSONDownloadFileTypeConverter; +import com.iqser.red.service.persistence.management.v1.processor.utils.JSONStringSetConverter; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.DownloadFileType; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.DossierVisibility; + import jakarta.persistence.CascadeType; import jakarta.persistence.Column; import jakarta.persistence.Convert; @@ -19,18 +30,6 @@ import jakarta.persistence.ManyToMany; import jakarta.persistence.ManyToOne; import jakarta.persistence.OneToMany; import jakarta.persistence.Table; - -import org.hibernate.annotations.Fetch; -import org.hibernate.annotations.FetchMode; - -import com.fasterxml.jackson.annotation.JsonIgnore; -import com.iqser.red.service.persistence.management.v1.processor.entity.configuration.TypeEntity; -import com.iqser.red.service.persistence.management.v1.processor.entity.configuration.WatermarkEntity; -import com.iqser.red.service.persistence.management.v1.processor.utils.JSONDownloadFileTypeConverter; -import com.iqser.red.service.persistence.management.v1.processor.utils.JSONStringSetConverter; -import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.DownloadFileType; -import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.DossierVisibility; - import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/DossierService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/DossierService.java index 8a18c26d4..348393251 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/DossierService.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/DossierService.java @@ -142,6 +142,18 @@ public class DossierService { } + public int getNumberOfDossierOwnerships(String userId) { + + return dossierPersistenceService.getNumberOfDossierOwnerships(userId); + } + + + public int getNumberOfDossierMemberships(String userId) { + + return dossierPersistenceService.getNumberOfDossierMemberships(userId); + } + + public List getAllDossiers(List dossierIds) { return dossierPersistenceService.findAllDossiers(dossierIds); diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/DossierPersistenceService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/DossierPersistenceService.java index a4e10a712..65f556b5a 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/DossierPersistenceService.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/DossierPersistenceService.java @@ -179,6 +179,20 @@ public class DossierPersistenceService { } + public int getNumberOfDossierOwnerships(String userId) { + + List dossiers = dossierRepository.findDossiersByOwnerId(userId); + return dossiers.size(); + } + + + public int getNumberOfDossierMemberships(String userId) { + + List dossiers = dossierRepository.findDossiersByMemberId(userId); + return dossiers.size(); + } + + public List findAllDossiers(List dossierIds) { if (!dossierIds.isEmpty()) { diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/FileStatusPersistenceService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/FileStatusPersistenceService.java index 4ca594587..673fb5523 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/FileStatusPersistenceService.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/FileStatusPersistenceService.java @@ -22,9 +22,9 @@ import com.iqser.red.service.persistence.management.v1.processor.exception.NotFo import com.iqser.red.service.persistence.management.v1.processor.model.FileIdentifier; import com.iqser.red.service.persistence.management.v1.processor.model.OCRStatusUpdateResponse; import com.iqser.red.service.persistence.management.v1.processor.model.websocket.AnalyseStatus; -import com.iqser.red.service.persistence.management.v1.processor.service.websocket.WebsocketService; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.FileAttributesRepository; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.FileRepository; +import com.iqser.red.service.persistence.management.v1.processor.service.websocket.WebsocketService; import com.iqser.red.service.persistence.service.v1.api.shared.model.FileAttribute; import com.iqser.red.service.persistence.service.v1.api.shared.model.component.ComponentMappingMetadata; import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.file.FileErrorInfo; @@ -403,7 +403,10 @@ public class FileStatusPersistenceService { public List getStatusesForDossierTemplate(String dossierTemplateId) { return dossierService.findAllDossiersForDossierTemplateId(dossierTemplateId) - .stream().map(dossier -> fileRepository.findByDossierId(dossier.getId())).flatMap(List::stream).toList(); + .stream() + .map(dossier -> fileRepository.findByDossierId(dossier.getId())) + .flatMap(List::stream) + .toList(); } @@ -434,6 +437,13 @@ public class FileStatusPersistenceService { } + public int getNumberOfAssignedFiles(String userId) { + + List files = fileRepository.findFilesByAssignee(userId); + return files.size(); + } + + public List getSoftDeletedFiles(List dossierIds) { return fileRepository.getSoftDeletedFiles(dossierIds); @@ -453,7 +463,7 @@ public class FileStatusPersistenceService { @Transactional public void softDelete(String fileId, OffsetDateTime softDeletedTime) { - fileRepository.setSoftDelete(fileId, ProcessingStatus.PROCESSED, OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS), softDeletedTime); + fileRepository.setSoftDelete(fileId, ProcessingStatus.PROCESSED, OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS), softDeletedTime); } diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/DossierRepository.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/DossierRepository.java index 6a3b41d3b..e7a67962d 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/DossierRepository.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/DossierRepository.java @@ -18,6 +18,14 @@ public interface DossierRepository extends JpaRepository List findDossierChangeByLastUpdatedIsAfter(@Param("since") OffsetDateTime since); + @Query("select d from DossierEntity d where d.ownerId = :ownerId") + List findDossiersByOwnerId(@Param("ownerId") String ownerId); + + + @Query(value = "select * from DossierEntity d where JSON_CONTAINS(d.members, :memberId, '$')", nativeQuery = true) + List findDossiersByMemberId(@Param("memberId") String memberId); + + @Modifying @Query("update DossierEntity d set d.softDeletedTime = null, d.lastUpdated = :lastUpdated where d.id = :dossierId" + " and d.hardDeletedTime is null") int undelete(@Param("dossierId") String dossierId, @Param("lastUpdated") OffsetDateTime lastUpdated); diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/FileRepository.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/FileRepository.java index 16d4538b8..b7b00c339 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/FileRepository.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/FileRepository.java @@ -46,6 +46,10 @@ public interface FileRepository extends JpaRepository { @Param("hasUpdates") boolean hasUpdates); + @Query("select f from FileEntity f where f.assignee = :assignee") + List findFilesByAssignee(@Param("assignee") String assignee); + + @Modifying @Query(""" update FileEntity f set f.numberOfPages = :numberOfPages, \ -- 2.47.2 From 1afc3623d536072fb44f7905509358feb685f46c Mon Sep 17 00:00:00 2001 From: yhampe Date: Fri, 12 Jul 2024 14:54:01 +0200 Subject: [PATCH 12/12] RED-9393: user stats endpoint removed some queries since they wont work because of spring acl stuff --- .../impl/controller/UserStatsController.java | 24 ++++++++++++++----- .../acl/custom/dossier/DossierACLService.java | 17 +++++++++++++ .../entity/dossier/DossierEntity.java | 1 + .../v1/processor/service/DossierService.java | 12 ---------- .../DossierPersistenceService.java | 14 ----------- .../repository/DossierRepository.java | 8 ------- 6 files changed, 36 insertions(+), 40 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 916b0aba4..43f7aac23 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,10 +1,11 @@ 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.ArrayList; +import java.util.List; -import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.web.bind.annotation.RestController; +import com.iqser.red.service.persistence.management.v1.processor.acl.custom.dossier.DossierACLService; import com.iqser.red.service.persistence.management.v1.processor.service.DossierService; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.FileStatusPersistenceService; import com.iqser.red.service.persistence.management.v1.processor.service.users.UserService; @@ -22,18 +23,29 @@ public class UserStatsController implements UserStatsResource { private final UserService userService; private final DossierService dossierService; private final FileStatusPersistenceService fileStatusPersistenceService; + private final DossierACLService dossierACLService; @Override - @PreAuthorize("hasAuthority('" + READ_USER_STATS + "')") public UserStats getUserStats(String userId) { if (userService.getUserById(userId).isEmpty()) { return null; } - return new UserStats(this.dossierService.getNumberOfDossierMemberships(userId), - this.dossierService.getNumberOfDossierOwnerships(userId), - this.fileStatusPersistenceService.getNumberOfAssignedFiles(userId)); + List dossierMemberships = new ArrayList<>(); + List dossierOwnerships = new ArrayList<>(); + dossierService.getAllDossiers() + .stream() + .forEach(d -> { + if (dossierACLService.getMembers(d.getId()).contains(userId)) { + dossierMemberships.add(d.getId()); + } + if (dossierACLService.getOwners(d.getId()).contains(userId)) { + dossierOwnerships.add(d.getId()); + } + }); + + return new UserStats(dossierMemberships.size(), dossierOwnerships.size(), this.fileStatusPersistenceService.getNumberOfAssignedFiles(userId)); } } diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/acl/custom/dossier/DossierACLService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/acl/custom/dossier/DossierACLService.java index b60076a01..b0abc0fb2 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/acl/custom/dossier/DossierACLService.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/acl/custom/dossier/DossierACLService.java @@ -71,6 +71,23 @@ public class DossierACLService extends AbstractACLService { return members; } + public Set getOwners(String dossierId) { + + ObjectIdentityImpl dossierIdentity = new ObjectIdentityImpl(getIdentifier(), dossierId); + var acl = mutableAclService.readAclById(dossierIdentity); + Set members = new HashSet<>(); + acl.getEntries() + .forEach(entry -> { + if (entry.getSid() instanceof PrincipalSid) { + var principal = ((PrincipalSid) entry.getSid()).getPrincipal(); + if (entry.getPermission().getMask() == RedPermission.OWNER.getMask()) { + members.add(principal); + } + } + }); + return members; + } + @Override public String getIdentifier() { diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/dossier/DossierEntity.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/dossier/DossierEntity.java index b0886bc76..e0bd18fe9 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/dossier/DossierEntity.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/entity/dossier/DossierEntity.java @@ -20,6 +20,7 @@ import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemp import jakarta.persistence.CascadeType; import jakarta.persistence.Column; import jakarta.persistence.Convert; +import jakarta.persistence.ElementCollection; import jakarta.persistence.Entity; import jakarta.persistence.EnumType; import jakarta.persistence.Enumerated; diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/DossierService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/DossierService.java index 348393251..8a18c26d4 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/DossierService.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/DossierService.java @@ -142,18 +142,6 @@ public class DossierService { } - public int getNumberOfDossierOwnerships(String userId) { - - return dossierPersistenceService.getNumberOfDossierOwnerships(userId); - } - - - public int getNumberOfDossierMemberships(String userId) { - - return dossierPersistenceService.getNumberOfDossierMemberships(userId); - } - - public List getAllDossiers(List dossierIds) { return dossierPersistenceService.findAllDossiers(dossierIds); diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/DossierPersistenceService.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/DossierPersistenceService.java index 65f556b5a..a4e10a712 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/DossierPersistenceService.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/DossierPersistenceService.java @@ -179,20 +179,6 @@ public class DossierPersistenceService { } - public int getNumberOfDossierOwnerships(String userId) { - - List dossiers = dossierRepository.findDossiersByOwnerId(userId); - return dossiers.size(); - } - - - public int getNumberOfDossierMemberships(String userId) { - - List dossiers = dossierRepository.findDossiersByMemberId(userId); - return dossiers.size(); - } - - public List findAllDossiers(List dossierIds) { if (!dossierIds.isEmpty()) { diff --git a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/DossierRepository.java b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/DossierRepository.java index e7a67962d..6a3b41d3b 100644 --- a/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/DossierRepository.java +++ b/persistence-service-v1/persistence-service-processor-v1/src/main/java/com/iqser/red/service/persistence/management/v1/processor/service/persistence/repository/DossierRepository.java @@ -18,14 +18,6 @@ public interface DossierRepository extends JpaRepository List findDossierChangeByLastUpdatedIsAfter(@Param("since") OffsetDateTime since); - @Query("select d from DossierEntity d where d.ownerId = :ownerId") - List findDossiersByOwnerId(@Param("ownerId") String ownerId); - - - @Query(value = "select * from DossierEntity d where JSON_CONTAINS(d.members, :memberId, '$')", nativeQuery = true) - List findDossiersByMemberId(@Param("memberId") String memberId); - - @Modifying @Query("update DossierEntity d set d.softDeletedTime = null, d.lastUpdated = :lastUpdated where d.id = :dossierId" + " and d.hardDeletedTime is null") int undelete(@Param("dossierId") String dossierId, @Param("lastUpdated") OffsetDateTime lastUpdated); -- 2.47.2