diff --git a/Development.md b/Development.md new file mode 100644 index 0000000..c5b813f --- /dev/null +++ b/Development.md @@ -0,0 +1,104 @@ +# Development + +Эта страница фиксирует текущие правила разработки GM-Relay. + +## Решение и проекты + +Работа ведётся из корня репозитория `D:\Projects\Game`. + +Основные проекты: + +- `src/GmRelay.AppHost` — Aspire orchestration. +- `src/GmRelay.Bot` — Telegram worker. +- `src/GmRelay.Web` — Blazor Server UI. +- `src/GmRelay.Shared` — shared domain/rendering. +- `src/GmRelay.ServiceDefaults` — shared Aspire defaults. +- `tests/GmRelay.Bot.Tests` — xUnit-тесты. + +## Базовые команды + +```bash +dotnet restore GM-Relay.slnx +dotnet build GM-Relay.slnx -c Release +dotnet test tests/GmRelay.Bot.Tests/GmRelay.Bot.Tests.csproj --collect:"XPlat Code Coverage" +dotnet run --project src/GmRelay.AppHost +``` + +`Directory.Build.props` задаёт: + +- `Version`: `1.1.5`. +- `TargetFramework`: `net10.0`. +- `LangVersion`: `preview`. +- `Nullable`: `enable`. +- `ImplicitUsings`: `enable`. +- `TreatWarningsAsErrors`: `true`. + +## Добавление bot-фичи + +Новая логика бота должна попадать в существующие vertical slices под `src/GmRelay.Bot/Features/*`. + +Обычный порядок: + +1. Создать handler или rules-класс рядом с соответствующей фичей. +2. Если нужен новый Telegram callback или command, явно добавить маршрут в `Infrastructure/Telegram/UpdateRouter.cs`. +3. Зарегистрировать handler в `src/GmRelay.Bot/Program.cs`. +4. Для SQL-маппинга использовать явные DTO/record-типы, совместимые с Dapper.AOT. +5. Добавить тесты в зеркальный путь внутри `tests/GmRelay.Bot.Tests/Features/*`. + +Assembly scanning и reflection-регистрация не используются, чтобы сохранять Native AOT совместимость. + +## Миграции + +SQL-миграции лежат в `src/GmRelay.Bot/Migrations` и встраиваются в bot assembly как embedded resources. + +Формат имени: + +```text +V###__description.sql +``` + +Пример: + +```text +V006__add_example_column.sql +``` + +Миграции применяются при старте бота через `DbMigrator` и DbUp. + +## Тесты + +Текущий набор тестов покрывает: + +- domain/status helpers; +- parser `/newsession`; +- RSVP flow rules; +- reschedule time input и vote rules; +- rendering batch-сообщений; +- Telegram polling service behavior; +- secret redaction; +- Telegram auth в web; +- authorization для web-сессий. + +Новые тесты стоит класть рядом с feature area, например: + +```text +tests/GmRelay.Bot.Tests/Features/Sessions/CreateSession/NewSessionCommandParserTests.cs +``` + +## Web-разработка + +Blazor-компоненты находятся в `src/GmRelay.Web/Components`: + +- `Pages` — страницы `/`, `/login`, `/group/{id}`, `/session/edit/{id}` и служебные страницы. +- `Layout` — layout, navigation, reconnect modal. + +Сервисный слой web-панели находится в `src/GmRelay.Web/Services`. + +Web-доступ должен проходить через `AuthorizedSessionService`, чтобы пользователь не мог читать или менять чужие группы и сессии. + +## Практические ограничения + +- Не хранить секреты в appsettings или wiki. Использовать `.env`, environment variables или user secrets. +- Не добавлять dynamic SQL-mapping без DTO: это ломает предсказуемость Dapper.AOT. +- Любое изменение статусов должно быть согласовано с `SessionStatus`, миграциями и renderer/UI. +- Если web меняет данные сессии, нужно учитывать синхронизацию Telegram-сообщения через `SessionBatchRenderer`. \ No newline at end of file