From 079781f9a2e860636eaa4a491b9106ccc06d609f Mon Sep 17 00:00:00 2001 From: kaitoz11 <43519768+kaitoz11@users.noreply.github.com> Date: Sat, 29 Jul 2023 17:56:53 +0700 Subject: [PATCH] feat: get all shared users for a document --- src/Api/Controllers/DocumentsController.cs | 27 +++++++ ...sOfASharedEntryPaginatedQueryParameters.cs | 2 +- src/Api/Controllers/SharedController.cs | 2 +- .../Models/Dtos/Physical/PermissionDto.cs | 2 + .../GetAllSharedUsersOfDocumentPaginated.cs | 79 +++++++++++++++++++ 5 files changed, 110 insertions(+), 2 deletions(-) create mode 100644 src/Application/Documents/Queries/GetAllSharedUsersOfDocumentPaginated.cs diff --git a/src/Api/Controllers/DocumentsController.cs b/src/Api/Controllers/DocumentsController.cs index fda1be1c..b810cacc 100644 --- a/src/Api/Controllers/DocumentsController.cs +++ b/src/Api/Controllers/DocumentsController.cs @@ -1,4 +1,5 @@ using Api.Controllers.Payload.Requests.Documents; +using Api.Controllers.Payload.Requests.Users; using Application.Common.Extensions; using Application.Common.Interfaces; using Application.Common.Models; @@ -279,7 +280,33 @@ public async Task>> SharePermissions( var result = await Mediator.Send(query); return Ok(Result.Succeed(result)); } + + /// + /// Get shared users from a shared document paginated + /// + /// + /// + /// + [RequiresRole(IdentityData.Roles.Employee)] + [HttpGet("{documentId:guid}/shared-users")] + public async Task>> GetSharedUsersByDocumentId( + [FromRoute] Guid documentId, + [FromQuery] GetAllSharedUsersPaginatedQueryParameters queryParameters) + { + var currentUser = _currentUserService.GetCurrentUser(); + var query = new GetAllSharedUsersOfDocumentPaginated.Query() + { + CurrentUser = currentUser, + DocumentId = documentId, + SearchTerm = queryParameters.SearchTerm, + Page = queryParameters.Page, + Size = queryParameters.Size, + }; + var result = await Mediator.Send(query); + return Ok(Result>.Succeed(result)); + } + /// /// Download a file linked with a document /// diff --git a/src/Api/Controllers/Payload/Requests/Users/GetAllSharedUsersOfASharedEntryPaginatedQueryParameters.cs b/src/Api/Controllers/Payload/Requests/Users/GetAllSharedUsersOfASharedEntryPaginatedQueryParameters.cs index f2a15b7e..bdb7a102 100644 --- a/src/Api/Controllers/Payload/Requests/Users/GetAllSharedUsersOfASharedEntryPaginatedQueryParameters.cs +++ b/src/Api/Controllers/Payload/Requests/Users/GetAllSharedUsersOfASharedEntryPaginatedQueryParameters.cs @@ -1,6 +1,6 @@ namespace Api.Controllers.Payload.Requests.Users; -public class GetAllSharedUsersFromASharedEntryPaginatedQueryParameters +public class GetAllSharedUsersPaginatedQueryParameters { /// /// Search term diff --git a/src/Api/Controllers/SharedController.cs b/src/Api/Controllers/SharedController.cs index 29bc6959..165a9979 100644 --- a/src/Api/Controllers/SharedController.cs +++ b/src/Api/Controllers/SharedController.cs @@ -144,7 +144,7 @@ public async Task>> CreateSharedEntry( [HttpGet("entries/{entryId:guid}/shared-users")] public async Task>> GetSharedUsersFromASharedEntryPaginated( [FromRoute] Guid entryId, - [FromQuery] GetAllSharedUsersFromASharedEntryPaginatedQueryParameters queryParameters) + [FromQuery] GetAllSharedUsersPaginatedQueryParameters queryParameters) { var currentUser = _currentUserService.GetCurrentUser(); var query = new GetAllSharedUsersOfASharedEntryPaginated.Query() diff --git a/src/Application/Common/Models/Dtos/Physical/PermissionDto.cs b/src/Application/Common/Models/Dtos/Physical/PermissionDto.cs index b9cc456d..c8134c34 100644 --- a/src/Application/Common/Models/Dtos/Physical/PermissionDto.cs +++ b/src/Application/Common/Models/Dtos/Physical/PermissionDto.cs @@ -12,6 +12,8 @@ public class PermissionDto : IMapFrom public bool CanBorrow { get; set; } public Guid EmployeeId { get; set; } public Guid DocumentId { get; set; } + + public UserDto Employee { get; set; } = null!; public void Mapping(Profile profile) { diff --git a/src/Application/Documents/Queries/GetAllSharedUsersOfDocumentPaginated.cs b/src/Application/Documents/Queries/GetAllSharedUsersOfDocumentPaginated.cs new file mode 100644 index 00000000..654aae24 --- /dev/null +++ b/src/Application/Documents/Queries/GetAllSharedUsersOfDocumentPaginated.cs @@ -0,0 +1,79 @@ +using Application.Common.Extensions; +using Application.Common.Interfaces; +using Application.Common.Models; +using Application.Common.Models.Dtos.Physical; +using Application.Common.Models.Operations; +using AutoMapper; +using Domain.Entities; +using MediatR; +using Microsoft.EntityFrameworkCore; + +namespace Application.Documents.Queries; + +public class GetAllSharedUsersOfDocumentPaginated +{ + public record Query : IRequest> + { + public User CurrentUser { get; init; } = null!; + public Guid DocumentId { get; init; } + public string? SearchTerm { get; init; } + public int? Page { get; init; } + public int? Size { get; init; } + } + + public class Handler : IRequestHandler> + { + + private readonly IApplicationDbContext _context; + private readonly IMapper _mapper; + + public Handler(IApplicationDbContext context, IMapper mapper) + { + _context = context; + _mapper = mapper; + } + + public async Task> Handle(Query request, CancellationToken cancellationToken) + { + var document = await _context.Documents + .FirstOrDefaultAsync(x => x.Id == request.DocumentId, cancellationToken); + + if (document is null) + { + throw new KeyNotFoundException("Document does not exist."); + } + + var permission = await _context.Permissions + .FirstOrDefaultAsync(x => x.DocumentId == request.DocumentId + && x.EmployeeId == request.CurrentUser.Id, cancellationToken); + if ((permission is null || !permission.AllowedOperations.Contains(DocumentOperation.Read.ToString())) + && document.ImporterId != request.CurrentUser.Id) + { + throw new UnauthorizedAccessException("You do not have permission to view this document shared users."); + } + + var permissions = _context.Permissions + .Include(x => x.Employee) + .Where(x => x.DocumentId == request.DocumentId); + + if (request.SearchTerm is not null && !request.SearchTerm.Trim().Equals(string.Empty)) + { + permissions = permissions.Where(x => + x.Employee.Username.Trim().ToLower().Contains(request.SearchTerm.Trim().ToLower()) + || x.Employee.Email.Trim().ToLower().Contains(request.SearchTerm.Trim().ToLower())); + } + + var pageNumber = request.Page is null or <= 0 ? 1 : request.Page; + var sizeNumber = request.Size is null or <= 0 ? 10 : request.Size; + + var list = await permissions + .Paginate(pageNumber.Value, sizeNumber.Value) + .ToListAsync(cancellationToken); + + var count = await permissions.CountAsync(cancellationToken); + + var result = _mapper.Map>(list); + return new PaginatedList(result, count, pageNumber.Value, sizeNumber.Value); + } + } +} \ No newline at end of file