Fix body battery showing zeros on dashboard after Garmin sync
All checks were successful
Deploy / deploy (push) Successful in 2m29s
All checks were successful
Deploy / deploy (push) Successful in 2m29s
PocketBase coerces null number fields to 0 when reading. When Garmin API returned no data (null), we stored null, which became 0 on retrieval. The nullish coalescing (?? 100) in the API route didn't catch this because 0 is not nullish. Now store default value 100 when Garmin returns null, matching the existing pattern used for decision engine calculations. Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
@@ -457,7 +457,11 @@ describe("POST /api/cron/garmin-sync", () => {
|
|||||||
expect(body.errors).toBe(1);
|
expect(body.errors).toBe(1);
|
||||||
});
|
});
|
||||||
|
|
||||||
it("handles body battery null values", async () => {
|
it("stores default value 100 when body battery is null from Garmin", async () => {
|
||||||
|
// When Garmin API returns null for body battery values (no data available),
|
||||||
|
// we store the default value 100 instead of null.
|
||||||
|
// This prevents PocketBase's number field null-to-0 coercion from causing
|
||||||
|
// the dashboard to display 0 instead of a meaningful value.
|
||||||
mockUsers = [createMockUser()];
|
mockUsers = [createMockUser()];
|
||||||
mockFetchBodyBattery.mockResolvedValue({
|
mockFetchBodyBattery.mockResolvedValue({
|
||||||
current: null,
|
current: null,
|
||||||
@@ -468,8 +472,8 @@ describe("POST /api/cron/garmin-sync", () => {
|
|||||||
|
|
||||||
expect(mockPbCreate).toHaveBeenCalledWith(
|
expect(mockPbCreate).toHaveBeenCalledWith(
|
||||||
expect.objectContaining({
|
expect.objectContaining({
|
||||||
bodyBatteryCurrent: null,
|
bodyBatteryCurrent: 100,
|
||||||
bodyBatteryYesterdayLow: null,
|
bodyBatteryYesterdayLow: 100,
|
||||||
}),
|
}),
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -205,13 +205,16 @@ export async function POST(request: Request) {
|
|||||||
);
|
);
|
||||||
|
|
||||||
// Create DailyLog entry
|
// Create DailyLog entry
|
||||||
|
// Store default value 100 for body battery when Garmin returns null.
|
||||||
|
// This prevents PocketBase's number field null-to-0 coercion from
|
||||||
|
// causing the dashboard to display 0 instead of a meaningful value.
|
||||||
await pb.collection("dailyLogs").create({
|
await pb.collection("dailyLogs").create({
|
||||||
user: user.id,
|
user: user.id,
|
||||||
date: today,
|
date: today,
|
||||||
cycleDay,
|
cycleDay,
|
||||||
phase,
|
phase,
|
||||||
bodyBatteryCurrent: bodyBattery.current,
|
bodyBatteryCurrent: bodyBattery.current ?? 100,
|
||||||
bodyBatteryYesterdayLow: bodyBattery.yesterdayLow,
|
bodyBatteryYesterdayLow: bodyBattery.yesterdayLow ?? 100,
|
||||||
hrvStatus,
|
hrvStatus,
|
||||||
weekIntensityMinutes,
|
weekIntensityMinutes,
|
||||||
phaseLimit,
|
phaseLimit,
|
||||||
|
|||||||
Reference in New Issue
Block a user