diff --git a/src/pages/api/exam/[module]/[id].ts b/src/pages/api/exam/[module]/[id].ts index 50bf3c7d..3ec5051c 100644 --- a/src/pages/api/exam/[module]/[id].ts +++ b/src/pages/api/exam/[module]/[id].ts @@ -1,12 +1,11 @@ // Next.js API route support: https://nextjs.org/docs/api-routes/introduction import type {NextApiRequest, NextApiResponse} from "next"; -import {app} from "@/firebase"; -import {getFirestore, doc, getDoc, deleteDoc, setDoc} from "firebase/firestore"; +import client from "@/lib/mongodb"; import {withIronSessionApiRoute} from "iron-session/next"; import {sessionOptions} from "@/lib/session"; import {PERMISSIONS} from "@/constants/userPermissions"; -const db = getFirestore(app); +const db = client.db(process.env.MONGODB_DB); export default withIronSessionApiRoute(handler, sessionOptions); @@ -24,13 +23,11 @@ async function get(req: NextApiRequest, res: NextApiResponse) { const {module, id} = req.query as {module: string; id: string}; - const docRef = doc(db, module, id); - const docSnap = await getDoc(docRef); + const docSnap = await db.collection(module).findOne({ id: id}); - if (docSnap.exists()) { + if (docSnap) { res.status(200).json({ - id: docSnap.id, - ...docSnap.data(), + ...docSnap, module, }); } else { @@ -46,11 +43,13 @@ async function patch(req: NextApiRequest, res: NextApiResponse) { const {module, id} = req.query as {module: string; id: string}; - const docRef = doc(db, module, id); - const docSnap = await getDoc(docRef); + const docSnap = await db.collection(module).findOne({ id: id}); - if (docSnap.exists()) { - await setDoc(docRef, req.body, {merge: true}); + if (docSnap) { + await db.collection(module).updateOne( + { id: id}, + { $set: req.body } + ); res.status(200).json({ok: true}); } else { res.status(404).json({ok: false}); @@ -65,16 +64,15 @@ async function del(req: NextApiRequest, res: NextApiResponse) { const {module, id} = req.query as {module: string; id: string}; - const docRef = doc(db, module, id); - const docSnap = await getDoc(docRef); + const docSnap = await db.collection(module).findOne({ id: id}); - if (docSnap.exists()) { + if (docSnap) { if (!PERMISSIONS.examManagement.delete.includes(req.session.user.type)) { res.status(403).json({ok: false}); return; } - await deleteDoc(docRef); + await db.collection(module).deleteOne({ id: id }); res.status(200).json({ok: true}); } else { diff --git a/src/pages/api/exam/[module]/generate/[...endpoint].ts b/src/pages/api/exam/[module]/generate/[...endpoint].ts index f0dbb67b..9cf05b45 100644 --- a/src/pages/api/exam/[module]/generate/[...endpoint].ts +++ b/src/pages/api/exam/[module]/generate/[...endpoint].ts @@ -1,17 +1,11 @@ // 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, query, where} from "firebase/firestore"; import {withIronSessionApiRoute} from "iron-session/next"; import {sessionOptions} from "@/lib/session"; -import {shuffle} from "lodash"; import {Difficulty, Exam} from "@/interfaces/exam"; -import {Stat} from "@/interfaces/user"; import {Module} from "@/interfaces"; import axios from "axios"; -const db = getFirestore(app); - export default withIronSessionApiRoute(handler, sessionOptions); async function handler(req: NextApiRequest, res: NextApiResponse) { diff --git a/src/pages/api/exam/[module]/generate/level.ts b/src/pages/api/exam/[module]/generate/level.ts index 353cb5a8..201461b1 100644 --- a/src/pages/api/exam/[module]/generate/level.ts +++ b/src/pages/api/exam/[module]/generate/level.ts @@ -1,17 +1,9 @@ // 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, query, where} from "firebase/firestore"; import {withIronSessionApiRoute} from "iron-session/next"; import {sessionOptions} from "@/lib/session"; -import {shuffle} from "lodash"; -import {Difficulty, Exam} from "@/interfaces/exam"; -import {Stat} from "@/interfaces/user"; -import {Module} from "@/interfaces"; import axios from "axios"; -const db = getFirestore(app); - export default withIronSessionApiRoute(handler, sessionOptions); async function handler(req: NextApiRequest, res: NextApiResponse) { diff --git a/src/pages/api/exam/[module]/index.ts b/src/pages/api/exam/[module]/index.ts index 46e9ef65..6bd24165 100644 --- a/src/pages/api/exam/[module]/index.ts +++ b/src/pages/api/exam/[module]/index.ts @@ -1,14 +1,14 @@ // Next.js API route support: https://nextjs.org/docs/api-routes/introduction -import type {NextApiRequest, NextApiResponse} from "next"; -import {app} from "@/firebase"; -import {getFirestore, setDoc, doc, runTransaction, collection, query, where, getDocs} from "firebase/firestore"; -import {withIronSessionApiRoute} from "iron-session/next"; -import {sessionOptions} from "@/lib/session"; -import {Exam, InstructorGender, Variant} from "@/interfaces/exam"; -import {getExams} from "@/utils/exams.be"; -import {Module} from "@/interfaces"; -import {getUserCorporate} from "@/utils/groups.be"; -const db = getFirestore(app); +import type { NextApiRequest, NextApiResponse } from "next"; +import client from "@/lib/mongodb"; +import { withIronSessionApiRoute } from "iron-session/next"; +import { sessionOptions } from "@/lib/session"; +import { Exam, InstructorGender, Variant } from "@/interfaces/exam"; +import { getExams } from "@/utils/exams.be"; +import { Module } from "@/interfaces"; +import { getUserCorporate } from "@/utils/groups.be"; + +const db = client.db(process.env.MONGODB_DB); export default withIronSessionApiRoute(handler, sessionOptions); @@ -16,16 +16,16 @@ async function handler(req: NextApiRequest, res: NextApiResponse) { if (req.method === "GET") return await GET(req, res); if (req.method === "POST") return await POST(req, res); - res.status(404).json({ok: false}); + res.status(404).json({ ok: false }); } async function GET(req: NextApiRequest, res: NextApiResponse) { if (!req.session.user) { - res.status(401).json({ok: false}); + res.status(401).json({ ok: false }); return; } - const {module, avoidRepeated, variant, instructorGender} = req.query as { + const { module, avoidRepeated, variant, instructorGender } = req.query as { module: Module; avoidRepeated: string; variant?: Variant; @@ -38,13 +38,15 @@ async function GET(req: NextApiRequest, res: NextApiResponse) { async function POST(req: NextApiRequest, res: NextApiResponse) { if (!req.session.user) { - res.status(401).json({ok: false}); + res.status(401).json({ ok: false }); return; } - const {module} = req.query as {module: string}; + const { module } = req.query as { module: string }; const corporate = await getUserCorporate(req.session.user.id); + const session = client.startSession(); + try { const exam = { ...req.body, @@ -57,20 +59,25 @@ async function POST(req: NextApiRequest, res: NextApiResponse) { createdAt: new Date().toISOString(), }; - await runTransaction(db, async (transaction) => { - const docRef = doc(db, module, req.body.id); - const docSnap = await transaction.get(docRef); + await session.withTransaction(async () => { + const docSnap = await db.collection(module).findOne({ id: req.body.id }, { session }); - if (docSnap.exists()) { + if (docSnap) { throw new Error("Name already exists"); } - const newDocRef = doc(db, module, req.body.id); - transaction.set(newDocRef, exam); + await db.collection(module).insertOne( + { id: req.body.id, ...exam }, + { session } + ); }); + res.status(200).json(exam); + } catch (error) { console.error("Transaction failed: ", error); - res.status(500).json({ok: false, error: (error as any).message}); + res.status(500).json({ ok: false, error: (error as any).message }); + } finally { + session.endSession(); } } diff --git a/src/pages/api/exam/index.ts b/src/pages/api/exam/index.ts index d1009899..ac2b22c9 100644 --- a/src/pages/api/exam/index.ts +++ b/src/pages/api/exam/index.ts @@ -1,14 +1,13 @@ // 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, query, where} from "firebase/firestore"; +import client from "@/lib/mongodb"; import {withIronSessionApiRoute} from "iron-session/next"; import {sessionOptions} from "@/lib/session"; import {flatten} from "lodash"; import {Exam} from "@/interfaces/exam"; import {MODULE_ARRAY} from "@/utils/moduleUtils"; -const db = getFirestore(app); +const db = client.db(process.env.MONGODB_DB); export default withIronSessionApiRoute(handler, sessionOptions); @@ -25,16 +24,12 @@ async function GET(req: NextApiRequest, res: NextApiResponse) { } const moduleExamsPromises = MODULE_ARRAY.map(async (module) => { - const moduleRef = collection(db, module); + const snapshot = await db.collection(module).find({ isDiagnostic: false }).toArray(); - const q = query(moduleRef, where("isDiagnostic", "==", false)); - const snapshot = await getDocs(q); - - return snapshot.docs.map((doc) => ({ - id: doc.id, - ...doc.data(), + return snapshot.map((doc) => ({ + ...doc, module, - })) as Exam[]; + })); }); const moduleExams = await Promise.all(moduleExamsPromises);