From 6b59960189b2f5a3c1b502dab739bcdf7b5b9e77 Mon Sep 17 00:00:00 2001 From: Alex Mickelson Date: Tue, 29 Oct 2024 13:19:34 -0600 Subject: [PATCH] server actions --- .../assignments/[assignmentName]/route.ts | 95 --------- .../modules/[moduleName]/assignments/route.ts | 17 -- .../[moduleName]/pages/[pageName]/route.ts | 78 -------- .../modules/[moduleName]/pages/route.ts | 16 -- .../[moduleName]/quizzes/[quizName]/route.ts | 84 -------- .../modules/[moduleName]/quizzes/route.ts | 16 -- .../api/courses/[courseName]/modules/route.ts | 21 -- .../src/app/api/courses/[courseName]/route.ts | 16 -- .../src/hooks/localCourse/courseItemHooks.ts | 182 ++++++++++-------- .../localCourse/courseItemServerActions.ts | 160 +++++++++++++++ .../localCourse/localCourseModuleHooks.ts | 19 +- .../localCourseModuleServerActions.ts | 21 ++ .../hooks/localCourse/localCoursesHooks.ts | 23 ++- .../localCourse/localCoursesServerActions.ts | 35 ++++ 14 files changed, 347 insertions(+), 436 deletions(-) delete mode 100644 nextjs/src/app/api/courses/[courseName]/modules/[moduleName]/assignments/[assignmentName]/route.ts delete mode 100644 nextjs/src/app/api/courses/[courseName]/modules/[moduleName]/assignments/route.ts delete mode 100644 nextjs/src/app/api/courses/[courseName]/modules/[moduleName]/pages/[pageName]/route.ts delete mode 100644 nextjs/src/app/api/courses/[courseName]/modules/[moduleName]/pages/route.ts delete mode 100644 nextjs/src/app/api/courses/[courseName]/modules/[moduleName]/quizzes/[quizName]/route.ts delete mode 100644 nextjs/src/app/api/courses/[courseName]/modules/[moduleName]/quizzes/route.ts delete mode 100644 nextjs/src/app/api/courses/[courseName]/modules/route.ts delete mode 100644 nextjs/src/app/api/courses/[courseName]/route.ts create mode 100644 nextjs/src/hooks/localCourse/localCourseModuleServerActions.ts create mode 100644 nextjs/src/hooks/localCourse/localCoursesServerActions.ts diff --git a/nextjs/src/app/api/courses/[courseName]/modules/[moduleName]/assignments/[assignmentName]/route.ts b/nextjs/src/app/api/courses/[courseName]/modules/[moduleName]/assignments/[assignmentName]/route.ts deleted file mode 100644 index e74df19..0000000 --- a/nextjs/src/app/api/courses/[courseName]/modules/[moduleName]/assignments/[assignmentName]/route.ts +++ /dev/null @@ -1,95 +0,0 @@ -import { LocalAssignment } from "@/models/local/assignment/localAssignment"; -import { fileStorageService } from "@/services/fileStorage/fileStorageService"; -import { withErrorHandling } from "@/services/withErrorHandling"; -import { revalidatePath } from "next/cache"; - -export const GET = async ( - _request: Request, - { - params: { courseName, moduleName, assignmentName }, - }: { - params: { courseName: string; moduleName: string; assignmentName: string }; - } -) => - await withErrorHandling(async () => { - const assignment = await fileStorageService.assignments.getAssignment( - courseName, - moduleName, - assignmentName - ); - return Response.json(assignment); - }); - -export const PUT = async ( - request: Request, - { - params: { courseName, moduleName, assignmentName }, - }: { - params: { courseName: string; moduleName: string; assignmentName: string }; - } -) => - await withErrorHandling(async () => { - const { assignment, previousModuleName, previousAssignmentName } = - (await request.json()) as { - assignment: LocalAssignment; - previousModuleName: string; - previousAssignmentName: string; - }; - - await fileStorageService.assignments.updateOrCreateAssignment({ - courseName, - moduleName, - assignmentName, - assignment, - }); - - if ( - assignment.name !== previousAssignmentName || - moduleName !== previousModuleName - ) { - fileStorageService.assignments.delete({ - courseName, - moduleName: previousModuleName, - assignmentName: previousAssignmentName, - }); - } - - return Response.json({}); - }); - -export const POST = async ( - request: Request, - { - params: { courseName, moduleName, assignmentName }, - }: { - params: { courseName: string; moduleName: string; assignmentName: string }; - } -) => - await withErrorHandling(async () => { - const assignment = await request.json(); - await fileStorageService.assignments.updateOrCreateAssignment({ - courseName, - moduleName, - assignmentName, - assignment, - }); - return Response.json({}); - }); - -export const DELETE = async ( - _request: Request, - { - params: { courseName, moduleName, assignmentName }, - }: { - params: { courseName: string; moduleName: string; assignmentName: string }; - } -) => - await withErrorHandling(async () => { - fileStorageService.assignments.delete({ - courseName, - moduleName, - assignmentName, - }); - - return Response.json({}); - }); diff --git a/nextjs/src/app/api/courses/[courseName]/modules/[moduleName]/assignments/route.ts b/nextjs/src/app/api/courses/[courseName]/modules/[moduleName]/assignments/route.ts deleted file mode 100644 index aa361a9..0000000 --- a/nextjs/src/app/api/courses/[courseName]/modules/[moduleName]/assignments/route.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { fileStorageService } from "@/services/fileStorage/fileStorageService"; -import { withErrorHandling } from "@/services/withErrorHandling"; - -export const GET = async ( - _request: Request, - { - params: { courseName, moduleName }, - }: { params: { courseName: string; moduleName: string } } -) => - await withErrorHandling(async () => { - const assignments = await fileStorageService.assignments.getAssignments( - courseName, - moduleName - ); - - return Response.json(assignments); - }); diff --git a/nextjs/src/app/api/courses/[courseName]/modules/[moduleName]/pages/[pageName]/route.ts b/nextjs/src/app/api/courses/[courseName]/modules/[moduleName]/pages/[pageName]/route.ts deleted file mode 100644 index f48d497..0000000 --- a/nextjs/src/app/api/courses/[courseName]/modules/[moduleName]/pages/[pageName]/route.ts +++ /dev/null @@ -1,78 +0,0 @@ -import { fileStorageService } from "@/services/fileStorage/fileStorageService"; -import { withErrorHandling } from "@/services/withErrorHandling"; - -export const GET = async ( - _request: Request, - { - params: { courseName, moduleName, pageName }, - }: { params: { courseName: string; moduleName: string; pageName: string } } -) => - await withErrorHandling(async () => { - const settings = await fileStorageService.pages.getPage( - courseName, - moduleName, - pageName - ); - return Response.json(settings); - }); - -export const PUT = async ( - request: Request, - { - params: { courseName, moduleName, pageName }, - }: { params: { courseName: string; moduleName: string; pageName: string } } -) => - await withErrorHandling(async () => { - const { page, previousModuleName, previousPageName } = await request.json(); - await fileStorageService.pages.updatePage( - courseName, - moduleName, - pageName, - page - ); - - if ( - previousModuleName && - previousPageName && - (page.name !== previousPageName || moduleName !== previousModuleName) - ) { - fileStorageService.pages.delete({ - courseName, - moduleName: previousModuleName, - pageName: previousPageName, - }); - } - return Response.json({}); - }); - -export const POST = async ( - request: Request, - { - params: { courseName, moduleName, pageName }, - }: { params: { courseName: string; moduleName: string; pageName: string } } -) => - await withErrorHandling(async () => { - const page = await request.json(); - await fileStorageService.pages.updatePage( - courseName, - moduleName, - pageName, - page - ); - return Response.json({}); - }); - -export const DELETE = async ( - _request: Request, - { - params: { courseName, moduleName, pageName }, - }: { params: { courseName: string; moduleName: string; pageName: string } } -) => - await withErrorHandling(async () => { - fileStorageService.pages.delete({ - courseName, - moduleName, - pageName, - }); - return Response.json({}); - }); diff --git a/nextjs/src/app/api/courses/[courseName]/modules/[moduleName]/pages/route.ts b/nextjs/src/app/api/courses/[courseName]/modules/[moduleName]/pages/route.ts deleted file mode 100644 index a1bfbd5..0000000 --- a/nextjs/src/app/api/courses/[courseName]/modules/[moduleName]/pages/route.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { fileStorageService } from "@/services/fileStorage/fileStorageService"; -import { withErrorHandling } from "@/services/withErrorHandling"; - -export const GET = async ( - _request: Request, - { - params: { courseName, moduleName }, - }: { params: { courseName: string; moduleName: string } } -) => - await withErrorHandling(async () => { - const pages = await fileStorageService.pages.getPages( - courseName, - moduleName - ); - return Response.json(pages); - }); diff --git a/nextjs/src/app/api/courses/[courseName]/modules/[moduleName]/quizzes/[quizName]/route.ts b/nextjs/src/app/api/courses/[courseName]/modules/[moduleName]/quizzes/[quizName]/route.ts deleted file mode 100644 index cc3a70d..0000000 --- a/nextjs/src/app/api/courses/[courseName]/modules/[moduleName]/quizzes/[quizName]/route.ts +++ /dev/null @@ -1,84 +0,0 @@ -import { LocalQuiz } from "@/models/local/quiz/localQuiz"; -import { fileStorageService } from "@/services/fileStorage/fileStorageService"; -import { withErrorHandling } from "@/services/withErrorHandling"; - -export const GET = async ( - _request: Request, - { - params: { courseName, moduleName, quizName }, - }: { params: { courseName: string; moduleName: string; quizName: string } } -) => - await withErrorHandling(async () => { - const quiz = await fileStorageService.quizzes.getQuiz( - courseName, - moduleName, - quizName - ); - return Response.json(quiz); - }); - -export const PUT = async ( - request: Request, - { - params: { courseName, moduleName, quizName }, - }: { params: { courseName: string; moduleName: string; quizName: string } } -) => - await withErrorHandling(async () => { - const { quiz, previousModuleName, previousQuizName } = - (await request.json()) as { - quiz: LocalQuiz; - previousModuleName?: string; - previousQuizName?: string; - }; - await fileStorageService.quizzes.updateQuiz( - courseName, - moduleName, - quizName, - quiz - ); - - if ( - previousModuleName && - previousQuizName && - (quiz.name !== previousQuizName || moduleName !== previousModuleName) - ) { - fileStorageService.quizzes.delete({ - courseName, - moduleName: previousModuleName, - quizName: previousQuizName, - }); - } - return Response.json({}); - }); - -export const POST = async ( - request: Request, - { - params: { courseName, moduleName, quizName }, - }: { params: { courseName: string; moduleName: string; quizName: string } } -) => - await withErrorHandling(async () => { - const quiz = await request.json(); - await fileStorageService.quizzes.updateQuiz( - courseName, - moduleName, - quizName, - quiz - ); - return Response.json({}); - }); -export const DELETE = async ( - _request: Request, - { - params: { courseName, moduleName, quizName }, - }: { params: { courseName: string; moduleName: string; quizName: string } } -) => - await withErrorHandling(async () => { - fileStorageService.quizzes.delete({ - courseName, - moduleName, - quizName, - }); - - return Response.json({}); - }); diff --git a/nextjs/src/app/api/courses/[courseName]/modules/[moduleName]/quizzes/route.ts b/nextjs/src/app/api/courses/[courseName]/modules/[moduleName]/quizzes/route.ts deleted file mode 100644 index ca0092d..0000000 --- a/nextjs/src/app/api/courses/[courseName]/modules/[moduleName]/quizzes/route.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { fileStorageService } from "@/services/fileStorage/fileStorageService"; -import { withErrorHandling } from "@/services/withErrorHandling"; - -export const GET = async ( - _request: Request, - { - params: { courseName, moduleName }, - }: { params: { courseName: string; moduleName: string } } -) => - await withErrorHandling(async () => { - const quizzes = await fileStorageService.quizzes.getQuizzes( - courseName, - moduleName - ); - return Response.json(quizzes); - }); diff --git a/nextjs/src/app/api/courses/[courseName]/modules/route.ts b/nextjs/src/app/api/courses/[courseName]/modules/route.ts deleted file mode 100644 index af884ed..0000000 --- a/nextjs/src/app/api/courses/[courseName]/modules/route.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { fileStorageService } from "@/services/fileStorage/fileStorageService"; -import { withErrorHandling } from "@/services/withErrorHandling"; - -export const GET = async ( - _request: Request, - { params: { courseName } }: { params: { courseName: string } } -) => - await withErrorHandling(async () => { - const settings = await fileStorageService.modules.getModuleNames(courseName); - return Response.json(settings); - }); - -export const POST = async ( - request: Request, - { params: { courseName } }: { params: { courseName: string } } -) => - await withErrorHandling(async () => { - const { moduleName } = await request.json(); - await fileStorageService.modules.createModule(courseName, moduleName); - return Response.json({}); - }); diff --git a/nextjs/src/app/api/courses/[courseName]/route.ts b/nextjs/src/app/api/courses/[courseName]/route.ts deleted file mode 100644 index 716f220..0000000 --- a/nextjs/src/app/api/courses/[courseName]/route.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { fileStorageService } from "@/services/fileStorage/fileStorageService"; -import { withErrorHandling } from "@/services/withErrorHandling"; - -export const PUT = async ( - request: Request, - { params: { courseName } }: { params: { courseName: string } } -) => - await withErrorHandling(async () => { - const { updatedCourse, previousCourse } = await request.json(); - - console.log(updatedCourse); - console.log(courseName); - - // await fileStorageService.saveCourseAsync(updatedCourse, previousCourse); - return Response.json({}); - }); diff --git a/nextjs/src/hooks/localCourse/courseItemHooks.ts b/nextjs/src/hooks/localCourse/courseItemHooks.ts index 7247a73..d7422ad 100644 --- a/nextjs/src/hooks/localCourse/courseItemHooks.ts +++ b/nextjs/src/hooks/localCourse/courseItemHooks.ts @@ -13,8 +13,11 @@ import { useSuspenseQuery, } from "@tanstack/react-query"; import { + createItemOnServer, + deleteItemOnServer, getAllItemsFromServer, getItemFromServer, + updateItemOnServer, } from "./courseItemServerActions"; import { useRouter } from "next/navigation"; @@ -25,20 +28,20 @@ export const getAllItemsQueryConfig = ( ) => ({ queryKey: localCourseKeys.allItemsOfType(courseName, moduleName, type), queryFn: async (): Promise[]> => { - const url = - "/api/courses/" + - encodeURIComponent(courseName) + - "/modules/" + - encodeURIComponent(moduleName) + - "/" + - typeToFolder[type]; - const response = await axiosClient.get(url); - return response.data; - // return await getAllItemsFromServer({ - // courseName, - // moduleName, - // type, - // }); + // const url = + // "/api/courses/" + + // encodeURIComponent(courseName) + + // "/modules/" + + // encodeURIComponent(moduleName) + + // "/" + + // typeToFolder[type]; + // const response = await axiosClient.get(url); + // return response.data; + return await getAllItemsFromServer({ + courseName, + moduleName, + type, + }); }, }); @@ -51,23 +54,23 @@ export const getItemQueryConfig = ( return { queryKey: localCourseKeys.itemOfType(courseName, moduleName, name, type), queryFn: async () => { - const url = - "/api/courses/" + - encodeURIComponent(courseName) + - "/modules/" + - encodeURIComponent(moduleName) + - "/" + - typeToFolder[type] + - "/" + - encodeURIComponent(name); - const response = await axiosClient.get>(url); - return response.data; - // return await getItemFromServer({ - // moduleName, - // courseName, - // itemName: name, - // type, - // }); + // const url = + // "/api/courses/" + + // encodeURIComponent(courseName) + + // "/modules/" + + // encodeURIComponent(moduleName) + + // "/" + + // typeToFolder[type] + + // "/" + + // encodeURIComponent(name); + // const response = await axiosClient.get>(url); + // return response.data; + return await getItemFromServer({ + moduleName, + courseName, + itemName: name, + type, + }); }, }; }; @@ -147,33 +150,42 @@ export const useUpdateItemMutation = (type: T) => { localCourseKeys.itemOfType(courseName, moduleName, itemName, type), item ); - const url = - "/api/courses/" + - encodeURIComponent(courseName) + - "/modules/" + - encodeURIComponent(moduleName) + - "/" + - typeToFolder[type] + - "/" + - encodeURIComponent(itemName); - if (type === "Assignment") - await axiosClient.put(url, { - assignment: item, - previousModuleName, - previousAssignmentName: previousItemName, - }); - if (type === "Quiz") - await axiosClient.put(url, { - quiz: item, - previousModuleName, - previousQuizName: previousItemName, - }); - if (type === "Page") - await axiosClient.put(url, { - page: item, - previousModuleName, - previousPageName: previousItemName, - }); + await updateItemOnServer({ + courseName, + moduleName, + item, + type, + previousItemName, + previousModuleName, + itemName, + }); + // const url = + // "/api/courses/" + + // encodeURIComponent(courseName) + + // "/modules/" + + // encodeURIComponent(moduleName) + + // "/" + + // typeToFolder[type] + + // "/" + + // encodeURIComponent(itemName); + // if (type === "Assignment") + // await axiosClient.put(url, { + // assignment: item, + // previousModuleName, + // previousAssignmentName: previousItemName, + // }); + // if (type === "Quiz") + // await axiosClient.put(url, { + // quiz: item, + // previousModuleName, + // previousQuizName: previousItemName, + // }); + // if (type === "Page") + // await axiosClient.put(url, { + // page: item, + // previousModuleName, + // previousPageName: previousItemName, + // }); }, onSuccess: async (_, { moduleName, itemName }) => { await queryClient.invalidateQueries({ @@ -210,16 +222,23 @@ export const useCreateItemMutation = (type: T) => { localCourseKeys.itemOfType(courseName, moduleName, itemName, type), item ); - const url = - "/api/courses/" + - encodeURIComponent(courseName) + - "/modules/" + - encodeURIComponent(moduleName) + - "/" + - typeToFolder[type] + - "/" + - encodeURIComponent(itemName); - await axiosClient.post(url, item); + // const url = + // "/api/courses/" + + // encodeURIComponent(courseName) + + // "/modules/" + + // encodeURIComponent(moduleName) + + // "/" + + // typeToFolder[type] + + // "/" + + // encodeURIComponent(itemName); + // await axiosClient.post(url, item); + await createItemOnServer({ + courseName, + moduleName, + item, + type, + itemName, + }); }, onSuccess: async (_, { moduleName, itemName }) => { await queryClient.invalidateQueries({ @@ -239,7 +258,6 @@ export const useCreateItemMutation = (type: T) => { export const useDeleteItemMutation = (type: T) => { const { courseName } = useCourseContext(); - const router = useRouter(); const queryClient = useQueryClient(); return useMutation({ mutationFn: async ({ @@ -249,16 +267,22 @@ export const useDeleteItemMutation = (type: T) => { moduleName: string; itemName: string; }) => { - const url = - "/api/courses/" + - encodeURIComponent(courseName) + - "/modules/" + - encodeURIComponent(moduleName) + - "/" + - typeToFolder[type] + - "/" + - encodeURIComponent(itemName); - await axiosClient.delete(url); + // const url = + // "/api/courses/" + + // encodeURIComponent(courseName) + + // "/modules/" + + // encodeURIComponent(moduleName) + + // "/" + + // typeToFolder[type] + + // "/" + + // encodeURIComponent(itemName); + // await axiosClient.delete(url); + await deleteItemOnServer({ + courseName, + itemName, + moduleName, + type, + }); }, onSuccess: async (_, { moduleName, itemName }) => { await queryClient.invalidateQueries({ diff --git a/nextjs/src/hooks/localCourse/courseItemServerActions.ts b/nextjs/src/hooks/localCourse/courseItemServerActions.ts index 2fc0e89..589e5c3 100644 --- a/nextjs/src/hooks/localCourse/courseItemServerActions.ts +++ b/nextjs/src/hooks/localCourse/courseItemServerActions.ts @@ -1,10 +1,13 @@ "use server"; import { ItemInDay } from "@/app/course/[courseName]/calendar/day/ItemInDay"; +import { LocalAssignment } from "@/models/local/assignment/localAssignment"; import { CourseItemReturnType, CourseItemType, } from "@/models/local/courseItemTypes"; +import { LocalCoursePage } from "@/models/local/page/localCoursePage"; +import { LocalQuiz } from "@/models/local/quiz/localQuiz"; import { fileStorageService } from "@/services/fileStorage/fileStorageService"; export async function getAllItemsFromServer({ @@ -68,3 +71,160 @@ export async function getItemFromServer({ ); return page as CourseItemReturnType; } + +export async function createItemOnServer({ + courseName, + moduleName, + type, + item, + itemName, +}: { + courseName: string; + moduleName: string; + type: T; + item: CourseItemReturnType; + itemName: string; +}) { + if (type === "Assignment") { + const assignment = item as LocalAssignment; + await fileStorageService.assignments.updateOrCreateAssignment({ + courseName, + moduleName, + assignmentName: itemName, + assignment, + }); + } + if (type === "Quiz") { + const quiz = item as LocalQuiz; + await fileStorageService.quizzes.updateQuiz( + courseName, + moduleName, + itemName, + quiz + ); + } + if (type === "Page") { + const page = item as LocalCoursePage; + await fileStorageService.pages.updatePage( + courseName, + moduleName, + itemName, + page + ); + } +} + +export async function updateItemOnServer({ + item, + courseName, + moduleName, + previousModuleName, + previousItemName, + itemName, + type, +}: { + item: CourseItemReturnType; + courseName: string; + moduleName: string; + previousModuleName: string; + previousItemName: string; + itemName: string; + type: T; +}) { + if (type === "Assignment") { + const assignment = item as LocalAssignment; + await fileStorageService.assignments.updateOrCreateAssignment({ + courseName, + moduleName, + assignmentName: itemName, + assignment, + }); + + if ( + assignment.name !== previousItemName || + moduleName !== previousModuleName + ) { + fileStorageService.assignments.delete({ + courseName, + moduleName: previousModuleName, + assignmentName: previousItemName, + }); + } + } + if (type === "Quiz") { + const quiz = item as LocalQuiz; + await fileStorageService.quizzes.updateQuiz( + courseName, + moduleName, + itemName, + quiz + ); + + if ( + previousModuleName && + previousItemName && + (quiz.name !== previousItemName || moduleName !== previousModuleName) + ) { + fileStorageService.quizzes.delete({ + courseName, + moduleName: previousModuleName, + quizName: previousItemName, + }); + } + } + if (type === "Page") { + const page = item as LocalCoursePage; + await fileStorageService.pages.updatePage( + courseName, + moduleName, + itemName, + page + ); + + if ( + previousModuleName && + previousItemName && + (page.name !== previousItemName || moduleName !== previousModuleName) + ) { + fileStorageService.pages.delete({ + courseName, + moduleName: previousModuleName, + pageName: previousItemName, + }); + } + } +} + +export async function deleteItemOnServer({ + courseName, + moduleName, + itemName, + type, +}: { + courseName: string; + moduleName: string; + itemName: string; + type: T; +}) { + if (type === "Assignment") { + await fileStorageService.assignments.delete({ + courseName, + moduleName, + assignmentName: itemName, + }); + } + if (type === "Quiz") { + await fileStorageService.quizzes.delete({ + courseName, + moduleName, + quizName: itemName, + }); + } + if (type === "Page") { + await fileStorageService.pages.delete({ + courseName, + moduleName, + pageName: itemName, + }); + } +} diff --git a/nextjs/src/hooks/localCourse/localCourseModuleHooks.ts b/nextjs/src/hooks/localCourse/localCourseModuleHooks.ts index 0e51c91..aaa93a4 100644 --- a/nextjs/src/hooks/localCourse/localCourseModuleHooks.ts +++ b/nextjs/src/hooks/localCourse/localCourseModuleHooks.ts @@ -1,5 +1,4 @@ import { useCourseContext } from "@/app/course/[courseName]/context/courseContext"; -import { axiosClient } from "@/services/axiosUtils"; import { useMutation, useQueryClient, @@ -10,15 +9,20 @@ import { localCourseKeys } from "./localCourseKeys"; import { getAllAssignmentsQueryConfig } from "./assignmentHooks"; import { getAllQuizzesQueryConfig } from "./quizHooks"; import { getAllItemsQueryConfig } from "./courseItemHooks"; +import { + createModuleOnServer, + getModuleNamesFromServer, +} from "./localCourseModuleServerActions"; export const useModuleNamesQuery = () => { const { courseName } = useCourseContext(); return useSuspenseQuery({ queryKey: localCourseKeys.moduleNames(courseName), queryFn: async (): Promise => { - const url = `/api/courses/${courseName}/modules`; - const response = await axiosClient.get(url); - return response.data; + // const url = `/api/courses/${courseName}/modules`; + // const response = await axiosClient.get(url); + // return response.data; + return await getModuleNamesFromServer({ courseName }); }, }); }; @@ -28,9 +32,10 @@ export const useCreateModuleMutation = () => { const queryClient = useQueryClient(); return useMutation({ mutationFn: async (moduleName: string) => { - const url = `/api/courses/${courseName}/modules`; - const response = await axiosClient.post(url, { moduleName }); - return response.data; + // const url = `/api/courses/${courseName}/modules`; + // const response = await axiosClient.post(url, { moduleName }); + // return response.data; + await createModuleOnServer({ courseName, moduleName }); }, onSuccess: () => { queryClient.invalidateQueries({ diff --git a/nextjs/src/hooks/localCourse/localCourseModuleServerActions.ts b/nextjs/src/hooks/localCourse/localCourseModuleServerActions.ts new file mode 100644 index 0000000..48926d3 --- /dev/null +++ b/nextjs/src/hooks/localCourse/localCourseModuleServerActions.ts @@ -0,0 +1,21 @@ +"use server"; + +import { fileStorageService } from "@/services/fileStorage/fileStorageService"; + +export async function getModuleNamesFromServer({ + courseName, +}: { + courseName: string; +}) { + return await fileStorageService.modules.getModuleNames(courseName); +} + +export async function createModuleOnServer({ + courseName, + moduleName, +}: { + courseName: string; + moduleName: string; +}) { + await fileStorageService.modules.createModule(courseName, moduleName); +} diff --git a/nextjs/src/hooks/localCourse/localCoursesHooks.ts b/nextjs/src/hooks/localCourse/localCoursesHooks.ts index 6e4facf..5501d42 100644 --- a/nextjs/src/hooks/localCourse/localCoursesHooks.ts +++ b/nextjs/src/hooks/localCourse/localCoursesHooks.ts @@ -8,14 +8,21 @@ import { import { localCourseKeys } from "./localCourseKeys"; import { axiosClient } from "@/services/axiosUtils"; import { useCourseContext } from "@/app/course/[courseName]/context/courseContext"; +import { + createCourseOnServer, + getAllCoursesSettingsFromServer, + getCourseSettingsFromServer, + updateCourseSettingsOnServer, +} from "./localCoursesServerActions"; export const useLocalCoursesSettingsQuery = () => useSuspenseQuery({ queryKey: localCourseKeys.allCoursesSettings, queryFn: async () => { - const url = `/api/courses/settings`; - const response = await axiosClient.get(url); - return response.data; + // const url = `/api/courses/settings`; + // const response = await axiosClient.get(url); + // return response.data; + return await getAllCoursesSettingsFromServer(); }, }); @@ -39,8 +46,9 @@ export const useCreateLocalCourseMutation = () => { const queryClient = useQueryClient(); return useMutation({ mutationFn: async (newCourse: LocalCourse) => { - const url = `/api/courses`; - await axiosClient.post(url, newCourse); + // const url = `/api/courses`; + // await axiosClient.post(url, newCourse); + await createCourseOnServer({ course: newCourse }); }, onSuccess: () => { queryClient.invalidateQueries({ @@ -59,8 +67,9 @@ export const useUpdateLocalCourseSettingsMutation = () => { localCourseKeys.settings(courseName), updatedSettings ); - const url = `/api/courses/${courseName}/settings`; - await axiosClient.put(url, updatedSettings); + // const url = `/api/courses/${courseName}/settings`; + // await axiosClient.put(url, updatedSettings); + await updateCourseSettingsOnServer({ courseName, settings: updatedSettings }); }, onSuccess: () => { queryClient.invalidateQueries({ diff --git a/nextjs/src/hooks/localCourse/localCoursesServerActions.ts b/nextjs/src/hooks/localCourse/localCoursesServerActions.ts new file mode 100644 index 0000000..d06d7a9 --- /dev/null +++ b/nextjs/src/hooks/localCourse/localCoursesServerActions.ts @@ -0,0 +1,35 @@ +"use server"; +import { LocalCourse, LocalCourseSettings } from "@/models/local/localCourse"; +import { fileStorageService } from "@/services/fileStorage/fileStorageService"; + +export async function getCourseSettingsFromServer({ + courseName, +}: { + courseName: string; +}) { + return await fileStorageService.settings.getCourseSettings(courseName); +} +export async function getAllCoursesSettingsFromServer() { + return await fileStorageService.settings.getAllCoursesSettings(); +} + +export async function createCourseOnServer({ + course, +}: { + course: LocalCourse; +}) { + await fileStorageService.settings.updateCourseSettings( + course.settings.name, + course.settings + ); +} + +export async function updateCourseSettingsOnServer({ + courseName, + settings, +}: { + courseName: string; + settings: LocalCourseSettings; +}) { + await fileStorageService.settings.updateCourseSettings(courseName, settings); +}