upload (900->427 l.) et api-detail (700->330 l.) : le template inline géant
passe en templateUrl. Aucun changement de comportement (build + eslint a11y
+ runtime OK). Composants bien plus navigables ; les .html sont désormais
lintés par angular-eslint (a11y).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Extrait le fil d'Ariane DSFR dupliqué dans browse/api-detail/upload vers un
composant présentationnel piloté par une liste d'items. Chaque page construit
ses items (computed pour browse/api-detail, statique pour upload).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Rejette les fichiers trop volumineux à la sélection avec un message clair,
avant lecture FileReader/envoi serveur.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- data-source.ts (CLI) + scripts migration:generate/run/revert/show
- migration InitialSchema : schéma complet (categories, api_entries),
vérifiée en l'appliquant sur une base vierge (crée aussi l'ext uuid-ossp)
- app.module: charge les migrations et migrationsRun en prod uniquement.
Corrige un trou : la prod avait synchronize:false SANS migrations
(schéma vide au déploiement). Dev inchangé (synchronize:true).
Bascule de dev vers migrations-only (synchronize:false + baseline de la base
dev existante) = étape ultérieure à faire en supervisé.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- Vitest (cohérent avec le back) pour les tests de logique/services purs ;
vitest-setup charge @angular/compiler (fallback JIT requis pour importer
les symboles @angular/* partiellement compilés)
- error.service.spec.ts : 6 cas couvrant toMessage()
- script test -> vitest run (+ test:watch). Tests de composants TestBed =
plugin Angular dédié, hors périmètre pour l'instant.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Ajoute le provider de coverage + section coverage dans vitest.config (reporter
text/html/lcov, exclusions modules/entities/dto/main) et un script test:cov.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- CreateApiUploadDto : valide le multipart POST /uploads via ValidationPipe
(types, @IsIn énums partagés, @IsUUID, @MaxLength(255)). Emails validés
seulement si renseignés (@ValidateIf) -> n'casse pas les contacts vides.
Remplace le body inline + les checks manuels du contrôleur.
- create-api-entry.dto: @MaxLength(255) sur name/provider/contacts (matche les
colonnes entité) + @MaxLength sur emails.
Vérifié: email invalide -> 400 message clair, contacts vides -> 201 OK.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Toutes les souscriptions des composants passent par
takeUntilDestroyed(this.destroyRef) : browse, catalog, api-detail, upload,
category-form-modal, category-delete-modal. api-detail abandonne le pattern
manuel Subscription/ngOnDestroy au profit de DestroyRef (ngOnDestroy ne garde
que le clearPoll du setInterval).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- src/environments/{environment,environment.prod}.ts + fileReplacements :
baseUrl API configurable au lieu de '/api' hardcodé dans les services
- ErrorService + errorInterceptor (HttpInterceptorFn) ; app.config passe à
withInterceptors([...]) (remplace withInterceptorsFromDi legacy)
- @gouvfr/dsfr déplacé en dependencies (chargé au runtime)
- api.service: extrait ValidateResponse (dédup du type inline)
- fix: formValues passe en protected (utilisé dans le template -> build NG1
cassé, le conteneur servait un ancien bundle)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- ConfigModule.forRoot({ validate }) : schéma class-validator des variables
d'env, l'app refuse de démarrer si une var manque/mal typée ; suppression
des fallbacks de credentials DB (getOrThrow)
- setCurrent() enveloppé dans une transaction (plus de fenêtre incohérente
sur isCurrent entre les 2 updates)
- browse() : compteurs de toutes les catégories en 2 requêtes + calcul en
mémoire au lieu d'un N+1 récursif par enfant
- console.* -> Logger Nest partout (apis, uploads, seeder, bootstrap) ;
.catch(console.error) -> logger.error avec contexte
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- API_STATUSES inclut 'NO_YAML' (était manquant alors que le type et le
code l'utilisent)
- ApiType/ApiStatus/ApiConvention dérivés des constantes (typeof X[number])
-> plus de double maintenance type <-> tableau
- DTO back réutilisent API_CONVENTIONS/API_TYPES dans @IsIn (fin de la
triple duplication des valeurs)
- front: déclare la dépendance @datacat/shared (workspace:*)
- shared: exports map + métadonnées + README (double build front/back)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>