125 lines
3.6 KiB
TypeScript
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 });
|
|
}
|
|
}
|