Create wiki page 'Development'
+104
@@ -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`.
|
||||
Reference in New Issue
Block a user