7
Разработка
Toutsu edited this page 2026-04-27 14:58:56 +03:00

Разработка

Эта страница фиксирует текущие правила разработки 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/*.

Обычный порядок:

  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.

Формат имени:

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.