From 346b7bfd48bb2194094626cabdd203f35a180a6f Mon Sep 17 00:00:00 2001 From: nns Date: Sun, 7 Jun 2026 21:54:12 +0500 Subject: [PATCH] =?UTF-8?q?feat(s20):=20Mapster=20+=20SSO=20scaffold=20+?= =?UTF-8?q?=20maintenance=20automation=20(7=20=D0=BF=D1=83=D0=BD=D0=BA?= =?UTF-8?q?=D1=82=D0=BE=D0=B2)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. TD-3 Mapster — Application/Mapping/MapsterConfig.cs с TypeAdapterConfig для Product, Counterparty + collections. ProductsController.List/Get/GetInternalAsync + CounterpartiesController. List/Get переведены на .ProjectToType(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; иначе +