Skip to content

Commit

Permalink
Refactored API
Browse files Browse the repository at this point in the history
  • Loading branch information
tomohiro-sawada committed Oct 9, 2023
1 parent 7ee03a4 commit f3e61bd
Show file tree
Hide file tree
Showing 28 changed files with 325 additions and 289 deletions.
1 change: 1 addition & 0 deletions declarations.d.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
declare module "../../../../server/mongodb/actions/mathPhysics";
203 changes: 92 additions & 111 deletions package-lock.json

Large diffs are not rendered by default.

4 changes: 2 additions & 2 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -21,14 +21,14 @@
"dotenv": "^16.3.1",
"eslint": "8.44.0",
"eslint-config-next": "13.4.9",
"extract-mongo-schema": "^0.2.11",
"extract-mongo-schema": "^0.2.12",
"framer-motion": "^10.13.0",
"husky": "^8.0.3",
"lint-staged": "^13.2.3",
"lodash": "^4.17.21",
"mongoose": "^7.3.3",
"next": "^13.4.9",
"postcss": "8.4.25",
"postcss": "^8.4.31",
"prettier": "^3.0.0",
"react": "18.2.0",
"react-dom": "18.2.0",
Expand Down
37 changes: 37 additions & 0 deletions src/pages/api/check-connection.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
import type { NextApiRequest, NextApiResponse } from "next";
import mongoose from "mongoose";
import connectDb from "../../server/mongodb/connectDb";

const handler = async (req: NextApiRequest, res: NextApiResponse) => {
let mongooseStateMessage: string;
const state = mongoose.connection.readyState;

switch (state) {
case 0: // disconnected
mongooseStateMessage = "MongoDB is disconnected.";
break;
case 1: // connected
mongooseStateMessage = "MongoDB is connected.";
break;
case 2: // connecting
mongooseStateMessage = "MongoDB is connecting.";
break;
case 3: // disconnecting
mongooseStateMessage = "MongoDB is disconnecting.";
break;
default:
mongooseStateMessage = "Unknown MongoDB connection state.";
}

const connectionResult = await connectDb();

res.status(200).json({
mongooseState: {
status: state,
message: mongooseStateMessage,
},
connectionAttempt: connectionResult,
});
};

export default handler;
11 changes: 8 additions & 3 deletions src/pages/api/lawProblem.ts
Original file line number Diff line number Diff line change
@@ -1,10 +1,15 @@
import type { NextApiRequest, NextApiResponse } from "next";
import { getRandomLawProblem } from "../../server/mongodb/actions/lawProblem";
import { getAllLawProblems } from "../../server/mongodb/actions/lawProblem";
import requestWrapper from "../../server/utils/middleware";

const handler = async (req: NextApiRequest, res: NextApiResponse) => {
const randomProblem = await getRandomLawProblem();
res.status(200).json({ randomProblem });
try {
const allProblems = await getAllLawProblems();
res.status(200).json({ allProblems });
} catch (error) {
console.error("Error in API endpoint:", error);
res.status(500).json({ error: "Failed to fetch data." });
}
};

export default requestWrapper(handler, "GET");
4 changes: 2 additions & 2 deletions src/pages/api/lib_2/math/numerical/[id].ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import type { NextApiRequest, NextApiResponse } from "next";
import { findMathProblemById } from "../../../../server/mongodb/actions/numericalProblem";
import requestWrapper from "../../../../server/utils/middleware";
import { findMathProblemById } from "../../../../../server/mongodb/actions/mathPhysics"
import requestWrapper from "../../../../../server/utils/middleware";

