Разработка
Эта страница фиксирует текущие правила разработки 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-тесты.
Базовые команды
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.7.0.TargetFramework:net10.0.LangVersion:preview.Nullable:enable.ImplicitUsings:enable.TreatWarningsAsErrors:true.
Добавление bot-фичи
Новая логика бота должна попадать в существующие vertical slices под src/GmRelay.Bot/Features/*.
Обычный порядок:
- Создать handler или rules-класс рядом с соответствующей фичей.
- Если нужен новый Telegram callback или command, явно добавить маршрут в
Infrastructure/Telegram/UpdateRouter.cs. - Зарегистрировать handler в
src/GmRelay.Bot/Program.cs. - Для SQL-маппинга использовать явные DTO/record-типы, совместимые с Dapper.AOT.
- Добавить тесты в зеркальный путь внутри
tests/GmRelay.Bot.Tests/Features/*.
Assembly scanning и reflection-регистрация не используются, чтобы сохранять Native AOT совместимость.
Миграции
SQL-миграции лежат в src/GmRelay.Bot/Migrations и встраиваются в bot assembly как embedded resources.
Формат имени:
V###__description.sql
Пример:
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;
- authorization для web-сессий.
Новые тесты стоит класть рядом с feature area, например:
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.