From 239cd6398eda20182f6a6c4c4e6172f51a83aef2 Mon Sep 17 00:00:00 2001 From: matthieu Date: Sun, 15 Mar 2026 21:26:05 +0100 Subject: [PATCH] docs : update CLAUDE.md with client portal context and gotchas Co-Authored-By: Claude Opus 4.6 (1M context) --- CLAUDE.md | 26 +++++++++++++++++++------- 1 file changed, 19 insertions(+), 7 deletions(-) diff --git a/CLAUDE.md b/CLAUDE.md index 1640a80..678107b 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -12,9 +12,11 @@ Application de gestion de projet. Monorepo Symfony 8 (API Platform 4) + Nuxt 4. ## Structure ``` -src/Entity/ # Entités Doctrine (User, Client, Project, Task, TaskStatus, TaskEffort, TaskPriority, TaskTag, TaskGroup, TimeEntry, GiteaConfiguration) +src/Entity/ # Entités Doctrine (User, Client, Project, Task, TaskStatus, TaskEffort, TaskPriority, TaskTag, TaskGroup, TimeEntry, GiteaConfiguration, ClientTicket, Notification, TaskDocument) src/ApiResource/ # Ressources API Platform (si découplées des entités) -src/State/ # Providers et Processors API Platform (MeProvider, AppVersionProvider, ActiveTimeEntryProvider, UserPasswordHasherProcessor, TaskNumberProcessor, Gitea*Provider, Gitea*Processor) +src/State/ # Providers et Processors API Platform (MeProvider, AppVersionProvider, ActiveTimeEntryProvider, UserPasswordHasherProcessor, TaskNumberProcessor, ClientTicket*Provider/Processor, NotificationProvider, Gitea*Provider, Gitea*Processor) +src/Service/ # Services métier (NotificationService) +src/Controller/ # Controllers custom Symfony (NotificationUnreadCountController, MarkAllReadController) src/Mcp/Tool/ # MCP tools organisés par domaine (Project/, Task/, TaskMeta/, TimeEntry/, Reference/) src/Security/ # Authenticators custom (ApiTokenAuthenticator pour MCP HTTP) src/Command/ # Commandes console (GenerateApiTokenCommand) @@ -26,12 +28,12 @@ migrations/ # Migrations Doctrine docs/plans/ # Plans d'implémentation docs/superpowers/ # Plans et specs superpowers frontend/ # App Nuxt 4 -frontend/pages/ # Pages (index, login, my-tasks, projects, projects/[id], projects/[id]/groups, projects/[id]/archives, time-tracking, admin) -frontend/layouts/ # Layouts (pas "layout") -frontend/components/ # Composants Vue organisés en sous-dossiers (ui/, client/, project/, task/, user/, admin/, time-tracking/) -frontend/composables/# Composables (useApi, useAppVersion) +frontend/pages/ # Pages (index, login, my-tasks, projects, projects/[id], projects/[id]/groups, projects/[id]/archives, time-tracking, admin, portal/, portal/projects/[id], portal/projects/[id]/new-ticket) +frontend/layouts/ # Layouts (default, portal) +frontend/components/ # Composants Vue organisés en sous-dossiers (ui/, client/, project/, task/, user/, admin/, time-tracking/, client-ticket/, notification/) +frontend/composables/# Composables (useApi, useAppVersion, useNotifications, useClientTicketHelpers) frontend/stores/ # Stores Pinia (auth, ui, timer) -frontend/services/ # Services API (auth, clients, gitea, projects, tasks, task-statuses, task-efforts, task-groups, task-priorities, task-tags, users, time-entries) +frontend/services/ # Services API (auth, clients, gitea, projects, tasks, task-statuses, task-efforts, task-groups, task-priorities, task-tags, users, time-entries, client-tickets, notifications, task-documents) frontend/services/dto/ # Types TypeScript frontend/i18n/locales/ # Fichiers de traduction (langDir résolu depuis i18n/) ``` @@ -73,6 +75,11 @@ Exemples : `feat : add login page`, `fix(auth) : prevent null token crash` - Routes API préfixées `/api` (via `config/routes/api_platform.yaml`) - Le login (`/login_check`) est hors prefix `/api`, nginx réécrit `REQUEST_URI` vers `/login_check` - PHP CS Fixer : règles Symfony + PSR-12 + strict types +- Rôles : `ROLE_ADMIN`, `ROLE_USER`, `ROLE_CLIENT` — hiérarchie dans `security.yaml` +- `User::getRoles()` n'ajoute PAS `ROLE_USER` si l'user a `ROLE_CLIENT` (isolation) +- PostgreSQL : `LIKE` sur colonne JSON ne marche pas → utiliser `roles::text LIKE` via native SQL +- Controllers custom sous `/api/` : ajouter `priority: 1` sur `#[Route]` pour éviter le conflit avec API Platform `{id}` +- Serialization : pour embarquer une relation (pas IRI), ajouter le groupe du parent aux propriétés de l'entité cible ### Frontend @@ -82,6 +89,9 @@ Exemples : `feat : add login page`, `fix(auth) : prevent null token crash` - Middleware global `auth.global.ts` protège les routes - Traductions dans `frontend/i18n/locales/` (le module résout `langDir` depuis `i18n/`) - 4 espaces d'indentation +- MalioSelect : options `{ label: string, value: number | null }` uniquement — pas de string values, utiliser `