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>; public class GetDocumentTreeHandler(IUnitOfWork uow, IMapper mapper) : IRequestHandler> { public async Task> 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(d)); var roots = new List(); 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; } }