From ab3a7ff8c522073df793f10f61df4328102bdac8 Mon Sep 17 00:00:00 2001 From: Claude Date: Fri, 6 Feb 2026 21:58:12 +0000 Subject: [PATCH] Fix rate limit query: use ISO strings for dates in sql template Drizzle's sql template literal serializes Date objects via .toString() which produces a format PostgreSQL can't parse. Use .toISOString() with explicit ::timestamptz casts instead. https://claude.ai/code/session_01Rf47gNAgM7jDstC4bvffzw --- src/lib/server/auth.ts | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/lib/server/auth.ts b/src/lib/server/auth.ts index 626e409..5473d6d 100644 --- a/src/lib/server/auth.ts +++ b/src/lib/server/auth.ts @@ -74,6 +74,8 @@ const CLEANUP_EVERY_N = 20; export async function checkRateLimit(key: string): Promise<{ allowed: boolean; retryAfterSeconds?: number }> { const now = new Date(); const resetAt = new Date(now.getTime() + WINDOW_MS); + const nowIso = now.toISOString(); + const resetAtIso = resetAt.toISOString(); if (++cleanupCounter >= CLEANUP_EVERY_N) { cleanupCounter = 0; @@ -86,8 +88,8 @@ export async function checkRateLimit(key: string): Promise<{ allowed: boolean; r .onConflictDoUpdate({ target: rateLimits.key, set: { - count: sql`CASE WHEN ${rateLimits.resetAt} < ${now} THEN 1 ELSE ${rateLimits.count} + 1 END`, - resetAt: sql`CASE WHEN ${rateLimits.resetAt} < ${now} THEN ${resetAt} ELSE ${rateLimits.resetAt} END` + count: sql`CASE WHEN ${rateLimits.resetAt} < ${nowIso}::timestamptz THEN 1 ELSE ${rateLimits.count} + 1 END`, + resetAt: sql`CASE WHEN ${rateLimits.resetAt} < ${nowIso}::timestamptz THEN ${resetAtIso}::timestamptz ELSE ${rateLimits.resetAt} END` } }) .returning({ count: rateLimits.count, resetAt: rateLimits.resetAt });