food-market/docs/sprint20-progress.md
nns 346b7bfd48
Some checks failed
CI / Backend (.NET 8) (push) Waiting to run
CI / Web (React + Vite) (push) Waiting to run
CI / POS (WPF, Windows) (push) Waiting to run
Docker API / Build + push API (push) Waiting to run
Docker API / Deploy API on stage (push) Blocked by required conditions
Docker Public / Build + push Public (push) Has been cancelled
Docker Public / Deploy Public on stage (push) Has been cancelled
feat(s20): Mapster + SSO scaffold + maintenance automation (7 пунктов)
1. TD-3 Mapster — Application/Mapping/MapsterConfig.cs с
   TypeAdapterConfig для Product, Counterparty + collections.
   ProductsController.List/Get/GetInternalAsync + CounterpartiesController.
   List/Get переведены на .ProjectToType<TDto>(MapsterConfig.Config).
   Inline Projection-Expression удалён.

2. SSO scaffold — Microsoft.AspNetCore.Authentication.Google + .MicrosoftAccount
   пакеты, условная регистрация в Program.cs (только если ClientId задан).
   ExternalAuthController с GET /api/auth/external/{provider} (Challenge или
   503 если не настроено), /callback (501 с email — invite-flow TODO),
   /providers (булевый список). docs/sso.md инструкция.

3. Stale-data cleanup — HousekeepingJobs расширен:
   PruneOrgAuditLogAsync (>90д из Cleanup:OrgAuditLogDays),
   PruneDraftsAsync (Supply/RetailSale/Demand старше 30д),
   PruneRevokedRefreshTokensAsync (raw SQL DELETE из OpenIddictTokens).
   3 новых cron'a в HangfireJobsConfigurator (03:00-03:20 UTC).

4. DB VACUUM automation — DatabaseMaintenanceJobs.VacuumTopTablesAsync:
   pg_total_relation_size → топ-5 таблиц → VACUUM (ANALYZE) per table
   с замером времени. Default cron еженедельно вс 04:00 UTC.

5. Disk usage monitoring — DiskMonitoringJob ежечасно: DriveInfo.AvailableFreeSpace
   на пути из Monitoring:DiskPaths (default "/opt,/var/lib/docker").
   <1GB → Telegram-alert на Monitoring:SuperAdminTelegramChatIds.
   Anti-spam cooldown 6h. Gauge food_market_disk_free_bytes{mount}.

6. Performance regression detection — ~/nightly-perf-check.sh после
   nightly-verify. Парсит /metrics, считает db_avg_ms, сравнивает с
   baseline в ~/.fm-watchdog/perf-baseline.json. Δ>30% → Telegram alert
   + baseline НЕ обновляется (sliding window).

7. Public-site analytics placeholder — Astro BaseLayout рендерит
   gtag/Yandex.Metrika только если задан PUBLIC_GA_ID / PUBLIC_YM_ID;
   иначе <script data-id="REPLACE_ME" data-doc="docs/analytics.md">
   маркер. docs/analytics.md с инструкцией подключения.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-06-07 21:54:12 +05:00

44 lines
2.5 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.

# Sprint 20 — Mapster + SSO scaffolding + maintenance automation
Цель: закрыть TD-3 (Mapster вместо ручных LINQ-проекций), добавить
SSO-скелет (Google + Microsoft), включить maintenance-автоматику
(stale cleanup / VACUUM / disk / performance regression / analytics).
Старт: 2026-06-07 (после Sprint 19). Исполнитель: Claude Opus 4.7.
## Принципы
- Mapster — без AutoMapper (платный + CVE), config в `Application/Mapping/`.
- SSO — только скелет. Реальные client_id/secret не коммитим, пустые → 503.
- Hangfire jobs — идемпотентные, с лимитом на rows (не зачищать слишком много за раз).
- НЕ трогать: `global.json`, prod admin.food-market.kz, POS WPF.
## Чек-лист
- [ ] **1. TD-3 Mapster**`MapsterConfig.cs` с TypeAdapterConfig'ом
для Product→ProductDto, Counterparty→CounterpartyDto. Замена
inline `Select(...)` на `.ProjectToType<TDto>()`. Бенчмарк до/после.
- [ ] **2. SSO Google + Microsoft scaffolding** — пакеты
`Microsoft.AspNetCore.Authentication.Google` + `.MicrosoftAccount`.
Endpoint `/api/auth/external/{provider}`, callback, связывание с
существующим Email или создание нового User+Employee. ApiClientId/
Secret из конфига; пустые → 503. docs/sso.md.
- [ ] **3. Stale-data cleanup автоматика** — Hangfire ежесуточно 03:00:
draft >30д, audit-log >90д, StockMovement >2г, refresh-tokens
revoked >7д. Конфиг `Cleanup:*` в appsettings.
- [ ] **4. DB VACUUM automation** — Hangfire еженедельно:
`VACUUM ANALYZE` на топ-5 таблиц по размеру. Лог времени.
- [ ] **5. Disk usage monitoring** — Hangfire ежечасно: free space
/opt и /var/lib/docker. <1GB Telegram SuperAdmin'ам. Prom-метрика
`food_market_disk_free_bytes{mount="..."}`.
- [ ] **6. Performance regression detection** nightly cron после
regression suite: prometheus p95 сравнение с вчерашним baseline.
Δ >30% → Telegram-alert.
- [ ] **7. Public-site analytics placeholder** — script tag в Astro
layout с `data-id="REPLACE_ME"`. docs/analytics.md с инструкцией.
## Журнал
### 2026-06-07 старт
Sprint 19 закрыт (7/7 ✓ + 1 hotfix). Начинаю tech debt + maintenance.