diff --git a/%D0%A0%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0.md b/%D0%A0%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0.md deleted file mode 100644 index 9b52b2e..0000000 --- a/%D0%A0%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0.md +++ /dev/null @@ -1,109 +0,0 @@ -# Разработка - -Эта страница фиксирует текущие правила разработки 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.9.9`. -- `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 voting input, multi-option vote rendering и deadline winner rules; -- rendering batch-сообщений; -- Telegram polling service behavior; -- secret redaction; -- Telegram auth в web; -- Telegram Mini App `initData` auth и entry points; -- authorization для web-сессий и шаблонов кампаний. -- functional smoke обещаний лендинга для Telegram: batch-сессии, inline-кнопки, лимиты/waitlist, автоповышение, голосование за перенос и dashboard-sync через fake Telegram messenger без внешнего Telegram API. - -Новые тесты стоит класть рядом с feature area, например: - -```text -tests/GmRelay.Bot.Tests/Features/Sessions/CreateSession/NewSessionCommandParserTests.cs -``` - -## Web-разработка - -Blazor-компоненты находятся в `src/GmRelay.Web/Components`: - -- `Pages` — страницы `/`, `/login`, `/miniapp`, `/group/{id}`, `/session/edit/{id}` и служебные страницы. -- `Layout` — layout, navigation, reconnect modal. - -Сервисный слой web-панели находится в `src/GmRelay.Web/Services`. - -Web-доступ должен проходить через `AuthorizedSessionService`, чтобы пользователь не мог читать или менять чужие группы, сессии и шаблоны кампаний. - -Mini App изменения должны переиспользовать те же страницы и сервисы. Серверная проверка `Telegram.WebApp.initData` живёт в `TelegramAuthService`, endpoint `/auth/telegram-webapp` выдаёт ту же cookie-аутентификацию, что и Telegram Login Widget, а fallback `/login` должен использовать callback-flow `data-onauth` и `POST /auth/telegram-login` вместо redirect-flow. `/auth/status` остаётся лёгким smoke endpoint для проверки текущей cookie-сессии. Safe-area изменения должны обновлять shell JS, CSS-переменные и статические regression-тесты, чтобы мобильная шапка не уходила под Telegram UI. - -## Практические ограничения - -- Не хранить секреты в appsettings или wiki. Использовать `.env`, environment variables или user secrets. -- Не добавлять dynamic SQL-mapping без DTO: это ломает предсказуемость Dapper.AOT. -- Любое изменение статусов должно быть согласовано с `SessionStatus`, миграциями и renderer/UI. -- Если web меняет данные сессии, нужно учитывать синхронизацию Telegram-сообщения через `SessionBatchRenderer`. -- Начиная с v1.9.9, smoke `tests/GmRelay.Bot.Tests/Features/Landing/TelegramLandingPromisesSmokeTests.cs` должен оставаться быстрым и автономным: он не ходит во внешний Telegram API и проверяет пользовательский сценарий через доменные правила, renderer и fake messenger.