Delete page "%D0%A0%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0"

2026-05-21 18:46:30 +03:00
parent cf55be6d21
commit 6eb550c703
@@ -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.