feat(auth): middleware Nitro serveur — pose event.context.userId (THI-134) - #14
Conversation
…-134) Aucun middleware serveur ne résolvait la session : requireUserId(event) renvoyait 401 pour toutes les routes authentifiées (metering, export-pdf, génération). Ajoute apps/app/server/middleware/auth.ts qui résout la session Better Auth (auth.api.getSession) et pose event.context.userId, sans lever d'erreur si absente — chaque route décide via requireUserId. Logique de résolution extraite en util pur testable (resolveUserId) suivant la convention DI du repo (cf. health.ts). 5 tests unitaires verts. Rattaché à l'auth (THI-131). Débloque le metering (THI-133/THI-126). Co-Authored-By: Paperclip <noreply@paperclip.ing>
ℹ️ Recent review info⚙️ Run configurationConfiguration used: defaults Review profile: CHILL Plan: Free Run ID: 📒 Files selected for processing (3)
📝 WalkthroughWalkthroughThis PR establishes server-side authentication infrastructure by introducing a session resolution utility, comprehensive tests, and middleware that extracts the authenticated user id from Better Auth and makes it available via the request context. Missing sessions or users are handled gracefully without blocking requests. ChangesAuth Session Resolution
Estimated code review effort🎯 2 (Simple) | ⏱️ ~10 minutes Poem
Note 🎁 Summarized by CodeRabbit FreeYour organization is on the Free plan. CodeRabbit will generate a high-level summary and a walkthrough for each pull request. For a comprehensive line-by-line review, please upgrade your subscription to CodeRabbit Pro by visiting https://app.coderabbit.ai/login. Comment |
Pourquoi
Constaté en branchant le metering (THI-133) : aucun middleware Nitro côté serveur ne résolvait la session.
requireUserId(event)renvoyait donc 401 pour toutes les routes authentifiées (GET /api/usage/current, et bientôt export-pdf + génération). Le seulapps/app/middleware/auth.tsexistant est un route-guard Nuxt client.Ce que fait cette PR
apps/app/server/middleware/auth.ts— résout la session Better Auth (auth.api.getSession({ headers: event.headers })) et poseevent.context.userId. Non bloquant : si pas de session,userIdreste indéfini (pas de 401 ici) — chaque route décide viarequireUserId. Ce middleware est le producteur deevent.context.userId;requireUserId(session.ts, lot metering) en est le consommateur.apps/app/server/utils/auth-context.ts—resolveUserId(), logique pure et injectable, suivant la convention DI du repo (cf.health.ts/pingDb), pour rester testable sans chargerbetter-auth.apps/app/test/auth-context.spec.ts— 5 tests unitaires.Vérification
vitest run test/auth-context.spec.ts→ 5/5 verts (session présente → id ; pas de session / user nul / id nul → undefined sans lever ; en-têtes bien transmis).Ordre de merge (important)
À merger après :
feat(auth): Better Auth magic-link(THI-131) — fournit l'instanceauth.feat(metering): service + endpoint usage courant(THI-126/THI-133) — fournitrequireUserIdetGET /api/usage/current.Une fois ces deux PR mergées, le DoD de THI-134 est satisfait. La déclaration
H3EventContext.userId?est dupliquée à l'identique côté lecteur (session.ts) et côté producteur (ce middleware) : les déclarations d'interface identiques fusionnent, aucune collision au merge.Rattaché à l'auth (THI-131). Débloque le metering (THI-133).
🤖 Generated with Claude Code
Summary by CodeRabbit
New Features
Tests