aethex-forge/api/user/arm-follows.ts
2025-11-15 02:11:47 +00:00

144 lines
3.7 KiB
TypeScript

export const config = {
runtime: "nodejs",
};
import { createClient } from "@supabase/supabase-js";
const supabaseUrl = process.env.VITE_SUPABASE_URL;
const supabaseServiceRole = process.env.SUPABASE_SERVICE_ROLE;
if (!supabaseUrl || !supabaseServiceRole) {
throw new Error("Missing Supabase configuration");
}
const supabase = createClient(supabaseUrl, supabaseServiceRole);
const VALID_ARMS = [
"labs",
"gameforge",
"corp",
"foundation",
"devlink",
"nexus",
"staff",
];
export default async function handler(req: any, res: any) {
const userId = req.query.user_id;
if (!userId) {
return res.status(400).json({ error: "Missing user_id" });
}
if (req.method === "GET") {
try {
const { data, error } = await supabase
.from("arm_follows")
.select("arm_affiliation")
.eq("user_id", userId)
.order("followed_at", { ascending: false });
if (error) {
console.error("[ARM Follows API] Query error:", error);
return res.status(500).json({ error: error.message });
}
return res.status(200).json({
arms: (data || []).map((row: any) => row.arm_affiliation),
});
} catch (error: any) {
console.error("[ARM Follows API GET] Unexpected error:", error);
return res
.status(500)
.json({ error: error.message || "Internal server error" });
}
}
if (req.method === "POST") {
try {
const { arm_affiliation } = req.body;
if (!arm_affiliation) {
return res.status(400).json({ error: "Missing arm_affiliation" });
}
if (!VALID_ARMS.includes(arm_affiliation)) {
return res.status(400).json({
error: `Invalid arm_affiliation. Must be one of: ${VALID_ARMS.join(", ")}`,
});
}
// Check if already following
const { data: existing, error: checkError } = await supabase
.from("arm_follows")
.select("id")
.eq("user_id", userId)
.eq("arm_affiliation", arm_affiliation)
.single();
if (!checkError && existing) {
return res.status(409).json({
error: "Already following this arm",
});
}
// Follow the arm
const { data, error } = await supabase
.from("arm_follows")
.insert({
user_id: userId,
arm_affiliation,
})
.select("arm_affiliation, followed_at");
if (error) {
console.error("[ARM Follows API] Insert error:", error);
return res.status(500).json({ error: error.message });
}
return res.status(201).json({
success: true,
arm: data?.[0],
});
} catch (error: any) {
console.error("[ARM Follows API POST] Unexpected error:", error);
return res
.status(500)
.json({ error: error.message || "Internal server error" });
}
}
if (req.method === "DELETE") {
try {
const { arm_affiliation } = req.body;
if (!arm_affiliation) {
return res.status(400).json({ error: "Missing arm_affiliation" });
}
// Unfollow the arm
const { error } = await supabase
.from("arm_follows")
.delete()
.eq("user_id", userId)
.eq("arm_affiliation", arm_affiliation);
if (error) {
console.error("[ARM Follows API] Delete error:", error);
return res.status(500).json({ error: error.message });
}
return res.status(200).json({
success: true,
message: "Arm unfollowed successfully",
});
} catch (error: any) {
console.error("[ARM Follows API DELETE] Unexpected error:", error);
return res
.status(500)
.json({ error: error.message || "Internal server error" });
}
}
return res.status(405).json({ error: "Method not allowed" });
}