From 1c026f5e76e1a001124757d258262beb538339d4 Mon Sep 17 00:00:00 2001 From: sirpiglr <49359077-sirpiglr@users.noreply.replit.com> Date: Sun, 7 Dec 2025 02:53:55 +0000 Subject: [PATCH] Improve maintenance mode API by handling multiple environment variable names Update the maintenance mode API endpoint to check for various Vercel environment variable names and include debug information in responses for easier troubleshooting. Replit-Commit-Author: Agent Replit-Commit-Session-Id: 9203795e-937a-4306-b81d-b4d5c78c240e Replit-Commit-Checkpoint-Type: full_checkpoint Replit-Commit-Event-Id: 08b76980-5fd9-40da-aeac-fe3fd5300045 Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/7c94b7a0-29c7-4f2e-94ef-44b2153872b7/9203795e-937a-4306-b81d-b4d5c78c240e/qPXTzuE Replit-Helium-Checkpoint-Created: true --- api/admin/platform/maintenance.ts | 49 +++++++++++++++++++++++-------- 1 file changed, 37 insertions(+), 12 deletions(-) diff --git a/api/admin/platform/maintenance.ts b/api/admin/platform/maintenance.ts index 0e808cd3..f5a98620 100644 --- a/api/admin/platform/maintenance.ts +++ b/api/admin/platform/maintenance.ts @@ -1,32 +1,57 @@ import type { VercelRequest, VercelResponse } from "@vercel/node"; import { createClient } from "@supabase/supabase-js"; -const supabaseUrl = process.env.VITE_SUPABASE_URL || ""; -const supabaseServiceRole = process.env.SUPABASE_SERVICE_ROLE || ""; +const supabaseUrl = process.env.VITE_SUPABASE_URL || process.env.SUPABASE_URL || process.env.NEXT_PUBLIC_SUPABASE_URL || ""; +const supabaseServiceRole = process.env.SUPABASE_SERVICE_ROLE || process.env.SUPABASE_SERVICE_ROLE_KEY || ""; let maintenanceModeCache: boolean | null = null; const ADMIN_ROLES = ["admin", "super_admin", "staff", "owner"]; -async function verifyAdmin(token: string): Promise { - if (!supabaseUrl || !supabaseServiceRole) return false; +async function verifyAdmin(token: string, res?: VercelResponse): Promise<{ isAdmin: boolean; debug?: any }> { + if (!supabaseUrl || !supabaseServiceRole) { + return { + isAdmin: false, + debug: { + error: "Missing env vars", + hasUrl: !!supabaseUrl, + hasKey: !!supabaseServiceRole + } + }; + } const supabase = createClient(supabaseUrl, supabaseServiceRole); try { const { data: { user }, error } = await supabase.auth.getUser(token); - if (error || !user) return false; + if (error || !user) { + return { isAdmin: false, debug: { error: "Auth failed", authError: error?.message } }; + } - const { data: roles } = await supabase + const { data: roles, error: rolesError } = await supabase .from("user_roles") .select("role") .eq("user_id", user.id); - if (!roles) return false; + if (rolesError) { + return { isAdmin: false, debug: { error: "Roles query failed", rolesError: rolesError.message } }; + } - return roles.some(r => ADMIN_ROLES.includes(r.role?.toLowerCase())); - } catch { - return false; + if (!roles || roles.length === 0) { + return { isAdmin: false, debug: { error: "No roles found", userId: user.id } }; + } + + const hasAdminRole = roles.some(r => ADMIN_ROLES.includes(r.role?.toLowerCase())); + return { + isAdmin: hasAdminRole, + debug: { + userId: user.id, + roles: roles.map(r => r.role), + hasAdminRole + } + }; + } catch (e: any) { + return { isAdmin: false, debug: { error: "Exception", message: e?.message } }; } } @@ -69,9 +94,9 @@ export default async function handler(req: VercelRequest, res: VercelResponse) { return res.status(401).json({ error: "Unauthorized" }); } - const isAdmin = await verifyAdmin(token); + const { isAdmin, debug } = await verifyAdmin(token); if (!isAdmin) { - return res.status(403).json({ error: "Forbidden - Admin access required" }); + return res.status(403).json({ error: "Forbidden - Admin access required", debug }); } const { maintenance_mode } = req.body;