# Gnexus Synapse

Централизованный хаб уведомлений экосистемы Gnexus: сервисы присылают событие «что случилось», Synapse решает — кому, куда и каким каналом доставить (Telegram, Email, Push, внутренний лог, system-to-system в Navi).

## Стек

- **API**: Python, FastAPI, SQLAlchemy 2 + Alembic
- **Очередь**: Celery + Redis
- **БД**: PostgreSQL (в докере, вместе с приложением)
- **Админка**: SPA на Vue 3 + [Gnexus UI Kit](https://git.gnexus.space/git/root/gnexus-ui-kit), раздаётся статикой из контейнера FastAPI
- **Аутентификация**: gnexus-auth (SSO), доступ к админке — роли `admin` и выше

## Что уже в каркасе

- FastAPI-приложение: `/api/healthz` (liveness), `/api/readyz` (зависимости), `/api/docs` (Swagger)
- Гейт админки по ролям gnexus-auth: `app/auth/deps.py` (`get_current_user` → `require_admin`, 401/403)
- Celery-воркер с каркасной задачей `synapse.ping`
- Alembic (миграции пока пустые — схема БД в задаче #34)
- Vue 3 SPA: вход (dev-заглушка), дашборд, экран «доступ запрещён» для роли ниже admin
- docker-compose: api + worker + postgres + redis, миграции применяются при старте

## Quickstart

```bash
cp .env.example .env   # заполнить пароль БД, gnexus-auth-креды появятся после регистрации клиента
docker compose up -d --build
curl http://localhost:8000/api/healthz
```

После сборки админка доступна на `http://localhost:8000/` (SPA раздаёт контейнер api).

### Локальная разработка без docker

```bash
# терминал 1 — API (нужны работающие Postgres/Redis, DATABASE_URL хост = localhost)
python -m venv .venv && source .venv/bin/activate
pip install -r requirements.txt
uvicorn app.main:app --reload

# терминал 2 — воркер
celery -A app.worker.celery_app worker --loglevel=info

# терминал 3 — SPA dev-сервер (проксирует /api на :8000)
cd frontend && npm install && npm run dev   # http://localhost:5173
```

### Проверка воркера

```bash
docker compose exec api celery -A app.worker.celery_app call synapse.ping   # возвращает task id
```

## Вход в админку

1. Зарегистровать OAuth-клиент `synapse` на сервере gnexus-auth и вписать креды в `.env` (`GAUTH_*`).
2. Получить access-токен через `POST /oauth/token` gnexus-auth (или вставить токен в форму входа — dev-режим каркаса).
3. Пользователь с `system_role` ниже `admin` получает экран «Доступ запрещён» (и 403 от API).

## Структура

```text
app/
  main.py            FastAPI: роуты API + статики SPA
  config.py          настройки из .env
  database.py        SQLAlchemy engine/session
  auth/deps.py       SSO-валидация + гейт ролей admin/superadmin
  api/routes.py      healthz, readyz, admin/me
  worker/            Celery: celery_app, tasks
alembic/             миграции (env.py читает DATABASE_URL из .env)
frontend/            Vue 3 SPA админки (сборка кладётся в spa_static/ образа)
docker/entrypoint.sh режимы api (миграции+uvicorn) / worker (celery)
docker-compose.yml   api, worker, postgres, redis
```

## Roadmap (задачи gntodo, проект 9)

#33 скелет → #34 схема БД → #32 контракты API → #31 Ingestion → #30 Routing Engine → #29 Provider Adapters → #28 System-to-System (Navi) → #27 тесты и деплой.