Create Discord role mappings API endpoint (Vercel format)
cgen-662b14ed0d484054942d9930d2d9cb70
This commit is contained in:
parent
a5873e4b67
commit
2ef9b59fe9
1 changed files with 97 additions and 135 deletions
|
|
@ -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;
|
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue