diff --git a/server/index.ts b/server/index.ts index 63b2aa3d..4b5dfe04 100644 --- a/server/index.ts +++ b/server/index.ts @@ -426,6 +426,61 @@ export function createServer() { } }); + // Site settings (admin-managed) + app.get("/api/site-settings", async (req, res) => { + try { + const key = String(req.query.key || "").trim(); + if (key) { + try { + const { data, error } = await adminSupabase + .from("site_settings") + .select("value") + .eq("key", key) + .maybeSingle(); + if (error) { + if (isTableMissing(error)) return res.json({}); + return res.status(500).json({ error: error.message }); + } + return res.json((data as any)?.value || {}); + } catch (e: any) { + return res.status(500).json({ error: e?.message || String(e) }); + } + } + const { data, error } = await adminSupabase + .from("site_settings") + .select("key, value"); + if (error) { + if (isTableMissing(error)) return res.json({}); + return res.status(500).json({ error: error.message }); + } + const map: Record = {}; + for (const row of data || []) map[(row as any).key] = (row as any).value; + return res.json(map); + } catch (e: any) { + return res.status(500).json({ error: e?.message || String(e) }); + } + }); + + app.post("/api/site-settings", async (req, res) => { + try { + const { key, value } = (req.body || {}) as { key?: string; value?: any }; + if (!key || typeof key !== "string") { + return res.status(400).json({ error: "key required" }); + } + const payload = { key, value: value ?? {} } as any; + const { error } = await adminSupabase + .from("site_settings") + .upsert(payload, { onConflict: "key" as any }); + if (error) { + if (isTableMissing(error)) return res.status(400).json({ error: "site_settings table missing" }); + return res.status(500).json({ error: error.message }); + } + return res.json({ ok: true }); + } catch (e: any) { + return res.status(500).json({ error: e?.message || String(e) }); + } + }); + app.get("/api/health", async (_req, res) => { try { const { error } = await adminSupabase