From 8d3b96203da194bcd7f173c99d2f1764db3a67c0 Mon Sep 17 00:00:00 2001 From: duckRabbitPy <78092825+duckRabbitPy@users.noreply.github.com> Date: Tue, 23 Apr 2024 20:55:10 +0100 Subject: [PATCH] add route for prodding supabase --- client/src/index.css | 6 ++++- server/src/httpServer/createHttpServer.ts | 3 +++ server/src/httpServer/requestHandlers.ts | 24 ++++++++++++++++++-- server/src/httpServer/routes/db-ping/ping.ts | 12 ++++++++++ server/src/models/gamestate/queries.ts | 16 +++++++++++++ 5 files changed, 58 insertions(+), 3 deletions(-) create mode 100644 server/src/httpServer/routes/db-ping/ping.ts diff --git a/client/src/index.css b/client/src/index.css index 661bf5d..5a74222 100644 --- a/client/src/index.css +++ b/client/src/index.css @@ -94,10 +94,14 @@ button { padding: 0.2em; } } -button:hover { +button:not(:disabled):hover { border-color: #646cff; color: #747bff; } + +button:disabled:hover { + color: grey; +} button:focus, button:focus-visible { outline: 4px auto -webkit-focus-ring-color; diff --git a/server/src/httpServer/createHttpServer.ts b/server/src/httpServer/createHttpServer.ts index d243a8f..0bfd605 100644 --- a/server/src/httpServer/createHttpServer.ts +++ b/server/src/httpServer/createHttpServer.ts @@ -6,6 +6,8 @@ import { registerRouter } from "./routes/register/register"; import { authRouter } from "./routes/auth/auth"; import path from "path"; import { wsApplication } from "@wll8/express-ws/dist/src/type"; +import { ping } from "./requestHandlers"; +import { pingRouter } from "./routes/db-ping/ping"; export function createHttpServer(app: wsApplication) { const isDev = process.env.NODE_ENV === "development"; @@ -26,6 +28,7 @@ export function createHttpServer(app: wsApplication) { app.use("/api/login", loginRouter); app.use("/api/register", registerRouter); app.use("/api/auth", authRouter); + app.use("/api/ping", pingRouter); app.use("/api/game-sessions", gameRouter); // React app running on the same port as the server, in development use Vite server on port 5173 diff --git a/server/src/httpServer/requestHandlers.ts b/server/src/httpServer/requestHandlers.ts index 7a644c5..e398b0f 100644 --- a/server/src/httpServer/requestHandlers.ts +++ b/server/src/httpServer/requestHandlers.ts @@ -1,6 +1,9 @@ import { Request, RequestHandler } from "express"; import { pipe, Effect as E, Effect } from "effect"; -import { getOpenGameSessionsQuery } from "../models/gamestate/queries"; +import { + getHealthCheckSnapShotCount, + getOpenGameSessionsQuery, +} from "../models/gamestate/queries"; import path from "path"; import { safeParseBoolean, @@ -64,7 +67,6 @@ const checkHasValidToken = (req: Request, pool: Pool) => { }; export const createGameSession: RequestHandler = (req, res) => { - safeParseNonEmptyString(req.headers.authorization); const createGameSession = DBConnection.pipe( E.flatMap((connection) => connection.pool), E.flatMap((pool) => checkHasValidToken(req, pool)), @@ -333,3 +335,21 @@ export const auth: RequestHandler = (req, res) => { return E.runPromise(runnable); }; + +export const ping: RequestHandler = (req, res) => { + const healthCheckKey = req.query.key; + if (healthCheckKey !== process.env.HEALTH_CHECK_KEY) { + return res.status(403).send("Incorrect health check key"); + } + const getSnapShotCount = DBConnection.pipe( + E.flatMap((connection) => connection.pool), + E.flatMap((pool) => getHealthCheckSnapShotCount(pool)), + E.map((count) => { + res.status(200).send(`pong! Snapshot count: ${count}`); + }) + ); + + const runnable = E.provide(getSnapShotCount, DBConnectionLive); + + return E.runPromise(runnable); +}; diff --git a/server/src/httpServer/routes/db-ping/ping.ts b/server/src/httpServer/routes/db-ping/ping.ts new file mode 100644 index 0000000..e882ca8 --- /dev/null +++ b/server/src/httpServer/routes/db-ping/ping.ts @@ -0,0 +1,12 @@ +import { Router } from "express"; +import { ping } from "../../requestHandlers"; + +const pingRouter = Router(); + +pingRouter.get("/", ping); + +pingRouter.use((_, res) => { + res.status(406).json({ message: "Method Not Acceptable" }); +}); + +export { pingRouter }; diff --git a/server/src/models/gamestate/queries.ts b/server/src/models/gamestate/queries.ts index 8c69f55..ab8aa74 100644 --- a/server/src/models/gamestate/queries.ts +++ b/server/src/models/gamestate/queries.ts @@ -72,3 +72,19 @@ export const getOpenGameSessionsQuery = (pool: Pool) => { catch: () => new PostgresError({ message: "postgres query error" }), }).pipe(E.retry({ times: 1 })); }; + +export const getHealthCheckSnapShotCount = (pool: Pool) => { + const get = async () => { + try { + const result = await pool.query(`SELECT COUNT(*) FROM game_snapshots`); + return result.rows[0].count; + } catch (error) { + logAndThrowError(error); + } + }; + + return E.tryPromise({ + try: () => get(), + catch: () => new PostgresError({ message: "postgres query error" }), + }).pipe(E.retry({ times: 1 })); +};