Skip to content

BDD-21 — Création d'un dossier client

📁 Ticket fonctionnel

Créer et gérer des dossiers clients

L'administrateur peut créer des dossiers nommés, associés à une entreprise éligible, pour organiser les fichiers reçus par contexte métier.

1. User Story

En tant qu'administrateur,
Je veux créer des dossiers associés à une entreprise,
Afin d'organiser les fichiers déposés par contexte métier.

2. Critères d'acceptance

  1. L'admin peut créer un dossier (nom + entreprise) depuis la page /admin/folders.
  2. Le nom est obligatoire, non vide, limité à 255 caractères.
  3. L'entreprise doit exister côté console admin.
  4. Une entreprise ne peut avoir qu'un seul dossier actif.
  5. L'admin peut renommer un dossier existant.
  6. L'admin peut supprimer un dossier (soft delete).
  7. Un utilisateur non super-admin ne peut pas accéder à /admin/folders.
  8. Le lien "Clients" n'apparaît dans le header que pour les super-admins.
  9. La liste /admin/folders est paginée, filtrable et recherchable.

3. Flux complet

mermaid
sequenceDiagram
    autonumber
    participant A as 👤 Admin
    participant F as 🖥️ Front
    participant API as 🧠 API NestJS
    participant DB as 🗄️ prisma.tool

    A->>F: Accède à /admin/folders
    F->>F: superAdminGuard vérifie isSuperAdmin
    F->>API: GET /folders?page=1&limit=7
    API->>API: AuthGuard + SuperAdminGuard
    API->>DB: folders WHERE deleted_at IS NULL + count
    DB-->>API: liste paginée + total
    API-->>F: {items, total, page, limit}
    F-->>A: Affiche la liste

    A->>F: Clique "Nouveau dossier"
    F->>API: GET /folders/enterprises
    API-->>F: liste entreprises avec hasFolder
    F-->>A: Dialog avec select entreprise

    A->>F: Saisit nom + sélectionne entreprise → Créer
    F->>API: POST /folders {name, enterpriseId}
    API->>DB: folders.create(...)
    DB-->>API: dossier créé (avec entreprise)
    API-->>F: dossier
    F-->>A: Dossier ajouté en tête de liste

4. Sécurité

  • SuperAdminGuard (NestJS) vérifie user.role.type === 'super-admin' sur tous les endpoints /folders (sauf GET /folders/mine).
  • superAdminGuard (Vue Router) protège la route /admin/folders côté front et redirige vers /upload pour tout rôle non super-admin.
  • Le enterpriseId du body est validé côté backend via la liste console admin.
  • Une contrainte métier interdit plusieurs dossiers actifs pour une même entreprise.
  • Soft delete : deleted_at positionné, les requêtes filtrent WHERE deleted_at IS NULL.

5. Périmètre fonctionnel

Backend

FichierRôle
back/src/guards/superAdminGuard.tsGuard NestJS, vérifie role.type === 'super-admin'
back/src/api/folders/folder.module.tsModule NestJS
back/src/api/folders/folder.controller.ts11 endpoints REST
back/src/api/folders/folder.service.tsLogique métier CRUD
back/src/exceptions/folder.exceptions.tsExceptions custom (404, 400)
back/src/api/users/user.service.tsgetMe expose maintenant role
sql/tool_03_create_folders.sqlMigration SQL (table folders)
back/prisma/schema.prismaModel folders + relations nommées

Frontend

