Compare commits
13 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
1afc3623d5 | ||
|
|
d8c162918e | ||
|
|
e114291f56 | ||
|
|
019bec4496 | ||
|
|
a6b275a928 | ||
|
|
b5819178b3 | ||
|
|
7354d15aa3 | ||
|
|
8f3cec426b | ||
|
|
ecddef1851 | ||
|
|
98c2aed8ba | ||
|
|
f231a75722 | ||
|
|
21ed61bc61 | ||
|
|
05a1a7de54 |
@ -0,0 +1,51 @@
|
|||||||
|
package com.iqser.red.persistence.service.v1.external.api.impl.controller;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
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;
|
||||||
|
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 FileStatusPersistenceService fileStatusPersistenceService;
|
||||||
|
private final DossierACLService dossierACLService;
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public UserStats getUserStats(String userId) {
|
||||||
|
|
||||||
|
if (userService.getUserById(userId).isEmpty()) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
List<String> dossierMemberships = new ArrayList<>();
|
||||||
|
List<String> 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));
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@ -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;
|
||||||
|
|
||||||
|
}
|
||||||
@ -0,0 +1,20 @@
|
|||||||
|
package com.iqser.red.service.persistence.service.v1.api.external.model;
|
||||||
|
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
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;
|
||||||
|
|
||||||
|
}
|
||||||
@ -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);
|
||||||
|
|
||||||
|
}
|
||||||
@ -71,6 +71,23 @@ public class DossierACLService extends AbstractACLService<String> {
|
|||||||
return members;
|
return members;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Set<String> getOwners(String dossierId) {
|
||||||
|
|
||||||
|
ObjectIdentityImpl dossierIdentity = new ObjectIdentityImpl(getIdentifier(), dossierId);
|
||||||
|
var acl = mutableAclService.readAclById(dossierIdentity);
|
||||||
|
Set<String> 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
|
@Override
|
||||||
public String getIdentifier() {
|
public String getIdentifier() {
|
||||||
|
|||||||
@ -6,20 +6,6 @@ import java.util.HashSet;
|
|||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
import jakarta.persistence.CascadeType;
|
|
||||||
import jakarta.persistence.Column;
|
|
||||||
import jakarta.persistence.Convert;
|
|
||||||
import jakarta.persistence.Entity;
|
|
||||||
import jakarta.persistence.EnumType;
|
|
||||||
import jakarta.persistence.Enumerated;
|
|
||||||
import jakarta.persistence.FetchType;
|
|
||||||
import jakarta.persistence.Id;
|
|
||||||
import jakarta.persistence.JoinColumn;
|
|
||||||
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.Fetch;
|
||||||
import org.hibernate.annotations.FetchMode;
|
import org.hibernate.annotations.FetchMode;
|
||||||
|
|
||||||
@ -31,6 +17,20 @@ import com.iqser.red.service.persistence.management.v1.processor.utils.JSONStrin
|
|||||||
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.DownloadFileType;
|
||||||
import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.DossierVisibility;
|
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;
|
||||||
|
import jakarta.persistence.ElementCollection;
|
||||||
|
import jakarta.persistence.Entity;
|
||||||
|
import jakarta.persistence.EnumType;
|
||||||
|
import jakarta.persistence.Enumerated;
|
||||||
|
import jakarta.persistence.FetchType;
|
||||||
|
import jakarta.persistence.Id;
|
||||||
|
import jakarta.persistence.JoinColumn;
|
||||||
|
import jakarta.persistence.ManyToMany;
|
||||||
|
import jakarta.persistence.ManyToOne;
|
||||||
|
import jakarta.persistence.OneToMany;
|
||||||
|
import jakarta.persistence.Table;
|
||||||
import lombok.AllArgsConstructor;
|
import lombok.AllArgsConstructor;
|
||||||
import lombok.Builder;
|
import lombok.Builder;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
|
|||||||
@ -171,6 +171,10 @@ public final class ActionRoles {
|
|||||||
// RSS
|
// RSS
|
||||||
public static final String GET_RSS = "red-get-rss";
|
public static final String GET_RSS = "red-get-rss";
|
||||||
|
|
||||||
|
// USER STATS
|
||||||
|
|
||||||
|
public static final String READ_USER_STATS = "red-get-user-stats";
|
||||||
|
|
||||||
// Multitenancy
|
// Multitenancy
|
||||||
public static final String CREATE_TENANT = "red-create-tenant";
|
public static final String CREATE_TENANT = "red-create-tenant";
|
||||||
public static final String GET_TENANTS = "red-get-tenants";
|
public static final String GET_TENANTS = "red-get-tenants";
|
||||||
|
|||||||
@ -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.FileIdentifier;
|
||||||
import com.iqser.red.service.persistence.management.v1.processor.model.OCRStatusUpdateResponse;
|
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.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.FileAttributesRepository;
|
||||||
import com.iqser.red.service.persistence.management.v1.processor.service.persistence.repository.FileRepository;
|
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.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.component.ComponentMappingMetadata;
|
||||||
import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.file.FileErrorInfo;
|
import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.file.FileErrorInfo;
|
||||||
@ -403,7 +403,10 @@ public class FileStatusPersistenceService {
|
|||||||
public List<FileEntity> getStatusesForDossierTemplate(String dossierTemplateId) {
|
public List<FileEntity> getStatusesForDossierTemplate(String dossierTemplateId) {
|
||||||
|
|
||||||
return dossierService.findAllDossiersForDossierTemplateId(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<FileEntity> files = fileRepository.findFilesByAssignee(userId);
|
||||||
|
return files.size();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
public List<FileEntity> getSoftDeletedFiles(List<String> dossierIds) {
|
public List<FileEntity> getSoftDeletedFiles(List<String> dossierIds) {
|
||||||
|
|
||||||
return fileRepository.getSoftDeletedFiles(dossierIds);
|
return fileRepository.getSoftDeletedFiles(dossierIds);
|
||||||
@ -453,7 +463,7 @@ public class FileStatusPersistenceService {
|
|||||||
@Transactional
|
@Transactional
|
||||||
public void softDelete(String fileId, OffsetDateTime softDeletedTime) {
|
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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -46,6 +46,10 @@ public interface FileRepository extends JpaRepository<FileEntity, String> {
|
|||||||
@Param("hasUpdates") boolean hasUpdates);
|
@Param("hasUpdates") boolean hasUpdates);
|
||||||
|
|
||||||
|
|
||||||
|
@Query("select f from FileEntity f where f.assignee = :assignee")
|
||||||
|
List<FileEntity> findFilesByAssignee(@Param("assignee") String assignee);
|
||||||
|
|
||||||
|
|
||||||
@Modifying
|
@Modifying
|
||||||
@Query("""
|
@Query("""
|
||||||
update FileEntity f set f.numberOfPages = :numberOfPages, \
|
update FileEntity f set f.numberOfPages = :numberOfPages, \
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user