From a64dc7ab5e8a63410aa8fa8de5e258204a049730 Mon Sep 17 00:00:00 2001 From: Paperclip Date: Tue, 14 Apr 2026 16:35:24 +0000 Subject: [PATCH] fix: restore DB connectivity check to auth health endpoint Co-Authored-By: Paperclip --- auth/src/auth.ts | 2 +- auth/src/index.ts | 20 +++++++++++++++++--- cart608-auth-signin-fail.png | Bin 0 -> 24352 bytes cartsnitch | 1 + 4 files changed, 19 insertions(+), 4 deletions(-) create mode 100644 cart608-auth-signin-fail.png create mode 160000 cartsnitch diff --git a/auth/src/auth.ts b/auth/src/auth.ts index 202802c..c882aac 100644 --- a/auth/src/auth.ts +++ b/auth/src/auth.ts @@ -17,7 +17,7 @@ if (!databaseUrl) { ); } -const pool = new Pool({ +export const pool = new Pool({ connectionString: databaseUrl ?? "postgresql://cartsnitch:cartsnitch@localhost:5432/cartsnitch", }); diff --git a/auth/src/index.ts b/auth/src/index.ts index 843a97c..708d91d 100644 --- a/auth/src/index.ts +++ b/auth/src/index.ts @@ -1,6 +1,6 @@ import { createServer } from "node:http"; import { toNodeHandler } from "better-auth/node"; -import { auth } from "./auth.js"; +import { auth, pool } from "./auth.js"; const port = parseInt(process.env.PORT ?? "3001", 10); @@ -9,8 +9,22 @@ const handler = toNodeHandler(auth); const server = createServer(async (req, res) => { // Health check if (req.url === "/health" && req.method === "GET") { - res.writeHead(200, { "Content-Type": "application/json" }); - res.end(JSON.stringify({ status: "ok" })); + try { + const client = await pool.connect(); + try { + await Promise.race([ + client.query("SELECT 1"), + new Promise((_, reject) => setTimeout(() => reject(new Error("DB timeout")), 2000)), + ]); + } finally { + client.release(); + } + res.writeHead(200, { "Content-Type": "application/json" }); + res.end(JSON.stringify({ status: "ok", db: "connected" })); + } catch { + res.writeHead(503, { "Content-Type": "application/json" }); + res.end(JSON.stringify({ status: "error", db: "unreachable" })); + } return; } diff --git a/cart608-auth-signin-fail.png b/cart608-auth-signin-fail.png new file mode 100644 index 0000000000000000000000000000000000000000..295adc56f4da219d3f6a40462c655890df635119 GIT binary patch literal 24352 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 i0M9+e-$g3v9|j(9zV__^AH+?SBC3G-}%b literal 0 HcmV?d00001 diff --git a/cartsnitch b/cartsnitch new file mode 160000 index 0000000..a53dadd --- /dev/null +++ b/cartsnitch @@ -0,0 +1 @@ +Subproject commit a53daddb9a9a0ff7f91bdca8c1588d836e0804cb