# Правила разработки ## Обязательные требования пользователя - Использовать C#, .NET 10 и PostgreSQL. Приложение и БД запускаются в отдельных Docker-контейнерах в общей сети. - Писать небольшие, читаемые классы с одной ясной ответственностью. Не создавать сложные объёмные классы и абстракции без практической необходимости. - Не использовать `record` и `record struct`. Модели и DTO — обычные классы со свойствами `get; set;`. - Использовать привычные типы данных. Не вводить экзотические типы и конструкции без обсуждения. - Соблюдать инверсию зависимостей. Domain не зависит от инфраструктуры и UI; Application не зависит от Infrastructure или Web. - Не зашивать настраиваемые значения в код. Значения по умолчанию и параметры поведения выносить в `appsettings.json`, секреты — в переменные окружения. Поддерживать переопределение через `.env` и Docker Compose. - Не хранить пароли, строки подключения с секретами или реальные клиентские данные в репозитории. - При неясности в архитектуре или устройстве конкретного класса остановиться и задать пользователю вопрос до реализации спорного решения. - Не добавлять функциональность вне согласованного объёма. - Не проверять результат скриншотами, пока пользователь явно не попросит об этом. Для проверки UI использовать состояние страницы и функциональные проверки без снимков. ## Согласованный объём первой версии - Рабочее место одного тренера с возможностью расширения на нескольких. - Вход по логину и паролю, без регистрации и клиентского кабинета. - Клиенты и библиотека упражнений; добавление упражнений также вручную. - Группы содержат независимые упражнения. Удаление группы удаляет её упражнения из библиотеки; тренировки сохраняют свои снимки. Корзина внутри группы удаляет упражнение полностью из библиотеки. - Drag and drop переносит упражнение в другую группу или в «Без группы». Добавление упражнения из другой группы создаёт независимую копию. - В конфигураторе — адаптивный выпадающий список с текстовым поиском и фильтром по группе. Двойной клик сразу применяет выбранное упражнение. - Персональная месячная программа: недели, тренировки, упорядоченные блоки. - Упражнение: общие количество подходов, текстовые повторения и вес; разминка и примечание текстом; процент от максимума вручную; ссылка на видео и флаг камеры. - Сеты удалены из функционала. Один блок содержит ровно одно упражнение. - Отдых в минутах (дробные значения допустимы). Общий отдых: сумма количества подходов × отдых, включая паузу после последнего подхода. Время тренировки вводится вручную. - Перестановка блоков, тренировок и недель с автоматической перенумерацией. - История программ клиента и независимое копирование для следующего месяца. - Экспорт PDF: альбомная таблица, цветные заголовки недель и тренировок, кликабельные ссылки. Видео не загружаем и не принимаем. - Приоритет — компьютер. Полноценная адаптация под iPhone 15 — следующий этап. ## Работа с проектом - С 13 октября 2026 года сервер содержит рабочие данные. Не выполнять серверные операции без согласованной задачи; прежнее разрешение на первоначальное развёртывание не разрешает последующие обновления. - При обновлении сохранять серверные `.env`, `app.env` и существующие учётные записи без изменений, если пользователь отдельно не поручил их изменить. - Резервные копии рабочей БД хранить вне сервера приложения и вне Git. Для текущего окружения использовать `~/Documents/TrainingPlannerBackups`; временный серверный дамп удалять только после успешного переноса и сверки контрольных сумм. - Миграции должны сохранять текущие данные. Перед применением на сервере проверить SQL, создать резервную копию и проверить её восстановление и миграцию в отдельной тестовой БД. Не запускать тесты на рабочей базе. - Не пересоздавать рабочую БД, не удалять её тома и не заменять её локальной базой. Потенциально разрушающие изменения требуют отдельного согласования и плана переноса данных. - Учитывать автоматическое применение миграций при запуске приложения: перезапуск новой версии также может изменить БД. При обнаружении проблемы на сервере остановиться и спросить пользователя до исправления. - После изменений выполнять сборку и проверки, соответствующие изменению. - Поддерживать README и `.env.example` в соответствии с реальной конфигурацией. - Не заявлять о проверке Docker, БД, PDF или UI, если соответствующая проверка не выполнена.