mirror of
https://github.com/MaksTinyWorkshop/_Assistant_Lead_Tech
synced 2026-06-28 01:53:40 +02:00
capitalisation: triage 95_a_capitaliser + création domaine infra
Triage des 27 propositions du buffer de capitalisation (skill capitalisation-triage), avec vérification des doublons contre la base. Intégré dans knowledge/ (23 entrées): - backend: redis (compensation incrBy non-atomique), nestjs (injection cassée sous tsx watch; guard write mode dégradé), async (test rollback pipeline multi-fichiers), contracts (idempotence POST), auth (disclosure comptes soft-deleted), prisma (index partial soft-delete), llm-providers (nouveau: OAuth vs API key, prompt caching). - frontend: tests (garde-fous parking Later), navigation (fichiers non-route sous src/app Expo Router), general (type client vs payload backend), state (fallback catch-all mapping DB→UI). - workflow: story-tracking (statut BMAD vs narratif obsolète). - product: general (nouveau: doc feature store sans UI). - infra: NOUVEAU DOMAINE (traefik, tailscale, docker, docker-networking, reverse-proxy-paths, sidecar tailscale) + 00_INDEX.md. Autres: - 90_debug_et_postmortem.md: post-mortem réseau Docker partagé hors compose. - Rejeté 3 doublons (types enum contracts, getter PrismaService, $transaction). - Buffer 95_a_capitaliser.md purgé et restauré à son état initial. - _projects.conf: MAJ statuts epics + ajout app-rl799.
This commit is contained in:
@@ -2,10 +2,10 @@
|
||||
title: Backend — Patterns : Contracts
|
||||
domain: backend
|
||||
bucket: patterns
|
||||
tags: [contracts, zod, api, error-codes, monorepo]
|
||||
tags: [contracts, zod, api, error-codes, monorepo, idempotence, http-semantics]
|
||||
applies_to: [analysis, implementation, review, architecture]
|
||||
severity: high
|
||||
validated_on: 2026-04-07
|
||||
validated_on: 2026-06-25
|
||||
source_projects: [app-alexandrie, RL799_V2]
|
||||
---
|
||||
|
||||
@@ -150,6 +150,34 @@ return res.status(200).json({
|
||||
|
||||
---
|
||||
|
||||
<a id="pattern-idempotence-post-ressource-existante"></a>
|
||||
## Pattern : Idempotence POST = retour de la ressource existante
|
||||
|
||||
- Objectif : garantir qu'un POST dont l'AC demande l'idempotence produit le **même résultat quel que soit le nombre d'appels**.
|
||||
- Contexte : endpoint de création où une duplication est détectable (ressource déjà créée pour le même sujet, ex : demande d'export, déclenchement de job unique). Complément du pattern « HTTP 200 + payload métier » ci-dessus, appliqué au cas duplication.
|
||||
- Quand l'utiliser : POST déclaré idempotent (retries client, double-tap mobile, rejeu réseau).
|
||||
- Quand l'éviter : création stricte où une duplication est une vraie erreur métier que l'appelant doit traiter explicitement.
|
||||
- Validé le : 13-04-2026
|
||||
- Contexte technique : NestJS / contrat API — app-alexandrie story 9.2
|
||||
|
||||
### Règle
|
||||
|
||||
Un POST idempotent **retourne la ressource existante** (HTTP 200 / 201) quand une duplication est détectée, sans lever d'erreur. Un `409 CONFLICT` est un comportement de **blocage**, pas d'idempotence : il force l'appelant à gérer un cas d'erreur et casse le contrat « N appels = 1 résultat ».
|
||||
|
||||
```typescript
|
||||
// ✅ IDEMPOTENT — retourne la ressource existante
|
||||
if (existing) return this.serialize(existing);
|
||||
|
||||
// ❌ NON-IDEMPOTENT — lève une erreur de blocage
|
||||
if (existing) throw new HttpException({ error: { code: 'ALREADY_EXISTS' } }, 409);
|
||||
```
|
||||
|
||||
### Côté client
|
||||
|
||||
Dédupliquer par `id` avant d'insérer dans la liste/store local, pour éviter les doublons en cas de race condition (deux requêtes parallèles recevant la même ressource).
|
||||
|
||||
---
|
||||
|
||||
<a id="pattern-coherence-result-repository"></a>
|
||||
## Pattern : Cohérence du pattern Result dans un repository
|
||||
|
||||
|
||||
Reference in New Issue
Block a user