FichierRôle
front/src/stores/folder-store.jsStore Pinia (CRUD dossiers + pagination + entreprises éligibles)
front/src/stores/user-store.jsGetter isAdmin
front/src/router/superAdminGuard.jsGuard Vue Router — redirige non super-admin vers /upload
front/src/router/folderDetailGuard.jsGuard Vue Router — accès dossier détail (super-admin uniquement)
front/src/router/myFolderRedirectGuard.jsGuard Vue Router — /admin/folders/me redirige non super-admin vers /upload
front/src/router/routes.jsRoutes /admin, /admin/folders, catch-all 404
front/src/layouts/MainLayout.vueLien "Clients" conditionnel (isSuperAdmin uniquement)
front/src/App.vuebeforeEach peuple userStore.user avant les guards
front/src/pages/admin/folders/AdminFoldersPage.vuePage admin dossiers (pagination, recherche, filtres)
front/src/components/admin/FolderListItem.vueItem de liste avec menu actions
front/src/components/admin/CreateFolderDialog.vueDialog de création depuis les entreprises éligibles
front/src/pages/ErrorNotFoundPage.vuePage 404

6. Endpoints API

MéthodeCheminDescription
POST/foldersCréer un dossier
GET/foldersLister les dossiers non supprimés, paginés
GET/folders/enterprisesLister les entreprises éligibles avec hasFolder
PATCH/folders/:uuidRenommer un dossier
DELETE/folders/:uuidSoft delete

Tous protégés par AuthGuard + SuperAdminGuard, sauf GET /folders/mine (AuthGuard seul).

7. Modèle de données

sql
CREATE TABLE public.folders (
  id            SERIAL PRIMARY KEY,
  uuid          UUID NOT NULL DEFAULT gen_random_uuid() UNIQUE,
  name          VARCHAR(255) NOT NULL,
  client_id     INTEGER NOT NULL REFERENCES public.users(id),
  enterprise_id INTEGER NOT NULL REFERENCES public.enterprises(id),
  created_by    INTEGER NOT NULL REFERENCES public.users(id),
  created_at    TIMESTAMP(6) DEFAULT CURRENT_TIMESTAMP,
  updated_at    TIMESTAMP(6),
  deleted_at    TIMESTAMP(6)
);

8. Aperçu de l'interface

Page dossiers clients

Page /admin/folders — liste paginée des dossiers avec entreprise et date

Dialog de creation d un dossier

Dialog "Nouveau dossier" — saisie du nom et sélection de l entreprise

8. Points de vérification

  • La page /admin/folders est accessible uniquement aux super-admins (guard front + back).
  • Le lien "Clients" n'apparaît pas pour un utilisateur non super-admin.
  • /admin et /admin/ redirigent vers /admin/folders.
  • Tout chemin inconnu affiche la page 404 avec un bouton retour.
  • La page affiche le total issu de la pagination backend.
  • La recherche et le filtre accountType déclenchent un rechargement paginé.
  • La création d'un dossier affiche immédiatement l entreprise dans la liste.
  • Les entreprises déjà liées à un dossier actif sont exclues via hasFolder.
  • Le renommage conserve les infos entreprise (pas de régression).
  • Le soft delete retire le dossier de la liste sans recharger la page.

9. Tests associés

Backend

  • back/src/guards/superAdminGuard.spec.ts
  • back/src/api/folders/folder.service.spec.ts
  • back/test/e2e/folders-controller.e2e-spec.ts (403 SuperAdminGuard)

Frontend (unitaires)

  • front/src/__tests__/stores/folder-store.spec.js
  • front/src/__tests__/stores/user-store.spec.js
  • front/src/__tests__/router/superAdminGuard.spec.js
  • front/src/__tests__/router/folderDetailGuard.spec.js
  • front/src/__tests__/router/myFolderRedirectGuard.spec.js
  • front/src/__tests__/router/routes.spec.js
  • front/src/__tests__/layouts/MainLayout.spec.js
  • front/src/__tests__/pages/admin/folders/AdminFoldersPage.spec.js
  • front/src/__tests__/components/admin/FolderListItem.spec.js

E2E Playwright

  • front/e2e/pages/admin/admin-folders.spec.js
  • front/e2e/pages/admin/admin-folder-detail.spec.js

Variables d'environnement requises pour les tests E2E admin :

env
E2E_REAL_AUTH=true
[email protected]
E2E_TEST_ADMIN_PASSWORD=<mot de passe admin>