using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; /// /// qSOFA scoring: current active criteria count per encounter (Redis-backed). /// [ApiController] [Route("api/v1/encounters/{encounterId:guid}/qsofa")] [Produces("application/json")] [AuthorizePermission(ClinicalPermissions.EncountersRead)] public class QsofaController : ControllerBase { private readonly IQsofaService _qsofa; public QsofaController(IQsofaService qsofa) => _qsofa = qsofa; /// /// Returns the current qSOFA active criteria count (0–3) for an encounter. /// [HttpGet("current")] [ProducesResponseType(typeof(ApiResponse), StatusCodes.Status200OK)] [ProducesResponseType(typeof(ApiResponse), StatusCodes.Status404NotFound)] public async Task Current(Guid encounterId) { var score = await _qsofa.GetCurrentAsync(encounterId); return Ok(ApiResponse.Ok(score)); } /// /// Returns cursor-paginated qSOFA alert history for an encounter. /// [HttpGet("history")] [ProducesResponseType(typeof(ApiResponse), StatusCodes.Status200OK)] public async Task History( Guid encounterId, [FromQuery] int limit = 20, [FromQuery] string? cursor = null) { var page = await _qsofa.GetHistoryAsync(encounterId, limit, cursor); return Ok(ApiResponse.Ok(new { items = page.Items, nextCursor = page.NextCursor, hasMore = page.HasMore })); } }