Aller au contenu

PD-15 — Plan d'implémentation


📚 Navigation User Story | Document | | | ---------- | -- | | 📋 [Spécification](PD-15-specification.md) | | | 🛠️ **Plan d'implémentation** | *(ce document)* | | ✅ [Critères d'acceptation](PD-15-acceptability.md) | | | 📝 [Retour d'expérience](PD-15-rex.md) | | [← Retour à backend-core](../PD-186-epic.md) · [↑ Index User Story](index.md)

Objectif

Créer le schéma PostgreSQL et l'entité TypeORM pour la table users avec support SRP-6a (salt + verifier).

Choix techniques retenus

  • Table : public.users
  • Auth : SRP-6a (salt + verifier, pas de hash password)
  • Identifiant : UUID v4
  • Contraintes : Email unique, validation format

Architecture ciblée

src/modules/auth/entities/
└── user.entity.ts            # Entité TypeORM User

src/database/migrations/
└── 1731888000000-CreateUsersTable.ts

Découpage technique

Phase 1 : Migration

  1. Créer migration CreateUsersTable :
CREATE TABLE public.users (
  id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
  email VARCHAR(255) NOT NULL UNIQUE,
  salt VARCHAR(64) NOT NULL,        -- SRP salt (hex)
  verifier TEXT NOT NULL,           -- SRP verifier (hex)
  plan VARCHAR(50) DEFAULT 'free',
  created_at TIMESTAMPTZ DEFAULT NOW(),
  updated_at TIMESTAMPTZ DEFAULT NOW()
);

CREATE INDEX idx_users_email ON public.users(email);
CREATE INDEX idx_users_created_at ON public.users(created_at DESC);
  1. Créer trigger updated_at

Phase 2 : Entité TypeORM

  1. Créer user.entity.ts :
@Entity('users')
export class User {
  @PrimaryGeneratedColumn('uuid')
  id: string;

  @Column({ unique: true })
  email: string;

  @Column()
  salt: string;

  @Column('text')
  verifier: string;

  @Column({ default: 'free' })
  plan: string;

  @CreateDateColumn()
  createdAt: Date;

  @UpdateDateColumn()
  updatedAt: Date;
}

Phase 3 : Validation

  1. Contraintes niveau DB :
  2. Email format via CHECK
  3. Salt longueur 32-64 hex
  4. Verifier non vide

  5. Validation niveau DTO :

  6. class-validator decorators
  7. Regex email RFC 5322

Phase 4 : Repository

  1. Créer UserRepository si nécessaire
  2. Méthodes : findByEmail, create
  3. Pas de findByPassword (SRP)

Phase 5 : Tests

  1. Tests migration up/down
  2. Tests contraintes unicité
  3. Tests entité TypeORM
  4. Tests validation email

Points de vigilance

  • Pas de password : Jamais stocké, même hashé
  • Salt/Verifier : Format hex validé
  • Email : Normaliser lowercase avant stockage
  • GDPR : Prévoir soft delete si nécessaire

Hors périmètre

  • Authentification SRP (→ PD-24)
  • Gestion rôles/permissions (→ future US)
  • Profile utilisateur étendu (→ future US)