mirror of
https://github.com/alexmickelson/canvasManagement.git
synced 2026-03-26 07:38:33 -06:00
more centralization
This commit is contained in:
@@ -8,9 +8,9 @@ export const GET = async (
|
||||
}: { params: { courseName: string; moduleName: string } }
|
||||
) =>
|
||||
await withErrorHandling(async () => {
|
||||
const settings = await fileStorageService.pages.getPageNames(
|
||||
const pages = await fileStorageService.pages.getPages(
|
||||
courseName,
|
||||
moduleName
|
||||
);
|
||||
return Response.json(settings);
|
||||
return Response.json(pages);
|
||||
});
|
||||
|
||||
@@ -8,9 +8,9 @@ export const GET = async (
|
||||
}: { params: { courseName: string; moduleName: string } }
|
||||
) =>
|
||||
await withErrorHandling(async () => {
|
||||
const settings = await fileStorageService.quizzes.getQuizNames(
|
||||
const quizzes = await fileStorageService.quizzes.getQuizzes(
|
||||
courseName,
|
||||
moduleName
|
||||
);
|
||||
return Response.json(settings);
|
||||
return Response.json(quizzes);
|
||||
});
|
||||
|
||||
@@ -1,13 +1,9 @@
|
||||
"use client";
|
||||
import { useAssignmentsQueries } from "@/hooks/localCourse/assignmentHooks";
|
||||
import {
|
||||
useAssignmentsQueries,
|
||||
} from "@/hooks/localCourse/assignmentHooks";
|
||||
import {
|
||||
usePageNamesQuery,
|
||||
usePagesQueries,
|
||||
} from "@/hooks/localCourse/pageHooks";
|
||||
import {
|
||||
useQuizNamesQuery,
|
||||
useQuizzesQueries,
|
||||
} from "@/hooks/localCourse/quizHooks";
|
||||
import { IModuleItem } from "@/models/local/IModuleItem";
|
||||
@@ -33,15 +29,11 @@ export default function ExpandableModule({
|
||||
}: {
|
||||
moduleName: string;
|
||||
}) {
|
||||
const { data: quizNames } = useQuizNamesQuery(moduleName);
|
||||
const { data: pageNames } = usePageNamesQuery(moduleName);
|
||||
const { itemDropOnModule } = useDraggingContext();
|
||||
|
||||
const { data: assignments } = useAssignmentsQueries(
|
||||
moduleName,
|
||||
);
|
||||
const { data: quizzes } = useQuizzesQueries(moduleName, quizNames);
|
||||
const { data: pages } = usePagesQueries(moduleName, pageNames);
|
||||
const { data: assignments } = useAssignmentsQueries(moduleName);
|
||||
const { data: quizzes } = useQuizzesQueries(moduleName);
|
||||
const { data: pages } = usePagesQueries(moduleName);
|
||||
|
||||
const [expanded, setExpanded] = useState(false);
|
||||
|
||||
|
||||
@@ -73,16 +73,16 @@ export const hydrateCanvasCourse = async (
|
||||
};
|
||||
|
||||
const loadAllModuleData = async (courseName: string, moduleName: string) => {
|
||||
const [assignmentNames, pageNames, quizNames] = await Promise.all([
|
||||
const [assignmentNames, pages, quizzes] = await Promise.all([
|
||||
await fileStorageService.assignments.getAssignmentNames(
|
||||
courseName,
|
||||
moduleName
|
||||
),
|
||||
await fileStorageService.pages.getPageNames(courseName, moduleName),
|
||||
await fileStorageService.quizzes.getQuizNames(courseName, moduleName),
|
||||
await fileStorageService.pages.getPages(courseName, moduleName),
|
||||
await fileStorageService.quizzes.getQuizzes(courseName, moduleName),
|
||||
]);
|
||||
|
||||
const [assignments, quizzes, pages] = await Promise.all([
|
||||
const [assignments] = await Promise.all([
|
||||
await Promise.all(
|
||||
assignmentNames.map(async (assignmentName) => {
|
||||
try {
|
||||
@@ -97,33 +97,11 @@ const loadAllModuleData = async (courseName: string, moduleName: string) => {
|
||||
}
|
||||
})
|
||||
),
|
||||
await Promise.all(
|
||||
quizNames.map(
|
||||
async (quizName) =>
|
||||
await fileStorageService.quizzes.getQuiz(
|
||||
courseName,
|
||||
moduleName,
|
||||
quizName
|
||||
)
|
||||
)
|
||||
),
|
||||
await Promise.all(
|
||||
pageNames.map(
|
||||
async (pageName) =>
|
||||
await fileStorageService.pages.getPage(
|
||||
courseName,
|
||||
moduleName,
|
||||
pageName
|
||||
)
|
||||
)
|
||||
),
|
||||
]);
|
||||
|
||||
const assignmentsLoaded = assignments.filter(a => a !== null);
|
||||
const assignmentsLoaded = assignments.filter((a) => a !== null);
|
||||
return {
|
||||
moduleName,
|
||||
pageNames,
|
||||
quizNames,
|
||||
assignments: assignmentsLoaded,
|
||||
quizzes,
|
||||
pages,
|
||||
@@ -133,15 +111,11 @@ const loadAllModuleData = async (courseName: string, moduleName: string) => {
|
||||
const hydrateModuleData = async (
|
||||
{
|
||||
moduleName,
|
||||
pageNames,
|
||||
quizNames,
|
||||
assignments,
|
||||
quizzes,
|
||||
pages,
|
||||
}: {
|
||||
moduleName: string;
|
||||
pageNames: string[];
|
||||
quizNames: string[];
|
||||
assignments: LocalAssignment[];
|
||||
quizzes: LocalQuiz[];
|
||||
pages: LocalCoursePage[];
|
||||
@@ -153,6 +127,14 @@ const hydrateModuleData = async (
|
||||
queryKey: localCourseKeys.allAssignments(courseName, moduleName),
|
||||
queryFn: () => assignments,
|
||||
});
|
||||
await queryClient.prefetchQuery({
|
||||
queryKey: localCourseKeys.allQuizzes(courseName, moduleName),
|
||||
queryFn: () => quizzes,
|
||||
});
|
||||
await queryClient.prefetchQuery({
|
||||
queryKey: localCourseKeys.allPages(courseName, moduleName),
|
||||
queryFn: () => pages,
|
||||
});
|
||||
await Promise.all(
|
||||
assignments.map(
|
||||
async (assignment) =>
|
||||
@@ -166,10 +148,6 @@ const hydrateModuleData = async (
|
||||
})
|
||||
)
|
||||
);
|
||||
await queryClient.prefetchQuery({
|
||||
queryKey: localCourseKeys.quizNames(courseName, moduleName),
|
||||
queryFn: () => quizNames,
|
||||
});
|
||||
await Promise.all(
|
||||
quizzes.map(
|
||||
async (quiz) =>
|
||||
@@ -179,10 +157,6 @@ const hydrateModuleData = async (
|
||||
})
|
||||
)
|
||||
);
|
||||
await queryClient.prefetchQuery({
|
||||
queryKey: localCourseKeys.pageNames(courseName, moduleName),
|
||||
queryFn: () => pageNames,
|
||||
});
|
||||
await Promise.all(
|
||||
pages.map(
|
||||
async (page) =>
|
||||
|
||||
@@ -28,7 +28,7 @@ export const getAllAssignmentsQueryConfig = (
|
||||
},
|
||||
});
|
||||
|
||||
export const useAllAssignmentNamesQuery = (moduleName: string) => {
|
||||
const useAllAssignmentsQuery = (moduleName: string) => {
|
||||
const { courseName } = useCourseContext();
|
||||
return useSuspenseQuery(getAllAssignmentsQueryConfig(courseName, moduleName));
|
||||
};
|
||||
@@ -70,7 +70,7 @@ export const useAssignmentQuery = (
|
||||
};
|
||||
|
||||
export const useAssignmentsQueries = (moduleName: string) => {
|
||||
const { data: allAssignments } = useAllAssignmentNamesQuery(moduleName);
|
||||
const { data: allAssignments } = useAllAssignmentsQuery(moduleName);
|
||||
const { courseName } = useCourseContext();
|
||||
return useSuspenseQueries({
|
||||
queries: allAssignments.map((assignment) =>
|
||||
|
||||
@@ -19,23 +19,23 @@ export const localCourseKeys = {
|
||||
"assignments",
|
||||
{ type: "all assignments" },
|
||||
] as const,
|
||||
quizNames: (courseName: string, moduleName: string) =>
|
||||
allQuizzes: (courseName: string, moduleName: string) =>
|
||||
[
|
||||
"course details",
|
||||
courseName,
|
||||
"modules",
|
||||
moduleName,
|
||||
"quizzes",
|
||||
{ type: "names" },
|
||||
{ type: "all quizzes" },
|
||||
] as const,
|
||||
pageNames: (courseName: string, moduleName: string) =>
|
||||
allPages: (courseName: string, moduleName: string) =>
|
||||
[
|
||||
"course details",
|
||||
courseName,
|
||||
"modules",
|
||||
moduleName,
|
||||
"pages",
|
||||
{ type: "names" },
|
||||
{ type: "all pages" },
|
||||
] as const,
|
||||
assignment: (
|
||||
courseName: string,
|
||||
|
||||
@@ -11,8 +11,8 @@ import {
|
||||
getAllAssignmentsQueryConfig,
|
||||
getAssignmentQueryConfig,
|
||||
} from "./assignmentHooks";
|
||||
import { getPageNamesQueryConfig, getPageQueryConfig } from "./pageHooks";
|
||||
import { getQuizNamesQueryConfig, getQuizQueryConfig } from "./quizHooks";
|
||||
import { getAllPagesQueryConfig, getPageQueryConfig } from "./pageHooks";
|
||||
import { getAllQuizzesQueryConfig, getQuizQueryConfig } from "./quizHooks";
|
||||
|
||||
export const useModuleNamesQuery = () => {
|
||||
const { courseName } = useCourseContext();
|
||||
@@ -92,57 +92,15 @@ export const useAllCourseDataQuery = () => {
|
||||
}),
|
||||
});
|
||||
|
||||
// const { data: assignmentsAndModules } = useSuspenseQueries({
|
||||
// queries: assignmentsAndModules.map(
|
||||
// ({ moduleName, assignment }, i) =>
|
||||
// getAssignmentQueryConfig(courseName, moduleName, assignment)
|
||||
// ),
|
||||
// combine: (results) => ({
|
||||
// data: results.flatMap((r, i) => ({
|
||||
// moduleName: assignmentsAndModules[i].moduleName,
|
||||
// assignment: r.data,
|
||||
// })),
|
||||
// pending: results.some((r) => r.isPending),
|
||||
// }),
|
||||
// });
|
||||
|
||||
const { data: quizNamesAndModules } = useSuspenseQueries({
|
||||
queries: moduleNames.map((moduleName) =>
|
||||
getQuizNamesQueryConfig(courseName, moduleName)
|
||||
),
|
||||
combine: (results) => ({
|
||||
data: results.flatMap((r, i) =>
|
||||
r.data.map((quizName) => ({
|
||||
moduleName: moduleNames[i],
|
||||
quizName: quizName,
|
||||
}))
|
||||
),
|
||||
pending: results.some((r) => r.isPending),
|
||||
}),
|
||||
});
|
||||
|
||||
const { data: quizzesAndModules } = useSuspenseQueries({
|
||||
queries: quizNamesAndModules.map(({ moduleName, quizName }, i) =>
|
||||
getQuizQueryConfig(courseName, moduleName, quizName)
|
||||
),
|
||||
combine: (results) => ({
|
||||
data: results.flatMap((r, i) => ({
|
||||
moduleName: quizNamesAndModules[i].moduleName,
|
||||
quiz: r.data,
|
||||
})),
|
||||
pending: results.some((r) => r.isPending),
|
||||
}),
|
||||
});
|
||||
|
||||
const { data: pageNamesAndModules } = useSuspenseQueries({
|
||||
queries: moduleNames.map((moduleName) =>
|
||||
getPageNamesQueryConfig(courseName, moduleName)
|
||||
getAllQuizzesQueryConfig(courseName, moduleName)
|
||||
),
|
||||
combine: (results) => ({
|
||||
data: results.flatMap((r, i) =>
|
||||
r.data.map((pageName) => ({
|
||||
r.data.map((quiz) => ({
|
||||
moduleName: moduleNames[i],
|
||||
pageName,
|
||||
quiz,
|
||||
}))
|
||||
),
|
||||
pending: results.some((r) => r.isPending),
|
||||
@@ -150,14 +108,16 @@ export const useAllCourseDataQuery = () => {
|
||||
});
|
||||
|
||||
const { data: pagesAndModules } = useSuspenseQueries({
|
||||
queries: pageNamesAndModules.map(({ moduleName, pageName }, i) =>
|
||||
getPageQueryConfig(courseName, moduleName, pageName)
|
||||
queries: moduleNames.map((moduleName) =>
|
||||
getAllPagesQueryConfig(courseName, moduleName)
|
||||
),
|
||||
combine: (results) => ({
|
||||
data: results.flatMap((r, i) => ({
|
||||
moduleName: pageNamesAndModules[i].moduleName,
|
||||
page: r.data,
|
||||
})),
|
||||
data: results.flatMap((r, i) =>
|
||||
r.data.map((page) => ({
|
||||
moduleName: moduleNames[i],
|
||||
page,
|
||||
}))
|
||||
),
|
||||
pending: results.some((r) => r.isPending),
|
||||
}),
|
||||
});
|
||||
|
||||
@@ -10,13 +10,10 @@ import { localCourseKeys } from "./localCourseKeys";
|
||||
import { useCourseContext } from "@/app/course/[courseName]/context/courseContext";
|
||||
import { axiosClient } from "@/services/axiosUtils";
|
||||
|
||||
export function getPageNamesQueryConfig(
|
||||
courseName: string,
|
||||
moduleName: string
|
||||
) {
|
||||
export function getAllPagesQueryConfig(courseName: string, moduleName: string) {
|
||||
return {
|
||||
queryKey: localCourseKeys.pageNames(courseName, moduleName),
|
||||
queryFn: async (): Promise<string[]> => {
|
||||
queryKey: localCourseKeys.allPages(courseName, moduleName),
|
||||
queryFn: async (): Promise<LocalCoursePage[]> => {
|
||||
const url =
|
||||
"/api/courses/" +
|
||||
encodeURIComponent(courseName) +
|
||||
@@ -29,29 +26,6 @@ export function getPageNamesQueryConfig(
|
||||
};
|
||||
}
|
||||
|
||||
export const usePageNamesQuery = (moduleName: string) => {
|
||||
const { courseName } = useCourseContext();
|
||||
return useSuspenseQuery(getPageNamesQueryConfig(courseName, moduleName));
|
||||
};
|
||||
|
||||
export const usePageQuery = (moduleName: string, pageName: string) => {
|
||||
const { courseName } = useCourseContext();
|
||||
return useSuspenseQuery(getPageQueryConfig(courseName, moduleName, pageName));
|
||||
};
|
||||
|
||||
export const usePagesQueries = (moduleName: string, pageNames: string[]) => {
|
||||
const { courseName } = useCourseContext();
|
||||
return useSuspenseQueries({
|
||||
queries: pageNames.map((name) =>
|
||||
getPageQueryConfig(courseName, moduleName, name)
|
||||
),
|
||||
combine: (results) => ({
|
||||
data: results.map((r) => r.data),
|
||||
pending: results.some((r) => r.isPending),
|
||||
}),
|
||||
});
|
||||
};
|
||||
|
||||
export function getPageQueryConfig(
|
||||
courseName: string,
|
||||
moduleName: string,
|
||||
@@ -72,13 +46,37 @@ export function getPageQueryConfig(
|
||||
return response.data;
|
||||
} catch (e) {
|
||||
console.log("error getting page", e, url);
|
||||
debugger;
|
||||
throw e;
|
||||
}
|
||||
},
|
||||
};
|
||||
}
|
||||
|
||||
export const usePageQuery = (moduleName: string, pageName: string) => {
|
||||
const { courseName } = useCourseContext();
|
||||
return useSuspenseQuery(getPageQueryConfig(courseName, moduleName, pageName));
|
||||
};
|
||||
|
||||
const useAllPagesQuery = (moduleName: string) => {
|
||||
const { courseName } = useCourseContext();
|
||||
return useSuspenseQuery(getAllPagesQueryConfig(courseName, moduleName));
|
||||
};
|
||||
|
||||
export const usePagesQueries = (moduleName: string) => {
|
||||
const { courseName } = useCourseContext();
|
||||
const { data: allPages } = useAllPagesQuery(moduleName);
|
||||
return useSuspenseQueries({
|
||||
queries: allPages.map((page) => ({
|
||||
...getPageQueryConfig(courseName, moduleName, page.name),
|
||||
queryFn: () => page,
|
||||
})),
|
||||
combine: (results) => ({
|
||||
data: results.map((r) => r.data),
|
||||
pending: results.some((r) => r.isPending),
|
||||
}),
|
||||
});
|
||||
};
|
||||
|
||||
export const useUpdatePageMutation = () => {
|
||||
const { courseName } = useCourseContext();
|
||||
const queryClient = useQueryClient();
|
||||
@@ -109,7 +107,7 @@ export const useUpdatePageMutation = () => {
|
||||
),
|
||||
});
|
||||
queryClient.removeQueries({
|
||||
queryKey: localCourseKeys.pageNames(courseName, moduleName),
|
||||
queryKey: localCourseKeys.allPages(courseName, moduleName),
|
||||
});
|
||||
}
|
||||
queryClient.setQueryData(
|
||||
@@ -131,7 +129,7 @@ export const useUpdatePageMutation = () => {
|
||||
},
|
||||
onSuccess: async (_, { moduleName, pageName }) => {
|
||||
await queryClient.invalidateQueries({
|
||||
queryKey: localCourseKeys.pageNames(courseName, moduleName),
|
||||
queryKey: localCourseKeys.allPages(courseName, moduleName),
|
||||
});
|
||||
await queryClient.invalidateQueries({
|
||||
queryKey: localCourseKeys.page(courseName, moduleName, pageName),
|
||||
@@ -171,7 +169,7 @@ export const useCreatePageMutation = () => {
|
||||
queryKey: localCourseKeys.page(courseName, moduleName, pageName),
|
||||
});
|
||||
queryClient.invalidateQueries({
|
||||
queryKey: localCourseKeys.pageNames(courseName, moduleName),
|
||||
queryKey: localCourseKeys.allPages(courseName, moduleName),
|
||||
});
|
||||
},
|
||||
});
|
||||
@@ -192,7 +190,7 @@ export const useDeletePageMutation = () => {
|
||||
queryKey: localCourseKeys.page(courseName, moduleName, pageName),
|
||||
});
|
||||
queryClient.removeQueries({
|
||||
queryKey: localCourseKeys.pageNames(courseName, moduleName),
|
||||
queryKey: localCourseKeys.allPages(courseName, moduleName),
|
||||
});
|
||||
const url =
|
||||
"/api/courses/" +
|
||||
@@ -202,11 +200,10 @@ export const useDeletePageMutation = () => {
|
||||
"/pages/" +
|
||||
encodeURIComponent(pageName);
|
||||
await axiosClient.delete(url);
|
||||
|
||||
},
|
||||
onSuccess: async (_, { moduleName, pageName }) => {
|
||||
await queryClient.invalidateQueries({
|
||||
queryKey: localCourseKeys.pageNames(courseName, moduleName),
|
||||
queryKey: localCourseKeys.allPages(courseName, moduleName),
|
||||
});
|
||||
await queryClient.invalidateQueries({
|
||||
queryKey: localCourseKeys.page(courseName, moduleName, pageName),
|
||||
|
||||
@@ -10,13 +10,13 @@ import { localCourseKeys } from "./localCourseKeys";
|
||||
import { useCourseContext } from "@/app/course/[courseName]/context/courseContext";
|
||||
import { axiosClient } from "@/services/axiosUtils";
|
||||
|
||||
export function getQuizNamesQueryConfig(
|
||||
export function getAllQuizzesQueryConfig(
|
||||
courseName: string,
|
||||
moduleName: string
|
||||
) {
|
||||
return {
|
||||
queryKey: localCourseKeys.quizNames(courseName, moduleName),
|
||||
queryFn: async (): Promise<string[]> => {
|
||||
queryKey: localCourseKeys.allQuizzes(courseName, moduleName),
|
||||
queryFn: async (): Promise<LocalQuiz[]> => {
|
||||
const url =
|
||||
"/api/courses/" +
|
||||
encodeURIComponent(courseName) +
|
||||
@@ -28,22 +28,24 @@ export function getQuizNamesQueryConfig(
|
||||
},
|
||||
};
|
||||
}
|
||||
export const useQuizNamesQuery = (moduleName: string) => {
|
||||
const { courseName } = useCourseContext();
|
||||
return useSuspenseQuery(getQuizNamesQueryConfig(courseName, moduleName));
|
||||
};
|
||||
|
||||
export const useQuizQuery = (moduleName: string, quizName: string) => {
|
||||
const { courseName } = useCourseContext();
|
||||
return useSuspenseQuery(getQuizQueryConfig(courseName, moduleName, quizName));
|
||||
};
|
||||
|
||||
export const useQuizzesQueries = (moduleName: string, quizNames: string[]) => {
|
||||
const useAllQuizzesQuery = (moduleName: string) => {
|
||||
const { courseName } = useCourseContext();
|
||||
return useSuspenseQuery(getAllQuizzesQueryConfig(courseName, moduleName));
|
||||
};
|
||||
export const useQuizzesQueries = (moduleName: string) => {
|
||||
const { courseName } = useCourseContext();
|
||||
const { data: allQuizzes } = useAllQuizzesQuery(moduleName);
|
||||
return useSuspenseQueries({
|
||||
queries: quizNames.map((name) =>
|
||||
getQuizQueryConfig(courseName, moduleName, name)
|
||||
),
|
||||
queries: allQuizzes.map((quiz) => ({
|
||||
...getQuizQueryConfig(courseName, moduleName, quiz.name),
|
||||
queryFn: () => quiz,
|
||||
})),
|
||||
combine: (results) => ({
|
||||
data: results.map((r) => r.data),
|
||||
pending: results.some((r) => r.isPending),
|
||||
@@ -102,7 +104,7 @@ export const useUpdateQuizMutation = () => {
|
||||
),
|
||||
});
|
||||
queryClient.removeQueries({
|
||||
queryKey: localCourseKeys.quizNames(courseName, previousModuleName),
|
||||
queryKey: localCourseKeys.allQuizzes(courseName, previousModuleName),
|
||||
});
|
||||
}
|
||||
queryClient.setQueryData(
|
||||
@@ -128,7 +130,7 @@ export const useUpdateQuizMutation = () => {
|
||||
},
|
||||
onSuccess: async (_, { moduleName, quizName }) => {
|
||||
await queryClient.invalidateQueries({
|
||||
queryKey: localCourseKeys.quizNames(courseName, moduleName),
|
||||
queryKey: localCourseKeys.allQuizzes(courseName, moduleName),
|
||||
});
|
||||
await queryClient.invalidateQueries({
|
||||
queryKey: localCourseKeys.quiz(courseName, moduleName, quizName),
|
||||
@@ -165,7 +167,7 @@ export const useCreateQuizMutation = () => {
|
||||
},
|
||||
onSuccess: async (_, { moduleName, quizName }) => {
|
||||
await queryClient.invalidateQueries({
|
||||
queryKey: localCourseKeys.quizNames(courseName, moduleName),
|
||||
queryKey: localCourseKeys.allQuizzes(courseName, moduleName),
|
||||
});
|
||||
await queryClient.invalidateQueries({
|
||||
queryKey: localCourseKeys.quiz(courseName, moduleName, quizName),
|
||||
@@ -194,12 +196,12 @@ export const useDeleteQuizMutation = () => {
|
||||
encodeURIComponent(quizName);
|
||||
await axiosClient.delete(url);
|
||||
queryClient.removeQueries({
|
||||
queryKey: localCourseKeys.quizNames(courseName, moduleName),
|
||||
queryKey: localCourseKeys.allQuizzes(courseName, moduleName),
|
||||
});
|
||||
},
|
||||
onSuccess: async (_, { moduleName, quizName }) => {
|
||||
await queryClient.invalidateQueries({
|
||||
queryKey: localCourseKeys.quizNames(courseName, moduleName),
|
||||
queryKey: localCourseKeys.allQuizzes(courseName, moduleName),
|
||||
});
|
||||
await queryClient.invalidateQueries({
|
||||
queryKey: localCourseKeys.quiz(courseName, moduleName, quizName),
|
||||
|
||||
@@ -13,6 +13,8 @@ import {
|
||||
LocalCoursePage,
|
||||
localPageMarkdownUtils,
|
||||
} from "@/models/local/page/localCoursePage";
|
||||
import { assignmentMarkdownSerializer } from "@/models/local/assignment/utils/assignmentMarkdownSerializer";
|
||||
import { quizMarkdownUtils } from "@/models/local/quiz/utils/quizMarkdownUtils";
|
||||
|
||||
const typeToFolder = {
|
||||
Assignment: "assignments",
|
||||
@@ -99,4 +101,41 @@ export const courseItemFileStorageService = {
|
||||
).filter((a) => a !== null);
|
||||
return items;
|
||||
},
|
||||
async updateOrCreateAssignment({
|
||||
courseName,
|
||||
moduleName,
|
||||
name,
|
||||
item,
|
||||
type,
|
||||
}: {
|
||||
courseName: string;
|
||||
moduleName: string;
|
||||
name: string;
|
||||
item: LocalAssignment | LocalQuiz | LocalCoursePage;
|
||||
type: CourseItemType;
|
||||
}) {
|
||||
const typeFolder = typeToFolder[type];
|
||||
const folder = path.join(basePath, courseName, moduleName, typeFolder);
|
||||
await fs.mkdir(folder, { recursive: true });
|
||||
|
||||
const filePath = path.join(
|
||||
basePath,
|
||||
courseName,
|
||||
moduleName,
|
||||
typeFolder,
|
||||
name + ".md"
|
||||
);
|
||||
|
||||
const markdownDictionary: {
|
||||
[key in CourseItemType]: () => string;
|
||||
} = {
|
||||
Assignment: () => assignmentMarkdownSerializer.toMarkdown(item as LocalAssignment),
|
||||
Quiz: () => quizMarkdownUtils.toMarkdown(item as LocalQuiz),
|
||||
Page: () => localPageMarkdownUtils.toMarkdown(item as LocalCoursePage),
|
||||
};
|
||||
const itemMarkdown = markdownDictionary[type]();
|
||||
|
||||
console.log(`Saving ${type} ${filePath}`);
|
||||
await fs.writeFile(filePath, itemMarkdown);
|
||||
},
|
||||
};
|
||||
|
||||
@@ -13,7 +13,6 @@ export const fileStorageService = {
|
||||
assignments: assignmentsFileStorageService,
|
||||
quizzes: quizFileStorageService,
|
||||
pages: pageFileStorageService,
|
||||
|
||||
|
||||
async getEmptyDirectories(): Promise<string[]> {
|
||||
if (!(await directoryOrFileExists(basePath))) {
|
||||
@@ -48,7 +47,7 @@ export const fileStorageService = {
|
||||
await fs.mkdir(courseDirectory, { recursive: true });
|
||||
},
|
||||
async createModuleFolderForTesting(courseName: string, moduleName: string) {
|
||||
const courseDirectory = path.join(basePath, courseName);
|
||||
const courseDirectory = path.join(basePath, courseName, moduleName);
|
||||
|
||||
await fs.mkdir(courseDirectory, { recursive: true });
|
||||
},
|
||||
|
||||
Reference in New Issue
Block a user