# Fable Media Platform

Рабочий scaffold по `plan.md` и `ТЗ_единый.md`: университетская платформа управления медиаконтентом, а не общий сайт университета.

## Что реализовано

- React + TailwindCSS frontend на русском языке.
- Публичный контур: главная, каталог, поиск, материалы, медиа, мероприятия как тип контента, спикеры.
- Персонифицированный контур: демо-вход, профиль, роли, подписки, уведомления, комментарии.
- Административный контур: dashboard, пользователи и роли, очередь модерации, журнал действий, форма черновика.
- Elysia gateway на Node.js с CORS, request ID, rate limiting, service proxy, token-style fallback auth и RBAC checks.
- Go microservices для auth, user, content, taxonomy, speaker, subscription, notification, comment, search, analytics, audit, media.
- Рабочие backend endpoints: регистрация, вход, профиль, контент CRUD, медиа, категории, теги, спикеры, подписки, уведомления, комментарии, поиск, аналитика, admin users/roles/audit.
- PostgreSQL migration для сущностей из ТЗ.
- Docker Compose для локального запуска всех контуров.

Все данные в интерфейсе и API являются явно демонстрационными заглушками. Реальные люди, подразделения, интеграции, юридические сведения и брендовые материалы не добавлялись.

Backend теперь использует PostgreSQL через GORM в Go-сервисах. Демо-данные остаются только как seed-набор для локального запуска и проверки сценариев.

## Локальный запуск

Установить зависимости:

```bash
pnpm install
```

Запустить весь проект без Docker:

```bash
npm run dev
```

Это одновременно запускает Go backend services, Node gateway и React/Vite frontend.

Запустить backend без Docker: все Go-сервисы + Node gateway:

```bash
npm run dev:backend
```

Для этого локально должен быть доступен PostgreSQL на `127.0.0.1:5432` или должен быть задан `DATABASE_URL`.

Запустить только gateway с fallback demo API:

```bash
npm run dev:gateway
```

`npm run dev:gateway` оставляет только gateway. Для рабочего backend-контура используйте `npm run dev:backend`, потому что Go-сервисы теперь требуют реальную БД и не должны подменяться скрытым demo-store.

Запустить frontend:

```bash
npm run dev:web
```

Проверить Go services:

```bash
npm run test:go
```

Docker сейчас необязателен, но PostgreSQL обязателен для Go-сервисов. Для текущей разработки используйте `npm run dev:backend` и `npm run dev:web`.

Проверить сборку всего проекта:

```bash
npm run check
```

Запуск всего окружения через Docker, если он понадобится позже:

```bash
docker compose up --build
```

В Docker Compose gateway проксирует `/api/*` в Go-сервисы. Frontend nginx также проксирует `/api/*` в gateway, поэтому `http://localhost:5173` работает как единое приложение.

Frontend: `http://localhost:5173`.

Gateway health: `http://localhost:3000/health`.

Internal services health through gateway: `http://localhost:3000/api/services/health`.

## Демо-вход

Логин: `demo_admin`

Пароль: `demo_password`

Auth service принимает демо-учетную запись из seed-данных, проверяет хэш пароля и выдает подписанный token для локального backend-контура.

## Backend API

- `POST /api/auth/register`, `POST /api/auth/login`, `GET /api/auth/me`, `POST /api/auth/logout`, `POST /api/auth/change-password`
- `GET /api/content`, `GET /api/content/:id`, `POST /api/content`, `PATCH /api/content/:id`, `DELETE /api/content/:id`
- `GET /api/media`, `GET /api/events`, `GET /api/categories`, `GET /api/tags`, `GET /api/speakers`
- `GET /api/search?q=...`, `GET /api/subscriptions`, `POST /api/subscriptions`
- `GET /api/notifications`, `PATCH /api/notifications/:id/read`
- `GET /api/comments/:contentId`, `POST /api/comments/:contentId`
- `GET /api/analytics/summary`, `GET /api/admin/dashboard`, `GET /api/admin/users`, `GET /api/admin/roles`, `GET /api/admin/audit`

## Открытые вопросы из плана

- Финальное название платформы.
- Разрешенные логотипы и брендовые материалы.
- Источник реальных данных для миграции.
- Точная матрица ролей и прав.
- Являются ли мероприятия отдельной сущностью или типом контента.
- Production runtime и инфраструктура для gateway.
- Формулы показателей эффективности контента.
