aethex-forge/api/gameforge/team.ts
Builder.io 0aa7d46acd Fix gameforge team query type
cgen-659e82113a8c45ef931a66b587d3dab5
2025-11-16 07:09:15 +00:00

125 lines
3.6 KiB
TypeScript

import { createClient } from "@supabase/supabase-js";
const supabase = createClient(
process.env.VITE_SUPABASE_URL || "",
process.env.SUPABASE_SERVICE_ROLE || "",
);
export default async function handler(req: any, res: any) {
const { method, query, body, headers } = req;
const userId = headers["x-user-id"];
try {
if (method === "GET") {
const { user_id, project_id, role, limit = 50, offset = 0 } = query;
let dbQuery = supabase.from("gameforge_team_members").select(
`
*,
user_profiles(id, full_name, avatar_url, email)
`,
{ count: "exact" },
);
if (user_id) dbQuery = dbQuery.eq("user_id", user_id).single() as any;
if (project_id) dbQuery = dbQuery.contains("project_ids", [project_id]);
if (role) dbQuery = dbQuery.eq("role", role);
if (!user_id) dbQuery = dbQuery.eq("is_active", true);
const { data, error, count } = await dbQuery
.order("joined_date", { ascending: false })
.range(Number(offset), Number(offset) + Number(limit) - 1);
if (error) throw error;
return res.json({
data: user_id ? data : data,
total: count,
limit: Number(limit),
offset: Number(offset),
});
} else if (method === "POST") {
if (!userId) return res.status(401).json({ error: "Unauthorized" });
const {
user_id,
role,
position,
contract_type,
hourly_rate,
skills,
bio,
project_ids,
} = body;
if (!user_id || !role) {
return res
.status(400)
.json({ error: "Missing required fields: user_id, role" });
}
const { data, error } = await supabase
.from("gameforge_team_members")
.insert([
{
user_id,
role,
position,
contract_type: contract_type || "contractor",
hourly_rate,
skills: skills || [],
bio,
project_ids: project_ids || [],
is_active: true,
},
])
.select();
if (error) throw error;
return res.status(201).json(data[0]);
} else if (method === "PUT") {
if (!userId) return res.status(401).json({ error: "Unauthorized" });
const { id } = query;
const {
role,
position,
contract_type,
hourly_rate,
skills,
bio,
project_ids,
is_active,
} = body;
if (!id) {
return res.status(400).json({ error: "Team member ID required" });
}
const updateData: any = {};
if (role !== undefined) updateData.role = role;
if (position !== undefined) updateData.position = position;
if (contract_type !== undefined) updateData.contract_type = contract_type;
if (hourly_rate !== undefined) updateData.hourly_rate = hourly_rate;
if (skills !== undefined) updateData.skills = skills;
if (bio !== undefined) updateData.bio = bio;
if (project_ids !== undefined) updateData.project_ids = project_ids;
if (is_active !== undefined) updateData.is_active = is_active;
if (is_active === false && !updateData.left_date)
updateData.left_date = new Date().toISOString();
const { data, error } = await supabase
.from("gameforge_team_members")
.update(updateData)
.eq("id", id)
.select();
if (error) throw error;
return res.json(data[0]);
} else {
return res.status(405).json({ error: "Method not allowed" });
}
} catch (err: any) {
console.error("[GameForge Team]", err);
res.status(500).json({ error: err.message });
}
}