mirror of
https://github.com/tiennm99/DocsGPT.git
synced 2026-10-15 10:14:32 +00:00
fix(audit): derive attribution for legacy inserts instead of defaulting it
The DEFAULT 'unknown' added in the last pass stopped a previous-release process from raising NotNullViolation mid-rollout, but it threw the attribution away to do it. The highest-volume auth_events writers are OIDC login and silent renewal, where the actor is simply the user, so a rollout window would have flattened exactly the rows that were trivially recoverable. Lifts both derivation rules into SQL functions -- auth_events_derive_actor and auth_events_derive_target -- so the backfill and a BEFORE INSERT trigger share one definition rather than two copies of the same CASE drifting apart. The trigger guards on NEW.actor_id IS NULL, which identifies a legacy insert exactly because the repository always supplies one. That distinction matters for target_id: a current writer sets it NULL deliberately for events with no user target, and deriving there would name the actor as their own target. Kept rather than scheduled for removal: it is a no-op on the path the repository takes, and it keeps the column's contract true for any writer that bypasses it.
This commit is contained in:
1 parent
25c82003d7
commit
f693111de1
3 files changed
+140
-29
No files matched your search
@@ -190,7 +190,9 @@ Authentication activity is recorded in `auth_events`, an append-only Postgres ta
|
||||
- `actor_id` — who performed the action. Never empty.
|
||||
- `target_id` — the user the action was performed on, or `NULL` when the event is not about a user (a team change, an instance-wide policy).
|
||||
|
||||
They differ whenever someone acts on someone else: an admin deactivating an account is `actor_id = <the admin>`, `target_id = <the account>`. For self-service events such as a login they are the same user. Automated actors are named `system:oidc` (a group-driven role change at login) and `system:scim` (provisioning). `actor_id` defaults to `unknown`, which only a process from a release predating the column can produce.
|
||||
They differ whenever someone acts on someone else: an admin deactivating an account is `actor_id = <the admin>`, `target_id = <the account>`. For self-service events such as a login they are the same user. Automated actors are named `system:oidc` (a group-driven role change at login) and `system:scim` (provisioning).
|
||||
|
||||
A `BEFORE INSERT` trigger fills both columns for any row that arrives without an `actor_id`, applying the same rules as the migration's backfill. That keeps attribution intact for a writer from a release that predates the columns — during a rolling deployment, for instance — instead of rejecting the insert or flattening the actor to a sentinel.
|
||||
|
||||
| Event | Recorded when |
|
||||
| --- | --- |
|
||||
|
||||
Reference in new issue
Block a user