// Next.js API route support: https://nextjs.org/docs/api-routes/introduction import { sendEmail } from "@/email"; import { app } from "@/firebase"; import { Ticket, TicketTypeLabel } from "@/interfaces/ticket"; import { sessionOptions } from "@/lib/session"; import { collection, doc, getDocs, getFirestore, setDoc, } from "firebase/firestore"; import { withIronSessionApiRoute } from "iron-session/next"; import moment from "moment"; import type { NextApiRequest, NextApiResponse } from "next"; import ShortUniqueId from "short-unique-id"; const db = getFirestore(app); export default withIronSessionApiRoute(handler, sessionOptions); async function handler(req: NextApiRequest, res: NextApiResponse) { // due to integration with the homepage the POST request should be public if (req.method === "POST") { await post(req, res); return; } // specific logic for the preflight request if (req.method === "OPTIONS") { res.status(200).end(); return; } if (!req.session.user) { res.status(401).json({ ok: false }); return; } if (req.method === "GET") { await get(req, res); } } async function get(req: NextApiRequest, res: NextApiResponse) { const snapshot = await getDocs(collection(db, "tickets")); res.status(200).json( snapshot.docs.map((doc) => ({ id: doc.id, ...doc.data(), })) ); } async function post(req: NextApiRequest, res: NextApiResponse) { const body = req.body as Ticket; const shortUID = new ShortUniqueId(); const id = body.id || shortUID.randomUUID(8); await setDoc(doc(db, "tickets", id), body); res.status(200).json({ ok: true }); try { await sendEmail( "submittedFeedback", { id, subject: body.subject, reporter: body.reporter, date: moment(body.date).format("DD/MM/YYYY - HH:mm"), type: TicketTypeLabel[body.type], reportedFrom: body.reportedFrom, description: body.description, }, [body.reporter.email], `Ticket ${id}: ${body.subject}` ); } catch (e) { console.log(e); } }