init
This commit is contained in:
@@ -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("/");
|
||||
|
||||
Reference in New Issue
Block a user