mirror of
https://github.com/alexmickelson/canvasManagement.git
synced 2026-03-25 23:28:33 -06:00
166 lines
3.9 KiB
TypeScript
166 lines
3.9 KiB
TypeScript
import publicProcedure from "../../../services/serverFunctions/publicProcedure";
|
|
import { z } from "zod";
|
|
import { router } from "../../../services/serverFunctions/trpcSetup";
|
|
import {
|
|
LocalQuiz,
|
|
zodLocalQuiz,
|
|
} from "@/features/local/quizzes/models/localQuiz";
|
|
import { getCoursePathByName } from "../globalSettings/globalSettingsFileStorageService";
|
|
import path from "path";
|
|
import { promises as fs } from "fs";
|
|
import { quizMarkdownUtils } from "./models/utils/quizMarkdownUtils";
|
|
import { courseItemFileStorageService } from "../course/courseItemFileStorageService";
|
|
|
|
export const quizRouter = router({
|
|
getQuiz: publicProcedure
|
|
.input(
|
|
z.object({
|
|
courseName: z.string(),
|
|
moduleName: z.string(),
|
|
quizName: z.string(),
|
|
})
|
|
)
|
|
.query(async ({ input: { courseName, moduleName, quizName } }) => {
|
|
return await courseItemFileStorageService.getItem({
|
|
courseName,
|
|
moduleName,
|
|
name: quizName,
|
|
type: "Quiz",
|
|
});
|
|
}),
|
|
|
|
getAllQuizzes: publicProcedure
|
|
.input(
|
|
z.object({
|
|
courseName: z.string(),
|
|
moduleName: z.string(),
|
|
})
|
|
)
|
|
.query(async ({ input: { courseName, moduleName } }) => {
|
|
return await courseItemFileStorageService.getItems({
|
|
courseName,
|
|
moduleName,
|
|
type: "Quiz",
|
|
});
|
|
}),
|
|
createQuiz: publicProcedure
|
|
.input(
|
|
z.object({
|
|
courseName: z.string(),
|
|
moduleName: z.string(),
|
|
quizName: z.string(),
|
|
quiz: zodLocalQuiz,
|
|
})
|
|
)
|
|
.mutation(async ({ input: { courseName, moduleName, quizName, quiz } }) => {
|
|
await updateQuizFile({
|
|
courseName,
|
|
moduleName,
|
|
quizName,
|
|
quiz,
|
|
});
|
|
}),
|
|
updateQuiz: publicProcedure
|
|
.input(
|
|
z.object({
|
|
courseName: z.string(),
|
|
moduleName: z.string(),
|
|
previousModuleName: z.string(),
|
|
previousQuizName: z.string(),
|
|
quizName: z.string(),
|
|
quiz: zodLocalQuiz,
|
|
})
|
|
)
|
|
.mutation(
|
|
async ({
|
|
input: {
|
|
courseName,
|
|
moduleName,
|
|
quizName,
|
|
quiz,
|
|
previousModuleName,
|
|
previousQuizName,
|
|
},
|
|
}) => {
|
|
await updateQuizFile({
|
|
courseName,
|
|
moduleName,
|
|
quizName,
|
|
quiz,
|
|
});
|
|
|
|
if (
|
|
quizName !== previousQuizName ||
|
|
moduleName !== previousModuleName
|
|
) {
|
|
await deleteQuizFile({
|
|
courseName,
|
|
moduleName: previousModuleName,
|
|
quizName: previousQuizName,
|
|
});
|
|
}
|
|
}
|
|
),
|
|
deleteQuiz: publicProcedure
|
|
.input(
|
|
z.object({
|
|
courseName: z.string(),
|
|
moduleName: z.string(),
|
|
quizName: z.string(),
|
|
})
|
|
)
|
|
.mutation(async ({ input: { courseName, moduleName, quizName } }) => {
|
|
await deleteQuizFile({
|
|
courseName,
|
|
moduleName,
|
|
quizName,
|
|
});
|
|
}),
|
|
});
|
|
|
|
export async function deleteQuizFile({
|
|
courseName,
|
|
moduleName,
|
|
quizName,
|
|
}: {
|
|
courseName: string;
|
|
moduleName: string;
|
|
quizName: string;
|
|
}) {
|
|
const courseDirectory = await getCoursePathByName(courseName);
|
|
const filePath = path.join(
|
|
courseDirectory,
|
|
moduleName,
|
|
"quizzes",
|
|
quizName + ".md"
|
|
);
|
|
console.log("removing quiz", filePath);
|
|
await fs.unlink(filePath);
|
|
}
|
|
|
|
export async function updateQuizFile({
|
|
courseName,
|
|
moduleName,
|
|
quizName,
|
|
quiz,
|
|
}: {
|
|
courseName: string;
|
|
moduleName: string;
|
|
quizName: string;
|
|
quiz: LocalQuiz;
|
|
}) {
|
|
const courseDirectory = await getCoursePathByName(courseName);
|
|
const folder = path.join(courseDirectory, moduleName, "quizzes");
|
|
await fs.mkdir(folder, { recursive: true });
|
|
const filePath = path.join(
|
|
courseDirectory,
|
|
moduleName,
|
|
"quizzes",
|
|
quizName + ".md"
|
|
);
|
|
|
|
const quizMarkdown = quizMarkdownUtils.toMarkdown(quiz);
|
|
console.log(`Saving quiz ${filePath}`);
|
|
await fs.writeFile(filePath, quizMarkdown);
|
|
}
|