diff --git a/api/admin/nexus/opportunities.ts b/api/admin/nexus/opportunities.ts new file mode 100644 index 00000000..1a73672b --- /dev/null +++ b/api/admin/nexus/opportunities.ts @@ -0,0 +1,58 @@ +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) { + if (req.method === "GET") { + try { + const { data: opportunities, error } = await supabase + .from("nexus_opportunities") + .select( + ` + id, + title, + category, + budget_min, + budget_max, + status, + application_count, + is_featured, + created_at, + user_profiles!nexus_opportunities_posted_by_fkey ( + id, + email + ) + ` + ) + .order("created_at", { ascending: false }); + + if (error) throw error; + + const formattedOpp = (opportunities || []).map((o: any) => ({ + id: o.id, + title: o.title, + category: o.category, + budget_min: o.budget_min, + budget_max: o.budget_max, + status: o.status, + application_count: o.application_count, + is_featured: o.is_featured, + created_at: o.created_at, + posted_by_email: o.user_profiles?.email, + })); + + res.status(200).json(formattedOpp); + } catch (error: any) { + res + .status(500) + .json({ + error: error.message || "Failed to fetch opportunities", + }); + } + } else { + res.status(405).json({ error: "Method not allowed" }); + } +}