# План задач для 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. - [ ] Допустимо ли использовать дизайн только как вдохновение или требуется максимально близкая визуальная стилизация без копирования защищенных материалов. - [ ] Формулы показателей эффективности контента для аналитики.