mirror of
https://github.com/MaksTinyWorkshop/_Assistant_Lead_Tech
synced 2026-04-06 21:41:42 +02:00
capitalisation: intégrer 12 entrées depuis app-alexandrie et app-template-resto
- backend/risques/nestjs : guard multi-statut READ_METHODS avant statut - backend/patterns/nestjs : fusionner lastSeenAt dans la réconciliation - backend/risques/contracts : pas de process.env dans services/helpers - backend/risques/nextjs : self-request Server Action + EXDEV atomic write - backend/risques/prisma : champ enum-like stocké en String - frontend/risques/general : Alert.prompt iOS-only - frontend/risques/tests : 3 anti-patterns (helpers copiés, test indirect, test façade) - workflow/risques/story-tracking : 2 entrées (hors périmètre, File List approximative) - skill capitalisation-triage : nouveau format de rapport (tableaux par domaine) - 95_a_capitaliser.md : purgé
This commit is contained in:
@@ -136,3 +136,32 @@ if (count !== null && count > QUOTA_MAX) {
|
||||
- [ ] Mode dégradé permissif si `count === null` (Redis down)
|
||||
- [ ] Clé nommée `{app}:quota:{action}:{userId}:{yyyy-mm-dd}` (date UTC)
|
||||
- [ ] Anti-pattern évité : `incrBy` + `setEx` séparés (race condition si count === 1 concurrent)
|
||||
|
||||
---
|
||||
|
||||
<a id="pattern-fusionner-lastseenat-reconciliation"></a>
|
||||
## Pattern : Fusionner `lastSeenAt` dans l'update de réconciliation — évite N requêtes DB par requête
|
||||
|
||||
- Objectif : éviter deux appels Prisma distincts (réconciliation + lastSeenAt) sur chaque requête authentifiée.
|
||||
- Contexte : service de réconciliation d'état de session appelé à chaque request via guard ou middleware.
|
||||
- Quand l'utiliser : dès qu'un `lastSeenAt` est mis à jour systématiquement et qu'un update conditionnel coexiste.
|
||||
- Avantage : 1 requête DB par requête authentifiée au lieu de 2.
|
||||
- Validé le : 30-03-2026
|
||||
- Contexte technique : NestJS / Prisma — app-alexandrie
|
||||
|
||||
### Implémentation (exemple minimal)
|
||||
|
||||
```typescript
|
||||
// ❌ 2 requêtes par requête authentifiée
|
||||
private async reconcileSessionStatus(session) {
|
||||
if (statusChanged) await prisma.session.update({ data: { status, graceEndsAt } });
|
||||
}
|
||||
await prisma.session.update({ data: { lastSeenAt: now } }); // 2ème update systématique
|
||||
|
||||
// ✅ 1 requête — lastSeenAt toujours inclus dans le même appel
|
||||
private async reconcileSessionStatus(session, now = new Date()) {
|
||||
await prisma.session.update({
|
||||
data: { lastSeenAt: now, ...(statusChanged && { status, graceEndsAt }) }
|
||||
});
|
||||
}
|
||||
```
|
||||
|
||||
Reference in New Issue
Block a user