Skip to content

feat(auth): middleware Nitro serveur — pose event.context.userId (THI-134) - #14

Merged
Tbeaumont79 merged 1 commit into
mainfrom
feat/server-auth-middleware
Jun 9, 2026
Merged

Tbeaumont79 merged 1 commit into
mainfrom
feat/server-auth-middleware

Conversation

@Tbeaumont79

@Tbeaumont79 Tbeaumont79 commented Jun 9, 2026 •

Copy link
Copy Markdown
Owner

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 seul apps/app/middleware/auth.ts existant 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 pose event.context.userId. Non bloquant : si pas de session, userId reste indéfini (pas de 401 ici) — chaque route décide via requireUserId. Ce middleware est le producteur de event.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 charger better-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).

Le typecheck complet et le DoD end-to-end (GET /api/usage/current → 200 authentifié / 401 sinon) nécessitent les deux PR dépendantes ci-dessous (l'instance auth et session.ts//api/usage/current n'existent pas encore sur main).

Ordre de merge (important)

À merger après :

  1. feat(auth): Better Auth magic-link + tables satellites (THI-131, slice 2/3) #8 feat(auth): Better Auth magic-link (THI-131) — fournit l'instance auth.
  2. feat(metering): service + endpoint usage courant (THI-126 — 2/2) #12 feat(metering): service + endpoint usage courant (THI-126/THI-133) — fournit requireUserId et GET /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

    • Implemented server-side authentication session handling that automatically resolves and maintains user identity across requests, enabling secure context throughout the application lifecycle.
  • Tests

    • Added comprehensive test coverage for authentication session resolution, validating behavior across various session states and conditions.

…-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>
@coderabbitai

coderabbitai Bot commented Jun 9, 2026 •

Copy link
Copy Markdown

Review Change Stack

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Free

Run ID: f6caa907-75df-4660-a0ff-2d2181bf5a46

📥 Commits

Reviewing files that changed from the base of the PR and between de0a541 and 73b8415.

📒 Files selected for processing (3)
  • apps/app/server/middleware/auth.ts
  • apps/app/server/utils/auth-context.ts
  • apps/app/test/auth-context.spec.ts

📝 Walkthrough

Walkthrough

This 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.

Changes

Auth Session Resolution

Layer / File(s) Summary
Session resolution utility
apps/app/server/utils/auth-context.ts
SessionLike interface and SessionResolver type define the contract for session resolution. resolveUserId function safely extracts session.user.id or returns undefined when session or user is missing.
Session resolution tests
apps/app/test/auth-context.spec.ts
Vitest suite covers successful user id extraction, graceful handling of absent session/user/null id, and verification that request Headers are forwarded unchanged to the resolver.
Server middleware integration
apps/app/server/middleware/auth.ts
Event handler resolves Better Auth session and populates event.context.userId; module augmentation extends h3's H3EventContext to declare userId?: string for type safety downstream.

Estimated code review effort

🎯 2 (Simple) | ⏱️ ~10 minutes

Poem

🐰 A session slips through headers and headers,
Resolved with care, not swift endeavors,
No user means we skip, don't cry,
Context waits for userId,
Auth flows now with tested fevors! 🔐


Note

🎁 Summarized by CodeRabbit Free

Your 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 @coderabbitai help to get the list of available commands and usage tips.

@Tbeaumont79
Tbeaumont79 merged commit 29b8f4f into main Jun 9, 2026
1 check passed
@Tbeaumont79
Tbeaumont79 deleted the feat/server-auth-middleware branch June 9, 2026 17:03
Tbeaumont79 added a commit that referenced this pull request Jun 9, 2026
Tbeaumont79 added a commit that referenced this pull request Jun 9, 2026
PR #8 importait better-auth/* et nodemailer sans les déclarer (jamais
passé le gate vert) → main cassée au merge de #8. Ajout deps + relock.
Débloque #10 (auth chain) et la ré-application du middleware #14.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Tbeaumont79 added a commit that referenced this pull request Jun 9, 2026
Ré-applique #14 (revert b139839). #14 avait été mergé AVANT son contrat
auth (#8) → main cassée → revert. Maintenant que #8 (utils/auth) + ses
deps sont sur main, le middleware compile. Gate local vert.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant