// Next.js API route support: https://nextjs.org/docs/api-routes/introduction import type { NextApiRequest, NextApiResponse } from "next"; import { app } from "@/firebase"; import { getFirestore, collection, getDocs, setDoc, doc, query, where, } from "firebase/firestore"; import { withIronSessionApiRoute } from "iron-session/next"; import { sessionOptions } from "@/lib/session"; import { Group } from "@/interfaces/user"; import { v4 } from "uuid"; import { updateExpiryDateOnGroup } from "@/utils/groups.be"; const db = getFirestore(app); export default withIronSessionApiRoute(handler, sessionOptions); async function handler(req: NextApiRequest, res: NextApiResponse) { if (!req.session.user) { res.status(401).json({ ok: false }); return; } if (req.method === "GET") await get(req, res); if (req.method === "POST") await post(req, res); } const getGroupsForUser = async (admin: string, participant: string) => { try { const queryConstraints = [ ...(admin ? [where("admin", "==", admin)] : []), ...(participant ? [where("participants", "array-contains", participant)] : []), ]; const snapshot = await getDocs( queryConstraints.length > 0 ? query(collection(db, "groups"), ...queryConstraints) : collection(db, "groups") ); const groups = snapshot.docs.map((doc) => ({ id: doc.id, ...doc.data(), })) as Group[]; return groups; } catch (e) { console.error(e); return []; } }; async function get(req: NextApiRequest, res: NextApiResponse) { const { admin, participant } = req.query as { admin: string; participant: string; }; if (req.session?.user?.type === "mastercorporate") { try { const masterCorporateGroups = await getGroupsForUser(admin, participant); const corporatesFromMaster = masterCorporateGroups .filter((g) => g.name === "Corporate") .flatMap((g) => g.participants); if (corporatesFromMaster.length === 0) { res.status(200).json([]); return; } Promise.all( corporatesFromMaster.map((c) => getGroupsForUser(c, participant)) ) .then((groups) => { res.status(200).json([...masterCorporateGroups, ...groups.flat()]); return; }) .catch((e) => { console.error(e); res.status(500).json({ ok: false }); return; }); } catch (e) { console.error(e); res.status(500).json({ ok: false }); return; } return; } try { const groups = await getGroupsForUser(admin, participant); res.status(200).json(groups); } catch (e) { console.error(e); res.status(500).json({ ok: false }); } } async function post(req: NextApiRequest, res: NextApiResponse) { const body = req.body as Group; await Promise.all( body.participants.map( async (p) => await updateExpiryDateOnGroup(p, body.admin) ) ); await setDoc(doc(db, "groups", v4()), { name: body.name, admin: body.admin, participants: body.participants, }); res.status(200).json({ ok: true }); }