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

4.3 KiB
Raw Blame History

Task 6 — Tenant-контекст и подключение к Postgres (отчёт)

Дата: 2026-09-05 Статус: Выполнено (build 0 warnings / 0 errors, 3 теста PASS)

Файлы

Созданы (по коду плана, verbatim)

  • src/core/Deal.SharedKernel/Tenants/TenantId.csreadonly record struct TenantId, валидация непустого Value, SchemaName => "tenant_{Value}".
  • src/core/Deal.SharedKernel/Tenants/ITenantContext.csTenantId? TenantId, HasTenant, string? SchemaName.
  • src/core/Deal.Infrastructure/Data/TenantContext.csAsyncLocal<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) не касались.