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";
const router = Router();
// Initialize Supabase
const supabase = createClient(
process.env.SUPABASE_URL || "",
process.env.SUPABASE_SERVICE_ROLE || "",
);
// GET /api/discord/role-mappings - Fetch all role mappings
router.get("/role-mappings", async (req, res) => {
try {
const { data: mappings, error } = await supabase
.from("discord_role_mappings")
.select("*")
.order("arm", { ascending: true });
export default async function handler(req: VercelRequest, res: VercelResponse) {
const { method, query, body } = req;
if (error) {
return res.status(500).json({
error: "Failed to fetch role mappings",
details: error.message,
});
try {
// GET /api/discord/role-mappings - Fetch all role mappings
if (method === "GET") {
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 || []);
} catch (error) {
console.error("Error fetching role mappings:", error);
res.status(500).json({ error: "Internal server error" });
}
});
// POST /api/discord/role-mappings - Create new role mapping
if (method === "POST") {
const { arm, user_type, discord_role, server_id } = body;
// POST /api/discord/role-mappings - Create new role mapping
router.post("/role-mappings", async (req, res) => {
try {
const { arm, user_type, discord_role, server_id } = req.body;
if (!arm || !discord_role) {
return res.status(400).json({
error: "Missing required fields: arm, discord_role",
});
}
// Validate required fields
if (!arm || !discord_role) {
return res.status(400).json({
error: "Missing required fields: arm, discord_role",
});
const { data: mapping, error } = await supabase
.from("discord_role_mappings")
.insert({
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
.from("discord_role_mappings")
.insert({
arm,
user_type: user_type || null,
discord_role,
server_id: server_id || null,
})
.select()
.single();
// PUT /api/discord/role-mappings/:id - Update role mapping
if (method === "PUT") {
const { id } = query;
const { arm, user_type, discord_role, server_id } = body;
if (error) {
return res.status(500).json({
error: "Failed to create role mapping",
details: error.message,
});
if (!id) {
return res.status(400).json({ error: "Mapping ID is required" });
}
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);
} catch (error) {
console.error("Error creating role mapping:", error);
res.status(500).json({ error: "Internal server error" });
}
});
// DELETE /api/discord/role-mappings/:id - Delete role mapping
if (method === "DELETE") {
const { id } = query;
// PUT /api/discord/role-mappings/:id - Update role mapping
router.put("/role-mappings/:id", async (req, res) => {
try {
const { id } = req.params;
const { arm, user_type, discord_role, server_id } = req.body;
if (!id) {
return res.status(400).json({ error: "Mapping ID is required" });
}
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();
const { error } = await supabase
.from("discord_role_mappings")
.delete()
.eq("id", id);
if (error) {
return res.status(500).json({
error: "Failed to update role mapping",
details: error.message,
});
if (error) {
return res.status(500).json({
error: "Failed to delete role mapping",
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) {
console.error("Error updating role mapping:", error);
res.status(500).json({ error: "Internal server error" });
console.error("Discord role mappings API error:", 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;
}