From dc759a368e46e2fd3323c95d643807673dfcfdce Mon Sep 17 00:00:00 2001 From: Tiago Ribeiro Date: Thu, 16 Nov 2023 13:55:43 +0000 Subject: [PATCH] Added more lists related to the expired accounts --- src/dashboards/Owner.tsx | 46 ++++++++++++++++++++-- src/pages/(admin)/BatchCodeGenerator.tsx | 2 +- src/pages/(admin)/CodeGenerator.tsx | 2 +- src/pages/(admin)/ExamGenerator.tsx | 50 ++++++++++++++++++++++++ src/pages/admin.tsx | 3 +- src/pages/api/exam/[module]/generate.tsx | 41 +++++++++++++++++++ 6 files changed, 138 insertions(+), 6 deletions(-) create mode 100644 src/pages/(admin)/ExamGenerator.tsx create mode 100644 src/pages/api/exam/[module]/generate.tsx diff --git a/src/dashboards/Owner.tsx b/src/dashboards/Owner.tsx index a41632cc..10d83356 100644 --- a/src/dashboards/Owner.tsx +++ b/src/dashboards/Owner.tsx @@ -244,7 +244,8 @@ export default function OwnerDashboard({user}: Props) { (x) => x.type === "student" && x.subscriptionExpirationDate && - moment().isAfter(moment(x.subscriptionExpirationDate).subtract(30, "days")), + moment().isAfter(moment(x.subscriptionExpirationDate).subtract(30, "days")) && + moment().isBefore(moment(x.subscriptionExpirationDate)), ) .map((x) => ( @@ -259,7 +260,8 @@ export default function OwnerDashboard({user}: Props) { (x) => x.type === "teacher" && x.subscriptionExpirationDate && - moment().isAfter(moment(x.subscriptionExpirationDate).subtract(30, "days")), + moment().isAfter(moment(x.subscriptionExpirationDate).subtract(30, "days")) && + moment().isBefore(moment(x.subscriptionExpirationDate)), ) .map((x) => ( @@ -274,7 +276,45 @@ export default function OwnerDashboard({user}: Props) { (x) => x.type === "corporate" && x.subscriptionExpirationDate && - moment().isAfter(moment(x.subscriptionExpirationDate).subtract(30, "days")), + moment().isAfter(moment(x.subscriptionExpirationDate).subtract(30, "days")) && + moment().isBefore(moment(x.subscriptionExpirationDate)), + ) + .map((x) => ( + + ))} + + +
+ Expired Students +
+ {users + .filter( + (x) => x.type === "student" && x.subscriptionExpirationDate && moment().isAfter(moment(x.subscriptionExpirationDate)), + ) + .map((x) => ( + + ))} +
+
+
+ Expired Teachers +
+ {users + .filter( + (x) => x.type === "teacher" && x.subscriptionExpirationDate && moment().isAfter(moment(x.subscriptionExpirationDate)), + ) + .map((x) => ( + + ))} +
+
+
+ Expired Corporate +
+ {users + .filter( + (x) => + x.type === "corporate" && x.subscriptionExpirationDate && moment().isAfter(moment(x.subscriptionExpirationDate)), ) .map((x) => ( diff --git a/src/pages/(admin)/BatchCodeGenerator.tsx b/src/pages/(admin)/BatchCodeGenerator.tsx index c6f99a1a..a308772e 100644 --- a/src/pages/(admin)/BatchCodeGenerator.tsx +++ b/src/pages/(admin)/BatchCodeGenerator.tsx @@ -128,7 +128,7 @@ export default function BatchCodeGenerator({user}: {user: User}) { variant="outline" onClick={() => generateCode("corporate")} disabled={emails.length === 0 || isLoading || !PERMISSIONS.generateCode.corporate.includes(user.type)}> - Admin + Corporate + ))} +
+
+ ); +} diff --git a/src/pages/admin.tsx b/src/pages/admin.tsx index c3d6a7be..6bd39f84 100644 --- a/src/pages/admin.tsx +++ b/src/pages/admin.tsx @@ -12,6 +12,7 @@ import clsx from "clsx"; import Lists from "./(admin)/Lists"; import BatchCodeGenerator from "./(admin)/BatchCodeGenerator"; import {shouldRedirectHome} from "@/utils/navigation.disabled"; +import ExamGenerator from "./(admin)/ExamGenerator"; export const getServerSideProps = withIronSessionSsr(({req, res}) => { const user = req.session.user; @@ -61,7 +62,7 @@ export default function Admin() { {user && (
- + {user.type === "developer" ? : }
diff --git a/src/pages/api/exam/[module]/generate.tsx b/src/pages/api/exam/[module]/generate.tsx new file mode 100644 index 00000000..c72f1276 --- /dev/null +++ b/src/pages/api/exam/[module]/generate.tsx @@ -0,0 +1,41 @@ +// 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 {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) { + if (!req.session.user) { + res.status(401).json({ok: false}); + return; + } + + if (req.session.user.type !== "developer") { + res.status(403).json({ok: false}); + return; + } + + const {module} = req.query as {module: Module}; + + switch (module) { + case "reading": + const result = await axios.get( + `${process.env.BACKEND_URL}/reading_passage_1?topic=football manager video game&exercises=multipleChoice&exercises=trueFalse&exercises=fillBlanks&exercises=writeBlanks`, + {headers: {Authorization: `Bearer ${process.env.BACKEND_JWT}`}}, + ); + res.status(200).json(result.data); + return; + } + + res.status(200).json({ok: true}); +}