Files
Deal/.superpowers/sdd/deal-scaffold/task-6-report.md
T
Rustam Khalimov 27c7831910
ci / build-test (push) Canceled after 0s
Deal — единая кодовая база
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 зелёные.
2026-09-11 23:56:47 +03:00

55 lines
4.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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`) не касались.