Fix garmin status showing stale connection state
All checks were successful
Deploy / deploy (push) Successful in 1m37s

Fetch fresh user data from database in status endpoint instead of
relying on auth store cookie, which may be stale after token save.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
2026-01-12 21:45:35 +00:00
parent 6bd5eb663b
commit dbf0c32588
2 changed files with 27 additions and 10 deletions

View File

@@ -9,11 +9,26 @@ import type { User } from "@/types";
// Module-level variable to control mock user in tests // Module-level variable to control mock user in tests
let currentMockUser: User | null = null; let currentMockUser: User | null = null;
// Create a mock PocketBase client that returns the current mock user
const createMockPb = () => ({
collection: vi.fn(() => ({
getOne: vi.fn(() =>
Promise.resolve(
currentMockUser
? {
...currentMockUser,
garminTokenExpiresAt:
currentMockUser.garminTokenExpiresAt?.toISOString(),
}
: null,
),
),
})),
});
// Mock PocketBase // Mock PocketBase
vi.mock("@/lib/pocketbase", () => ({ vi.mock("@/lib/pocketbase", () => ({
createPocketBaseClient: vi.fn(() => ({ createPocketBaseClient: vi.fn(() => createMockPb()),
collection: vi.fn(),
})),
})); }));
// Mock the auth-middleware module // Mock the auth-middleware module
@@ -23,7 +38,8 @@ vi.mock("@/lib/auth-middleware", () => ({
if (!currentMockUser) { if (!currentMockUser) {
return NextResponse.json({ error: "Unauthorized" }, { status: 401 }); return NextResponse.json({ error: "Unauthorized" }, { status: 401 });
} }
return handler(request, currentMockUser); const mockPb = createMockPb();
return handler(request, currentMockUser, mockPb);
}; };
}), }),
})); }));

View File

@@ -5,8 +5,10 @@ import { NextResponse } from "next/server";
import { withAuth } from "@/lib/auth-middleware"; import { withAuth } from "@/lib/auth-middleware";
import { daysUntilExpiry, isTokenExpired } from "@/lib/garmin"; import { daysUntilExpiry, isTokenExpired } from "@/lib/garmin";
export const GET = withAuth(async (_request, user) => { export const GET = withAuth(async (_request, user, pb) => {
const connected = user.garminConnected; // Fetch fresh user data from database (auth store cookie may be stale)
const freshUser = await pb.collection("users").getOne(user.id);
const connected = freshUser.garminConnected;
if (!connected) { if (!connected) {
return NextResponse.json({ return NextResponse.json({
@@ -17,10 +19,9 @@ export const GET = withAuth(async (_request, user) => {
}); });
} }
const expiresAt = const expiresAt = freshUser.garminTokenExpiresAt
user.garminTokenExpiresAt instanceof Date ? String(freshUser.garminTokenExpiresAt)
? user.garminTokenExpiresAt.toISOString() : "";
: String(user.garminTokenExpiresAt);
const tokens = { const tokens = {
oauth1: "", oauth1: "",