diff --git a/src/app/addCourse/AddCourseToGlobalSettingsForm.tsx b/src/app/addCourse/AddCourseToGlobalSettingsForm.tsx index 7756dbd..c8c4d11 100644 --- a/src/app/addCourse/AddCourseToGlobalSettingsForm.tsx +++ b/src/app/addCourse/AddCourseToGlobalSettingsForm.tsx @@ -22,7 +22,7 @@ import { } from "@/hooks/localCourse/storageDirectoryHooks"; import { CanvasCourseModel } from "@/models/canvas/courses/canvasCourseModel"; import { CanvasEnrollmentTermModel } from "@/models/canvas/enrollmentTerms/canvasEnrollmentTermModel"; -import { AssignmentSubmissionType } from "@/models/local/assignment/assignmentSubmissionType"; +import { AssignmentSubmissionType } from "@/features/local/assignments/models/assignmentSubmissionType"; import { DayOfWeek, LocalCourseSettings, diff --git a/src/app/api/mcp/[transport]/route.ts b/src/app/api/mcp/[transport]/route.ts index dbd1065..718c878 100644 --- a/src/app/api/mcp/[transport]/route.ts +++ b/src/app/api/mcp/[transport]/route.ts @@ -1,4 +1,4 @@ -import { assignmentMarkdownSerializer } from "@/models/local/assignment/utils/assignmentMarkdownSerializer"; +import { assignmentMarkdownSerializer } from "@/features/local/assignments/models/utils/assignmentMarkdownSerializer"; import { groupByStartDate } from "@/models/local/utils/timeUtils"; import { fileStorageService } from "@/services/fileStorage/fileStorageService"; import { ResourceTemplate } from "@modelcontextprotocol/sdk/server/mcp.js"; diff --git a/src/app/course/[courseName]/calendar/day/getStatus.tsx b/src/app/course/[courseName]/calendar/day/getStatus.tsx index 7fbaf8f..6be9e86 100644 --- a/src/app/course/[courseName]/calendar/day/getStatus.tsx +++ b/src/app/course/[courseName]/calendar/day/getStatus.tsx @@ -2,10 +2,8 @@ import { CanvasAssignment } from "@/models/canvas/assignments/canvasAssignment"; import { CanvasPage } from "@/models/canvas/pages/canvasPageModel"; import { CanvasQuiz } from "@/models/canvas/quizzes/canvasQuizModel"; -import { LocalAssignment } from "@/models/local/assignment/localAssignment"; +import { LocalAssignment } from "@/features/local/assignments/models/localAssignment"; import { LocalCourseSettings } from "@/models/local/localCourseSettings"; -import { LocalCoursePage } from "@/models/local/page/localCoursePage"; -import { LocalQuiz } from "@/models/local/quiz/localQuiz"; import { dateToMarkdownString, getDateFromStringOrThrow, @@ -13,6 +11,8 @@ import { import { markdownToHTMLSafe } from "@/services/htmlMarkdownUtils"; import { htmlIsCloseEnough } from "@/services/utils/htmlIsCloseEnough"; import { ReactNode } from "react"; +import { LocalCoursePage } from "@/features/local/pages/localCoursePageModels"; +import { LocalQuiz } from "@/features/local/quizzes/models/localQuiz"; export const getStatus = ({ item, diff --git a/src/app/course/[courseName]/calendar/day/useTodaysItems.tsx b/src/app/course/[courseName]/calendar/day/useTodaysItems.tsx index bba42b9..af2fece 100644 --- a/src/app/course/[courseName]/calendar/day/useTodaysItems.tsx +++ b/src/app/course/[courseName]/calendar/day/useTodaysItems.tsx @@ -2,9 +2,7 @@ import { useCanvasAssignmentsQuery } from "@/hooks/canvas/canvasAssignmentHooks"; import { useCanvasPagesQuery } from "@/hooks/canvas/canvasPageHooks"; import { useCanvasQuizzesQuery } from "@/hooks/canvas/canvasQuizHooks"; -import { LocalAssignment } from "@/models/local/assignment/localAssignment"; -import { LocalCoursePage } from "@/models/local/page/localCoursePage"; -import { LocalQuiz } from "@/models/local/quiz/localQuiz"; +import { LocalAssignment } from "@/features/local/assignments/models/localAssignment"; import { getDateFromStringOrThrow, getDateOnlyMarkdownString, @@ -13,6 +11,8 @@ import { ReactNode } from "react"; import { useCalendarItemsContext } from "../../context/calendarItemsContext"; import { getStatus } from "./getStatus"; import { useLocalCourseSettingsQuery } from "@/hooks/localCourse/localCoursesHooks"; +import { LocalCoursePage } from "@/features/local/pages/localCoursePageModels"; +import { LocalQuiz } from "@/features/local/quizzes/models/localQuiz"; export function useTodaysItems(day: string) { const { data: settings } = useLocalCourseSettingsQuery(); diff --git a/src/app/course/[courseName]/context/calendarItemsContext.ts b/src/app/course/[courseName]/context/calendarItemsContext.ts index 168a948..944f1a5 100644 --- a/src/app/course/[courseName]/context/calendarItemsContext.ts +++ b/src/app/course/[courseName]/context/calendarItemsContext.ts @@ -1,6 +1,6 @@ -import { LocalAssignment } from "@/models/local/assignment/localAssignment"; -import { LocalCoursePage } from "@/models/local/page/localCoursePage"; -import { LocalQuiz } from "@/models/local/quiz/localQuiz"; +import { LocalAssignment } from "@/features/local/assignments/models/localAssignment"; +import { LocalCoursePage } from "@/features/local/pages/localCoursePageModels"; +import { LocalQuiz } from "@/features/local/quizzes/models/localQuiz"; import { createContext, useContext } from "react"; export interface CalendarItemsInterface { diff --git a/src/app/course/[courseName]/context/drag/useItemDropOnDay.ts b/src/app/course/[courseName]/context/drag/useItemDropOnDay.ts index 061bfe3..bb6347e 100644 --- a/src/app/course/[courseName]/context/drag/useItemDropOnDay.ts +++ b/src/app/course/[courseName]/context/drag/useItemDropOnDay.ts @@ -1,16 +1,13 @@ "use client"; -import { useUpdateAssignmentMutation } from "@/hooks/localCourse/assignmentHooks"; import { useLecturesSuspenseQuery, useLectureUpdateMutation, } from "@/hooks/localCourse/lectureHooks"; import { useLocalCourseSettingsQuery } from "@/hooks/localCourse/localCoursesHooks"; -import { useUpdatePageMutation } from "@/hooks/localCourse/pageHooks"; -import { LocalAssignment } from "@/models/local/assignment/localAssignment"; +import { useUpdatePageMutation } from "@/features/local/pages/pageHooks"; +import { LocalAssignment } from "@/features/local/assignments/models/localAssignment"; import { Lecture } from "@/models/local/lecture"; import { getLectureForDay } from "@/models/local/utils/lectureUtils"; -import { LocalCoursePage } from "@/models/local/page/localCoursePage"; -import { LocalQuiz } from "@/models/local/quiz/localQuiz"; import { getDateFromStringOrThrow, getDateOnlyMarkdownString, @@ -21,6 +18,9 @@ import { DraggableItem } from "./draggingContext"; import { getNewLockDate } from "./getNewLockDate"; import { useUpdateQuizMutation } from "@/hooks/localCourse/quizHooks"; import { useCourseContext } from "../courseContext"; +import { useUpdateAssignmentMutation } from "@/features/local/assignments/assignmentHooks"; +import { LocalCoursePage } from "@/features/local/pages/localCoursePageModels"; +import { LocalQuiz } from "@/features/local/quizzes/models/localQuiz"; export function useItemDropOnDay({ setIsDragging, diff --git a/src/app/course/[courseName]/context/drag/useItemDropOnModule.ts b/src/app/course/[courseName]/context/drag/useItemDropOnModule.ts index ba17215..efd6248 100644 --- a/src/app/course/[courseName]/context/drag/useItemDropOnModule.ts +++ b/src/app/course/[courseName]/context/drag/useItemDropOnModule.ts @@ -1,13 +1,13 @@ "use client"; -import { useUpdateAssignmentMutation } from "@/hooks/localCourse/assignmentHooks"; -import { useUpdatePageMutation } from "@/hooks/localCourse/pageHooks"; -import { LocalAssignment } from "@/models/local/assignment/localAssignment"; -import { LocalCoursePage } from "@/models/local/page/localCoursePage"; -import { LocalQuiz } from "@/models/local/quiz/localQuiz"; +import { useUpdatePageMutation } from "@/features/local/pages/pageHooks"; +import { LocalAssignment } from "@/features/local/assignments/models/localAssignment"; import { Dispatch, SetStateAction, useCallback, DragEvent } from "react"; import { DraggableItem } from "./draggingContext"; import { useCourseContext } from "../courseContext"; import { useUpdateQuizMutation } from "@/hooks/localCourse/quizHooks"; +import { useUpdateAssignmentMutation } from "@/features/local/assignments/assignmentHooks"; +import { LocalCoursePage } from "@/features/local/pages/localCoursePageModels"; +import { LocalQuiz } from "@/features/local/quizzes/models/localQuiz"; export function useItemDropOnModule({ setIsDragging, diff --git a/src/app/course/[courseName]/modules/ExpandableModule.tsx b/src/app/course/[courseName]/modules/ExpandableModule.tsx index 64afe9c..99f1e61 100644 --- a/src/app/course/[courseName]/modules/ExpandableModule.tsx +++ b/src/app/course/[courseName]/modules/ExpandableModule.tsx @@ -1,5 +1,5 @@ "use client"; -import { usePagesQueries } from "@/hooks/localCourse/pageHooks"; +import { usePagesQueries } from "@/features/local/pages/pageHooks"; import { IModuleItem } from "@/models/local/IModuleItem"; import { getDateFromString, @@ -22,9 +22,9 @@ import { useCourseContext } from "../context/courseContext"; import { Expandable } from "../../../../components/Expandable"; import { useDragStyleContext } from "../context/drag/dragStyleContext"; import { useQuizzesQueries } from "@/hooks/localCourse/quizHooks"; -import { useAssignmentNamesQuery } from "@/hooks/localCourse/assignmentHooks"; import { useTRPC } from "@/services/serverFunctions/trpcClient"; import { useSuspenseQueries } from "@tanstack/react-query"; +import { useAssignmentNamesQuery } from "@/features/local/assignments/assignmentHooks"; export default function ExpandableModule({ moduleName, diff --git a/src/app/course/[courseName]/modules/NewItemForm.tsx b/src/app/course/[courseName]/modules/NewItemForm.tsx index 6b46946..9edd51b 100644 --- a/src/app/course/[courseName]/modules/NewItemForm.tsx +++ b/src/app/course/[courseName]/modules/NewItemForm.tsx @@ -3,11 +3,10 @@ import ButtonSelect from "@/components/ButtonSelect"; import SelectInput from "@/components/form/SelectInput"; import TextInput from "@/components/form/TextInput"; import { Spinner } from "@/components/Spinner"; -import { useCreateAssignmentMutation } from "@/hooks/localCourse/assignmentHooks"; import { useModuleNamesQuery } from "@/hooks/localCourse/localCourseModuleHooks"; import { useLocalCourseSettingsQuery } from "@/hooks/localCourse/localCoursesHooks"; -import { useCreatePageMutation } from "@/hooks/localCourse/pageHooks"; -import { LocalAssignmentGroup } from "@/models/local/assignment/localAssignmentGroup"; +import { useCreatePageMutation } from "@/features/local/pages/pageHooks"; +import { LocalAssignmentGroup } from "@/features/local/assignments/models/localAssignmentGroup"; import React, { useState } from "react"; import { useCourseContext } from "../context/courseContext"; @@ -17,6 +16,7 @@ import { dateToMarkdownString, getDateFromStringOrThrow, } from "@/models/local/utils/timeUtils"; +import { useCreateAssignmentMutation } from "@/features/local/assignments/assignmentHooks"; export default function NewItemForm({ moduleName: defaultModuleName, diff --git a/src/app/course/[courseName]/modules/[moduleName]/assignment/[assignmentName]/AssignmentFooterButtons.tsx b/src/app/course/[courseName]/modules/[moduleName]/assignment/[assignmentName]/AssignmentFooterButtons.tsx index b3f5417..244f15e 100644 --- a/src/app/course/[courseName]/modules/[moduleName]/assignment/[assignmentName]/AssignmentFooterButtons.tsx +++ b/src/app/course/[courseName]/modules/[moduleName]/assignment/[assignmentName]/AssignmentFooterButtons.tsx @@ -1,16 +1,13 @@ import { useCourseContext } from "@/app/course/[courseName]/context/courseContext"; import Modal, { useModal } from "@/components/Modal"; import { Spinner } from "@/components/Spinner"; +import { useAssignmentQuery, useDeleteAssignmentMutation } from "@/features/local/assignments/assignmentHooks"; import { useCanvasAssignmentsQuery, useAddAssignmentToCanvasMutation, useDeleteAssignmentFromCanvasMutation, useUpdateAssignmentInCanvasMutation, } from "@/hooks/canvas/canvasAssignmentHooks"; -import { - useAssignmentQuery, - useDeleteAssignmentMutation, -} from "@/hooks/localCourse/assignmentHooks"; import { useLocalCourseSettingsQuery } from "@/hooks/localCourse/localCoursesHooks"; import { baseCanvasUrl } from "@/services/canvas/canvasServiceUtils"; import { getCourseUrl } from "@/services/urlUtils"; diff --git a/src/app/course/[courseName]/modules/[moduleName]/assignment/[assignmentName]/AssignmentPreview.tsx b/src/app/course/[courseName]/modules/[moduleName]/assignment/[assignmentName]/AssignmentPreview.tsx index b3bc407..5852e45 100644 --- a/src/app/course/[courseName]/modules/[moduleName]/assignment/[assignmentName]/AssignmentPreview.tsx +++ b/src/app/course/[courseName]/modules/[moduleName]/assignment/[assignmentName]/AssignmentPreview.tsx @@ -1,7 +1,7 @@ import MarkdownDisplay from "@/components/MarkdownDisplay"; -import { LocalAssignment } from "@/models/local/assignment/localAssignment"; -import { rubricItemIsExtraCredit } from "@/models/local/assignment/rubricItem"; -import { assignmentPoints } from "@/models/local/assignment/utils/assignmentPointsUtils"; +import { LocalAssignment } from "@/features/local/assignments/models/localAssignment"; +import { rubricItemIsExtraCredit } from "@/features/local/assignments/models/rubricItem"; +import { assignmentPoints } from "@/features/local/assignments/models/utils/assignmentPointsUtils"; import { formatHumanReadableDate } from "@/services/utils/dateFormat"; import React, { Fragment } from "react"; diff --git a/src/app/course/[courseName]/modules/[moduleName]/assignment/[assignmentName]/EditAssignment.tsx b/src/app/course/[courseName]/modules/[moduleName]/assignment/[assignmentName]/EditAssignment.tsx index 73a1f8e..0ab7093 100644 --- a/src/app/course/[courseName]/modules/[moduleName]/assignment/[assignmentName]/EditAssignment.tsx +++ b/src/app/course/[courseName]/modules/[moduleName]/assignment/[assignmentName]/EditAssignment.tsx @@ -1,14 +1,9 @@ "use client"; import { MonacoEditor } from "@/components/editor/MonacoEditor"; -import { - useAssignmentQuery, - useUpdateAssignmentMutation, - useUpdateImageSettingsForAssignment, -} from "@/hooks/localCourse/assignmentHooks"; import { LocalAssignment, localAssignmentMarkdown, -} from "@/models/local/assignment/localAssignment"; +} from "@/features/local/assignments/models/localAssignment"; import { useEffect, useState } from "react"; import AssignmentPreview from "./AssignmentPreview"; import { useCourseContext } from "@/app/course/[courseName]/context/courseContext"; @@ -22,6 +17,11 @@ import EditAssignmentHeader from "./EditAssignmentHeader"; import { Spinner } from "@/components/Spinner"; import { getAssignmentHelpString } from "./getAssignmentHelpString"; import { EditLayout } from "@/components/EditLayout"; +import { + useAssignmentQuery, + useUpdateAssignmentMutation, + useUpdateImageSettingsForAssignment, +} from "@/features/local/assignments/assignmentHooks"; export default function EditAssignment({ moduleName, diff --git a/src/app/course/[courseName]/modules/[moduleName]/assignment/[assignmentName]/UpdateAssignmentName.tsx b/src/app/course/[courseName]/modules/[moduleName]/assignment/[assignmentName]/UpdateAssignmentName.tsx index fb326c3..07987c8 100644 --- a/src/app/course/[courseName]/modules/[moduleName]/assignment/[assignmentName]/UpdateAssignmentName.tsx +++ b/src/app/course/[courseName]/modules/[moduleName]/assignment/[assignmentName]/UpdateAssignmentName.tsx @@ -5,7 +5,7 @@ import { Spinner } from "@/components/Spinner"; import { useAssignmentQuery, useUpdateAssignmentMutation, -} from "@/hooks/localCourse/assignmentHooks"; +} from "@/features/local/assignments/assignmentHooks"; import { getModuleItemUrl } from "@/services/urlUtils"; import { useRouter } from "next/navigation"; import { useState } from "react"; diff --git a/src/app/course/[courseName]/modules/[moduleName]/assignment/[assignmentName]/getAssignmentHelpString.tsx b/src/app/course/[courseName]/modules/[moduleName]/assignment/[assignmentName]/getAssignmentHelpString.tsx index adad51d..af729e9 100644 --- a/src/app/course/[courseName]/modules/[moduleName]/assignment/[assignmentName]/getAssignmentHelpString.tsx +++ b/src/app/course/[courseName]/modules/[moduleName]/assignment/[assignmentName]/getAssignmentHelpString.tsx @@ -1,5 +1,5 @@ "use client"; -import { AssignmentSubmissionType } from "@/models/local/assignment/assignmentSubmissionType"; +import { AssignmentSubmissionType } from "@/features/local/assignments/models/assignmentSubmissionType"; import { LocalCourseSettings } from "@/models/local/localCourseSettings"; export function getAssignmentHelpString(settings: LocalCourseSettings) { diff --git a/src/app/course/[courseName]/modules/[moduleName]/page/[pageName]/EditPage.tsx b/src/app/course/[courseName]/modules/[moduleName]/page/[pageName]/EditPage.tsx index 78e144d..143c966 100644 --- a/src/app/course/[courseName]/modules/[moduleName]/page/[pageName]/EditPage.tsx +++ b/src/app/course/[courseName]/modules/[moduleName]/page/[pageName]/EditPage.tsx @@ -1,10 +1,5 @@ "use client"; import { MonacoEditor } from "@/components/editor/MonacoEditor"; -import { - usePageQuery, - useUpdatePageMutation, -} from "@/hooks/localCourse/pageHooks"; -import { localPageMarkdownUtils } from "@/models/local/page/localCoursePage"; import { useEffect, useState } from "react"; import PagePreview from "./PagePreview"; import { useLocalCourseSettingsQuery } from "@/hooks/localCourse/localCoursesHooks"; @@ -15,6 +10,11 @@ import { useCourseContext } from "@/app/course/[courseName]/context/courseContex import { useAuthoritativeUpdates } from "@/app/course/[courseName]/utils/useAuthoritativeUpdates"; import EditPageHeader from "./EditPageHeader"; import { EditLayout } from "@/components/EditLayout"; +import { localPageMarkdownUtils } from "@/features/local/pages/localCoursePageModels"; +import { + usePageQuery, + useUpdatePageMutation, +} from "@/features/local/pages/pageHooks"; export default function EditPage({ moduleName, diff --git a/src/app/course/[courseName]/modules/[moduleName]/page/[pageName]/EditPageButtons.tsx b/src/app/course/[courseName]/modules/[moduleName]/page/[pageName]/EditPageButtons.tsx index e65d017..a25df19 100644 --- a/src/app/course/[courseName]/modules/[moduleName]/page/[pageName]/EditPageButtons.tsx +++ b/src/app/course/[courseName]/modules/[moduleName]/page/[pageName]/EditPageButtons.tsx @@ -11,7 +11,7 @@ import { useLocalCourseSettingsQuery } from "@/hooks/localCourse/localCoursesHoo import { useDeletePageMutation, usePageQuery, -} from "@/hooks/localCourse/pageHooks"; +} from "@/features/local/pages/pageHooks"; import { baseCanvasUrl } from "@/services/canvas/canvasServiceUtils"; import { getCourseUrl } from "@/services/urlUtils"; import Link from "next/link"; diff --git a/src/app/course/[courseName]/modules/[moduleName]/page/[pageName]/PagePreview.tsx b/src/app/course/[courseName]/modules/[moduleName]/page/[pageName]/PagePreview.tsx index a0bed9d..e72d186 100644 --- a/src/app/course/[courseName]/modules/[moduleName]/page/[pageName]/PagePreview.tsx +++ b/src/app/course/[courseName]/modules/[moduleName]/page/[pageName]/PagePreview.tsx @@ -1,9 +1,7 @@ import MarkdownDisplay from "@/components/MarkdownDisplay"; -import { LocalCoursePage } from "@/models/local/page/localCoursePage"; +import { LocalCoursePage } from "@/features/local/pages/localCoursePageModels"; import React from "react"; export default function PagePreview({ page }: { page: LocalCoursePage }) { - return ( - - ); + return ; } diff --git a/src/app/course/[courseName]/modules/[moduleName]/page/[pageName]/UpdatePageName.tsx b/src/app/course/[courseName]/modules/[moduleName]/page/[pageName]/UpdatePageName.tsx index 15239ec..cce8cd0 100644 --- a/src/app/course/[courseName]/modules/[moduleName]/page/[pageName]/UpdatePageName.tsx +++ b/src/app/course/[courseName]/modules/[moduleName]/page/[pageName]/UpdatePageName.tsx @@ -5,7 +5,7 @@ import { Spinner } from "@/components/Spinner"; import { usePageQuery, useUpdatePageMutation, -} from "@/hooks/localCourse/pageHooks"; +} from "@/features/local/pages/pageHooks"; import { getModuleItemUrl } from "@/services/urlUtils"; import { useRouter } from "next/navigation"; import { useState } from "react"; diff --git a/src/app/course/[courseName]/modules/[moduleName]/quiz/[quizName]/EditQuiz.tsx b/src/app/course/[courseName]/modules/[moduleName]/quiz/[quizName]/EditQuiz.tsx index d4c9baa..a2a55a4 100644 --- a/src/app/course/[courseName]/modules/[moduleName]/quiz/[quizName]/EditQuiz.tsx +++ b/src/app/course/[courseName]/modules/[moduleName]/quiz/[quizName]/EditQuiz.tsx @@ -1,6 +1,5 @@ "use client"; import { MonacoEditor } from "@/components/editor/MonacoEditor"; -import { quizMarkdownUtils } from "@/models/local/quiz/utils/quizMarkdownUtils"; import { useEffect, useState } from "react"; import QuizPreview from "./QuizPreview"; import { QuizButtons } from "./QuizButton"; @@ -13,11 +12,12 @@ import { useUpdateQuizMutation, } from "@/hooks/localCourse/quizHooks"; import { useAuthoritativeUpdates } from "../../../../utils/useAuthoritativeUpdates"; -import { extractLabelValue } from "@/models/local/assignment/utils/markdownUtils"; +import { extractLabelValue } from "@/features/local/assignments/models/utils/markdownUtils"; import EditQuizHeader from "./EditQuizHeader"; import { LocalCourseSettings } from "@/models/local/localCourseSettings"; import { useLocalCourseSettingsQuery } from "@/hooks/localCourse/localCoursesHooks"; import { EditLayout } from "@/components/EditLayout"; +import { quizMarkdownUtils } from "@/features/local/quizzes/models/utils/quizMarkdownUtils"; const helpString = (settings: LocalCourseSettings) => { const groupNames = settings.assignmentGroups.map((g) => g.name).join("\n- "); diff --git a/src/app/course/[courseName]/modules/[moduleName]/quiz/[quizName]/QuizPreview.tsx b/src/app/course/[courseName]/modules/[moduleName]/quiz/[quizName]/QuizPreview.tsx index 88054a6..22b494e 100644 --- a/src/app/course/[courseName]/modules/[moduleName]/quiz/[quizName]/QuizPreview.tsx +++ b/src/app/course/[courseName]/modules/[moduleName]/quiz/[quizName]/QuizPreview.tsx @@ -1,10 +1,7 @@ import CheckIcon from "@/components/icons/CheckIcon"; import MarkdownDisplay from "@/components/MarkdownDisplay"; +import { LocalQuizQuestion, QuestionType } from "@/features/local/quizzes/models/localQuizQuestion"; import { useQuizQuery } from "@/hooks/localCourse/quizHooks"; -import { - LocalQuizQuestion, - QuestionType, -} from "@/models/local/quiz/localQuizQuestion"; import { escapeMatchingText } from "@/services/utils/questionHtmlUtils"; export default function QuizPreview({ diff --git a/src/app/course/[courseName]/settings/AssignmentGroupManagement.tsx b/src/app/course/[courseName]/settings/AssignmentGroupManagement.tsx index 3aeeb3e..c8e90d9 100644 --- a/src/app/course/[courseName]/settings/AssignmentGroupManagement.tsx +++ b/src/app/course/[courseName]/settings/AssignmentGroupManagement.tsx @@ -4,7 +4,7 @@ import { useLocalCourseSettingsQuery, useUpdateLocalCourseSettingsMutation, } from "@/hooks/localCourse/localCoursesHooks"; -import { LocalAssignmentGroup } from "@/models/local/assignment/localAssignmentGroup"; +import { LocalAssignmentGroup } from "@/features/local/assignments/models/localAssignmentGroup"; import { useEffect, useState } from "react"; import TextInput from "../../../../components/form/TextInput"; import { useSetAssignmentGroupsMutation } from "@/hooks/canvas/canvasCourseHooks"; diff --git a/src/app/course/[courseName]/settings/SubmissionDefaults.tsx b/src/app/course/[courseName]/settings/SubmissionDefaults.tsx index 2c75c71..1179b83 100644 --- a/src/app/course/[courseName]/settings/SubmissionDefaults.tsx +++ b/src/app/course/[courseName]/settings/SubmissionDefaults.tsx @@ -7,7 +7,7 @@ import { import { AssignmentSubmissionType, AssignmentSubmissionTypeList, -} from "@/models/local/assignment/assignmentSubmissionType"; +} from "@/features/local/assignments/models/assignmentSubmissionType"; import React, { useEffect, useState } from "react"; import { settingsBox } from "./sharedSettings"; diff --git a/src/hooks/localCourse/assignmentHooks.ts b/src/features/local/assignments/assignmentHooks.ts similarity index 99% rename from src/hooks/localCourse/assignmentHooks.ts rename to src/features/local/assignments/assignmentHooks.ts index 6f2f33b..f32e38d 100644 --- a/src/hooks/localCourse/assignmentHooks.ts +++ b/src/features/local/assignments/assignmentHooks.ts @@ -1,10 +1,6 @@ "use client"; import { useTRPC } from "@/services/serverFunctions/trpcClient"; import { useCourseContext } from "@/app/course/[courseName]/context/courseContext"; -import { - useLocalCourseSettingsQuery, - useUpdateLocalCourseSettingsMutation, -} from "./localCoursesHooks"; import { extractImageSources, markdownToHtmlNoImages, @@ -15,6 +11,10 @@ import { useQueryClient, useSuspenseQuery, } from "@tanstack/react-query"; +import { + useLocalCourseSettingsQuery, + useUpdateLocalCourseSettingsMutation, +} from "@/hooks/localCourse/localCoursesHooks"; export const useAssignmentQuery = ( moduleName: string, diff --git a/src/services/serverFunctions/router/assignmentRouter.ts b/src/features/local/assignments/assignmentRouter.ts similarity index 92% rename from src/services/serverFunctions/router/assignmentRouter.ts rename to src/features/local/assignments/assignmentRouter.ts index 38217f9..3c48fe1 100644 --- a/src/services/serverFunctions/router/assignmentRouter.ts +++ b/src/features/local/assignments/assignmentRouter.ts @@ -1,8 +1,8 @@ -import publicProcedure from "../procedures/public"; +import publicProcedure from "../../../services/serverFunctions/procedures/public"; import { z } from "zod"; -import { router } from "../trpcSetup"; +import { router } from "../../../services/serverFunctions/trpcSetup"; import { fileStorageService } from "@/services/fileStorage/fileStorageService"; -import { zodLocalAssignment } from "@/models/local/assignment/localAssignment"; +import { zodLocalAssignment } from "@/features/local/assignments/models/localAssignment"; export const assignmentRouter = router({ getAssignment: publicProcedure diff --git a/src/models/local/assignment/assignmentSubmissionType.ts b/src/features/local/assignments/models/assignmentSubmissionType.ts similarity index 100% rename from src/models/local/assignment/assignmentSubmissionType.ts rename to src/features/local/assignments/models/assignmentSubmissionType.ts diff --git a/src/models/local/assignment/localAssignment.ts b/src/features/local/assignments/models/localAssignment.ts similarity index 95% rename from src/models/local/assignment/localAssignment.ts rename to src/features/local/assignments/models/localAssignment.ts index 1abdfc6..b3b9aac 100644 --- a/src/models/local/assignment/localAssignment.ts +++ b/src/features/local/assignments/models/localAssignment.ts @@ -1,4 +1,4 @@ -import { IModuleItem } from "../IModuleItem"; +import { IModuleItem } from "../../../../models/local/IModuleItem"; import { AssignmentSubmissionType, zodAssignmentSubmissionType, diff --git a/src/models/local/assignment/localAssignmentGroup.ts b/src/features/local/assignments/models/localAssignmentGroup.ts similarity index 100% rename from src/models/local/assignment/localAssignmentGroup.ts rename to src/features/local/assignments/models/localAssignmentGroup.ts diff --git a/src/models/local/assignment/rubricItem.ts b/src/features/local/assignments/models/rubricItem.ts similarity index 100% rename from src/models/local/assignment/rubricItem.ts rename to src/features/local/assignments/models/rubricItem.ts diff --git a/src/models/local/assignment/utils/assignmentMarkdownParser.ts b/src/features/local/assignments/models/utils/assignmentMarkdownParser.ts similarity index 98% rename from src/models/local/assignment/utils/assignmentMarkdownParser.ts rename to src/features/local/assignments/models/utils/assignmentMarkdownParser.ts index 37cb068..44beac1 100644 --- a/src/models/local/assignment/utils/assignmentMarkdownParser.ts +++ b/src/features/local/assignments/models/utils/assignmentMarkdownParser.ts @@ -1,7 +1,7 @@ import { verifyDateOrThrow, verifyDateStringOrUndefined, -} from "../../utils/timeUtils"; +} from "../../../../../models/local/utils/timeUtils"; import { AssignmentSubmissionType } from "../assignmentSubmissionType"; import { LocalAssignment } from "../localAssignment"; import { RubricItem } from "../rubricItem"; diff --git a/src/models/local/assignment/utils/assignmentMarkdownSerializer.ts b/src/features/local/assignments/models/utils/assignmentMarkdownSerializer.ts similarity index 100% rename from src/models/local/assignment/utils/assignmentMarkdownSerializer.ts rename to src/features/local/assignments/models/utils/assignmentMarkdownSerializer.ts diff --git a/src/models/local/assignment/utils/assignmentPointsUtils.ts b/src/features/local/assignments/models/utils/assignmentPointsUtils.ts similarity index 100% rename from src/models/local/assignment/utils/assignmentPointsUtils.ts rename to src/features/local/assignments/models/utils/assignmentPointsUtils.ts diff --git a/src/models/local/assignment/utils/markdownUtils.ts b/src/features/local/assignments/models/utils/markdownUtils.ts similarity index 100% rename from src/models/local/assignment/utils/markdownUtils.ts rename to src/features/local/assignments/models/utils/markdownUtils.ts diff --git a/src/models/local/page/localCoursePage.ts b/src/features/local/pages/localCoursePageModels.ts similarity index 82% rename from src/models/local/page/localCoursePage.ts rename to src/features/local/pages/localCoursePageModels.ts index 2f0aa34..895fc07 100644 --- a/src/models/local/page/localCoursePage.ts +++ b/src/features/local/pages/localCoursePageModels.ts @@ -1,7 +1,7 @@ +import { IModuleItem } from "@/models/local/IModuleItem"; +import { verifyDateOrThrow } from "@/models/local/utils/timeUtils"; import { z } from "zod"; -import { extractLabelValue } from "../assignment/utils/markdownUtils"; -import { IModuleItem } from "../IModuleItem"; -import { verifyDateOrThrow } from "../utils/timeUtils"; +import { extractLabelValue } from "../assignments/models/utils/markdownUtils"; export interface LocalCoursePage extends IModuleItem { name: string; diff --git a/src/services/fileStorage/pageFileStorageService.ts b/src/features/local/pages/pageFileStorageService.ts similarity index 85% rename from src/services/fileStorage/pageFileStorageService.ts rename to src/features/local/pages/pageFileStorageService.ts index c955833..4b5b13d 100644 --- a/src/services/fileStorage/pageFileStorageService.ts +++ b/src/features/local/pages/pageFileStorageService.ts @@ -1,11 +1,11 @@ -import { - localPageMarkdownUtils, - LocalCoursePage, -} from "@/models/local/page/localCoursePage"; import { promises as fs } from "fs"; import path from "path"; -import { courseItemFileStorageService } from "./courseItemFileStorageService"; -import { getCoursePathByName } from "./globalSettingsFileStorageService"; +import { courseItemFileStorageService } from "../../../services/fileStorage/courseItemFileStorageService"; +import { getCoursePathByName } from "../../../services/fileStorage/globalSettingsFileStorageService"; +import { + LocalCoursePage, + localPageMarkdownUtils, +} from "@/features/local/pages/localCoursePageModels"; export const pageFileStorageService = { getPage: async (courseName: string, moduleName: string, name: string) => diff --git a/src/hooks/localCourse/pageHooks.ts b/src/features/local/pages/pageHooks.ts similarity index 100% rename from src/hooks/localCourse/pageHooks.ts rename to src/features/local/pages/pageHooks.ts diff --git a/src/services/serverFunctions/router/pageRouter.ts b/src/features/local/pages/pageRouter.ts similarity index 91% rename from src/services/serverFunctions/router/pageRouter.ts rename to src/features/local/pages/pageRouter.ts index 61b85d6..fed3946 100644 --- a/src/services/serverFunctions/router/pageRouter.ts +++ b/src/features/local/pages/pageRouter.ts @@ -1,8 +1,8 @@ -import publicProcedure from "../procedures/public"; +import publicProcedure from "../../../services/serverFunctions/procedures/public"; import { z } from "zod"; -import { router } from "../trpcSetup"; +import { router } from "../../../services/serverFunctions/trpcSetup"; import { fileStorageService } from "@/services/fileStorage/fileStorageService"; -import { zodLocalCoursePage } from "@/models/local/page/localCoursePage"; +import { zodLocalCoursePage } from "@/features/local/pages/localCoursePageModels"; export const pageRouter = router({ getPage: publicProcedure diff --git a/src/models/local/quiz/localQuiz.ts b/src/features/local/quizzes/models/localQuiz.ts similarity index 94% rename from src/models/local/quiz/localQuiz.ts rename to src/features/local/quizzes/models/localQuiz.ts index 9e2ee10..5190b15 100644 --- a/src/models/local/quiz/localQuiz.ts +++ b/src/features/local/quizzes/models/localQuiz.ts @@ -1,7 +1,7 @@ import { z } from "zod"; -import { IModuleItem } from "../IModuleItem"; import { LocalQuizQuestion, zodLocalQuizQuestion } from "./localQuizQuestion"; import { quizMarkdownUtils } from "./utils/quizMarkdownUtils"; +import { IModuleItem } from "@/models/local/IModuleItem"; export interface LocalQuiz extends IModuleItem { name: string; diff --git a/src/models/local/quiz/localQuizQuestion.ts b/src/features/local/quizzes/models/localQuizQuestion.ts similarity index 100% rename from src/models/local/quiz/localQuizQuestion.ts rename to src/features/local/quizzes/models/localQuizQuestion.ts diff --git a/src/models/local/quiz/localQuizQuestionAnswer.ts b/src/features/local/quizzes/models/localQuizQuestionAnswer.ts similarity index 100% rename from src/models/local/quiz/localQuizQuestionAnswer.ts rename to src/features/local/quizzes/models/localQuizQuestionAnswer.ts diff --git a/src/models/local/quiz/utils/quizMarkdownUtils.ts b/src/features/local/quizzes/models/utils/quizMarkdownUtils.ts similarity index 97% rename from src/models/local/quiz/utils/quizMarkdownUtils.ts rename to src/features/local/quizzes/models/utils/quizMarkdownUtils.ts index 31ab45b..84b5ca9 100644 --- a/src/models/local/quiz/utils/quizMarkdownUtils.ts +++ b/src/features/local/quizzes/models/utils/quizMarkdownUtils.ts @@ -1,7 +1,4 @@ -import { - verifyDateOrThrow, - verifyDateStringOrUndefined, -} from "../../utils/timeUtils"; +import { verifyDateOrThrow, verifyDateStringOrUndefined } from "@/models/local/utils/timeUtils"; import { LocalQuiz } from "../localQuiz"; import { quizQuestionMarkdownUtils } from "./quizQuestionMarkdownUtils"; diff --git a/src/models/local/quiz/utils/quizQuestionAnswerMarkdownUtils.ts b/src/features/local/quizzes/models/utils/quizQuestionAnswerMarkdownUtils.ts similarity index 100% rename from src/models/local/quiz/utils/quizQuestionAnswerMarkdownUtils.ts rename to src/features/local/quizzes/models/utils/quizQuestionAnswerMarkdownUtils.ts diff --git a/src/models/local/quiz/utils/quizQuestionMarkdownUtils.ts b/src/features/local/quizzes/models/utils/quizQuestionMarkdownUtils.ts similarity index 100% rename from src/models/local/quiz/utils/quizQuestionMarkdownUtils.ts rename to src/features/local/quizzes/models/utils/quizQuestionMarkdownUtils.ts diff --git a/src/hooks/canvas/canvasAssignmentHooks.ts b/src/hooks/canvas/canvasAssignmentHooks.ts index 1b425c4..1d63b0e 100644 --- a/src/hooks/canvas/canvasAssignmentHooks.ts +++ b/src/hooks/canvas/canvasAssignmentHooks.ts @@ -1,7 +1,7 @@ import { canvasAssignmentService } from "@/services/canvas/canvasAssignmentService"; import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query"; import { useLocalCourseSettingsQuery } from "../localCourse/localCoursesHooks"; -import { LocalAssignment } from "@/models/local/assignment/localAssignment"; +import { LocalAssignment } from "@/features/local/assignments/models/localAssignment"; import { canvasModuleService } from "@/services/canvas/canvasModuleService"; import { useAddCanvasModuleMutation, diff --git a/src/hooks/canvas/canvasCourseHooks.ts b/src/hooks/canvas/canvasCourseHooks.ts index 6e58303..9cdfd80 100644 --- a/src/hooks/canvas/canvasCourseHooks.ts +++ b/src/hooks/canvas/canvasCourseHooks.ts @@ -1,6 +1,6 @@ import { CanvasAssignmentGroup } from "@/models/canvas/assignments/canvasAssignmentGroup"; import { CanvasCourseModel } from "@/models/canvas/courses/canvasCourseModel"; -import { LocalAssignmentGroup } from "@/models/local/assignment/localAssignmentGroup"; +import { LocalAssignmentGroup } from "@/features/local/assignments/models/localAssignmentGroup"; import { LocalCourseSettings } from "@/models/local/localCourseSettings"; import { canvasAssignmentGroupService } from "@/services/canvas/canvasAssignmentGroupService"; import { canvasService } from "@/services/canvas/canvasService"; diff --git a/src/hooks/canvas/canvasPageHooks.ts b/src/hooks/canvas/canvasPageHooks.ts index 1ec31fc..289f9ae 100644 --- a/src/hooks/canvas/canvasPageHooks.ts +++ b/src/hooks/canvas/canvasPageHooks.ts @@ -1,4 +1,4 @@ -import { LocalCoursePage } from "@/models/local/page/localCoursePage"; +import { LocalCoursePage } from "@/features/local/pages/localCoursePageModels"; import { canvasPageService } from "@/services/canvas/canvasPageService"; import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query"; import { useLocalCourseSettingsQuery } from "../localCourse/localCoursesHooks"; diff --git a/src/hooks/canvas/canvasQuizHooks.ts b/src/hooks/canvas/canvasQuizHooks.ts index b5efe0f..1a946d4 100644 --- a/src/hooks/canvas/canvasQuizHooks.ts +++ b/src/hooks/canvas/canvasQuizHooks.ts @@ -1,12 +1,12 @@ import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query"; import { useLocalCourseSettingsQuery } from "../localCourse/localCoursesHooks"; import { canvasQuizService } from "@/services/canvas/canvasQuizService"; -import { LocalQuiz } from "@/models/local/quiz/localQuiz"; import { useAddCanvasModuleMutation, useCanvasModulesQuery, } from "./canvasModuleHooks"; import { canvasModuleService } from "@/services/canvas/canvasModuleService"; +import { LocalQuiz } from "@/features/local/quizzes/models/localQuiz"; export const canvasQuizKeys = { quizzes: (canvasCourseId: number) => diff --git a/src/models/local/courseItemTypes.ts b/src/models/local/courseItemTypes.ts index 57adec2..724bd3c 100644 --- a/src/models/local/courseItemTypes.ts +++ b/src/models/local/courseItemTypes.ts @@ -1,14 +1,14 @@ -import { LocalAssignment } from "./assignment/localAssignment"; -import { LocalCoursePage } from "./page/localCoursePage"; -import { LocalQuiz } from "./quiz/localQuiz"; +import { LocalCoursePage } from "@/features/local/pages/localCoursePageModels"; +import { LocalAssignment } from "../../features/local/assignments/models/localAssignment"; +import { LocalQuiz } from "@/features/local/quizzes/models/localQuiz"; export type CourseItemType = "Assignment" | "Quiz" | "Page"; -export type CourseItemReturnType = T extends "Assignment" - ? LocalAssignment - : T extends "Quiz" - ? LocalQuiz - : LocalCoursePage; - +export type CourseItemReturnType = + T extends "Assignment" + ? LocalAssignment + : T extends "Quiz" + ? LocalQuiz + : LocalCoursePage; export const typeToFolder = { Assignment: "assignments", diff --git a/src/models/local/localCourseSettings.ts b/src/models/local/localCourseSettings.ts index 13b900c..7815664 100644 --- a/src/models/local/localCourseSettings.ts +++ b/src/models/local/localCourseSettings.ts @@ -2,11 +2,11 @@ import { z } from "zod"; import { AssignmentSubmissionType, zodAssignmentSubmissionType, -} from "./assignment/assignmentSubmissionType"; +} from "../../features/local/assignments/models/assignmentSubmissionType"; import { LocalAssignmentGroup, zodLocalAssignmentGroup, -} from "./assignment/localAssignmentGroup"; +} from "../../features/local/assignments/models/localAssignmentGroup"; import { parse, stringify } from "yaml"; export interface SimpleTimeOnly { diff --git a/src/models/local/localModules.ts b/src/models/local/localModules.ts index 65c66a4..a0f98b6 100644 --- a/src/models/local/localModules.ts +++ b/src/models/local/localModules.ts @@ -1,8 +1,8 @@ -import { LocalAssignment } from "./assignment/localAssignment"; +import { LocalCoursePage } from "@/features/local/pages/localCoursePageModels"; +import { LocalAssignment } from "../../features/local/assignments/models/localAssignment"; import { IModuleItem } from "./IModuleItem"; -import { LocalCoursePage } from "./page/localCoursePage"; -import { LocalQuiz } from "./quiz/localQuiz"; import { getDateFromString } from "./utils/timeUtils"; +import { LocalQuiz } from "@/features/local/quizzes/models/localQuiz"; export interface LocalModule { name: string; diff --git a/src/models/local/tests/assignmentMarkdown.test.ts b/src/models/local/tests/assignmentMarkdown.test.ts index 97f9834..024441e 100644 --- a/src/models/local/tests/assignmentMarkdown.test.ts +++ b/src/models/local/tests/assignmentMarkdown.test.ts @@ -1,8 +1,8 @@ import { describe, it, expect } from "vitest"; -import { LocalAssignment } from "../assignment/localAssignment"; -import { AssignmentSubmissionType } from "../assignment/assignmentSubmissionType"; -import { assignmentMarkdownSerializer } from "../assignment/utils/assignmentMarkdownSerializer"; -import { assignmentMarkdownParser } from "../assignment/utils/assignmentMarkdownParser"; +import { LocalAssignment } from "../../../features/local/assignments/models/localAssignment"; +import { AssignmentSubmissionType } from "../../../features/local/assignments/models/assignmentSubmissionType"; +import { assignmentMarkdownSerializer } from "../../../features/local/assignments/models/utils/assignmentMarkdownSerializer"; +import { assignmentMarkdownParser } from "../../../features/local/assignments/models/utils/assignmentMarkdownParser"; describe("AssignmentMarkdownTests", () => { it("can parse assignment settings", () => { diff --git a/src/models/local/tests/quizMarkdown/matchingAnswerErrors.test.ts b/src/models/local/tests/quizMarkdown/matchingAnswerErrors.test.ts index 9c9c74f..02aa0de 100644 --- a/src/models/local/tests/quizMarkdown/matchingAnswerErrors.test.ts +++ b/src/models/local/tests/quizMarkdown/matchingAnswerErrors.test.ts @@ -1,5 +1,5 @@ import { describe, it, expect } from "vitest"; -import { quizMarkdownUtils } from "@/models/local/quiz/utils/quizMarkdownUtils"; +import { quizMarkdownUtils } from "@/models/local/models/utils/quizMarkdownUtils"; describe("Matching Answer Error Messages", () => { it("can parse matching question", () => { diff --git a/src/models/local/tests/quizMarkdown/matchingAnswers.test.ts b/src/models/local/tests/quizMarkdown/matchingAnswers.test.ts index 743347e..0e6a253 100644 --- a/src/models/local/tests/quizMarkdown/matchingAnswers.test.ts +++ b/src/models/local/tests/quizMarkdown/matchingAnswers.test.ts @@ -1,11 +1,11 @@ import { describe, it, expect } from "vitest"; -import { QuestionType } from "../../quiz/localQuizQuestion"; -import { quizMarkdownUtils } from "@/models/local/quiz/utils/quizMarkdownUtils"; -import { quizQuestionMarkdownUtils } from "@/models/local/quiz/utils/quizQuestionMarkdownUtils"; +import { QuestionType } from "../../models/localQuizQuestion"; +import { quizMarkdownUtils } from "@/models/local/models/utils/quizMarkdownUtils"; +import { quizQuestionMarkdownUtils } from "@/models/local/models/utils/quizQuestionMarkdownUtils"; describe("MatchingTests", () => { it("can parse matching question", () => { - const name = "Test Quiz" + const name = "Test Quiz"; const rawMarkdownQuiz = ` ShuffleAnswers: true OneQuestionAtATime: false @@ -33,7 +33,7 @@ Match the following terms & definitions }); it("can create markdown for matching question", () => { - const name = "Test Quiz" + const name = "Test Quiz"; const rawMarkdownQuiz = ` ShuffleAnswers: true OneQuestionAtATime: false @@ -65,7 +65,7 @@ Match the following terms & definitions }); it("whitespace is optional", () => { - const name = "Test Quiz" + const name = "Test Quiz"; const rawMarkdownQuiz = ` ShuffleAnswers: true OneQuestionAtATime: false @@ -85,7 +85,7 @@ Match the following terms & definitions }); it("can have distractors", () => { - const name = "Test Quiz" + const name = "Test Quiz"; const rawMarkdownQuiz = ` ShuffleAnswers: true OneQuestionAtATime: false @@ -108,7 +108,7 @@ Match the following terms & definitions }); it("can have distractors and be persisted", () => { - const name = "Test Quiz" + const name = "Test Quiz"; const rawMarkdownQuiz = ` ShuffleAnswers: true OneQuestionAtATime: false @@ -132,7 +132,7 @@ Match the following terms & definitions ); }); it("can escape - characters", () => { - const name = "Test Quiz" + const name = "Test Quiz"; const rawMarkdownQuiz = ` ShuffleAnswers: true OneQuestionAtATime: false @@ -149,18 +149,17 @@ Match the following terms & definitions const quiz = quizMarkdownUtils.parseMarkdown(rawMarkdownQuiz, name); - const firstQuestion = quiz.questions[0]; expect(firstQuestion.answers[0].text).toBe("git add --all"); - expect(firstQuestion.answers[0].matchedText).toBe("start tracking all files in the current directory and subdirectories"); - - + expect(firstQuestion.answers[0].matchedText).toBe( + "start tracking all files in the current directory and subdirectories" + ); const quizMarkdown = quizMarkdownUtils.toMarkdown(quiz); expect(quizMarkdown).toContain( - "^ git add \-\-all - start tracking all files in the current directory and subdirectories" + "^ git add --all - start tracking all files in the current directory and subdirectories" ); }); }); diff --git a/src/models/local/tests/quizMarkdown/multipleAnswers.test.ts b/src/models/local/tests/quizMarkdown/multipleAnswers.test.ts index f8e40fc..d7334ed 100644 --- a/src/models/local/tests/quizMarkdown/multipleAnswers.test.ts +++ b/src/models/local/tests/quizMarkdown/multipleAnswers.test.ts @@ -1,8 +1,8 @@ import { describe, it, expect } from "vitest"; -import { LocalQuiz } from "../../quiz/localQuiz"; -import { QuestionType } from "../../quiz/localQuizQuestion"; -import { quizMarkdownUtils } from "@/models/local/quiz/utils/quizMarkdownUtils"; -import { quizQuestionMarkdownUtils } from "@/models/local/quiz/utils/quizQuestionMarkdownUtils"; +import { LocalQuiz } from "../../models/localQuiz"; +import { QuestionType } from "../../models/localQuizQuestion"; +import { quizMarkdownUtils } from "@/models/local/models/utils/quizMarkdownUtils"; +import { quizQuestionMarkdownUtils } from "@/models/local/models/utils/quizQuestionMarkdownUtils"; describe("MultipleAnswersTests", () => { it("quiz markdown includes multiple answer question", () => { @@ -41,7 +41,7 @@ oneline question }); it("can parse question with multiple answers", () => { - const name = "Test Quiz" + const name = "Test Quiz"; const rawMarkdownQuiz = ` ShuffleAnswers: true OneQuestionAtATime: false @@ -79,7 +79,7 @@ Which events are triggered when the user clicks on an input field? }); it("can parse question with multiple answers without a space in false answers", () => { - const name = "Test Quiz" + const name = "Test Quiz"; const rawMarkdownQuiz = ` ShuffleAnswers: true OneQuestionAtATime: false @@ -102,10 +102,10 @@ Which events are triggered when the user clicks on an input field? expect(firstQuestion.answers.length).toBe(2); expect(firstQuestion.answers[0].correct).toBe(true); expect(firstQuestion.answers[1].correct).toBe(false); - }); - + }); + it("can parse question with multiple answers without a space in false answers other example", () => { - const name = "Test Quiz" + const name = "Test Quiz"; const rawMarkdownQuiz = ` ShuffleAnswers: true OneQuestionAtATime: false diff --git a/src/models/local/tests/quizMarkdown/multipleChoice.test.ts b/src/models/local/tests/quizMarkdown/multipleChoice.test.ts index 83b7bb9..2aa5315 100644 --- a/src/models/local/tests/quizMarkdown/multipleChoice.test.ts +++ b/src/models/local/tests/quizMarkdown/multipleChoice.test.ts @@ -1,8 +1,8 @@ import { describe, it, expect } from "vitest"; -import { LocalQuiz } from "../../quiz/localQuiz"; -import { QuestionType } from "../../quiz/localQuizQuestion"; -import { quizMarkdownUtils } from "@/models/local/quiz/utils/quizMarkdownUtils"; -import { quizQuestionMarkdownUtils } from "@/models/local/quiz/utils/quizQuestionMarkdownUtils"; +import { LocalQuiz } from "../../models/localQuiz"; +import { QuestionType } from "../../models/localQuizQuestion"; +import { quizMarkdownUtils } from "@/models/local/models/utils/quizMarkdownUtils"; +import { quizQuestionMarkdownUtils } from "@/models/local/models/utils/quizQuestionMarkdownUtils"; describe("MultipleChoiceTests", () => { it("quiz markdown includes multiple choice question", () => { diff --git a/src/models/local/tests/quizMarkdown/quizDeterministicChecks.test.ts b/src/models/local/tests/quizMarkdown/quizDeterministicChecks.test.ts index e81a0e0..538859b 100644 --- a/src/models/local/tests/quizMarkdown/quizDeterministicChecks.test.ts +++ b/src/models/local/tests/quizMarkdown/quizDeterministicChecks.test.ts @@ -1,7 +1,7 @@ import { describe, it, expect } from "vitest"; -import { LocalQuiz } from "../../quiz/localQuiz"; -import { quizMarkdownUtils } from "../../quiz/utils/quizMarkdownUtils"; -import { QuestionType } from "@/models/local/quiz/localQuizQuestion"; +import { LocalQuiz } from "../../models/localQuiz"; +import { quizMarkdownUtils } from "../../models/utils/quizMarkdownUtils"; +import { QuestionType } from "@/models/local/models/localQuizQuestion"; // Test suite for deterministic checks on LocalQuiz describe("QuizDeterministicChecks", () => { diff --git a/src/models/local/tests/quizMarkdown/quizMarkdown.test.ts b/src/models/local/tests/quizMarkdown/quizMarkdown.test.ts index 7992877..66832b6 100644 --- a/src/models/local/tests/quizMarkdown/quizMarkdown.test.ts +++ b/src/models/local/tests/quizMarkdown/quizMarkdown.test.ts @@ -1,8 +1,8 @@ import { describe, it, expect } from "vitest"; -import { LocalQuiz } from "../../quiz/localQuiz"; -import { quizMarkdownUtils } from "../../quiz/utils/quizMarkdownUtils"; -import { QuestionType } from "@/models/local/quiz/localQuizQuestion"; -import { quizQuestionMarkdownUtils } from "@/models/local/quiz/utils/quizQuestionMarkdownUtils"; +import { LocalQuiz } from "../../models/localQuiz"; +import { quizMarkdownUtils } from "../../models/utils/quizMarkdownUtils"; +import { QuestionType } from "@/models/local/models/localQuizQuestion"; +import { quizQuestionMarkdownUtils } from "@/models/local/models/utils/quizQuestionMarkdownUtils"; import { markdownToHtmlNoImages } from "@/services/htmlMarkdownUtils"; // Test suite for QuizMarkdown @@ -281,5 +281,4 @@ b) false expect(quizHtml).toContain("x"); expect(quizHtml).not.toContain("x_2"); }); - }); diff --git a/src/models/local/tests/quizMarkdown/testAnswer.test.ts b/src/models/local/tests/quizMarkdown/testAnswer.test.ts index 591a6a9..1831eb4 100644 --- a/src/models/local/tests/quizMarkdown/testAnswer.test.ts +++ b/src/models/local/tests/quizMarkdown/testAnswer.test.ts @@ -1,12 +1,15 @@ -import { getAnswers, getQuestionType } from "@/services/canvas/canvasQuizService"; -import { QuestionType, zodQuestionType } from "../../quiz/localQuizQuestion"; -import { quizMarkdownUtils } from "../../quiz/utils/quizMarkdownUtils"; -import { quizQuestionMarkdownUtils } from "../../quiz/utils/quizQuestionMarkdownUtils"; +import { + getAnswers, + getQuestionType, +} from "@/services/canvas/canvasQuizService"; +import { QuestionType, zodQuestionType } from "../../models/localQuizQuestion"; +import { quizMarkdownUtils } from "../../models/utils/quizMarkdownUtils"; +import { quizQuestionMarkdownUtils } from "../../models/utils/quizQuestionMarkdownUtils"; import { describe, it, expect } from "vitest"; describe("TextAnswerTests", () => { it("can parse essay", () => { - const name = "Test Quiz" + const name = "Test Quiz"; const rawMarkdownQuiz = ` ShuffleAnswers: true OneQuestionAtATime: false @@ -31,7 +34,7 @@ essay }); it("can parse short answer", () => { - const name = "Test Quiz" + const name = "Test Quiz"; const rawMarkdownQuiz = ` ShuffleAnswers: true OneQuestionAtATime: false @@ -56,8 +59,7 @@ short answer }); it("short answer to markdown is correct", () => { - - const name = "Test Quiz" + const name = "Test Quiz"; const rawMarkdownQuiz = ` ShuffleAnswers: true OneQuestionAtATime: false @@ -85,8 +87,7 @@ short_answer`; }); it("short_answer= to markdown is correct", () => { - - const name = "Test Quiz" + const name = "Test Quiz"; const rawMarkdownQuiz = ` ShuffleAnswers: true OneQuestionAtATime: false @@ -118,7 +119,7 @@ short_answer=`; }); it("essay question to markdown is correct", () => { - const name = "Test Quiz" + const name = "Test Quiz"; const rawMarkdownQuiz = ` ShuffleAnswers: true OneQuestionAtATime: false @@ -146,7 +147,7 @@ essay`; }); it("Can parse short answer with auto graded answers", () => { - const name = "Test Quiz" + const name = "Test Quiz"; const rawMarkdownQuiz = ` ShuffleAnswers: true OneQuestionAtATime: false @@ -166,14 +167,16 @@ short_answer= const quiz = quizMarkdownUtils.parseMarkdown(rawMarkdownQuiz, name); const firstQuestion = quiz.questions[0]; - expect(firstQuestion.questionType).toBe(QuestionType.SHORT_ANSWER_WITH_ANSWERS) + expect(firstQuestion.questionType).toBe( + QuestionType.SHORT_ANSWER_WITH_ANSWERS + ); expect(firstQuestion.answers.length).toBe(2); expect(firstQuestion.answers[0].text).toBe("test"); expect(firstQuestion.answers[1].text).toBe("other"); }); it("Can parse short answer with auto graded answers", () => { - const name = "Test Quiz" + const name = "Test Quiz"; const rawMarkdownQuiz = ` ShuffleAnswers: true OneQuestionAtATime: false @@ -193,18 +196,22 @@ short_answer= const quiz = quizMarkdownUtils.parseMarkdown(rawMarkdownQuiz, name); const firstQuestion = quiz.questions[0]; - expect(firstQuestion.questionType).toBe(QuestionType.SHORT_ANSWER_WITH_ANSWERS) + expect(firstQuestion.questionType).toBe( + QuestionType.SHORT_ANSWER_WITH_ANSWERS + ); expect(firstQuestion.answers.length).toBe(2); expect(firstQuestion.answers[0].text).toBe("test"); expect(firstQuestion.answers[1].text).toBe("other"); }); it("Has short_answer= type at the same position in types and zod types", () => { - expect(Object.values(zodQuestionType.Enum)).toEqual(Object.values(QuestionType)); + expect(Object.values(zodQuestionType.Enum)).toEqual( + Object.values(QuestionType) + ); }); it("Associates short_answer= questions with short_answer_question canvas question type", () => { - const name = "Test Quiz" + const name = "Test Quiz"; const rawMarkdownQuiz = ` ShuffleAnswers: true OneQuestionAtATime: false @@ -228,7 +235,7 @@ short_answer= }); it("Includes answer_text in answers sent to canvas", () => { - const name = "Test Quiz" + const name = "Test Quiz"; const rawMarkdownQuiz = ` ShuffleAnswers: true OneQuestionAtATime: false @@ -246,27 +253,26 @@ Which events are triggered when the user clicks on an input field? short_answer= `; - const quiz = quizMarkdownUtils.parseMarkdown(rawMarkdownQuiz, name); - const firstQuestion = quiz.questions[0]; - const answers = getAnswers(firstQuestion, { - name: "", - assignmentGroups: [], - daysOfWeek: [], - canvasId: 0, - startDate: "", - endDate: "", - defaultDueTime: { - hour: 0, - minute: 0 - }, - defaultAssignmentSubmissionTypes: [], - defaultFileUploadTypes: [], - holidays: [], - assets: [] - }) - expect(answers).toHaveLength(2); - const firstAnswer = answers[0]; - expect(firstAnswer).toHaveProperty("answer_text"); + const quiz = quizMarkdownUtils.parseMarkdown(rawMarkdownQuiz, name); + const firstQuestion = quiz.questions[0]; + const answers = getAnswers(firstQuestion, { + name: "", + assignmentGroups: [], + daysOfWeek: [], + canvasId: 0, + startDate: "", + endDate: "", + defaultDueTime: { + hour: 0, + minute: 0, + }, + defaultAssignmentSubmissionTypes: [], + defaultFileUploadTypes: [], + holidays: [], + assets: [], + }); + expect(answers).toHaveLength(2); + const firstAnswer = answers[0]; + expect(firstAnswer).toHaveProperty("answer_text"); }); - }); diff --git a/src/models/local/tests/rubricMarkdown.test.ts b/src/models/local/tests/rubricMarkdown.test.ts index 5e6e2f5..124778f 100644 --- a/src/models/local/tests/rubricMarkdown.test.ts +++ b/src/models/local/tests/rubricMarkdown.test.ts @@ -1,6 +1,9 @@ import { describe, it, expect } from "vitest"; -import { RubricItem, rubricItemIsExtraCredit } from "../assignment/rubricItem"; -import { assignmentMarkdownParser } from "../assignment/utils/assignmentMarkdownParser"; +import { + RubricItem, + rubricItemIsExtraCredit, +} from "../../../features/local/assignments/models/rubricItem"; +import { assignmentMarkdownParser } from "../../../features/local/assignments/models/utils/assignmentMarkdownParser"; describe("RubricMarkdownTests", () => { it("can parse one item", () => { diff --git a/src/models/local/tests/testSemesterImport.test.ts b/src/models/local/tests/testSemesterImport.test.ts index 0dbec8d..076ab4a 100644 --- a/src/models/local/tests/testSemesterImport.test.ts +++ b/src/models/local/tests/testSemesterImport.test.ts @@ -1,12 +1,12 @@ import { describe, it, expect } from "vitest"; -import { LocalAssignment } from "../assignment/localAssignment"; +import { LocalAssignment } from "../../../features/local/assignments/models/localAssignment"; import { prepAssignmentForNewSemester, prepLectureForNewSemester, prepPageForNewSemester, prepQuizForNewSemester, } from "../utils/semesterTransferUtils"; -import { LocalQuiz } from "../quiz/localQuiz"; +import { LocalQuiz } from "../models/localQuiz"; import { LocalCoursePage } from "../page/localCoursePage"; import { Lecture } from "../lecture"; diff --git a/src/models/local/utils/semesterTransferUtils.ts b/src/models/local/utils/semesterTransferUtils.ts index 5634e2f..f768290 100644 --- a/src/models/local/utils/semesterTransferUtils.ts +++ b/src/models/local/utils/semesterTransferUtils.ts @@ -1,12 +1,8 @@ - -import { LocalAssignment } from "../assignment/localAssignment"; +import { LocalCoursePage } from "@/features/local/pages/localCoursePageModels"; +import { LocalAssignment } from "../../../features/local/assignments/models/localAssignment"; import { Lecture } from "../lecture"; -import { LocalCoursePage } from "../page/localCoursePage"; -import { LocalQuiz } from "../quiz/localQuiz"; -import { - dateToMarkdownString, - getDateFromStringOrThrow, -} from "./timeUtils"; +import { dateToMarkdownString, getDateFromStringOrThrow } from "./timeUtils"; +import { LocalQuiz } from "@/features/local/quizzes/models/localQuiz"; export const prepAssignmentForNewSemester = ( assignment: LocalAssignment, diff --git a/src/services/canvas/canvasAssignmentGroupService.ts b/src/services/canvas/canvasAssignmentGroupService.ts index fddf41f..1d4bfce 100644 --- a/src/services/canvas/canvasAssignmentGroupService.ts +++ b/src/services/canvas/canvasAssignmentGroupService.ts @@ -1,16 +1,14 @@ import { canvasApi, paginatedRequest } from "./canvasServiceUtils"; import { axiosClient } from "../axiosUtils"; import { CanvasAssignmentGroup } from "@/models/canvas/assignments/canvasAssignmentGroup"; -import { LocalAssignmentGroup } from "@/models/local/assignment/localAssignmentGroup"; +import { LocalAssignmentGroup } from "@/features/local/assignments/models/localAssignmentGroup"; import { rateLimitAwareDelete } from "./canvasWebRequestor"; export const canvasAssignmentGroupService = { async getAll(courseId: number): Promise { console.log("Requesting assignment groups"); const url = `${canvasApi}/courses/${courseId}/assignment_groups`; - const assignmentGroups = await paginatedRequest< - CanvasAssignmentGroup[] - >({ + const assignmentGroups = await paginatedRequest({ url, }); return assignmentGroups.flatMap((groupList) => groupList); @@ -40,7 +38,9 @@ export const canvasAssignmentGroupService = { canvasCourseId: number, localAssignmentGroup: LocalAssignmentGroup ): Promise { - console.log(`Updating assignment group: ${localAssignmentGroup.name}, ${localAssignmentGroup.canvasId}`); + console.log( + `Updating assignment group: ${localAssignmentGroup.name}, ${localAssignmentGroup.canvasId}` + ); if (!localAssignmentGroup.canvasId) { throw new Error("Cannot update assignment group if canvas ID is null"); } diff --git a/src/services/canvas/canvasAssignmentService.ts b/src/services/canvas/canvasAssignmentService.ts index 82fd388..50900ff 100644 --- a/src/services/canvas/canvasAssignmentService.ts +++ b/src/services/canvas/canvasAssignmentService.ts @@ -1,10 +1,10 @@ import { CanvasAssignment } from "@/models/canvas/assignments/canvasAssignment"; import { canvasApi, paginatedRequest } from "./canvasServiceUtils"; -import { LocalAssignment } from "@/models/local/assignment/localAssignment"; +import { LocalAssignment } from "@/features/local/assignments/models/localAssignment"; import { axiosClient } from "../axiosUtils"; import { markdownToHTMLSafe } from "../htmlMarkdownUtils"; import { CanvasRubricCreationResponse } from "@/models/canvas/assignments/canvasRubricCreationResponse"; -import { assignmentPoints } from "@/models/local/assignment/utils/assignmentPointsUtils"; +import { assignmentPoints } from "@/features/local/assignments/models/utils/assignmentPointsUtils"; import { getDateFromString } from "@/models/local/utils/timeUtils"; import { getRubricCriterion } from "./canvasRubricUtils"; import { LocalCourseSettings } from "@/models/local/localCourseSettings"; diff --git a/src/services/canvas/canvasPageService.ts b/src/services/canvas/canvasPageService.ts index 3483667..19b8972 100644 --- a/src/services/canvas/canvasPageService.ts +++ b/src/services/canvas/canvasPageService.ts @@ -1,5 +1,5 @@ import { CanvasPage } from "@/models/canvas/pages/canvasPageModel"; -import { LocalCoursePage } from "@/models/local/page/localCoursePage"; +import { LocalCoursePage } from "@/features/local/pages/localCoursePageModels"; import { canvasApi, paginatedRequest } from "./canvasServiceUtils"; import { markdownToHTMLSafe } from "../htmlMarkdownUtils"; import { axiosClient } from "../axiosUtils"; @@ -10,21 +10,21 @@ export const canvasPageService = { async getAll(courseId: number): Promise { console.log("requesting pages"); try { - const url = `${canvasApi}/courses/${courseId}/pages`; - const pages = await paginatedRequest({ - url, - }); - return pages.flatMap((pageList) => pageList); - // eslint-disable-next-line @typescript-eslint/no-explicit-any - } catch (error: any) { - if (error?.response?.status === 403) { - console.log( - "Canvas API error: 403 Forbidden for pages. Returning empty array." - ); - return []; + const url = `${canvasApi}/courses/${courseId}/pages`; + const pages = await paginatedRequest({ + url, + }); + return pages.flatMap((pageList) => pageList); + // eslint-disable-next-line @typescript-eslint/no-explicit-any + } catch (error: any) { + if (error?.response?.status === 403) { + console.log( + "Canvas API error: 403 Forbidden for pages. Returning empty array." + ); + return []; + } + throw error; } - throw error; - } }, async create( diff --git a/src/services/canvas/canvasQuizService.ts b/src/services/canvas/canvasQuizService.ts index a8b7f3bf..8f33e81 100644 --- a/src/services/canvas/canvasQuizService.ts +++ b/src/services/canvas/canvasQuizService.ts @@ -1,17 +1,14 @@ import { CanvasQuiz } from "@/models/canvas/quizzes/canvasQuizModel"; import { axiosClient } from "../axiosUtils"; import { canvasApi, paginatedRequest } from "./canvasServiceUtils"; -import { LocalQuiz } from "@/models/local/quiz/localQuiz"; import { markdownToHTMLSafe } from "../htmlMarkdownUtils"; import { getDateFromStringOrThrow } from "@/models/local/utils/timeUtils"; import { canvasAssignmentService } from "./canvasAssignmentService"; -import { - LocalQuizQuestion, - QuestionType, -} from "@/models/local/quiz/localQuizQuestion"; import { CanvasQuizQuestion } from "@/models/canvas/quizzes/canvasQuizQuestionModel"; import { LocalCourseSettings } from "@/models/local/localCourseSettings"; import { escapeMatchingText } from "../utils/questionHtmlUtils"; +import { LocalQuiz } from "@/features/local/quizzes/models/localQuiz"; +import { LocalQuizQuestion, QuestionType } from "@/features/local/quizzes/models/localQuizQuestion"; export const getAnswers = ( question: LocalQuizQuestion, diff --git a/src/services/canvas/canvasRubricUtils.ts b/src/services/canvas/canvasRubricUtils.ts index b4a4cc8..76f644b 100644 --- a/src/services/canvas/canvasRubricUtils.ts +++ b/src/services/canvas/canvasRubricUtils.ts @@ -1,22 +1,21 @@ -import { RubricItem } from "@/models/local/assignment/rubricItem"; +import { RubricItem } from "@/features/local/assignments/models/rubricItem"; export const getRubricCriterion = (rubric: RubricItem[]) => { const criterion = rubric - .map((rubricItem) => ({ - description: rubricItem.label, - points: rubricItem.points, - ratings: { - 0: { description: "Full Marks", points: rubricItem.points }, - 1: { description: "No Marks", points: 0 }, - }, - })) - .reduce((acc, item, index) => { - return { - ...acc, - [index]: item, - }; - }, {} as { [key: number]: { description: string; points: number; ratings: { [key: number]: { description: string; points: number } } } }); + .map((rubricItem) => ({ + description: rubricItem.label, + points: rubricItem.points, + ratings: { + 0: { description: "Full Marks", points: rubricItem.points }, + 1: { description: "No Marks", points: 0 }, + }, + })) + .reduce((acc, item, index) => { + return { + ...acc, + [index]: item, + }; + }, {} as { [key: number]: { description: string; points: number; ratings: { [key: number]: { description: string; points: number } } } }); - return criterion - -} \ No newline at end of file + return criterion; +}; diff --git a/src/services/canvas/rubric.test.ts b/src/services/canvas/rubric.test.ts index 616518b..adb9905 100644 --- a/src/services/canvas/rubric.test.ts +++ b/src/services/canvas/rubric.test.ts @@ -1,21 +1,21 @@ -import { RubricItem } from "@/models/local/assignment/rubricItem"; +import { RubricItem } from "@/features/local/assignments/models/rubricItem"; import { describe, expect, it } from "vitest"; import { getRubricCriterion } from "./canvasRubricUtils"; -import { assignmentPoints } from "@/models/local/assignment/utils/assignmentPointsUtils"; +import { assignmentPoints } from "@/features/local/assignments/models/utils/assignmentPointsUtils"; -describe("can prepare rubric for canvas", () =>{ - it("can parse normal rubric into criterion", () =>{ +describe("can prepare rubric for canvas", () => { + it("can parse normal rubric into criterion", () => { const rubric: RubricItem[] = [ { label: "first", - points: 1 + points: 1, }, { label: "second", - points: 2 + points: 2, }, - ] - const criterion = getRubricCriterion(rubric) + ]; + const criterion = getRubricCriterion(rubric); expect(criterion).toStrictEqual({ 0: { @@ -24,7 +24,7 @@ describe("can prepare rubric for canvas", () =>{ ratings: { 0: { description: "Full Marks", points: 1 }, 1: { description: "No Marks", points: 0 }, - } + }, }, 1: { description: "second", @@ -32,24 +32,23 @@ describe("can prepare rubric for canvas", () =>{ ratings: { 0: { description: "Full Marks", points: 2 }, 1: { description: "No Marks", points: 0 }, - } - } - }) - }) + }, + }, + }); + }); - - it("can parse negative rubric into criterion", () =>{ + it("can parse negative rubric into criterion", () => { const rubric: RubricItem[] = [ { label: "first", - points: 1 + points: 1, }, { label: "second", - points: -2 + points: -2, }, - ] - const criterion = getRubricCriterion(rubric) + ]; + const criterion = getRubricCriterion(rubric); expect(criterion).toStrictEqual({ 0: { @@ -58,7 +57,7 @@ describe("can prepare rubric for canvas", () =>{ ratings: { 0: { description: "Full Marks", points: 1 }, 1: { description: "No Marks", points: 0 }, - } + }, }, 1: { description: "second", @@ -66,28 +65,27 @@ describe("can prepare rubric for canvas", () =>{ ratings: { 0: { description: "Full Marks", points: -2 }, 1: { description: "No Marks", points: 0 }, - } - } - }) - }) + }, + }, + }); + }); - - it("negative rubric items do not contribute to the total", () =>{ + it("negative rubric items do not contribute to the total", () => { const rubric: RubricItem[] = [ { label: "first", - points: 1 + points: 1, }, { label: "second", - points: -2 + points: -2, }, { label: "second", - points: 3 + points: 3, }, - ] - const points = assignmentPoints(rubric) - expect(points).toBe(4) - }) -}) \ No newline at end of file + ]; + const points = assignmentPoints(rubric); + expect(points).toBe(4); + }); +}); diff --git a/src/services/fileStorage/assignmentsFileStorageService.ts b/src/services/fileStorage/assignmentsFileStorageService.ts index 7ab6830..b11b1c3 100644 --- a/src/services/fileStorage/assignmentsFileStorageService.ts +++ b/src/services/fileStorage/assignmentsFileStorageService.ts @@ -1,8 +1,8 @@ import { localAssignmentMarkdown, LocalAssignment, -} from "@/models/local/assignment/localAssignment"; -import { assignmentMarkdownSerializer } from "@/models/local/assignment/utils/assignmentMarkdownSerializer"; +} from "@/features/local/assignments/models/localAssignment"; +import { assignmentMarkdownSerializer } from "@/features/local/assignments/models/utils/assignmentMarkdownSerializer"; import path from "path"; import { directoryOrFileExists } from "./utils/fileSystemUtils"; import { promises as fs } from "fs"; diff --git a/src/services/fileStorage/courseItemFileStorageService.ts b/src/services/fileStorage/courseItemFileStorageService.ts index 7899be4..3d6f1d2 100644 --- a/src/services/fileStorage/courseItemFileStorageService.ts +++ b/src/services/fileStorage/courseItemFileStorageService.ts @@ -4,23 +4,20 @@ import fs from "fs/promises"; import { LocalAssignment, localAssignmentMarkdown, -} from "@/models/local/assignment/localAssignment"; -import { - LocalQuiz, - localQuizMarkdownUtils, -} from "@/models/local/quiz/localQuiz"; -import { - LocalCoursePage, - localPageMarkdownUtils, -} from "@/models/local/page/localCoursePage"; -import { assignmentMarkdownSerializer } from "@/models/local/assignment/utils/assignmentMarkdownSerializer"; -import { quizMarkdownUtils } from "@/models/local/quiz/utils/quizMarkdownUtils"; +} from "@/features/local/assignments/models/localAssignment"; +import { assignmentMarkdownSerializer } from "@/features/local/assignments/models/utils/assignmentMarkdownSerializer"; import { CourseItemReturnType, CourseItemType, typeToFolder, } from "@/models/local/courseItemTypes"; import { getCoursePathByName } from "./globalSettingsFileStorageService"; +import { + localPageMarkdownUtils, + LocalCoursePage, +} from "@/features/local/pages/localCoursePageModels"; +import { LocalQuiz, localQuizMarkdownUtils } from "@/features/local/quizzes/models/localQuiz"; +import { quizMarkdownUtils } from "@/features/local/quizzes/models/utils/quizMarkdownUtils"; const getItemFileNames = async ( courseName: string, diff --git a/src/services/fileStorage/fileStorageService.ts b/src/services/fileStorage/fileStorageService.ts index 6bf28c9..b347856 100644 --- a/src/services/fileStorage/fileStorageService.ts +++ b/src/services/fileStorage/fileStorageService.ts @@ -3,7 +3,7 @@ import path from "path"; import { basePath, directoryOrFileExists } from "./utils/fileSystemUtils"; import { assignmentsFileStorageService } from "./assignmentsFileStorageService"; import { quizFileStorageService } from "./quizFileStorageService"; -import { pageFileStorageService } from "./pageFileStorageService"; +import { pageFileStorageService } from "../../features/local/pages/pageFileStorageService"; import { moduleFileStorageService } from "./moduleFileStorageService"; import { settingsFileStorageService } from "./settingsFileStorageService"; import { getCoursePathByName } from "./globalSettingsFileStorageService"; diff --git a/src/services/fileStorage/globalSettingsFileStorageService.ts b/src/services/fileStorage/globalSettingsFileStorageService.ts index 05d5237..4680ae9 100644 --- a/src/services/fileStorage/globalSettingsFileStorageService.ts +++ b/src/services/fileStorage/globalSettingsFileStorageService.ts @@ -46,11 +46,4 @@ export const updateGlobalSettings = async (globalSettings: GlobalSettings) => { zodGlobalSettings.parse(globalSettings) ); await fs.writeFile(SETTINGS_FILE_PATH, globalSettingsString, "utf-8"); - - // await Promise.all( - // globalSettings.courses.map(async (course) => { - // const coursePath = await getCoursePathByName(course.name); - // await fs.mkdir(coursePath, { recursive: true }); - // }) - // ); }; diff --git a/src/services/fileStorage/quizFileStorageService.ts b/src/services/fileStorage/quizFileStorageService.ts index 585d12c..7a26e92 100644 --- a/src/services/fileStorage/quizFileStorageService.ts +++ b/src/services/fileStorage/quizFileStorageService.ts @@ -1,9 +1,9 @@ -import { LocalQuiz } from "@/models/local/quiz/localQuiz"; -import { quizMarkdownUtils } from "@/models/local/quiz/utils/quizMarkdownUtils"; import path from "path"; import { promises as fs } from "fs"; import { courseItemFileStorageService } from "./courseItemFileStorageService"; import { getCoursePathByName } from "./globalSettingsFileStorageService"; +import { LocalQuiz } from "@/features/local/quizzes/models/localQuiz"; +import { quizMarkdownUtils } from "@/features/local/quizzes/models/utils/quizMarkdownUtils"; export const quizFileStorageService = { getQuiz: async (courseName: string, moduleName: string, quizName: string) => diff --git a/src/services/fileStorage/settingsFileStorageService.ts b/src/services/fileStorage/settingsFileStorageService.ts index 7e81cdf..2e50412 100644 --- a/src/services/fileStorage/settingsFileStorageService.ts +++ b/src/services/fileStorage/settingsFileStorageService.ts @@ -5,7 +5,7 @@ import { import { promises as fs } from "fs"; import path from "path"; import { basePath, directoryOrFileExists } from "./utils/fileSystemUtils"; -import { AssignmentSubmissionType } from "@/models/local/assignment/assignmentSubmissionType"; +import { AssignmentSubmissionType } from "@/features/local/assignments/models/assignmentSubmissionType"; import { getCoursePathByName, getGlobalSettings, diff --git a/src/services/fileStorage/utils/lectureUtils.ts b/src/services/fileStorage/utils/lectureUtils.ts index ca72996..ee81984 100644 --- a/src/services/fileStorage/utils/lectureUtils.ts +++ b/src/services/fileStorage/utils/lectureUtils.ts @@ -1,5 +1,5 @@ import { getWeekNumber } from "@/app/course/[courseName]/calendar/calendarMonthUtils"; -import { extractLabelValue } from "@/models/local/assignment/utils/markdownUtils"; +import { extractLabelValue } from "@/features/local/assignments/models/utils/markdownUtils"; import { Lecture } from "@/models/local/lecture"; import { getDateFromStringOrThrow } from "@/models/local/utils/timeUtils"; diff --git a/src/services/serverFunctions/router/app.ts b/src/services/serverFunctions/router/app.ts index 0df3237..81dcaf1 100644 --- a/src/services/serverFunctions/router/app.ts +++ b/src/services/serverFunctions/router/app.ts @@ -1,12 +1,12 @@ import { createTrpcContext } from "../context"; import { createCallerFactory, router } from "../trpcSetup"; -import { assignmentRouter } from "./assignmentRouter"; +import { assignmentRouter } from "../../../features/local/assignments/assignmentRouter"; import { canvasFileRouter } from "./canvasFileRouter"; import { directoriesRouter } from "./directoriesRouter"; import { globalSettingsRouter } from "./globalSettingsRouter"; import { lectureRouter } from "./lectureRouter"; import { moduleRouter } from "./moduleRouter"; -import { pageRouter } from "./pageRouter"; +import { pageRouter } from "../../../features/local/pages/pageRouter"; import { quizRouter } from "./quizRouter"; import { settingsRouter } from "./settingsRouter"; diff --git a/src/services/serverFunctions/router/quizRouter.ts b/src/services/serverFunctions/router/quizRouter.ts index 0f7800c..47d96c1 100644 --- a/src/services/serverFunctions/router/quizRouter.ts +++ b/src/services/serverFunctions/router/quizRouter.ts @@ -2,7 +2,7 @@ import publicProcedure from "../procedures/public"; import { z } from "zod"; import { router } from "../trpcSetup"; import { fileStorageService } from "@/services/fileStorage/fileStorageService"; -import { zodLocalQuiz } from "@/models/local/quiz/localQuiz"; +import { zodLocalQuiz } from "@/features/local/quizzes/models/localQuiz"; export const quizRouter = router({ getQuiz: publicProcedure