Added download option for assignment cards

Export PDF Download to hook
Prevented some NaN's
This commit is contained in:
Joao Ramos
2024-01-09 23:15:13 +00:00
parent 418221427a
commit cc0f9712d6
6 changed files with 111 additions and 88 deletions

View File

@@ -15,17 +15,14 @@ import { withIronSessionApiRoute } from "iron-session/next";
import { sessionOptions } from "@/lib/session";
import ReactPDF from "@react-pdf/renderer";
import GroupTestReport from "@/exams/pdf/group.test.report";
import { ref, uploadBytes } from "firebase/storage";
import { ref, uploadBytes, getDownloadURL } from "firebase/storage";
import { Stat } from "@/interfaces/user";
import { User } from "@/interfaces/user";
import { Module } from "@/interfaces";
import { ModuleScore, StudentData } from "@/interfaces/module.scores";
import qrcode from "qrcode";
import { SkillExamDetails } from "@/exams/pdf/details/skill.exam";
import { LevelExamDetails } from "@/exams/pdf/details/level.exam";
import { calculateBandScore, getLevelScore } from "@/utils/score";
import axios from "axios";
import { moduleLabels } from "@/utils/moduleUtils";
import {
generateQRCode,
getRadialProgressPNG,
@@ -121,17 +118,25 @@ async function post(req: NextApiRequest, res: NextApiResponse) {
results: any;
exams: { module: Module }[];
startDate: string;
pdf?: string;
};
if (!data) {
res.status(400).end();
return;
}
// TODO: Reenable this
// if (data.assigner !== req.session.user.id) {
// res.status(401).json({ ok: false });
// return;
// }
if (data.assigner !== req.session.user.id) {
res.status(401).json({ ok: false });
return;
}
if (data.pdf) {
// if it does, return the pdf url
const fileRef = ref(storage, data.pdf);
const url = await getDownloadURL(fileRef);
res.status(200).end(url);
return;
}
try {
const docUser = await getDoc(doc(db, "users", req.session.user.id));
@@ -185,9 +190,10 @@ async function post(req: NextApiRequest, res: NextApiResponse) {
(e) => e.module === module
);
const bandScore =
const baseBandScore =
moduleResults.reduce((accm, curr) => accm + curr.bandScore, 0) /
moduleResults.length;
const bandScore = isNaN(baseBandScore) ? 0 : baseBandScore;
const { correct, total } = getScoreAndTotal(moduleResults);
const png = getRadialProgressPNG("azul", correct, total);
@@ -203,7 +209,8 @@ async function post(req: NextApiRequest, res: NextApiResponse) {
const { correct: overallCorrect, total: overallTotal } =
getScoreAndTotal(flattenResults);
const overallResult = overallCorrect / overallTotal;
const baseOverallResult = overallCorrect / overallTotal;
const overallResult = isNaN(baseOverallResult) ? 0 : baseOverallResult;
const overallPNG = getRadialProgressPNG(
"laranja",
@@ -365,7 +372,8 @@ async function post(req: NextApiRequest, res: NextApiResponse) {
// generate the file ref for storage
const fileName = `${Date.now().toString()}.pdf`;
const fileRef = ref(storage, `assignment_report/${fileName}`);
const refName = `assignment_report/${fileName}`;
const fileRef = ref(storage, refName);
// upload the pdf to storage
const pdfBuffer = await streamToBuffer(pdfStream);
@@ -375,9 +383,10 @@ async function post(req: NextApiRequest, res: NextApiResponse) {
// update the stats entries with the pdf url to prevent duplication
await updateDoc(docSnap.ref, {
pdf: snapshot.ref.fullPath,
pdf: refName,
});
res.status(200).end(snapshot.ref.fullPath);
const url = await getDownloadURL(fileRef);
res.status(200).end(url);
return;
}
@@ -407,7 +416,9 @@ async function get(req: NextApiRequest, res: NextApiResponse) {
}
if (data.pdf) {
return res.end(data.pdf);
const fileRef = ref(storage, data.pdf);
const url = await getDownloadURL(fileRef);
return res.redirect(url);
}
res.status(404).end();