using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using Tnsu.ApprovalRoute.Api.Common; using Tnsu.ApprovalRoute.Application.RequestManage; namespace Tnsu.ApprovalRoute.Api.Controllers; /// /// Чтение заявок и маршрутов согласования от имени приложения (см. /// RequestManageService) — для вкладок «Редактирование заявок» и «Заявки по /// согласующему»: результат не зависит от прав вызывающего пользователя на /// списки SharePoint, в отличие от прежнего прямого PnP-чтения с фронтенда. /// [ApiController] [Authorize] [Route("api/request-manage")] [Produces("application/json")] public sealed class RequestManageController(RequestManageService service) : ControllerBase { /// Заявки типа requestTypeId по всем партициям (архив + текущая), постранично. [HttpGet("search")] [ProducesResponseType(typeof(ApiResponse), StatusCodes.Status200OK)] [ProducesResponseType(typeof(ApiError), StatusCodes.Status404NotFound)] public async Task Search( [FromQuery] int requestTypeId, [FromQuery] string query, [FromQuery] int page, [FromQuery] int? pageSize, CancellationToken ct) => (await service.SearchAsync(requestTypeId, query ?? string.Empty, page < 1 ? 1 : page, pageSize, ct)).ToActionResult(); /// Заявка + полный маршрут согласования (обе фазы, по StepOrder). [HttpGet("matrix")] [ProducesResponseType(typeof(ApiResponse), StatusCodes.Status200OK)] [ProducesResponseType(typeof(ApiError), StatusCodes.Status404NotFound)] [ProducesResponseType(typeof(ApiError), StatusCodes.Status400BadRequest)] public async Task Matrix( [FromQuery] int requestTypeId, [FromQuery] string listId, [FromQuery] int requestId, CancellationToken ct) => (await service.GetMatrixAsync(requestTypeId, listId, requestId, ct)).ToActionResult(); /// /// Активные строки согласования одного человека сразу по всем типам заявок и /// партициям. statuses — через запятую (см. REQUEST_STATUS во фронтенде). /// [HttpGet("by-approver")] [ProducesResponseType(typeof(ApiResponse>), StatusCodes.Status200OK)] public async Task ByApprover( [FromQuery] string approverEmail, [FromQuery] string statuses, CancellationToken ct) { var activeStatuses = (statuses ?? string.Empty) .Split(',', StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries) .ToList(); return (await service.FindActiveApprovalRowsForApproverAsync(approverEmail ?? string.Empty, activeStatuses, ct)) .ToActionResult(); } }