using MediatR; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using Mws.Application.Documents; namespace Mws.Api.Controllers; [ApiController] [Route("api")] [Authorize] public class DocumentsController(ISender sender) : ControllerBase { [HttpGet("documents/search")] public async Task>> Search([FromQuery] string? q, CancellationToken ct) { return Ok(await sender.Send(new SearchDocumentsQuery(User.GetUserId(), q ?? string.Empty), ct)); } [HttpGet("projects/{projectId:guid}/documents")] public async Task>> GetTree(Guid projectId, CancellationToken ct) { return Ok(await sender.Send(new GetDocumentTreeQuery(User.GetUserId(), projectId), ct)); } [HttpPost("projects/{projectId:guid}/documents")] public async Task> Create(Guid projectId, [FromBody] CreateDocumentRequest request, CancellationToken ct) { var result = await sender.Send(new CreateDocumentCommand(User.GetUserId(), projectId, request), ct); return CreatedAtAction(nameof(Get), new { id = result.Id }, result); } [HttpGet("documents/{id:guid}")] public async Task> Get(Guid id, CancellationToken ct) { return Ok(await sender.Send(new GetDocumentQuery(User.GetUserId(), id), ct)); } [HttpPut("documents/{id:guid}")] public async Task> Update(Guid id, [FromBody] UpdateDocumentRequest request, CancellationToken ct) { return Ok(await sender.Send(new UpdateDocumentCommand(User.GetUserId(), id, request), ct)); } [HttpPut("documents/{id:guid}/move")] public async Task> Move(Guid id, [FromBody] MoveDocumentRequest request, CancellationToken ct) { await sender.Send(new MoveDocumentCommand(User.GetUserId(), id, request.NewParentId), ct); return Ok(await sender.Send(new GetDocumentQuery(User.GetUserId(), id), ct)); } [HttpDelete("documents/{id:guid}")] public async Task Delete(Guid id, CancellationToken ct) { await sender.Send(new DeleteDocumentCommand(User.GetUserId(), id), ct); return NoContent(); } }