From db795c8725989d72900830234c7aa8ca2082a512 Mon Sep 17 00:00:00 2001 From: StarryFolf Date: Tue, 13 Jun 2023 22:44:23 +0700 Subject: [PATCH 1/2] feat: implement get documents of a user --- src/Api/Controllers/DocumentsController.cs | 26 +++++++ ...DocumentsOfUserPaginatedQueryParameters.cs | 6 ++ .../Queries/GetDocumentsOfUserPaginated.cs | 67 +++++++++++++++++++ 3 files changed, 99 insertions(+) create mode 100644 src/Api/Controllers/Payload/Requests/Documents/GetDocumentsOfUserPaginatedQueryParameters.cs create mode 100644 src/Application/Documents/Queries/GetDocumentsOfUserPaginated.cs diff --git a/src/Api/Controllers/DocumentsController.cs b/src/Api/Controllers/DocumentsController.cs index 9b7931ca..4fe54813 100644 --- a/src/Api/Controllers/DocumentsController.cs +++ b/src/Api/Controllers/DocumentsController.cs @@ -177,4 +177,30 @@ public async Task>> Delete([FromRoute] Guid doc var result = await Mediator.Send(query); return Ok(Result.Succeed(result)); } + + /// + /// Get all documents of a user. + /// + /// Id of the user + /// Query parameters + /// A list of DocumentDtos of the user. + [RequiresRole(IdentityData.Roles.Employee)] + [HttpGet("user/{userId:guid}")] + [ProducesResponseType(StatusCodes.Status200OK)] + [ProducesResponseType(StatusCodes.Status403Forbidden)] + [ProducesResponseType(StatusCodes.Status404NotFound)] + public async Task>> GetDocumentsOfUserPaginated([FromRoute] Guid userId, + [FromQuery] GetDocumentsOfUserPaginatedQueryParameters queryParameters) + { + var query = new GetDocumentsOfUserPaginated.Query() + { + UserId = userId, + Page = queryParameters.Page, + Size = queryParameters.Size, + SortBy = queryParameters.SortBy, + SortOrder = queryParameters.SortOrder, + }; + var result = await Mediator.Send(query); + return Ok(Result>.Succeed(result)); + } } \ No newline at end of file diff --git a/src/Api/Controllers/Payload/Requests/Documents/GetDocumentsOfUserPaginatedQueryParameters.cs b/src/Api/Controllers/Payload/Requests/Documents/GetDocumentsOfUserPaginatedQueryParameters.cs new file mode 100644 index 00000000..a09e0eee --- /dev/null +++ b/src/Api/Controllers/Payload/Requests/Documents/GetDocumentsOfUserPaginatedQueryParameters.cs @@ -0,0 +1,6 @@ +namespace Api.Controllers.Payload.Requests.Documents; + +public class GetDocumentsOfUserPaginatedQueryParameters : PaginatedQueryParameters +{ + +} \ No newline at end of file diff --git a/src/Application/Documents/Queries/GetDocumentsOfUserPaginated.cs b/src/Application/Documents/Queries/GetDocumentsOfUserPaginated.cs new file mode 100644 index 00000000..f64ce465 --- /dev/null +++ b/src/Application/Documents/Queries/GetDocumentsOfUserPaginated.cs @@ -0,0 +1,67 @@ +using Application.Common.Extensions; +using Application.Common.Interfaces; +using Application.Common.Models; +using Application.Common.Models.Dtos.Physical; +using AutoMapper; +using MediatR; +using Microsoft.EntityFrameworkCore; + +namespace Application.Documents.Queries; + +public class GetDocumentsOfUserPaginated +{ + public record Query : IRequest> + { + public Guid UserId { get; set; } + public int? Page { get; init; } + public int? Size { get; init; } + public string? SortBy { get; init; } + public string? SortOrder { 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 user = await _context.Users.FirstOrDefaultAsync(x => x.Id == request.UserId + && x.IsActive + && x.IsActivated, cancellationToken); + + if (user is null) + { + throw new KeyNotFoundException("User does not exist."); + } + + var documents = _context.Documents.AsQueryable() + .Where(x => x.Importer!.Id.Equals(request.UserId) && !x.IsPrivate); + + var sortBy = request.SortBy; + if (sortBy is null || !sortBy.MatchesPropertyName()) + { + sortBy = nameof(DocumentDto.Id); + } + var sortOrder = request.SortOrder ?? "asc"; + var pageNumber = request.Page is null or <= 0 ? 1 : request.Page; + var sizeNumber = request.Size is null or <= 0 ? 5 : request.Size; + + var count = await documents.CountAsync(cancellationToken); + var list = await documents + .Paginate(pageNumber.Value, sizeNumber.Value) + .OrderByCustom(sortBy, sortOrder) + .ToListAsync(cancellationToken); + + var result = _mapper.Map>(list); + + return new PaginatedList(result, count, pageNumber.Value, sizeNumber.Value); + } + } +} \ No newline at end of file From 18f179d1a61545f25c6d282eddbcda8b849f97be Mon Sep 17 00:00:00 2001 From: StarryFolf Date: Wed, 14 Jun 2023 09:05:38 +0700 Subject: [PATCH 2/2] refactoring --- .../Documents/Queries/GetDocumentsOfUserPaginated.cs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/Application/Documents/Queries/GetDocumentsOfUserPaginated.cs b/src/Application/Documents/Queries/GetDocumentsOfUserPaginated.cs index f64ce465..1f14d615 100644 --- a/src/Application/Documents/Queries/GetDocumentsOfUserPaginated.cs +++ b/src/Application/Documents/Queries/GetDocumentsOfUserPaginated.cs @@ -41,7 +41,10 @@ public async Task> Handle(Query request, Cancellation throw new KeyNotFoundException("User does not exist."); } - var documents = _context.Documents.AsQueryable() + var documents = _context.Documents + .Include(x => x.Department) + .Include(x => x.Folder) + .AsQueryable() .Where(x => x.Importer!.Id.Equals(request.UserId) && !x.IsPrivate); var sortBy = request.SortBy;