< Summary - Heimdall API

Information
Class: ArturRios.Heimdall.WebApi.Controllers.HealthCheckController
Assembly: ArturRios.Heimdall.WebApi
File(s): /home/runner/work/heimdall-api/heimdall-api/src/Presentation/ArturRios.Heimdall.WebApi/Controllers/HealthCheckController.cs
Line coverage
100%
Covered lines: 12
Uncovered lines: 0
Coverable lines: 12
Total lines: 59
Line coverage: 100%
Branch coverage
50%
Covered branches: 2
Total branches: 4
Branch coverage: 50%
Method coverage
100%
Covered methods: 3
Fully covered methods: 3
Total methods: 3
Method coverage: 100%
Full method coverage: 100%

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
.ctor(...)100%11100%
HelloWorld()100%11100%
Detailed()50%44100%

File(s)

/home/runner/work/heimdall-api/heimdall-api/src/Presentation/ArturRios.Heimdall.WebApi/Controllers/HealthCheckController.cs

#LineLine coverage
 1using ArturRios.Heimdall.Domain.Enums;
 2using ArturRios.Heimdall.Query.HealthChecks;
 3using ArturRios.Heimdall.Query.Input;
 4using ArturRios.Heimdall.Query.Output;
 5using ArturRios.Mediator.Query;
 6using ArturRios.Output;
 7using ArturRios.Util.Http;
 8using ArturRios.Util.WebApi.AspNetCore;
 9using ArturRios.Util.WebApi.Security.Attributes;
 10using Microsoft.AspNetCore.Mvc;
 11
 12namespace ArturRios.Heimdall.WebApi.Controllers;
 13
 14/// <remarks>
 15///     Under <c>api/</c> like every other route, because that prefix is all that carries a request on
 16///     the web UI's host through to the API — see <c>OpenApiContractTests</c>. The container probe and
 17///     yggdrasil's status catalog call the root <c>/healthcheck</c>, which the edge pipeline in
 18///     <see cref="Startup" /> rewrites to this address.
 19/// </remarks>
 20[Route("api/healthcheck")]
 2321public class HealthCheckController(QueryMediator queryMediator) : Controller
 22{
 23    /// <summary>
 24    ///     Basic liveness check (UC-30, FR-HC-01): confirms the API process is up and responding.
 25    ///     Public — no authentication required.
 26    /// </summary>
 27    [HttpGet]
 28    [Route("")]
 29    [AllowAnonymous]
 30    public ActionResult<DataOutput<string?>> HelloWorld()
 31    {
 2132        var result = DataOutput<string?>.New
 2133            .WithData("Hello world!")
 2134            .WithMessage("Heimdall API is working.");
 35
 2136        return result.ToActionResult(HttpStatusCodes.Ok);
 37    }
 38
 39    /// <summary>
 40    ///     Detailed health check (UC-30, FR-HC-02…07): reports the status of each verified service
 41    ///     plus an aggregate general status. Restricted to System Admins (AF-30a → 403, AF-30b → 401).
 42    ///     Returns <c>200 OK</c> when healthy and <c>503 Service Unavailable</c> when any verified
 43    ///     service is down (FR-HC-07, AF-30c).
 44    /// </summary>
 45    [HttpGet]
 46    [Route("detailed")]
 47    [RoleRequirement((int)Roles.SystemAdmin)]
 48    public async Task<ActionResult<DataOutput<HealthCheckOutput?>>> Detailed()
 49    {
 250        var result = await queryMediator
 251            .ExecuteQueryAsync<DetailedHealthQuery, HealthCheckOutput>(new DetailedHealthQuery());
 52
 253        var statusCode = result.Data?.Status == HealthStatuses.Healthy
 254            ? HttpStatusCodes.Ok
 255            : HttpStatusCodes.ServiceUnavailable;
 56
 257        return result.ToActionResult(statusCode);
 258    }
 59}