init
This commit is contained in:
52
lib/garmin/wellness.ts
Normal file
52
lib/garmin/wellness.ts
Normal file
@@ -0,0 +1,52 @@
|
||||
import type { GarminConnect } from "garmin-connect";
|
||||
|
||||
export type DayWellness = {
|
||||
date: string;
|
||||
sleepDurationMin?: number;
|
||||
sleepScore?: number;
|
||||
deepSleepMin?: number;
|
||||
remSleepMin?: number;
|
||||
avgOvernightHrv?: number;
|
||||
hrvStatus?: string;
|
||||
restingHr?: number;
|
||||
bodyBatteryChange?: number;
|
||||
};
|
||||
|
||||
export async function fetchRecentWellness(
|
||||
client: GarminConnect,
|
||||
days: number
|
||||
): Promise<DayWellness[]> {
|
||||
const today = new Date();
|
||||
|
||||
const dates = Array.from({ length: days }, (_, i) => {
|
||||
const d = new Date(today);
|
||||
d.setDate(d.getDate() - i);
|
||||
return d;
|
||||
});
|
||||
|
||||
const results = await Promise.allSettled(
|
||||
dates.map((date) => client.getSleepData(date))
|
||||
);
|
||||
|
||||
return results
|
||||
.map((result, i) => {
|
||||
const dateStr = dates[i].toISOString().slice(0, 10);
|
||||
if (result.status === "rejected" || !result.value?.dailySleepDTO) {
|
||||
return { date: dateStr };
|
||||
}
|
||||
const { value: data } = result;
|
||||
const dto = data.dailySleepDTO;
|
||||
return {
|
||||
date: dateStr,
|
||||
sleepDurationMin: dto.sleepTimeSeconds ? Math.round(dto.sleepTimeSeconds / 60) : undefined,
|
||||
sleepScore: dto.sleepScores?.overall?.value ?? undefined,
|
||||
deepSleepMin: dto.deepSleepSeconds ? Math.round(dto.deepSleepSeconds / 60) : undefined,
|
||||
remSleepMin: dto.remSleepSeconds ? Math.round(dto.remSleepSeconds / 60) : undefined,
|
||||
avgOvernightHrv: data.avgOvernightHrv || undefined,
|
||||
hrvStatus: data.hrvStatus || undefined,
|
||||
restingHr: data.restingHeartRate || undefined,
|
||||
bodyBatteryChange: typeof data.bodyBatteryChange === "number" ? data.bodyBatteryChange : undefined,
|
||||
};
|
||||
})
|
||||
.sort((a, b) => a.date.localeCompare(b.date));
|
||||
}
|
||||
Reference in New Issue
Block a user