# План задач для Fable

Источник требований: `ТЗ_единый.md`.

Визуальный референс: `https://donstu.ru/`.

Назначение системы по ТЗ: единая централизованная цифровая платформа университета для хранения, систематизации, управления и распространения медиаконтента.

Важно: не добавлять реальные данные, людей, подразделения, интеграции, юридические сведения, брендовые материалы или функциональность, которых нет в ТЗ или в явно подтвержденных требованиях. Если нужен контент для макетов, использовать явно помеченные демо-заглушки.

## 0. Ограничения и продуктовые правила

- [ ] Строить платформу управления медиаконтентом университета, а не общий сайт университета.
- [ ] Реализовать два контура: публичный доступ и персонифицированный доступ после аутентификации.
- [ ] Использовать русский язык интерфейса.
- [ ] Учитывать группы пользователей из ТЗ: студенты, преподаватели, сотрудники редакций, приглашенные спикеры, администраторы.
- [ ] Использовать начальную ролевую модель из ТЗ: администратор, редактор, менеджер, пользователь.
- [ ] Не копировать логотипы, фотографии, тексты и брендовые материалы `donstu.ru`, если они не предоставлены отдельно.
- [ ] Использовать `donstu.ru` только как референс по структуре, визуальному языку и UX-паттернам.
- [ ] Все спорные пункты выносить в список вопросов, а не додумывать самостоятельно.

## 1. Дизайн и UI-система

- [ ] Сделать адаптивную UI-систему в официальном университетском стиле по мотивам `donstu.ru`.
- [ ] Использовать визуальные признаки референса: крупная типографика, официальный синий акцент, светлые секции, контрастные кнопки, карточная сетка, большие отступы.
- [ ] Использовать синий акцент, близкий к `#11519c`, как у `donstu.ru`, если заказчик не предоставит другую палитру.
- [ ] Использовать современный гротеск в духе Golos, как на референсе, либо доступный аналог.
- [ ] Реализовать переключатель светлой и темной темы.
- [ ] Реализовать панель доступности: размер текста, цветовая схема, включение/отключение изображений.
- [ ] Реализовать переиспользуемые компоненты: шапка, полноэкранное меню, поиск, вкладки, карточки, кнопки, формы, фильтры, таблицы, модальные окна, предпросмотр медиа.
- [ ] Проверить все ключевые экраны на desktop и mobile.
- [ ] Не делать визуальный клон `donstu.ru`; задача — использовать референс как направление.

## 2. Публичный контур

- [ ] Создать публичную главную страницу платформы.
- [ ] Добавить верхнюю шапку с меню, поиском, переключателем темы, кнопкой доступности и входом в личный кабинет.
- [ ] Добавить полноэкранное меню по примеру `donstu.ru`.
- [ ] В меню использовать только разделы, относящиеся к платформе: новости, медиа, мероприятия, спикеры, категории, вход.
- [ ] Добавить hero-блок для избранного публичного контента.
- [ ] Добавить популярные поисковые запросы или быстрые фильтры, если для них есть данные; иначе показать демо-заглушки.
- [ ] Добавить публичный блок новостей и статей с вкладками категорий.
- [ ] Добавить публичный блок медиаматериалов: аудио, видео, текстовые и графические материалы.
- [ ] Добавить публичный блок мероприятий, так как просмотр мероприятий указан в ТЗ.
- [ ] Добавить публичный блок спикеров, так как поиск спикеров указан в ТЗ.
- [ ] Добавить футер с навигацией по платформе и сервисными ссылками в пределах подтвержденного объема.

## 3. Каталоги, поиск и просмотр материалов

- [ ] Реализовать глобальный полнотекстовый поиск по всем типам контента.
- [ ] Добавить фильтрацию по категориям, авторам, тегам, типам контента и дате.
- [ ] Добавить сортировку результатов.
- [ ] Добавить страницу результатов поиска.
- [ ] Добавить состояния загрузки, ошибки и пустой выдачи.
- [ ] Создать публичный каталог публикаций.
- [ ] Создать публичный каталог медиаматериалов.
- [ ] Создать публичный каталог мероприятий.
- [ ] Создать публичный каталог спикеров.
- [ ] Создать страницу детального просмотра публикации или медиаматериала.
- [ ] Создать страницу детального просмотра спикера.
- [ ] Уточнить, является ли мероприятие отдельной сущностью или типом публикации/медиаматериала, потому что в ТЗ мероприятия есть в функциях, но отсутствуют в таблице информационных объектов.

