Skip to content

[NestJS] Porter la route POST /api/v1/auth depuis le serveur Fastify vers server-nestjs #2225

@shikanime

Description

@shikanime

Contexte

Issue de suivi globale : #1889 — [NestJS] Modularisation de server

Ce ticket couvre spécifiquement le portage de la route POST /api/v1/auth depuis apps/server (Fastify) vers apps/server-nestjs. Cette route est la seule partie du module user (Vague 2 — Sprint 5) qui nécessite une synchronisation de session Keycloak.

Périmètre

Portage de la route :

  • POST /api/v1/auth — Authentification / synchronisation session (OIDC callback, signin ou signup)

Comportement actuel (server Fastify)

Le handler actuel (apps/server/src/resources/user/router.ts) :

  1. Récupère l'utilisateur depuis la session Keycloak (req.session.user)
  2. Appelle logViaSession(user) qui :
    • Recherche ou crée l'utilisateur en base (Prisma user)
    • Calcule les rôles admin via groupes OIDC Keycloak + rôles persistés en BDD (table adminRole)
    • Calcule le bitmask de permissions admin (adminPerms)
    • Met à jour lastLogin
  3. Retourne { user, adminPerms } avec un JWT signé
  4. Si pas de session → 401

Méthode cible (server-nestjs)

Module NestJS

Créer le module UserModule dans apps/server-nestjs/src/modules/user/ :

user/
├── user.module.ts
├── user.controller.ts
├── user.service.ts
├── user-datastore.service.ts
└── *.spec.ts

UserController / UserService

La route POST /api/v1/auth doit être gérée par un UserController qui :

  1. Utilise le décorateur @Session() (session Fastify via fastify-session) pour récupérer l'utilisateur Keycloak
  2. Délègue la synchronisation à UserService.syncSession(user: UserTrial)
  3. UserService réplique la logique de logViaSession :
    • UserDatastoreService : findUnique/upsert sur user, findMany sur adminRole
    • Calcul du bitmask via PermissionService (existant dans infrastructure/permission)
    • Émet l'événement user.synchronisé via @nestjs/event-emitter
  4. Retourne UserSchema (contrat partagé via @cpn-console/shared)
  5. Si pas de session → UnauthorizedException (401)

Contrat API

Le contrat est déjà défini dans packages/shared/src/contracts/user.ts :

auth: {
  method: 'POST',
  path: ${apiPrefix}/auth`,
  summary: 'Login',
  description: 'OIDC callback to signin or signup',
  responses: { 200: UserSchema, 307: null, 500: ErrorSchema },
}

Utiliser les décorateurs NestJS natifs (@Post(), @Session()) — ne pas réutiliser ts-rest côté serveur.

Dépendances

  • AuthService (Couche 0, infrastructure/auth/) : existe déjà, gère l'auth par token (x-dso-token et bearer JWT). Cette route utilise un troisième chemin (session Keycloak via cookie), donc une extension de AuthService ou un guard dédié est nécessaire pour la session.
  • UserDatastoreService : n'existe pas encore. Doit être créé dans le module.
  • Événement adminRole.upsert : EventEmitterModule (Couche 0d) doit être fonctionnel (pré-requis : ticket à créer/assigner si non fait).
  • Nginx strangler : après validation, mettre à jour nginx-strangler/conf.d/routing.conf pour router POST /api/v1/auth vers server-nestjs.

Critères de fini

  • UserModule créé dans apps/server-nestjs/src/modules/user/
  • POST /api/v1/auth implémenté avec synchronisation session Keycloak
  • UserDatastoreService avec queries Prisma (pas de queries-index partagées)
  • Utilisation d'@nestjs/event-emitter pour adminRole.upsert
  • Tests unitaires Vitest (controller + service) — 0 régression
  • Test de contrat validant la parité avec le legacy (même réponse pour même session)
  • Nginx strangler configuré pour router la route
  • Issue [NestJS] Modularisation de server #1889 mise à jour (coche Migré (Code-Ready))
  • Documentation mise à jour dans MODULARISATION-STATUT.md

Estimation

~2 jours (complexité moyenne : logique métier dense, 3 chemins d'auth à harmoniser, événement Ember).

Références

  • Code legacy : apps/server/src/resources/user/router.ts (handler auth)
  • Business logic : apps/server/src/resources/user/business.ts (logViaSession)
  • Contrat : packages/shared/src/contracts/user.ts
  • Auth existante : apps/server-nestjs/src/modules/infrastructure/auth/
  • Documentation modularisation : apps/server-nestjs/documentation/Modularisation-de-console-server/

Metadata

Metadata

Assignees

No one assigned

    Labels

    refactorRefactor codetechTechnical issuetechnical debtRésoud de la dette technique

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions