mirror of
https://github.com/alexmickelson/canvasManagement.git
synced 2026-03-25 23:28:33 -06:00
192 lines
5.9 KiB
TypeScript
192 lines
5.9 KiB
TypeScript
import publicProcedure from "../../../services/serverFunctions/publicProcedure";
|
|
import { z } from "zod";
|
|
import { router } from "../../../services/serverFunctions/trpcSetup";
|
|
import { fileStorageService } from "@/features/local/utils/fileStorageService";
|
|
import {
|
|
prepAssignmentForNewSemester,
|
|
prepLectureForNewSemester,
|
|
prepPageForNewSemester,
|
|
prepQuizForNewSemester,
|
|
} from "@/features/local/utils/semesterTransferUtils";
|
|
import {
|
|
getGlobalSettings,
|
|
updateGlobalSettings,
|
|
} from "@/features/local/globalSettings/globalSettingsFileStorageService";
|
|
import {
|
|
LocalCourseSettings,
|
|
zodLocalCourseSettings,
|
|
} from "@/features/local/course/localCourseSettings";
|
|
import { courseItemFileStorageService } from "./courseItemFileStorageService";
|
|
import { updateOrCreateAssignmentFile } from "../assignments/assignmentRouter";
|
|
import { updateQuizFile } from "../quizzes/quizRouter";
|
|
import { updatePageFile } from "../pages/pageRouter";
|
|
import { getLectures, updateLecture } from "../lectures/lectureRouter";
|
|
import {
|
|
createModuleFile,
|
|
getModuleNamesFromFiles,
|
|
} from "../modules/moduleRouter";
|
|
|
|
export const settingsRouter = router({
|
|
allCoursesSettings: publicProcedure.query(async () => {
|
|
return await fileStorageService.settings.getAllCoursesSettings();
|
|
}),
|
|
courseSettings: publicProcedure
|
|
.input(
|
|
z.object({
|
|
courseName: z.string(),
|
|
})
|
|
)
|
|
.query(async ({ input: { courseName } }) => {
|
|
const settingsList =
|
|
await fileStorageService.settings.getAllCoursesSettings();
|
|
const s = settingsList.find((s) => s.name === courseName);
|
|
if (!s) {
|
|
console.log(courseName, settingsList);
|
|
throw Error("Could not find settings for course " + courseName);
|
|
}
|
|
return s;
|
|
}),
|
|
createCourse: publicProcedure
|
|
.input(
|
|
z.object({
|
|
name: z.string(),
|
|
directory: z.string(),
|
|
settings: zodLocalCourseSettings,
|
|
settingsFromCourseToImport: zodLocalCourseSettings.optional(),
|
|
})
|
|
)
|
|
.mutation(
|
|
async ({
|
|
input: { settings, settingsFromCourseToImport, name, directory },
|
|
}) => {
|
|
console.log("creating in directory", directory);
|
|
await fileStorageService.settings.createCourseSettings(
|
|
settings,
|
|
directory
|
|
);
|
|
|
|
const globalSettings = await getGlobalSettings();
|
|
|
|
await updateGlobalSettings({
|
|
...globalSettings,
|
|
courses: [
|
|
...globalSettings.courses,
|
|
{
|
|
name,
|
|
path: directory,
|
|
},
|
|
],
|
|
});
|
|
|
|
if (settingsFromCourseToImport) {
|
|
await migrateCourseContent(settingsFromCourseToImport, settings);
|
|
}
|
|
}
|
|
),
|
|
updateSettings: publicProcedure
|
|
.input(
|
|
z.object({
|
|
settings: zodLocalCourseSettings,
|
|
})
|
|
)
|
|
.mutation(async ({ input: { settings } }) => {
|
|
await fileStorageService.settings.updateCourseSettings(
|
|
settings.name,
|
|
settings
|
|
);
|
|
}),
|
|
});
|
|
|
|
async function migrateCourseContent(
|
|
settingsFromCourseToImport: LocalCourseSettings,
|
|
settings: LocalCourseSettings
|
|
) {
|
|
const oldCourseName = settingsFromCourseToImport.name;
|
|
const newCourseName = settings.name;
|
|
const oldModules = await getModuleNamesFromFiles(oldCourseName);
|
|
await Promise.all(
|
|
oldModules.map(async (moduleName) => {
|
|
await createModuleFile(newCourseName, moduleName);
|
|
const [oldAssignments, oldQuizzes, oldPages, oldLecturesByWeek] =
|
|
await Promise.all([
|
|
await courseItemFileStorageService.getItems({
|
|
courseName: oldCourseName,
|
|
moduleName,
|
|
type: "Assignment",
|
|
}),
|
|
await courseItemFileStorageService.getItems({
|
|
courseName: oldCourseName,
|
|
moduleName,
|
|
type: "Quiz",
|
|
}),
|
|
await courseItemFileStorageService.getItems({
|
|
courseName: oldCourseName,
|
|
moduleName,
|
|
type: "Page",
|
|
}),
|
|
await getLectures(oldCourseName),
|
|
]);
|
|
|
|
const updateAssignmentPromises = oldAssignments.map(
|
|
async (oldAssignment) => {
|
|
const newAssignment = prepAssignmentForNewSemester(
|
|
oldAssignment,
|
|
settingsFromCourseToImport.startDate,
|
|
settings.startDate
|
|
);
|
|
await updateOrCreateAssignmentFile({
|
|
courseName: newCourseName,
|
|
moduleName,
|
|
assignmentName: newAssignment.name,
|
|
assignment: newAssignment,
|
|
});
|
|
}
|
|
);
|
|
const updateQuizzesPromises = oldQuizzes.map(async (oldQuiz) => {
|
|
const newQuiz = prepQuizForNewSemester(
|
|
oldQuiz,
|
|
settingsFromCourseToImport.startDate,
|
|
settings.startDate
|
|
);
|
|
await updateQuizFile({
|
|
courseName: newCourseName,
|
|
moduleName,
|
|
quizName: newQuiz.name,
|
|
quiz: newQuiz,
|
|
});
|
|
});
|
|
const updatePagesPromises = oldPages.map(async (oldPage) => {
|
|
const newPage = prepPageForNewSemester(
|
|
oldPage,
|
|
settingsFromCourseToImport.startDate,
|
|
settings.startDate
|
|
);
|
|
await updatePageFile({
|
|
courseName: newCourseName,
|
|
moduleName,
|
|
pageName: newPage.name,
|
|
page: newPage,
|
|
});
|
|
});
|
|
const updateLecturePromises = oldLecturesByWeek.flatMap(
|
|
async (oldLectureByWeek) =>
|
|
oldLectureByWeek.lectures.map(async (oldLecture) => {
|
|
const newLecture = prepLectureForNewSemester(
|
|
oldLecture,
|
|
settingsFromCourseToImport.startDate,
|
|
settings.startDate
|
|
);
|
|
await updateLecture(newCourseName, settings, newLecture);
|
|
})
|
|
);
|
|
|
|
await Promise.all([
|
|
...updateAssignmentPromises,
|
|
...updateQuizzesPromises,
|
|
...updatePagesPromises,
|
|
...updateLecturePromises,
|
|
]);
|
|
})
|
|
);
|
|
}
|