Create Discord role mappings API endpoint (Vercel format)

cgen-662b14ed0d484054942d9930d2d9cb70
This commit is contained in:
Builder.io 2025-11-08 13:44:09 +00:00
parent a5873e4b67
commit 2ef9b59fe9

View file

@ -1,159 +1,121 @@
import { Router } from "express"; import type { VercelRequest, VercelResponse } from "@vercel/node";
import { createClient } from "@supabase/supabase-js"; import { createClient } from "@supabase/supabase-js";
const router = Router();
// Initialize Supabase
const supabase = createClient( const supabase = createClient(
process.env.SUPABASE_URL || "", process.env.SUPABASE_URL || "",
process.env.SUPABASE_SERVICE_ROLE || "", process.env.SUPABASE_SERVICE_ROLE || "",
); );
// GET /api/discord/role-mappings - Fetch all role mappings export default async function handler(req: VercelRequest, res: VercelResponse) {
router.get("/role-mappings", async (req, res) => { const { method, query, body } = req;
try {
const { data: mappings, error } = await supabase
.from("discord_role_mappings")
.select("*")
.order("arm", { ascending: true });
if (error) { try {
return res.status(500).json({ // GET /api/discord/role-mappings - Fetch all role mappings
error: "Failed to fetch role mappings", if (method === "GET") {
details: error.message, const { data: mappings, error } = await supabase
}); .from("discord_role_mappings")
.select("*")
.order("arm", { ascending: true });
if (error) {
return res.status(500).json({
error: "Failed to fetch role mappings",
details: error.message,
});
}
return res.json(mappings || []);
} }
res.json(mappings || []); // POST /api/discord/role-mappings - Create new role mapping
} catch (error) { if (method === "POST") {
console.error("Error fetching role mappings:", error); const { arm, user_type, discord_role, server_id } = body;
res.status(500).json({ error: "Internal server error" });
}
});
// POST /api/discord/role-mappings - Create new role mapping if (!arm || !discord_role) {
router.post("/role-mappings", async (req, res) => { return res.status(400).json({
try { error: "Missing required fields: arm, discord_role",
const { arm, user_type, discord_role, server_id } = req.body; });
}
// Validate required fields const { data: mapping, error } = await supabase
if (!arm || !discord_role) { .from("discord_role_mappings")
return res.status(400).json({ .insert({
error: "Missing required fields: arm, discord_role", arm,
}); user_type: user_type || null,
discord_role,
server_id: server_id || null,
})
.select()
.single();
if (error) {
return res.status(500).json({
error: "Failed to create role mapping",
details: error.message,
});
}
return res.status(201).json(mapping);
} }
const { data: mapping, error } = await supabase // PUT /api/discord/role-mappings/:id - Update role mapping
.from("discord_role_mappings") if (method === "PUT") {
.insert({ const { id } = query;
arm, const { arm, user_type, discord_role, server_id } = body;
user_type: user_type || null,
discord_role,
server_id: server_id || null,
})
.select()
.single();
if (error) { if (!id) {
return res.status(500).json({ return res.status(400).json({ error: "Mapping ID is required" });
error: "Failed to create role mapping", }
details: error.message,
}); const { data: mapping, error } = await supabase
.from("discord_role_mappings")
.update({
arm,
user_type: user_type || null,
discord_role,
server_id: server_id || null,
})
.eq("id", id)
.select()
.single();
if (error) {
return res.status(500).json({
error: "Failed to update role mapping",
details: error.message,
});
}
return res.json(mapping);
} }
res.status(201).json(mapping); // DELETE /api/discord/role-mappings/:id - Delete role mapping
} catch (error) { if (method === "DELETE") {
console.error("Error creating role mapping:", error); const { id } = query;
res.status(500).json({ error: "Internal server error" });
}
});
// PUT /api/discord/role-mappings/:id - Update role mapping if (!id) {
router.put("/role-mappings/:id", async (req, res) => { return res.status(400).json({ error: "Mapping ID is required" });
try { }
const { id } = req.params;
const { arm, user_type, discord_role, server_id } = req.body;
const { data: mapping, error } = await supabase const { error } = await supabase
.from("discord_role_mappings") .from("discord_role_mappings")
.update({ .delete()
arm, .eq("id", id);
user_type: user_type || null,
discord_role,
server_id: server_id || null,
})
.eq("id", id)
.select()
.single();
if (error) { if (error) {
return res.status(500).json({ return res.status(500).json({
error: "Failed to update role mapping", error: "Failed to delete role mapping",
details: error.message, details: error.message,
}); });
}
return res.json({ success: true, message: "Role mapping deleted" });
} }
res.json(mapping); res.setHeader("Allow", ["GET", "POST", "PUT", "DELETE"]);
return res.status(405).json({ error: "Method not allowed" });
} catch (error) { } catch (error) {
console.error("Error updating role mapping:", error); console.error("Discord role mappings API error:", error);
res.status(500).json({ error: "Internal server error" }); return res.status(500).json({ error: "Internal server error" });
} }
}); }
// DELETE /api/discord/role-mappings/:id - Delete role mapping
router.delete("/role-mappings/:id", async (req, res) => {
try {
const { id } = req.params;
const { error } = await supabase
.from("discord_role_mappings")
.delete()
.eq("id", id);
if (error) {
return res.status(500).json({
error: "Failed to delete role mapping",
details: error.message,
});
}
res.json({ success: true, message: "Role mapping deleted" });
} catch (error) {
console.error("Error deleting role mapping:", error);
res.status(500).json({ error: "Internal server error" });
}
});
// GET /api/discord/bot-status - Get bot status
router.get("/bot-status", async (req, res) => {
try {
// Fetch stats from discord_links and discord_user_roles
const { data: linkedAccounts, error: linkError } = await supabase
.from("discord_links")
.select("count");
const { data: assignedRoles, error: roleError } = await supabase
.from("discord_user_roles")
.select("count");
const linkedCount = linkedAccounts?.[0]?.count || 0;
const rolesCount = assignedRoles?.[0]?.count || 0;
res.json({
bot_status: "online",
linked_accounts: linkedCount,
assigned_roles: rolesCount,
servers_connected: process.env.DISCORD_GUILD_COUNT || "6",
});
} catch (error) {
console.error("Error fetching bot status:", error);
res.status(500).json({
bot_status: "unknown",
linked_accounts: 0,
assigned_roles: 0,
servers_connected: "0",
});
}
});
export default router;