# 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()`. Бенчмарк до/после. - [ ] **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.