server actions

This commit is contained in:
2024-10-29 13:19:34 -06:00
parent 09a0e0b6c9
commit 6b59960189
14 changed files with 347 additions and 436 deletions

View File

@@ -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 = <T extends CourseItemType>(
) => ({
queryKey: localCourseKeys.allItemsOfType(courseName, moduleName, type),
queryFn: async (): Promise<CourseItemReturnType<T>[]> => {
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 = <T extends CourseItemType>(
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<CourseItemReturnType<T>>(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<CourseItemReturnType<T>>(url);
// return response.data;
return await getItemFromServer({
moduleName,
courseName,
itemName: name,
type,
});
},
};
};
@@ -147,33 +150,42 @@ export const useUpdateItemMutation = <T extends CourseItemType>(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 = <T extends CourseItemType>(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 = <T extends CourseItemType>(type: T) => {
export const useDeleteItemMutation = <T extends CourseItemType>(type: T) => {
const { courseName } = useCourseContext();
const router = useRouter();
const queryClient = useQueryClient();
return useMutation({
mutationFn: async ({
@@ -249,16 +267,22 @@ export const useDeleteItemMutation = <T extends CourseItemType>(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({

View File

@@ -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<T extends CourseItemType>({
@@ -68,3 +71,160 @@ export async function getItemFromServer<T extends CourseItemType>({
);
return page as CourseItemReturnType<T>;
}
export async function createItemOnServer<T extends CourseItemType>({
courseName,
moduleName,
type,
item,
itemName,
}: {
courseName: string;
moduleName: string;
type: T;
item: CourseItemReturnType<T>;
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<T extends CourseItemType>({
item,
courseName,
moduleName,
previousModuleName,
previousItemName,
itemName,
type,
}: {
item: CourseItemReturnType<T>;
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<T extends CourseItemType>({
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,
});
}
}

View File

@@ -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<string[]> => {
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({

View File

@@ -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);
}

View File

@@ -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<LocalCourseSettings[]>(url);
return response.data;
// const url = `/api/courses/settings`;
// const response = await axiosClient.get<LocalCourseSettings[]>(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({

View File

@@ -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);
}