36 lines
1.2 KiB
C#
36 lines
1.2 KiB
C#
using AutoMapper;
|
|
using MediatR;
|
|
using mws.backend.dotnet.application.Common;
|
|
using mws.backend.dotnet.application.Permissions;
|
|
|
|
namespace mws.backend.dotnet.application.Documents;
|
|
|
|
public record GetDocumentTreeQuery(Guid UserId, Guid ProjectId) : IRequest<List<DocumentNodeDto>>;
|
|
|
|
public class GetDocumentTreeHandler(IUnitOfWork uow, IMapper mapper) : IRequestHandler<GetDocumentTreeQuery, List<DocumentNodeDto>>
|
|
{
|
|
public async Task<List<DocumentNodeDto>> Handle(GetDocumentTreeQuery query, CancellationToken ct)
|
|
{
|
|
await DocumentAccess.EnsureDocumentPermissionAsync(uow, query.UserId, query.ProjectId, PermissionAction.View, ct);
|
|
|
|
var docs = await uow.Documents.GetTreeForProjectAsync(query.ProjectId, ct);
|
|
|
|
var nodes = docs.ToDictionary(d => d.Id, d => mapper.Map<DocumentNodeDto>(d));
|
|
|
|
var roots = new List<DocumentNodeDto>();
|
|
foreach (var node in nodes.Values)
|
|
{
|
|
if (node.ParentId is { } parentId && nodes.TryGetValue(parentId, out var parent))
|
|
{
|
|
parent.Children.Add(node);
|
|
}
|
|
else
|
|
{
|
|
roots.Add(node);
|
|
}
|
|
}
|
|
|
|
return roots;
|
|
}
|
|
}
|