aethex-forge/api/user/arm-affiliations.ts
Builder.io 1e1917800e Fix type casting in arm affiliations
cgen-4b85470f1cc34fbcbb9db90187212371
2025-11-16 07:08:24 +00:00

123 lines
3.3 KiB
TypeScript

import { supabase } from "../_supabase.js";
const VALID_ARMS = ["foundation", "gameforge", "labs", "corp", "devlink"];
const VALID_TYPES = [
"courses",
"projects",
"research",
"opportunities",
"manual",
];
export default async (req: Request) => {
try {
const authHeader = req.headers.get("Authorization");
if (!authHeader?.startsWith("Bearer ")) {
return new Response("Unauthorized", { status: 401 });
}
const token = authHeader.slice(7);
const { data: userData } = await supabase.auth.getUser(token);
if (!userData.user) {
return new Response("Unauthorized", { status: 401 });
}
const userId = userData.user.id;
// GET - Fetch user's arm affiliations
if (req.method === "GET") {
const { data, error } = await supabase
.from("user_arm_affiliations")
.select("*")
.eq("user_id", userId)
.order("created_at", { ascending: false });
if (error) {
return new Response(JSON.stringify({ error: error.message }), {
status: 500,
});
}
return new Response(JSON.stringify(data), {
status: 200,
headers: { "Content-Type": "application/json" },
});
}
// POST - Add or confirm arm affiliation
if (req.method === "POST") {
const body = (await req.json()) as any;
const { arm, affiliation_type, affiliation_data, confirmed } = body;
if (
!VALID_ARMS.includes(arm) ||
!VALID_TYPES.includes(affiliation_type)
) {
return new Response("Invalid arm or affiliation type", { status: 400 });
}
// Upsert to handle duplicates
const { data, error } = await supabase
.from("user_arm_affiliations")
.upsert(
{
user_id: userId,
arm,
affiliation_type,
affiliation_data: affiliation_data || {},
confirmed: confirmed === true,
},
{ onConflict: "user_id,arm,affiliation_type" },
)
.select()
.single();
if (error) {
return new Response(JSON.stringify({ error: error.message }), {
status: 500,
});
}
return new Response(JSON.stringify(data), {
status: 201,
headers: { "Content-Type": "application/json" },
});
}
// DELETE - Remove arm affiliation
if (req.method === "DELETE") {
const body = await req.json();
const { arm, affiliation_type } = body;
if (!VALID_ARMS.includes(arm)) {
return new Response("Invalid arm", { status: 400 });
}
const { error } = await supabase
.from("user_arm_affiliations")
.delete()
.eq("user_id", userId)
.eq("arm", arm)
.eq("affiliation_type", affiliation_type || null);
if (error) {
return new Response(JSON.stringify({ error: error.message }), {
status: 500,
});
}
return new Response(JSON.stringify({ success: true }), {
status: 200,
headers: { "Content-Type": "application/json" },
});
}
return new Response("Method not allowed", { status: 405 });
} catch (error: any) {
console.error("Arm affiliations error:", error);
return new Response(JSON.stringify({ error: error.message }), {
status: 500,
});
}
};