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>
1 parent 0e3b70b commit d7270ceb29311d2194eee35d96a3e21adbaa200f
@Eugene Sukhodolskiy Eugene Sukhodolskiy authored 7 hours ago
Showing 18 changed files
View
CLAUDE.md
View
alembic/versions/20261003_0004_user_channel.py 0 → 100644
View
app/api/admin_routes.py
View
app/api/admin_schemas.py
View
app/api/auth_routes.py
View
app/api/me_routes.py 0 → 100644
View
app/main.py
View
app/models/dicts.py
View
app/models/events.py
View
app/worker/tasks.py
View
docs/05-ingestion-api.md
View
frontend/src/App.vue
View
frontend/src/api.js
View
frontend/src/components/RuleForm.vue
View
frontend/src/router.js
View
frontend/src/ui.js
View
frontend/src/views/DeniedView.vue
View
frontend/src/views/MyEventsView.vue 0 → 100644