import { MongoClient } from "mongodb"
import { Question } from "../pages/index"
import type { NextApiRequest, NextApiResponse } from "next"
export async function connectToDatabase() {
const uri = process.env.MONGODB_URI
const client = await MongoClient.connect(uri!)
return client
} // end connectToDatabase
export async function addQuestionDocument(client: MongoClient, document: Question) {
const db = client.db()
await db.collection("questions").insertOne(document)
}
export async function getQuestions(client: MongoClient) {
const db = client.db()
const results = await db
.collection("questions")
.aggregate([{ $sample: { size: 5 } }])
.toArray()
// removes _id from each question object
const cleanedResults = results.map((questionObj: any) => {
return {
category: questionObj.category,
type: questionObj.type,
difficulty: questionObj.difficulty,
question: questionObj.question,
correct_answer: questionObj.correct_answer,
incorrect_answers: questionObj.incorrect_answers
}
})
client.close()
const data = cleanedResults
return data
}
export async function getQuestionsTwo(client: MongoClient, req: NextApiRequest) {
const db = client.db()
let amount: any = 5
if (req.query.amount) {
amount = parseInt(`${req.query.amount}`)
}
let category: string | string[]
let categoryMatch = {}
if (req.query.category) {
category = req.query.category
categoryMatch = { category: `${category}` }
}
const results = await db
.collection("questions")
.aggregate([{ $match: categoryMatch }, { $sample: { size: amount } }])
.toArray()
// removes _id from each question object
const cleanedResults = results.map((questionObj: any) => {
return {
category: questionObj.category,
type: questionObj.type,
difficulty: questionObj.difficulty,
question: questionObj.question,
correct_answer: questionObj.correct_answer,
incorrect_answers: questionObj.incorrect_answers
}
})
client.close()
const data = cleanedResults
return data
}
import type { NextApiRequest, NextApiResponse } from "next"
import { getSession } from "next-auth/client"
import { connectToDatabase, addQuestionDocument, getQuestionsTwo } from "../../lib/db"
export default async function handler(req: NextApiRequest, res: NextApiResponse) {
if (req.method === "POST") {
// api-route protection from non-logged in users
const session = await getSession({ req: req })
if (!session) {
res.status(401).json({ message: "Not authenticated" })
return
}
// add server-side validation to prevent empty fields
/* if (newQuestion.category === "") {
res.status(422).json({ message: "Invalid category. " })
} */
let client
//error handling for connection to database
try {
client = await connectToDatabase()
} catch (error) {
res.status(500).json({ message: "There was an error connecting to the data." })
return
}
//error handling for adding a new question
try {
await addQuestionDocument(client, {
category: req.body.category,
type: req.body.type,
difficulty: req.body.difficulty,
question: req.body.question,
correct_answer: req.body.correct_answer,
incorrect_answers: req.body.incorrect_answers
})
if (client) client.close()
} catch (error) {
res.status(500).json({ message: "Inserting data failed." })
return
}
if (client) client.close()
res.status(201).json({ message: "New question added!" })
} // end post request
if (req.method === "GET") {
let client
//error handling for connection to database
try {
client = await connectToDatabase()
} catch (error) {
res.status(500).json({ message: "There was an error connecting to the data." })
return
}
// error handling for getting questions
let cleanedResults
try {
cleanedResults = await getQuestionsTwo(client, req)
if (client) client.close()
} catch (error) {
res.status(500).json({ message: "There was an error retrieving the questions" })
return
}
client.close()
res.status(200).json(cleanedResults)
} // end GET request
} // end handler function