1.9 KiB
1.9 KiB
Спецификация: вызов MetricsEngine из sync (m02)
Ф-12.1: «после каждой синхронизированной тренировки MetricsEngine считает метрики». Точка вызова —
SyncService.Process(Server.WatchBody.Web) послеscope.Complete().
1. Поток
WebAppStartup:MetricsEngineрегистрируется синглтоном (те же репозитории, что у sync);MetricsConfig— синглтоном из конфига.SyncService.Process: собирает список уникальныхworkout_id, затронутых пакетом (элементentity=workout, успех = id изworkout_insert/повтор существующего).- После
scope.Complete()(транзакция пакета зафиксирована) — для каждого затронутогоworkout_id:metricsEngine.ComputeForWorkout(athleteId, workoutId)вtry/catch (Exception):- успех — Debug-лог;
- исключение — Warning-лог с
workout_idи сообщением, обработка пакета продолжается (🛡4: sync остаётся принятым, ответ 200 не меняется).
- Пакет без
workout-элементов → MetricsEngine не вызывается.
2. Пересчёт
Повторный sync того же пакета (идемпотентность) повторяет расчёт —
upsert обновляет строку, computed_at свежее (🛡2, приёмка №2).
3. Что не меняется
Контракт POST /api/v1/sync (spec m02 03-sync-post) — без изменений: метрики в ответ sync не входят; телефон читает их отдельным средством (workout card / v2 endpoint — вне m04).