115 lines
3.3 KiB
TypeScript
115 lines
3.3 KiB
TypeScript
import type { VercelRequest, VercelResponse } from "@vercel/node";
|
|
import { getAdminClient } from "../_supabase.js";
|
|
|
|
export default async function handler(req: VercelRequest, res: VercelResponse) {
|
|
const admin = getAdminClient();
|
|
|
|
// Only authenticated requests
|
|
const authHeader = req.headers.authorization;
|
|
if (!authHeader) {
|
|
return res.status(401).json({ error: "Unauthorized" });
|
|
}
|
|
|
|
const token = authHeader.replace("Bearer ", "");
|
|
const {
|
|
data: { user },
|
|
error: authError,
|
|
} = await admin.auth.getUser(token);
|
|
|
|
if (authError || !user) {
|
|
return res.status(401).json({ error: "Invalid token" });
|
|
}
|
|
|
|
try {
|
|
if (req.method === "GET") {
|
|
// Get user's mentorships (as mentee or mentor)
|
|
const role = req.query.role as string | undefined; // 'mentor' or 'mentee'
|
|
|
|
let mentorships;
|
|
if (role === "mentor") {
|
|
const { data: m } = await admin
|
|
.from("foundation_mentorships")
|
|
.select(
|
|
`
|
|
*,
|
|
mentee:user_profiles!mentee_id(id, full_name, avatar_url, email)
|
|
`,
|
|
)
|
|
.eq("mentor_id", user.id)
|
|
.order("created_at", { ascending: false });
|
|
mentorships = m;
|
|
} else if (role === "mentee") {
|
|
const { data: m } = await admin
|
|
.from("foundation_mentorships")
|
|
.select(
|
|
`
|
|
*,
|
|
mentor:user_profiles!mentor_id(id, full_name, avatar_url, email)
|
|
`,
|
|
)
|
|
.eq("mentee_id", user.id)
|
|
.order("created_at", { ascending: false });
|
|
mentorships = m;
|
|
} else {
|
|
// Get both roles
|
|
const { data: asMentor } = await admin
|
|
.from("foundation_mentorships")
|
|
.select(
|
|
`*,
|
|
mentee:user_profiles!mentee_id(id, full_name, avatar_url, email)`,
|
|
)
|
|
.eq("mentor_id", user.id);
|
|
|
|
const { data: asMentee } = await admin
|
|
.from("foundation_mentorships")
|
|
.select(
|
|
`*,
|
|
mentor:user_profiles!mentor_id(id, full_name, avatar_url, email)`,
|
|
)
|
|
.eq("mentee_id", user.id);
|
|
|
|
return res.status(200).json({
|
|
as_mentor: asMentor || [],
|
|
as_mentee: asMentee || [],
|
|
});
|
|
}
|
|
|
|
return res.status(200).json({
|
|
mentorships: mentorships || [],
|
|
});
|
|
}
|
|
|
|
if (req.method === "POST") {
|
|
// Request a mentor
|
|
const { mentor_id } = req.body;
|
|
|
|
if (!mentor_id) {
|
|
return res.status(400).json({ error: "mentor_id required" });
|
|
}
|
|
|
|
const { data: mentorship, error: createError } = await admin
|
|
.from("foundation_mentorships")
|
|
.insert({
|
|
mentor_id,
|
|
mentee_id: user.id,
|
|
status: "pending",
|
|
requested_at: new Date().toISOString(),
|
|
})
|
|
.select()
|
|
.single();
|
|
|
|
if (createError) {
|
|
if (createError.code === "23505") {
|
|
return res.status(400).json({ error: "Mentorship already exists" });
|
|
}
|
|
return res.status(500).json({ error: createError.message });
|
|
}
|
|
|
|
return res.status(201).json(mentorship);
|
|
}
|
|
|
|
return res.status(405).json({ error: "Method not allowed" });
|
|
} catch (error: any) {
|
|
return res.status(500).json({ error: error?.message || "Server error" });
|
|
}
|
|
}
|