Consultation des specs dans l'app (menu Specs + rendu Markdown/Mermaid)
Nouvelle fonctionnalité : consulter les documents de spécification (exigences,
conception technique, plan de tâches) en lecture seule dans le frontend.
Backend :
- SpecsController (GET /api/specs, GET /api/specs/{cle}) protégé par l'auth
globale ; SpecDocumentService avec whitelist (pas de path traversal) et
lecture depuis le dossier specs/ embarqué, repli sur .kiro/specs en dev.
- DTOs SpecDocumentDto / SpecContenuDto ; service enregistré dans Program.cs.
Docker :
- Contexte de build backend = racine du dépôt (dockerfile: backend/Dockerfile)
pour embarquer .kiro/specs/*.md dans l'image (app autonome).
- .dockerignore racine ajouté (exclut frontend/node_modules, bin/obj, etc.).
Frontend :
- SpecService + SpecsComponent (lazy-loadé) : page dédiée avec menu latéral par
document ; rendu Markdown via marked (GFM) assaini par DOMPurify.
- Diagrammes Mermaid (ex. graph TB) rendus en SVG via mermaid.js importé
dynamiquement ; déclenchement après résolution du @ViewChild (setTimeout).
- Barre de navigation : simple lien « Specs » (le choix du document se fait dans
le menu latéral de la page, pas dans la barre).
- Routes /specs et /specs/:cle protégées par authGuard.
Specs : exigence 19 (consultation des documents) ajoutée à requirements.md ;
design.md complété (DTOs, endpoints, composant, rendu Mermaid, note Docker).
This commit is contained in:
@@ -8,3 +8,4 @@ export * from './profil.model';
|
||||
export * from './bareme.model';
|
||||
export * from './adresse.model';
|
||||
export * from './auth.model';
|
||||
export * from './spec.model';
|
||||
|
||||
@@ -0,0 +1,19 @@
|
||||
// Modèles des documents de spécification (miroir des DTOs backend SpecDtos.cs).
|
||||
|
||||
/** Métadonnées d'un document de spécification (élément du sous-menu). */
|
||||
export interface SpecDocument {
|
||||
/** Clé stable et sûre : 'requirements' | 'design' | 'tasks'. */
|
||||
cle: string;
|
||||
/** Libellé lisible pour le sous-menu (ex. « Exigences »). */
|
||||
titre: string;
|
||||
/** Vrai si le fichier Markdown est présent et lisible côté backend. */
|
||||
disponible: boolean;
|
||||
}
|
||||
|
||||
/** Contenu Markdown d'un document de spécification. */
|
||||
export interface SpecContenu {
|
||||
cle: string;
|
||||
titre: string;
|
||||
/** Contenu brut Markdown, rendu en HTML côté composant. */
|
||||
markdown: string;
|
||||
}
|
||||
@@ -8,3 +8,4 @@ export * from './adresse-nommee.service';
|
||||
export * from './profil.service';
|
||||
export * from './bareme.service';
|
||||
export * from './remboursement.service';
|
||||
export * from './spec.service';
|
||||
|
||||
@@ -0,0 +1,27 @@
|
||||
import { HttpClient } from '@angular/common/http';
|
||||
import { Injectable, inject } from '@angular/core';
|
||||
import { Observable } from 'rxjs';
|
||||
|
||||
import { environment } from '../../../environments/environment';
|
||||
import { SpecContenu, SpecDocument } from '../models';
|
||||
|
||||
/**
|
||||
* Service HTTP d'accès aux documents de spécification du projet (exigences,
|
||||
* conception technique, plan de tâches) pour affichage en lecture seule.
|
||||
* Les endpoints sont protégés par l'authentification (comme les autres appels).
|
||||
*/
|
||||
@Injectable({ providedIn: 'root' })
|
||||
export class SpecService {
|
||||
private readonly http = inject(HttpClient);
|
||||
private readonly baseUrl = `${environment.apiUrl}/specs`;
|
||||
|
||||
/** Liste les documents de spécification connus et leur disponibilité (GET /api/specs). */
|
||||
lister(): Observable<SpecDocument[]> {
|
||||
return this.http.get<SpecDocument[]>(this.baseUrl);
|
||||
}
|
||||
|
||||
/** Récupère le contenu Markdown d'un document par sa clé (GET /api/specs/{cle}). */
|
||||
obtenir(cle: string): Observable<SpecContenu> {
|
||||
return this.http.get<SpecContenu>(`${this.baseUrl}/${cle}`);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user