37 lines
1.7 KiB
C#
37 lines
1.7 KiB
C#
using JobTrackerApi.Services;
|
|
using Microsoft.AspNetCore.Authorization;
|
|
using Microsoft.AspNetCore.Mvc;
|
|
|
|
namespace JobTrackerApi.Controllers;
|
|
|
|
[ApiController]
|
|
[Route("api/documents")]
|
|
[Authorize(AuthenticationSchemes = "local")]
|
|
public sealed class DocumentsController(DocumentsIndexService documents, ICurrentUserService currentUser) : ControllerBase
|
|
{
|
|
[HttpGet]
|
|
public async Task<ActionResult<DocumentsPageDto>> List(
|
|
[FromQuery] int page = 1,
|
|
[FromQuery] int pageSize = 25,
|
|
[FromQuery] string? q = null,
|
|
[FromQuery] string type = "all",
|
|
[FromQuery] string state = "all",
|
|
[FromQuery] string visibility = "all",
|
|
[FromQuery] int? jobApplicationId = null,
|
|
[FromQuery] string sort = "date-desc",
|
|
CancellationToken cancellationToken = default)
|
|
{
|
|
var owner = currentUser.UserId;
|
|
if (owner is null) return Unauthorized();
|
|
if (page is < 1 or > 10000 || pageSize is < 1 or > 100 || q?.Length > 200 || jobApplicationId is <= 0)
|
|
return BadRequest("Invalid document pagination or search parameters.");
|
|
if (type is not ("all" or "cv" or "cover-letter" or "application-material" or "tailored-cv" or "attachment" or "submitted-package" or "email-draft")
|
|
|| state is not ("all" or "current" or "draft" or "frozen")
|
|
|| visibility is not ("all" or "private" or "public")
|
|
|| sort is not ("date-desc" or "date-asc" or "name-asc" or "name-desc"))
|
|
return BadRequest("Unsupported document filter or sort.");
|
|
|
|
return Ok(await documents.GetAsync(owner, page, pageSize, q, type, state, visibility, jobApplicationId, sort, cancellationToken));
|
|
}
|
|
}
|