async function handler(req: NextApiRequest, res: NextApiResponse) {
if (req.method !== "GET") {
Expand Down
4 changes: 2 additions & 2 deletions src/pages/api/lib_2/math/numerical/index.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import type { NextApiRequest, NextApiResponse } from "next";
import { getAllMathProblems } from "../../../../server/mongodb/actions/numericalProblem";
import requestWrapper from "../../../../server/utils/middleware";
import { getAllMathProblems } from "../../../../../server/mongodb/actions/numericalProblem";
import requestWrapper from "../../../../../server/utils/middleware";

async function handler(req: NextApiRequest, res: NextApiResponse) {
const allProblems = await getAllMathProblems();
Expand Down
4 changes: 2 additions & 2 deletions src/pages/api/lib_2/math/prooflike/[id].ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import type { NextApiRequest, NextApiResponse } from "next";
import { findMathProofProblemById } from "../../../../../../server/mongodb/actions/numericalProblem";
import requestWrapper from "../../../../../../server/utils/middleware";
import { findMathProofProblemById } from "../../../../../server/mongodb/actions/numericalProblem";
import requestWrapper from "../../../../../server/utils/middleware";

async function handler(req: NextApiRequest, res: NextApiResponse) {
if (req.method !== "GET") {
Expand Down
4 changes: 2 additions & 2 deletions src/pages/api/lib_2/math/prooflike/index.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import type { NextApiRequest, NextApiResponse } from "next";
import { getAllMathProofProblems } from "../../../../../../server/mongodb/actions/numericalProblem";
import requestWrapper from "../../../../../../server/utils/middleware";
import { getAllMathProofProblems } from "../../../../../server/mongodb/actions/numericalProblem";
import requestWrapper from "../../../../../server/utils/middleware";

async function handler(req: NextApiRequest, res: NextApiResponse) {
const allProblems = await getAllMathProofProblems();
Expand Down
4 changes: 2 additions & 2 deletions src/pages/api/lib_2/math/symbolic/[id].ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import type { NextApiRequest, NextApiResponse } from "next";
import { findMathSymbolicProblemById } from "../../../../../../server/mongodb/actions/numericalProblem";
import requestWrapper from "../../../../../../server/utils/middleware";
import { findMathSymbolicProblemById } from "../../../../../server/mongodb/actions/numericalProblem";
import requestWrapper from "../../../../../server/utils/middleware";

async function handler(req: NextApiRequest, res: NextApiResponse) {
if (req.method !== "GET") {
Expand Down
4 changes: 2 additions & 2 deletions src/pages/api/lib_2/math/symbolic/index.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import type { NextApiRequest, NextApiResponse } from "next";
import { getAllMathSymbolicProblems } from "../../../../../../server/mongodb/actions/numericalProblem";
import requestWrapper from "../../../../../../server/utils/middleware";
import { getAllMathSymbolicProblems } from "../../../../../server/mongodb/actions/numericalProblem";
import requestWrapper from "../../../../../server/utils/middleware";

async function handler(req: NextApiRequest, res: NextApiResponse) {
const allProblems = await getAllMathSymbolicProblems();
Expand Down
4 changes: 2 additions & 2 deletions src/pages/api/lib_2/mcatReading/val/[id].ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import type { NextApiRequest, NextApiResponse } from "next";
import { findReadingProblemById } from "../../../../server/mongodb/actions/mcatProblem";
import requestWrapper from "../../../../server/utils/middleware";
import { findReadingProblemById } from "../../../../../server/mongodb/actions/mcatProblem";
import requestWrapper from "../../../../../server/utils/middleware";

async function handler(req: NextApiRequest, res: NextApiResponse) {
if (req.method !== "GET") {
Expand Down
4 changes: 2 additions & 2 deletions src/pages/api/lib_2/mcatReading/val/index.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import type { NextApiRequest, NextApiResponse } from "next";
import { getAllReadingProblems } from "../../../../server/mongodb/actions/mcatProblem";
import requestWrapper from "../../../../server/utils/middleware";
import { getAllReadingProblems } from "../../../../../server/mongodb/actions/mcatProblem";
import requestWrapper from "../../../../../server/utils/middleware";

async function handler(req: NextApiRequest, res: NextApiResponse) {
const allProblems = await getAllReadingProblems();
Expand Down
4 changes: 2 additions & 2 deletions src/pages/api/lib_2/mcatScience/val/img/[id].ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import type { NextApiRequest, NextApiResponse } from "next";
import { findScienceImagesProblemById } from "../../../../../server/mongodb/actions/mcatProblem";
import requestWrapper from "../../../../../server/utils/middleware";
import { findScienceImagesProblemById } from "../../../../../../server/mongodb/actions/mcatProblem";
import requestWrapper from "../../../../../../server/utils/middleware";

async function handler(req: NextApiRequest, res: NextApiResponse) {
if (req.method !== "GET") {
Expand Down
4 changes: 2 additions & 2 deletions src/pages/api/lib_2/mcatScience/val/img/index.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import type { NextApiRequest, NextApiResponse } from "next";
import { getAllScienceImagesProblems } from "../../../../../server/mongodb/actions/mcatProblem";
import requestWrapper from "../../../../../server/utils/middleware";
import { getAllScienceImagesProblems } from "../../../../../../server/mongodb/actions/mcatProblem";
import requestWrapper from "../../../../../../server/utils/middleware";

async function handler(req: NextApiRequest, res: NextApiResponse) {
const allProblems = await getAllScienceImagesProblems();
Expand Down
4 changes: 2 additions & 2 deletions src/pages/api/lib_2/mcatScience/val/val/[id].ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import type { NextApiRequest, NextApiResponse } from "next";
import { findScienceProblemById } from "../../../../../server/mongodb/actions/mcatProblem";
import requestWrapper from "../../../../../server/utils/middleware";
import { findScienceProblemById } from "../../../../../../server/mongodb/actions/mcatProblem";
import requestWrapper from "../../../../../../server/utils/middleware";

async function handler(req: NextApiRequest, res: NextApiResponse) {
if (req.method !== "GET") {
Expand Down
4 changes: 2 additions & 2 deletions src/pages/api/lib_2/mcatScience/val/val/index.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import type { NextApiRequest, NextApiResponse } from "next";
import { getAllScienceProblems } from "../../../../../server/mongodb/actions/mcatProblem";
import requestWrapper from "../../../../../server/utils/middleware";
import { getAllScienceProblems } from "../../../../../../server/mongodb/actions/mcatProblem";
import requestWrapper from "../../../../../../server/utils/middleware";

async function handler(req: NextApiRequest, res: NextApiResponse) {
const allProblems = await getAllScienceProblems();
Expand Down
4 changes: 2 additions & 2 deletions src/pages/api/lib_2/physics/numerical/img/[id].ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import type { NextApiRequest, NextApiResponse } from "next";
import { findPhysicsImgProblemById } from "../../../../../server/mongodb/actions/numericalProblem";
import requestWrapper from "../../../../../server/utils/middleware";
import { findPhysicsImgProblemById } from "../../../../../../server/mongodb/actions/numericalProblem";
import requestWrapper from "../../../../../../server/utils/middleware";

async function handler(req: NextApiRequest, res: NextApiResponse) {
if (req.method !== "GET") {
Expand Down
4 changes: 2 additions & 2 deletions src/pages/api/lib_2/physics/numerical/img/index.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import type { NextApiRequest, NextApiResponse } from "next";
import { getAllPhysicsImgProblems } from "../../../../../server/mongodb/actions/numericalProblem";
import requestWrapper from "../../../../../server/utils/middleware";
import { getAllPhysicsImgProblems } from "../../../../../../server/mongodb/actions/numericalProblem";
import requestWrapper from "../../../../../../server/utils/middleware";

async function handler(req: NextApiRequest, res: NextApiResponse) {
const allProblems = await getAllPhysicsImgProblems();
Expand Down
4 changes: 2 additions & 2 deletions src/pages/api/lib_2/physics/numerical/val/[id].ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import type { NextApiRequest, NextApiResponse } from "next";
import { findPhysicsProblemById } from "../../../../../server/mongodb/actions/numericalProblem";
import requestWrapper from "../../../../../server/utils/middleware";
import { findPhysicsProblemById } from "../../../../../../server/mongodb/actions/numericalProblem";
import requestWrapper from "../../../../../../server/utils/middleware";

async function handler(req: NextApiRequest, res: NextApiResponse) {
if (req.method !== "GET") {
Expand Down
4 changes: 2 additions & 2 deletions src/pages/api/lib_2/physics/numerical/val/index.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import type { NextApiRequest, NextApiResponse } from "next";
import { getAllPhysicsProblems } from "../../../../../server/mongodb/actions/numericalProblem";
import requestWrapper from "../../../../../server/utils/middleware";
import { getAllPhysicsProblems } from "../../../../../../server/mongodb/actions/numericalProblem";
import requestWrapper from "../../../../../../server/utils/middleware";

async function handler(req: NextApiRequest, res: NextApiResponse) {
const allProblems = await getAllPhysicsProblems();
Expand Down
20 changes: 14 additions & 6 deletions src/screens/Home/Home.tsx
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { useEffect, useState } from "react";
import { useEffect, useState, useMemo } from "react";
import { Image } from "@chakra-ui/react";
import { Center } from "@chakra-ui/react";

Expand Down Expand Up @@ -42,22 +42,30 @@ export default function Home() {
const [showSolution, setShowSolution] = useState(false);
const [showFinalAnswer, setShowFinalAnswer] = useState(false);

const endpoints = {
const endpoints = useMemo(() => ({
"Law Problem": "/api/lawProblem",
"Math Numerical Problem": "/api/mathProblem",
"MCAT Reading Problem": "/api/mcatReadingProblem",
"MCAT Science Problem": "/api/mcatScienceProblem",
"MCAT Science Image Problem": "/api/mcatScienceImageProblem",
"Physics Numerical Problem": "/api/physicsProblem",
"Physics Numerical Image Problem": "/api/physicsImgProblem",
};
}), []);

const fetchProblem = (endpoint: string) => {
fetch(endpoint)
.then((response) => response.json())
.then((response) => {
if (!response.ok) {
throw new Error("Network response was not ok");
}
return response.json();
})
.then((data) => {
console.log(data);
setProblem(data["randomProblem"]);
})
.catch(error => {
console.error("There was a problem with the fetch operation:", error);
});
};
useEffect(() => {
Expand All @@ -73,7 +81,7 @@ export default function Home() {
setFinalAnswer(problem["Final Answer"]);
}
}
}, [problem]);
}, [problem, endpoints]);

useEffect(() => {
const randomProblemType =
Expand All @@ -86,7 +94,7 @@ export default function Home() {
];
setRandomEndpoint(randomEndpoint);
fetchProblem(randomEndpoint);
}, []);
}, [endpoints]);

const handleProblemTypeChange = (
event: React.ChangeEvent<HTMLSelectElement>
Expand Down
47 changes: 27 additions & 20 deletions src/server/mongodb/actions/lawProblem.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
import { lawProblemModel } from "../models/law_problem";

import { ObjectId } from "mongodb";

async function findOneById(model, id, projection) {
Expand All @@ -10,31 +9,39 @@ async function findOneById(model, id, projection) {
}

async function getRandomLawProblem() {
const randomDocument = await lawProblemModel.aggregate([
{ $sample: { size: 1 } },
]);
return randomDocument[0];
try {
const randomDocument = await lawProblemModel.aggregate([
{ $sample: { size: 1 } },
]);
return randomDocument[0];
} catch (error) {
console.error("Error in getRandomLawProblem:", error);
throw error;
}
}

async function getAllLawProblems() {
return await lawProblemModel.find(
{},
{
"Problem Statement": 1,
"Problem Number": 1,
"Answer Candidates": 1,
"Final Answer": 1,
"Problem Type": 1,
}
);
try {
const data = await lawProblemModel.find({});
console.log("Data from MongoDB in getAllLawProblems:", data);
return data;
} catch (error) {
console.error("Error in getAllLawProblems:", error);
throw error;
}
}

async function findLawProblemById(id) {
return await findOneById(lawProblemModel, id, {
"Problem Statement": 1,
"Answer Candidates": 1,
"Final Answer": 1,
});
try {
return await findOneById(lawProblemModel, id, {
"Problem Statement": 1,
"Answer Candidates": 1,
"Final Answer": 1,
});
} catch (error) {
console.error("Error in findLawProblemById:", error);
throw error;
}
}

export { findLawProblemById, getRandomLawProblem, getAllLawProblems };
Loading

0 comments on commit f3e61bd

Please sign in to comment.