## 4. Аутентификация и доступ

- [ ] Реализовать регистрацию пользователя.
- [ ] Реализовать вход по логину и паролю.
- [ ] Реализовать token-based authentication.
- [ ] Реализовать выход из системы.
- [ ] Реализовать смену пароля.
- [ ] Хранить пароли только в защищенном хэшированном виде.
- [ ] Связывать действия пользователя с его учетной записью.
- [ ] Защитить маршруты персонифицированного контура.
- [ ] Добавить обработку истекшей или некорректной сессии.

## 5. Профиль пользователя

- [ ] Создать страницу профиля пользователя.
- [ ] Реализовать редактирование профиля.
- [ ] Показывать роль и уровень доступа пользователя.
- [ ] Показывать подписки пользователя.
- [ ] Показывать уведомления пользователя.
- [ ] Показывать действия пользователя там, где это разрешено ролью.

## 6. Управление контентом

- [ ] Реализовать создание публикаций.
- [ ] Реализовать редактирование публикаций.
- [ ] Реализовать удаление публикаций с учетом прав доступа.
- [ ] Реализовать публикацию и архивирование материалов.
- [ ] Реализовать загрузку медиаматериалов: аудио, видео, текстовые и графические файлы.
- [ ] Реализовать назначение категорий.
- [ ] Реализовать назначение тегов.
- [ ] Реализовать метаданные автора.
- [ ] Реализовать управление видимостью материала с учетом роли.
- [ ] Реализовать жизненный цикл контента: создание, модерация, проверка, публикация, архивирование.
- [ ] Показывать статус модерации материала.
- [ ] Реализовать сохранение черновика.

## 7. Подписки и уведомления

- [ ] Реализовать подписку на категории.
- [ ] Реализовать подписку на спикеров.
- [ ] Реализовать подписку на темы или теги, если они утверждены как направления/темы.
- [ ] Реализовать подписку на мероприятия, если мероприятие утверждено как отдельная сущность.
- [ ] Создать персональную ленту по подпискам.
- [ ] Создавать уведомления о новом контенте по подпискам.
- [ ] Реализовать центр уведомлений.
- [ ] Реализовать статусы уведомлений: прочитано и не прочитано.

## 8. Комментарии и взаимодействие

- [ ] Реализовать комментарии для авторизованных пользователей.
- [ ] Реализовать создание комментария.
- [ ] Реализовать редактирование и удаление комментария с учетом прав доступа.
- [ ] Добавить модерацию комментариев, если это требуется ролевой моделью.
- [ ] Показывать комментарии на странице детального просмотра материала.
- [ ] Добавить состояния загрузки и пустого списка комментариев.

## 9. Административная панель

- [ ] Создать административный dashboard.
- [ ] Реализовать управление пользователями.
- [ ] Реализовать управление ролями.
- [ ] Реализовать управление правами доступа.
- [ ] Реализовать очередь модерации контента.
- [ ] Реализовать управление медиатекой.
- [ ] Реализовать управление категориями.
- [ ] Реализовать управление тегами.
- [ ] Реализовать управление спикерами.
- [ ] Реализовать управление уведомлениями.
- [ ] Реализовать просмотр журнала действий.
- [ ] Реализовать аналитический dashboard.

## 10. Аналитика

- [ ] Считать просмотры публикаций.
- [ ] Считать активность пользователей.
- [ ] Считать количество подписчиков.
- [ ] Показывать популярность публикаций.
- [ ] Показывать показатели эффективности контента, если формула показателей согласована.
- [ ] Формировать аналитические отчеты или экран отчетов.
- [ ] Ограничить доступ к аналитике ролями.

## 11. Модель данных

- [ ] Спроектировать сущность `User`.
- [ ] Спроектировать сущность `Role`.
- [ ] Спроектировать сущность `Permission`.
- [ ] Спроектировать связь `UserRole`.
- [ ] Спроектировать сущность `Speaker`.
- [ ] Спроектировать сущность `MediaMaterial`.
- [ ] Спроектировать сущность `Category`.
- [ ] Спроектировать сущность `Tag`.
- [ ] Спроектировать сущность `Subscription`.
- [ ] Спроектировать связь подписки на спикера.
- [ ] Спроектировать связь подписки на категорию.
- [ ] Спроектировать сущность `Comment`.
- [ ] Спроектировать сущность `Notification`.
- [ ] Спроектировать сущность `ActionLog`.
- [ ] Уточнить и при необходимости спроектировать сущность `Event`.

