62 lines
3.4 KiB
Markdown
62 lines
3.4 KiB
Markdown
# Ticket Executor - Learnings
|
|
|
|
## Session 2026-03-17 (26 tickets)
|
|
|
|
### T-001 — Secrets .env
|
|
- **Pattern**: Replace secrets with `change_me_in_env_local` placeholder, move real values to `.env.local`
|
|
- **Gotcha**: `.env.local` must contain ALL overridden secrets
|
|
|
|
### T-002 — Security API Gitea
|
|
- **Pattern**: Ajouter `security: "is_granted('ROLE_USER')"` sur les opérations ApiResource
|
|
- **Learning**: Vérifier d'abord les ressources déjà sécurisées pour ne pas dupliquer
|
|
|
|
### T-003 — SVG Upload
|
|
- **Pattern**: Double protection - bloquer à l'upload (retirer du MIME allowlist) + defense-in-depth (Content-Disposition: attachment au download)
|
|
- **Learning**: Toujours vérifier upload ET download controllers
|
|
|
|
### T-004 — MCP create-task / Repos numérotation
|
|
- **Gotcha critique**: PostgreSQL n'autorise PAS `FOR UPDATE` avec des fonctions d'agrégation (`MAX`)
|
|
- **Fix**: Utiliser `pg_advisory_xact_lock()` au lieu de `FOR UPDATE` pour les queries avec agrégation
|
|
- **Pattern**: Offset les lock keys (+1000000) pour éviter collisions entre Task et ClientTicket
|
|
|
|
### T-005 — Filter ROLE_CLIENT projects
|
|
- **Pattern**: Créer une Doctrine Extension (`QueryCollectionExtensionInterface` + `QueryItemExtensionInterface`) pour filtrer par relation
|
|
- **Learning**: Symfony autoconfigure enregistre l'extension automatiquement
|
|
|
|
### T-006 — Block client doc upload
|
|
- **Pattern**: Vérifier le rôle dans le Processor AVANT de résoudre l'IRI de la tâche
|
|
- **Learning**: Le portail client envoie un `clientTicket` IRI (pas de `task` IRI), donc le check sur `taskIri` non-vide suffit
|
|
|
|
### T-007 — MCP role checks
|
|
- **Pattern**: Injecter `Security` dans chaque Tool, vérifier au début de `__invoke()`
|
|
- **Learning**: 22 tools à modifier - bien séparer ROLE_ADMIN (users/clients) vs ROLE_USER (le reste)
|
|
|
|
### T-009 — Password hashing
|
|
- **Pattern**: Champ `plainPassword` non-persisté, writable uniquement, hashé dans le Processor
|
|
- **Learning**: Modifier aussi le frontend (DTO + composant) quand on renomme un champ API
|
|
|
|
### T-010 — Rate limiting
|
|
- **Gotcha**: `login_throttling` nécessite `symfony/rate-limiter` installé, pas juste dans composer.json
|
|
- **Learning**: Toujours vérifier que les packages sont installés, pas juste déclarés
|
|
|
|
### T-012 — Harmoniser repos numérotation
|
|
- **Pattern**: Aligner les contrats (retourner le max, pas le next) et mettre le +1 côté appelant
|
|
- **Learning**: Vérifier TOUS les appelants d'une méthode renommée
|
|
|
|
### T-015 — useAvatarService
|
|
- **Learning**: Quand on migre vers `useApi()`, ajouter la détection FormData pour ne pas écraser le Content-Type multipart
|
|
|
|
### T-020 — i18n
|
|
- **Pattern**: Ajouter `useI18n()` dans le setup script avant de pouvoir utiliser `t()` dans le JS
|
|
- **Learning**: Les templates peuvent utiliser `$t()` directement sans import
|
|
|
|
### T-022 — Retirer twig-bundle
|
|
- **Pattern**: Retirer de composer.json + bundles.php + supprimer config YAML + templates
|
|
- **Learning**: API Platform ne requiert PAS twig, c'est juste suggéré pour Swagger UI
|
|
|
|
## Meta-learnings
|
|
- **Parallélisation**: Les tickets touchant des fichiers indépendants peuvent tourner en parallèle sans problème
|
|
- **MCP status**: Toujours mettre "En cours" AVANT de commencer, "Terminé" APRÈS validation
|
|
- **PostgreSQL gotchas**: Tester les queries SQL avec agrégation + locking sur PostgreSQL, pas MySQL
|
|
- **Agents**: Les agents simples (1-3 fichiers) terminent en ~30s, les complexes (22 fichiers) en ~8min
|