refactoring files to be located by feature

This commit is contained in:
2025-07-23 09:23:44 -06:00
parent 46e0c36916
commit c95c40f9e7
75 changed files with 279 additions and 303 deletions

View File

@@ -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<CanvasAssignmentGroup[]> {
console.log("Requesting assignment groups");
const url = `${canvasApi}/courses/${courseId}/assignment_groups`;
const assignmentGroups = await paginatedRequest<
CanvasAssignmentGroup[]
>({
const assignmentGroups = await paginatedRequest<CanvasAssignmentGroup[]>({
url,
});
return assignmentGroups.flatMap((groupList) => groupList);
@@ -40,7 +38,9 @@ export const canvasAssignmentGroupService = {
canvasCourseId: number,
localAssignmentGroup: LocalAssignmentGroup
): Promise<void> {
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");
}

View File

@@ -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";

View File

@@ -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<CanvasPage[]> {
console.log("requesting pages");
try {
const url = `${canvasApi}/courses/${courseId}/pages`;
const pages = await paginatedRequest<CanvasPage[]>({
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<CanvasPage[]>({
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(

View File

@@ -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,

View File

@@ -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
}
return criterion;
};

View File

@@ -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)
})
})
];
const points = assignmentPoints(rubric);
expect(points).toBe(4);
});
});