food-market/docs/sprint6-progress.md
2026-05-28 17:33:34 +05:00

36 lines
2.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.

# Спринт 6 — технический долг + 2FA
Автономная работа. После каждого пункта: `dotnet build` (SDK 8.0.126),
unit + integration тесты, коммит порцией, отметка `[x]`, коммит прогресса.
Не ломать auth. НЕ трогать global.json/POS/nginx/ОФД.
## Чек-лист
1. [x] **TD-6 Concurrency-токены на документах**`RowVersion` (PostgreSQL
`xmin` через `IsRowVersion`) на Supply/Demand/RetailSale/Transfer/Inventory.
Миграция. EF concurrency check. 409 при конфликте. Тест: два параллельных
PUT → один 200, другой 409.
✅ Postgres `xmin` (system column, без миграции) через
`UseXminAsConcurrencyToken` для 5 документов + `IVersionedEntity`-marker.
SuppliesController PUT принимает `Xmin`, сверяет, 409 при mismatch.
Bonus: Supply.Update перешёл на ExecuteDelete+AddRange (тот же fix что
в RetailSale). 2 интеграционных теста.
2. [ ] **TD-2 FluentValidation**`FluentValidation.AspNetCore`, validator'ы
для SupplyInputDto/RetailSaleInputDto/ProductInputDto/CounterpartyInputDto/
EmployeeInputDto. Auto-register. Тесты на каждый.
3. [ ] **TD-4 Структурные log-fields в Serilog**`LogContext.PushProperty`
в middleware: OrgId, UserId, CorrelationId. Бизнес-логи (Supply.Post,
Sale.Post) — структурно. `docs/logging.md`.
4. [ ] **TD-1 CQRS partial (MediatR)**`CreateSupplyCommand`,
`PostRetailSaleCommand`, `GetSalesReportQuery`. Показать паттерн, не
полный рефакторинг. Тесты на handlers.
5. [ ] **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`.