ci / build-test (push) Canceled after 0s
SaaS-мониторинг Telegram: ядро (модули Cards/Kanban/Pipeline/Tenants/Settings/ Discovery, Api, Infrastructure), сервисы telegram/ai/ml/storage, фронт Vue, контракты и grpc-hosting, деплой-конфиги (dev/prod/observability/CI-раннер), Gitea Actions CI, документация (ТЗ, техдок, api-map, код-стайл, планы, бэклог). Текущее состояние: все этапы роадмапа 0–12 закрыты, сборка 5 sln 0/0, тесты 1340/130/52/38/9 зелёные.
55 lines
4.3 KiB
Markdown
55 lines
4.3 KiB
Markdown
# Task 6 — Tenant-контекст и подключение к Postgres (отчёт)
|
||
|
||
**Дата:** 2026-09-05
|
||
**Статус:** ✅ Выполнено (build 0 warnings / 0 errors, 3 теста PASS)
|
||
|
||
## Файлы
|
||
|
||
### Созданы (по коду плана, verbatim)
|
||
- `src/core/Deal.SharedKernel/Tenants/TenantId.cs` — `readonly record struct TenantId`, валидация непустого `Value`, `SchemaName => "tenant_{Value}"`.
|
||
- `src/core/Deal.SharedKernel/Tenants/ITenantContext.cs` — `TenantId? TenantId`, `HasTenant`, `string? SchemaName`.
|
||
- `src/core/Deal.Infrastructure/Data/TenantContext.cs` — `AsyncLocal<TenantId?>`, имплементирует `ITenantContext` + `SetTenant`.
|
||
- `src/core/Deal.Infrastructure/Data/ConnectionStringProvider.cs` — ctor бросает `InvalidOperationException` без `ConnectionStrings:DealPostgres`; `ForTenant` добавляет `;Search Path=...`.
|
||
- `tests/Deal.Tests.Unit/TenantIdTests.cs` — 2 теста: `SchemaName_PrefixesTenant`, `TenantId_Empty_Throws`.
|
||
|
||
### Изменены
|
||
- `src/core/Deal.Api/Program.cs` — добавлены `using Deal.Infrastructure.Data;` и `using Deal.SharedKernel.Tenants;`, зарегистрированы `builder.Services.AddSingleton<ITenantContext, TenantContext>();` и `AddSingleton<ConnectionStringProvider>();`. `/api/health` и `public partial class Program` не тронуты.
|
||
- `src/core/Deal.Infrastructure/Deal.Infrastructure.csproj` — добавлен `PackageReference Microsoft.Extensions.Configuration.Abstractions 10.0.11` (командой `dotnet add`, Ruling 4).
|
||
|
||
## Отклонение от кода плана (требование стиля репозитория)
|
||
|
||
`ITenantContext.cs`: члены интерфейса получили явный `public` (план их опускал). Иначе сборка падает с `IDE0040` (error): в корневом `C:\telbase\.editorconfig` задано `dotnet_style_require_accessibility_modifiers = always:error`, а `EnforceCodeStyleInBuild=true` + `TreatWarningsAsErrors=true`. Изменение семантики не меняет — члены интерфейса и так public. `.editorconfig`/`Directory.Build.props` не редактировались.
|
||
|
||
`TenantId` (record struct с property-initializer-валидацией) успешно компилируется под net10.0 — перепроектирование не потребовалось.
|
||
|
||
## Build
|
||
|
||
Команда: `dotnet build Deal.sln` (из `src/core`)
|
||
|
||
```
|
||
Восстановление завершено (0,8 с)
|
||
Deal.SharedKernel net10.0 успешно выполнено
|
||
...
|
||
Deal.Api net10.0 успешно выполнено (0,6 с)
|
||
Сборка успешно выполнено через 2,5 с
|
||
```
|
||
|
||
Результат: 0 warnings, 0 errors (11 проектов собраны).
|
||
|
||
## Tests
|
||
|
||
Команда: `dotnet test tests/Deal.Tests.Unit --no-build`
|
||
|
||
```
|
||
Сводка теста: всего: 3; сбой: 0; успешно: 3; пропущено: 0; длительность: 1,1 с
|
||
```
|
||
|
||
PASS: `MarkerTests` (1) + `TenantIdTests` (2) = ровно 3.
|
||
|
||
## Concerns / заметки
|
||
|
||
1. **Template-level conflict (план vs .editorconfig):** код `ITenantContext` в плане не проходит `IDE0040` — потребовался явный `public` на членах интерфейса. Аналогичное стоит ожидать в будущих задачах, где план опускает модификаторы доступа у членов интерфейса.
|
||
2. `ConnectionStringProvider` зарегистрирован в DI, но нигде не резолвится (как и задумано для Task 6) — конструктор с `InvalidOperationException` при отсутствии `ConnectionStrings:DealPostgres` сработает только с Task 7 (appsettings).
|
||
3. NuGet-пакет выбран как `10.0.11` (latest stable, совместим с net10.0). Версия не зафиксирована в плане; при централизованном управлении пакетами (CPM) отсутствует — правок не требуется.
|
||
4. Загруженных файлов-маркеров (`SharedKernelMarker.cs`, `InfrastructureMarker.cs`) не касались.
|