Appearance
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
- L'admin peut créer un dossier (nom + entreprise) depuis la page
/admin/folders. - Le nom est obligatoire, non vide, limité à 255 caractères.
- L'entreprise doit exister côté console admin.
- Une entreprise ne peut avoir qu'un seul dossier actif.
- L'admin peut renommer un dossier existant.
- L'admin peut supprimer un dossier (soft delete).
- Un utilisateur non super-admin ne peut pas accéder à
/admin/folders. - Le lien "Clients" n'apparaît dans le header que pour les super-admins.
- La liste
/admin/foldersest 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 liste4. Sécurité
SuperAdminGuard(NestJS) vérifieuser.role.type === 'super-admin'sur tous les endpoints/folders(saufGET /folders/mine).superAdminGuard(Vue Router) protège la route/admin/folderscôté front et redirige vers/uploadpour tout rôle non super-admin.- Le
enterpriseIddu 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_atpositionné, les requêtes filtrentWHERE deleted_at IS NULL.
5. Périmètre fonctionnel
Backend
| Fichier | Rôle |
|---|---|
back/src/guards/superAdminGuard.ts | Guard NestJS, vérifie role.type === 'super-admin' |
back/src/api/folders/folder.module.ts | Module NestJS |
back/src/api/folders/folder.controller.ts | 11 endpoints REST |
back/src/api/folders/folder.service.ts | Logique métier CRUD |
back/src/exceptions/folder.exceptions.ts | Exceptions custom (404, 400) |
back/src/api/users/user.service.ts | getMe expose maintenant role |
sql/tool_03_create_folders.sql | Migration SQL (table folders) |
back/prisma/schema.prisma | Model folders + relations nommées |
Frontend
| Fichier | Rôle |
|---|---|
front/src/stores/folder-store.js | Store Pinia (CRUD dossiers + pagination + entreprises éligibles) |
front/src/stores/user-store.js | Getter isAdmin |
front/src/router/superAdminGuard.js | Guard Vue Router — redirige non super-admin vers /upload |
front/src/router/folderDetailGuard.js | Guard Vue Router — accès dossier détail (super-admin uniquement) |
front/src/router/myFolderRedirectGuard.js | Guard Vue Router — /admin/folders/me redirige non super-admin vers /upload |
front/src/router/routes.js | Routes /admin, /admin/folders, catch-all 404 |
front/src/layouts/MainLayout.vue | Lien "Clients" conditionnel (isSuperAdmin uniquement) |
front/src/App.vue | beforeEach peuple userStore.user avant les guards |
front/src/pages/admin/folders/AdminFoldersPage.vue | Page admin dossiers (pagination, recherche, filtres) |
front/src/components/admin/FolderListItem.vue | Item de liste avec menu actions |
front/src/components/admin/CreateFolderDialog.vue | Dialog de création depuis les entreprises éligibles |
front/src/pages/ErrorNotFoundPage.vue | Page 404 |
6. Endpoints API
| Méthode | Chemin | Description |
|---|---|---|
POST | /folders | Créer un dossier |
GET | /folders | Lister les dossiers non supprimés, paginés |
GET | /folders/enterprises | Lister les entreprises éligibles avec hasFolder |
PATCH | /folders/:uuid | Renommer un dossier |
DELETE | /folders/:uuid | Soft 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 /admin/folders — liste paginée des dossiers avec entreprise et date

Dialog "Nouveau dossier" — saisie du nom et sélection de l entreprise
8. Points de vérification
- La page
/admin/foldersest accessible uniquement aux super-admins (guard front + back). - Le lien "Clients" n'apparaît pas pour un utilisateur non super-admin.
/adminet/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
accountTypedé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.tsback/src/api/folders/folder.service.spec.tsback/test/e2e/folders-controller.e2e-spec.ts(403 SuperAdminGuard)
Frontend (unitaires)
front/src/__tests__/stores/folder-store.spec.jsfront/src/__tests__/stores/user-store.spec.jsfront/src/__tests__/router/superAdminGuard.spec.jsfront/src/__tests__/router/folderDetailGuard.spec.jsfront/src/__tests__/router/myFolderRedirectGuard.spec.jsfront/src/__tests__/router/routes.spec.jsfront/src/__tests__/layouts/MainLayout.spec.jsfront/src/__tests__/pages/admin/folders/AdminFoldersPage.spec.jsfront/src/__tests__/components/admin/FolderListItem.spec.js
E2E Playwright
front/e2e/pages/admin/admin-folders.spec.jsfront/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>