48 lines
1.6 KiB
C#
48 lines
1.6 KiB
C#
using Microsoft.AspNetCore.Authorization;
|
||
using Microsoft.AspNetCore.Mvc;
|
||
|
||
/// <summary>
|
||
/// qSOFA scoring: current active criteria count per encounter (Redis-backed).
|
||
/// </summary>
|
||
[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;
|
||
|
||
/// <summary>
|
||
/// Returns the current qSOFA active criteria count (0–3) for an encounter.
|
||
/// </summary>
|
||
[HttpGet("current")]
|
||
[ProducesResponseType(typeof(ApiResponse<QsofaCurrentResponse>), StatusCodes.Status200OK)]
|
||
[ProducesResponseType(typeof(ApiResponse<object>), StatusCodes.Status404NotFound)]
|
||
public async Task<IActionResult> Current(Guid encounterId)
|
||
{
|
||
var score = await _qsofa.GetCurrentAsync(encounterId);
|
||
return Ok(ApiResponse<QsofaCurrentResponse>.Ok(score));
|
||
}
|
||
|
||
/// <summary>
|
||
/// Returns cursor-paginated qSOFA alert history for an encounter.
|
||
/// </summary>
|
||
[HttpGet("history")]
|
||
[ProducesResponseType(typeof(ApiResponse<object>), StatusCodes.Status200OK)]
|
||
public async Task<IActionResult> History(
|
||
Guid encounterId,
|
||
[FromQuery] int limit = 20,
|
||
[FromQuery] string? cursor = null)
|
||
{
|
||
var page = await _qsofa.GetHistoryAsync(encounterId, limit, cursor);
|
||
return Ok(ApiResponse<object>.Ok(new
|
||
{
|
||
items = page.Items,
|
||
nextCursor = page.NextCursor,
|
||
hasMore = page.HasMore
|
||
}));
|
||
}
|
||
}
|