This commit is contained in:
Dominik Klarkowski
2026-06-18 11:24:56 +02:00
parent 115d56cd12
commit 63cb8b4933
3 changed files with 48 additions and 105 deletions

View File

@@ -14,10 +14,13 @@ import {
import {
getLastSyncAt,
getRunningActivity,
listRunningActivities,
setLastSyncAt,
setRunningActivityMetrics,
setRunningActivityRoutePoints,
upsertRunningActivity,
} from "@/lib/models/running";
import { fetchActivityRunMetrics } from "@/lib/garmin/client";
import {
clearPendingMfaState,
getPendingMfaState,
@@ -28,6 +31,9 @@ import { getCurrentUserId } from "@/lib/session";
export type SyncGarminState = { error: string } | { success: string } | { mfaRequired: true } | null;
// How many activities without data to enrich per sync (limits API call volume)
const ENRICH_PER_SYNC = 10;
async function syncWithClient(userId: string, client: GarminConnect): Promise<SyncGarminState> {
const since = await getLastSyncAt(userId);
const activities = await fetchRunningActivities(client);
@@ -39,6 +45,36 @@ async function syncWithClient(userId: string, client: GarminConnect): Promise<Sy
await setLastSyncAt(userId, new Date());
// Enrich activities missing route/metrics — fetched during sync so page loads are instant
const all = await listRunningActivities(userId);
const needsEnrich = all
.filter((a) => a.hasRoute && (!a.routePoints?.length || !a.runMetrics?.paceSec))
.slice(0, ENRICH_PER_SYNC);
for (const activity of needsEnrich) {
try {
if (!activity.routePoints?.length) {
const route = await fetchActivityRoutePoints(client, activity.garminActivityId);
if (route) {
await setRunningActivityRoutePoints(
userId,
activity.garminActivityId,
route.points,
route.elevationProfile
);
}
}
if (!activity.runMetrics?.paceSec) {
const metrics = await fetchActivityRunMetrics(client, activity.garminActivityId);
if (metrics) {
await setRunningActivityMetrics(userId, activity.garminActivityId, metrics);
}
}
} catch {
// Rate limited or activity has no GPS — skip silently
}
}
revalidatePath("/running");
revalidatePath("/settings");
revalidatePath("/");