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