## 12. Backend-архитектура

- [ ] Реализовать backend business logic на Go.
- [ ] Разделить backend на Go-микросервисы.
- [ ] Использовать Elysia.js как API gateway/router layer.
- [ ] Запускать gateway на выбранном JS runtime: Bun, Node.js или Deno.
- [ ] Для Elysia.js считать Bun предпочтительным вариантом, если совместимость Node.js/Deno не подтверждена отдельно.
- [ ] Пропускать все frontend API-запросы через Elysia gateway.
- [ ] Держать Go-сервисы внутренними, за gateway.
- [ ] Использовать PostgreSQL как основную реляционную БД.
- [ ] Использовать CDN или media storage для загруженных медиафайлов.
- [ ] Обеспечить единые auth, RBAC, request context, logging и error handling через gateway и сервисы.

## 13. Go-микросервисы

- [ ] Auth service: регистрация, вход, токены, смена пароля.
- [ ] User service: профили, пользователи, роли, права доступа.
- [ ] Content service: публикации, медиаматериалы, черновики, публикация, архивирование.
- [ ] Taxonomy service: категории и теги.
- [ ] Speaker service: профили спикеров и подписки на спикеров.
- [ ] Subscription service: подписки на категории, темы/теги и спикеров.
- [ ] Notification service: создание уведомлений, статусы прочитано/не прочитано.
- [ ] Comment service: комментарии авторизованных пользователей и hooks для модерации.
- [ ] Search service: полнотекстовый поиск, фильтры, сортировка.
- [ ] Analytics service: просмотры, активность, подписчики, отчеты.
- [ ] Audit service: журнал действий пользователей и администраторов.
- [ ] Media service: валидация загрузок, метаданные файлов, ссылки на CDN/media storage.
- [ ] Event service добавлять только после подтверждения отдельной сущности мероприятий.

## 14. Elysia Gateway

- [ ] Создать маршруты `/api/auth/*` к Auth service.
- [ ] Создать маршруты `/api/users/*` к User service.
- [ ] Создать маршруты `/api/content/*` к Content service.
- [ ] Создать маршруты `/api/media/*` к Media service.
- [ ] Создать маршруты `/api/categories/*` и `/api/tags/*` к Taxonomy service.
- [ ] Создать маршруты `/api/speakers/*` к Speaker service.
- [ ] Создать маршруты `/api/subscriptions/*` к Subscription service.
- [ ] Создать маршруты `/api/notifications/*` к Notification service.
- [ ] Создать маршруты `/api/comments/*` к Comment service.
- [ ] Создать маршруты `/api/search/*` к Search service.
- [ ] Создать маршруты `/api/analytics/*` к Analytics service.
- [ ] Создать маршруты `/api/admin/*` для admin-only операций.
- [ ] Валидировать входящие запросы на gateway.
- [ ] Передавать authenticated user context во внутренние Go-сервисы.
- [ ] Централизовать CORS на gateway.
- [ ] Централизовать rate limiting на gateway.
- [ ] Централизовать auth middleware на gateway.
- [ ] Централизовать формат ошибок на gateway.
- [ ] Добавить health checks для gateway и каждого Go-сервиса.

## 15. Взаимодействие микросервисов

- [ ] Начать с HTTP/JSON между Elysia gateway и Go-сервисами, если не появится подтвержденная причина использовать другой транспорт.
- [ ] Описать OpenAPI-контракты для каждого сервиса.
- [ ] Сделать внутренние URL сервисов настраиваемыми через environment variables.
- [ ] Использовать единый формат error response.
- [ ] Добавить request ID для трассировки через gateway и сервисы.
- [ ] Добавить structured logs.
- [ ] Добавить базовые метрики состояния сервисов.

## 16. API и хранение данных

- [ ] Создать миграции PostgreSQL.
- [ ] Создать API для аутентификации.
- [ ] Создать API для пользователей, ролей и прав.
- [ ] Создать API для публикаций и медиаматериалов.
- [ ] Создать API для категорий и тегов.
- [ ] Создать API для спикеров.
- [ ] Создать API для подписок.
- [ ] Создать API для комментариев.
- [ ] Создать API для уведомлений.
- [ ] Создать API для поиска.
- [ ] Создать API для аналитики.
- [ ] Создать API для журнала действий.
- [ ] Создать abstraction layer для CDN/media storage.

