3 KiB
3 KiB
Спринт 6 — технический долг + 2FA
Автономная работа. После каждого пункта: dotnet build (SDK 8.0.126),
unit + integration тесты, коммит порцией, отметка [x], коммит прогресса.
Не ломать auth. НЕ трогать global.json/POS/nginx/ОФД.
Чек-лист
- TD-6 Concurrency-токены на документах —
RowVersion(PostgreSQLxminчерезIsRowVersion) на Supply/Demand/RetailSale/Transfer/Inventory. Миграция. EF concurrency check. 409 при конфликте. Тест: два параллельных PUT → один 200, другой 409. ✅ Postgresxmin(system column, без миграции) черезUseXminAsConcurrencyTokenдля 5 документов +IVersionedEntity-marker. SuppliesController PUT принимаетXmin, сверяет, 409 при mismatch. Bonus: Supply.Update перешёл на ExecuteDelete+AddRange (тот же fix что в RetailSale). 2 интеграционных теста. - TD-2 FluentValidation —
FluentValidation.AspNetCore, validator'ы для SupplyInputDto/RetailSaleInputDto/ProductInputDto/CounterpartyInputDto/ EmployeeInputDto. Auto-register. Тесты на каждый. ✅ Не используем deprecatedFluentValidation.AspNetCore— текущая рекомендация:AddValidatorsFromAssemblyContaining<Program>()+ кастомныйValidationFilter(IAsyncActionFilter). На неуспех → 400 ValidationProblemDetails. 5 validator'ов, 16 unit-тестов, 70 integration зелёных без регрессий. - TD-4 Структурные log-fields в Serilog —
LogContext.PushPropertyв middleware: OrgId, UserId, CorrelationId. Бизнес-логи (Supply.Post, Sale.Post) — структурно.docs/logging.md. ✅LogEnrichmentMiddlewareпосле Authentication. CorrelationId из заголовкаX-Correlation-IDили генерируется. Business-логи на Supply.Post / RetailSale.Post с именованными плейсхолдерами.docs/logging.mdс паттерном + анти-паттернами (string interpolation, PII в логах). - TD-1 CQRS partial (MediatR) —
CreateSupplyCommand,PostRetailSaleCommand,GetSalesReportQuery. Показать паттерн, не полный рефакторинг. Тесты на handlers. - P2-4 2FA для админов (TOTP) —
AuthenticatorTokenProvider, endpoints/api/me/2fa/enroll,/api/me/2fa/verify,/api/me/2fa/disable. Опционально для Admin+SuperAdmin. При логине с включённым 2FA — два шага.
Лог
- Каждый пункт: build + тесты + коммит порцией + отметка [x] + коммит прогресса.
- Все правки на
main(origin Forgejo), без коммитаglobal.json.