|
feat: многопользовательский режим — личный лог по каналу user
- Конвенция payload.user_id (sub gnexus-auth): контракт v1 цел, получателей в конверте нет — дописка в docs/05-ingestion-api.md. - Канал user в CHANNELS: правило с действием user направляет событие в личный лог пользователя; без payload.user_id — skipped-delivery с причиной (аудит). - deliveries.recipient_user_id + ix_deliveries_recipient; миграция 0004 пересоздаёт ck_channel на всех трёх таблицах (deliveries, routing_rule_actions, channel_targets). - Routing: _throttled по recipient для user-канала; s2s без цели — прежний ретрай-цикл. - Правила: действие user валидно без цели, user + target_id — 422; TargetIn по-прежнему отвергает user. - GET /api/v1/me (любой аутентифицированный) и GET /api/v1/me/events (личный лог строго по своему sub, дедуп по событию). - OAuth-колбэк: токен выдаётся любому аутентифицированному, роль решает только раздел; adмин-API остаётся под 403. - SPA: роль-гейт в router (user -> /my-events, прямой заход в админ-маршруты редиректит), нав от роли, MyEventsView («Мои события»), getSession-кэш. Co-Authored-By: Claude Code <noreply@anthropic.com> |
|---|
|
|
| CLAUDE.md |
|---|
| alembic/versions/20261003_0004_user_channel.py 0 → 100644 |
|---|
| app/api/admin_routes.py |
|---|
| app/api/admin_schemas.py |
|---|
| app/api/auth_routes.py |
|---|
| app/api/me_routes.py 0 → 100644 |
|---|
| app/main.py |
|---|
| app/models/dicts.py |
|---|
| app/models/events.py |
|---|
| app/worker/tasks.py |
|---|
| docs/05-ingestion-api.md |
|---|
| frontend/src/App.vue |
|---|
| frontend/src/api.js |
|---|
| frontend/src/components/RuleForm.vue |
|---|
| frontend/src/router.js |
|---|
| frontend/src/ui.js |
|---|
| frontend/src/views/DeniedView.vue |
|---|
| frontend/src/views/MyEventsView.vue 0 → 100644 |
|---|