using Microsoft.AspNetCore.Mvc; using SchotzIadKmTracker.Api.Models.DTOs; using SchotzIadKmTracker.Api.Services; namespace SchotzIadKmTracker.Api.Controllers; /// /// Expose en lecture seule les documents de spécification du projet (exigences, /// conception technique, plan de tâches) pour affichage dans le frontend. Comme tous /// les controllers hors AuthController, ces endpoints exigent un utilisateur /// authentifié (autorisation globale) : les specs ne sont pas publiques. /// [ApiController] [Route("api/specs")] public class SpecsController : ControllerBase { private readonly ISpecDocumentService _specDocumentService; public SpecsController(ISpecDocumentService specDocumentService) { _specDocumentService = specDocumentService; } /// Liste les documents de spécification connus et leur disponibilité (pour le sous-menu). [HttpGet] [ProducesResponseType(typeof(IReadOnlyList), StatusCodes.Status200OK)] public ActionResult> Lister() { return Ok(_specDocumentService.Lister()); } /// /// Retourne le contenu Markdown d'un document identifié par sa clé (whitelist : /// "requirements", "design", "tasks"). 404 si la clé est inconnue ou le fichier absent. /// [HttpGet("{cle}")] [ProducesResponseType(typeof(SpecContenuDto), StatusCodes.Status200OK)] [ProducesResponseType(StatusCodes.Status404NotFound)] public async Task> Obtenir(string cle, CancellationToken cancellationToken) { var contenu = await _specDocumentService.ObtenirAsync(cle, cancellationToken); if (contenu is null) { return Problem( detail: $"Le document de spécification '{cle}' est introuvable.", statusCode: StatusCodes.Status404NotFound); } return Ok(contenu); } }