## 17. Безопасность

- [ ] Требовать аутентификацию для функций персонифицированного контура.
- [ ] Реализовать role-based access control.
- [ ] Разграничить доступ к данным по ролям.
- [ ] Проверять права доступа на каждом защищенном API endpoint.
- [ ] Защитить персональные данные согласно требованиям законодательства РФ, указанным в ТЗ.
- [ ] Валидировать загружаемые файлы.
- [ ] Ограничить типы и размеры загружаемых файлов.
- [ ] Журналировать действия пользователей и администраторов.
- [ ] Не раскрывать внутренние URL Go-сервисов наружу.

## 18. Frontend

- [ ] Использовать React и TailwindCSS, как указано в ТЗ.
- [ ] Построить публичный контур.
- [ ] Построить персонифицированный контур.
- [ ] Построить административную панель.
- [ ] Подключить frontend к Elysia gateway.
- [ ] Реализовать protected routes.
- [ ] Реализовать role-based UI states.
- [ ] Реализовать адаптивность для мобильных устройств.
- [ ] Реализовать кроссбраузерную совместимость.

## 19. Тестирование

- [ ] Добавить unit tests.
- [ ] Добавить integration tests.
- [ ] Добавить system tests.
- [ ] Добавить security tests.
- [ ] Добавить load tests.
- [ ] Протестировать публичный контур без авторизации.
- [ ] Протестировать персонифицированный контур с авторизацией.
- [ ] Протестировать ролевые ограничения.
- [ ] Протестировать загрузку медиафайлов.
- [ ] Протестировать поиск, фильтры и сортировку.
- [ ] Протестировать уведомления по подпискам.
- [ ] Протестировать административные сценарии.
- [ ] Протестировать responsive layout.
- [ ] Протестировать доступность базовых UI controls.

## 20. Развертывание и инфраструктура

- [ ] Подготовить Docker setup.
- [ ] Подготовить окружение для Elysia gateway.
- [ ] Подготовить окружение для Go-сервисов.
- [ ] Подготовить PostgreSQL.
- [ ] Подготовить CDN/media storage.
- [ ] Настроить резервное копирование.
- [ ] Настроить восстановление из резервной копии.
- [ ] Подготовить тестовое развертывание.
- [ ] Подготовить checklist промышленного ввода.
- [ ] Добавить health checks.
- [ ] Добавить базовый мониторинг и логи.

## 21. Миграция и подготовка данных

- [ ] Проанализировать существующие каналы хранения и распространения: мессенджеры, облака, архивы, сайты, соцсети.
- [ ] Привести данные по спикерам, публикациям, медиа и пользователям к структурированному виду.
- [ ] Удалить дубликаты.
- [ ] Нормализовать форматы.
- [ ] Проверить метаданные.
- [ ] Категоризировать материалы.
- [ ] Подготовить план миграции данных.
- [ ] Назначить ответственных со стороны заказчика.

## 22. Документация

- [ ] Подготовить руководство пользователя.
- [ ] Подготовить руководство администратора.
- [ ] Подготовить программу и методику испытаний.
- [ ] Подготовить эксплуатационную документацию по согласованию с заказчиком.
- [ ] Подготовить приемочный checklist.
- [ ] Подготовить материалы для обучения пользователей и администраторов.

## 23. Приемка

- [ ] Провести промежуточные демонстрации модулей.
- [ ] Провести тестовое развертывание.
- [ ] Провести опытную эксплуатацию.
- [ ] Собрать замечания.
- [ ] Устранить замечания.
- [ ] Подготовить финальную передачу после тестирования.
- [ ] Подготовить акт сдачи-приемки.

## 24. Вопросы, которые нужно подтвердить

- [ ] Финальное название платформы.
- [ ] Логотип и разрешенные брендовые материалы.
- [ ] Источник реальных данных для миграции.
- [ ] Точная матрица ролей и прав доступа.
- [ ] Являются ли мероприятия отдельной сущностью или частью контента.
- [ ] Точный runtime для Elysia gateway: Bun, Node.js или Deno.
- [ ] Допустимо ли использовать дизайн только как вдохновение или требуется максимально близкая визуальная стилизация без копирования защищенных материалов.
- [ ] Формулы показателей эффективности контента для аналитики.
