diff --git a/docs/architecture/2026-09-10-operator-analytics-contract.md b/docs/architecture/2026-09-10-operator-analytics-contract.md index ac4ef63..d76b054 100644 --- a/docs/architecture/2026-09-10-operator-analytics-contract.md +++ b/docs/architecture/2026-09-10-operator-analytics-contract.md @@ -149,8 +149,13 @@ "actorType": "tenant", "actorId": "1f2e3d4c-5b6a-7980-1234-56789abcdef0", "tenantId": "aabbccdd-eeff-0011-2233-445566778899", + "tenantName": "ООО «Ромашка»", "ip": "203.0.113.7", - "detailJson": "{\"cardId\":\"c_1a2b3c4d5e6f\",\"to\":\"planned\"}", + "changes": [ + { "field": "cardId", "to": "c_1a2b3c4d5e6f" }, + { "field": "to", "to": "planned" } + ], + "detailJson": "{\"changes\":[{\"field\":\"cardId\",\"to\":\"c_1a2b3c4d5e6f\"},{\"field\":\"to\",\"to\":\"planned\"}]}", "at": "2026-09-10T15:22:46.123Z", "id": 1042 } @@ -162,7 +167,18 @@ ``` - `items` — новые сверху (`at` DESC). `total` — полное число по фильтру (без `limit`/`offset`). -- `detailJson` — **строка** JSON деталей события (без секретов), может быть `null`. +- `tenantName` — имя пользователя события (join с реестром); `null`, если пользователя нет/не разрешено. +- `changes` — человекочитаемые изменения параметров события (см. «Детали события»); `[]`, если деталей нет. +- `detailJson` — **строка** сырого JSON деталей события (без секретов) для спойлера; может быть `null`. + +### Детали события (`changes`) + +Детали события хранятся как JSON вида `{ "changes": [ { "field": "<код>", "from": "<было>", "to": "<стало>" } ] }`, +где `field` — стабильный код параметра, `from` — предыдущее значение (`null` — параметр задан впервые), +`to` — новое. Сериализация деталей — `AuditService.ToDetailJson`, форма изменения — `AuditDetails.Set`/ +`AuditDetails.Change`. Ядро отдаёт `changes` как есть; человекочитаемые названия событий, акторов, параметров +и значений — в ресурсах интерфейса (`ru.js`: `operator.event`/`operator.actor`/`operator.field`/`operator.value`). +Прежние записи плоского формата (`{ "login": "..." }`, пары `old*`/`new*`) читаются обратно совместимо. **Коды**: `200`, `401`.