diff --git a/doc/audit-log.md b/doc/audit-log.md index 4dad029..4da495e 100644 --- a/doc/audit-log.md +++ b/doc/audit-log.md @@ -194,7 +194,7 @@ Listener Doctrine (pas EventSubscriber — deprecie Symfony 8) utilisant `#[AsDo - Entite sans `#[Auditable]` → ignoree - Batch (fixtures, import) → chaque entite auditee, groupees par `request_id` - Console → `performed_by = 'system'`, `ip_address = null`, `request_id = null` -- ManyToMany : non couvert par `getEntityChangeSet()` — limitation connue. Les changements de collections (ex: `User::$rbacRoles`) ne sont pas audites. Ajout futur possible via `getScheduledCollectionUpdates()`. +- ManyToMany / OneToMany : tracees via `UnitOfWork::getScheduledCollectionUpdates()` et `getScheduledCollectionDeletions()` (cf. `AuditListener::captureCollectionChange`). Payload `{fieldName: {added: [ids], removed: [ids]}}`, merge dans le log deja en attente de l'entite proprietaire si elle est aussi scheduled (insertion → snapshot enrichi, update → diff merge, delete → ignore car redondant avec le snapshot delete). --- @@ -415,7 +415,7 @@ Ticket 1 ────► Ticket 2 ────► Ticket 3 ────┬── - **Type natif `uuid` PG** : 16 octets vs 36 en varchar, index 40% plus petit sur table append-only a croissance infinie - **Pattern swap-and-clear** dans `postFlush` : protection contre flush re-entrant - **Blacklist exact-match** sur noms de proprietes (`password`, `plainPassword`, `token`, `secret`) — en defense-in-depth avec `#[AuditIgnore]` -- **ManyToMany non audite** : limitation connue, `getEntityChangeSet()` ne couvre pas les collections +- **Collections to-many auditees** : tracees via `getScheduledCollectionUpdates` / `getScheduledCollectionDeletions`, payload `{added, removed}` merge dans le changeset de l'entite proprietaire (cf. `AuditListener::captureCollectionChange`) - **Erreur audit silencieuse** : loguee, jamais propagee — pas de retry/dead-letter (acceptable pour CRM interne) - **`entity_type` format `module.Entity`** : evite collisions si deux modules ont des entites de meme nom