From 02f0a299e044e549b8a564cb0b7d3c7c68b86639 Mon Sep 17 00:00:00 2001 From: Regalijan Date: Sat, 11 Apr 2026 02:26:31 -0400 Subject: [PATCH] Move mx logic to top level functions middleware --- app/root.tsx | 2 +- functions/_middleware.ts | 24 ++++++++++++++++++++++++ 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/app/root.tsx b/app/root.tsx index fde7417..8d68424 100644 --- a/app/root.tsx +++ b/app/root.tsx @@ -166,7 +166,7 @@ export async function loader({ }: { context: RequestContext; }): Promise<{ [k: string]: any }> { - if (await context.env.DATA.get("mx")) + if (context.data.mx) throw new Response(null, { status: 503, }); diff --git a/functions/_middleware.ts b/functions/_middleware.ts index 38d8eea..4582bb8 100644 --- a/functions/_middleware.ts +++ b/functions/_middleware.ts @@ -1,5 +1,7 @@ import getPermissions from "./permissions.js"; import { jsonError } from "./common.js"; +import { PrismaClient } from "../generated/prisma/client.js"; +import { PrismaD1 } from "@prisma/adapter-d1"; import * as Sentry from "@sentry/cloudflare"; async function constructHTML(context: RequestContext) { @@ -28,6 +30,27 @@ async function generateTokenHash(token: string) { .replace(/=/g, ""); } +async function initializePrisma(context: RequestContext) { + const adapter = new PrismaD1(context.env.D1); + context.data.prisma = new PrismaClient({ adapter }); + + return await context.next(); +} + +async function mxAndBypassCheck(context: RequestContext) { + if (!(await context.env.DATA.get("mx"))) return await context.next(); + const cookies = context.request.headers.get("cookie")?.split(/; *?/); + const isAPI = new URL(context.request.url).pathname.startsWith("/api"); + + if (!cookies?.length || !cookies.find((c) => c.startsWith("mxb="))) { + if (isAPI) return jsonError("API is undergoing maintenance", 503); + + context.data.mx = true; + } + + return await context.next(); +} + async function refreshAuth(context: RequestContext) { const { current_user: currentUser } = context.data; @@ -395,5 +418,6 @@ export const onRequest = [ setTheme, constructHTML, setBody, + initializePrisma, setHeaders, ];