Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
27 changes: 27 additions & 0 deletions src/Api/Controllers/DocumentsController.cs
Original file line numberDiff line numberDiff line change
@@ -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;
Expand DownExpand Up@@ -279,7 +280,33 @@ public async Task<ActionResult<Result<DocumentDto>>> SharePermissions(
var result = await Mediator.Send(query);
return Ok(Result<DocumentDto>.Succeed(result));
}


/// <summary>
/// Get shared users from a shared document paginated
/// </summary>
/// <param name="documentId"></param>
/// <param name="queryParameters"></param>
/// <returns></returns>
[RequiresRole(IdentityData.Roles.Employee)]
[HttpGet("{documentId:guid}/shared-users")]
public async Task<ActionResult<PaginatedList<PermissionDto>>> 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<PaginatedList<PermissionDto>>.Succeed(result));
}

/// <summary>
/// Download a file linked with a document
/// </summary>
Expand Down
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
namespace Api.Controllers.Payload.Requests.Users;

public class GetAllSharedUsersFromASharedEntryPaginatedQueryParameters
public class GetAllSharedUsersPaginatedQueryParameters
{
/// <summary>
/// Search term
Expand Down
2 changes: 1 addition & 1 deletion src/Api/Controllers/SharedController.cs
Original file line numberDiff line numberDiff line change
Expand Up@@ -144,7 +144,7 @@ public async Task<ActionResult<Result<EntryDto>>> CreateSharedEntry(
[HttpGet("entries/{entryId:guid}/shared-users")]
public async Task<ActionResult<PaginatedList<EntryPermissionDto>>> GetSharedUsersFromASharedEntryPaginated(
[FromRoute] Guid entryId,
[FromQuery] GetAllSharedUsersFromASharedEntryPaginatedQueryParameters queryParameters)
[FromQuery] GetAllSharedUsersPaginatedQueryParameters queryParameters)
{
var currentUser = _currentUserService.GetCurrentUser();
var query = new GetAllSharedUsersOfASharedEntryPaginated.Query()
Expand Down
2 changes: 2 additions & 0 deletions src/Application/Common/Models/Dtos/Physical/PermissionDto.cs
Original file line numberDiff line numberDiff line change
Expand Up@@ -12,6 +12,8 @@ public class PermissionDto : IMapFrom<Permission>
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)
{
Expand Down
Original file line numberDiff line numberDiff line change
@@ -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<PaginatedList<PermissionDto>>
{
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<Query, PaginatedList<PermissionDto>>
{

private readonly IApplicationDbContext _context;
private readonly IMapper _mapper;

public Handler(IApplicationDbContext context, IMapper mapper)
{
_context = context;
_mapper = mapper;
}

public async Task<PaginatedList<PermissionDto>> 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<PermissionDto>>(list);
return new PaginatedList<PermissionDto>(result, count, pageNumber.Value, sizeNumber.Value);
}
}
}