workign on api errors

This commit is contained in:
2024-09-09 19:52:47 -06:00
parent e1f1401592
commit 945253c208
12 changed files with 217 additions and 230 deletions

View File

@@ -1,28 +1,33 @@
import { fileStorageService } from "@/services/fileStorage/fileStorageService"; import { fileStorageService } from "@/services/fileStorage/fileStorageService";
import { withErrorHandling } from "@/services/withErrorHandling";
export async function GET( export const GET = async (
_request: Request, _request: Request,
{ {
params: { courseName, moduleName, assignmentName }, params: { courseName, moduleName, assignmentName },
}: { }: {
params: { courseName: string; moduleName: string; assignmentName: string }; params: { courseName: string; moduleName: string; assignmentName: string };
} }
) { ) =>
await withErrorHandling(async () => {
const settings = await fileStorageService.getAssignment( const settings = await fileStorageService.getAssignment(
courseName, courseName,
moduleName, moduleName,
assignmentName assignmentName
); );
return Response.json(settings); return Response.json(settings);
} });
export async function PUT( export const PUT = async (
request: Request, request: Request,
{ {
params: { courseName, moduleName, assignmentName }, params: { courseName, moduleName, assignmentName },
}: { params: { courseName: string; moduleName: string; assignmentName: string } } }: {
) { params: { courseName: string; moduleName: string; assignmentName: string };
const assignment = await request.json() }
) =>
await withErrorHandling(async () => {
const assignment = await request.json();
await fileStorageService.updateAssignment( await fileStorageService.updateAssignment(
courseName, courseName,
moduleName, moduleName,
@@ -30,4 +35,4 @@ export async function PUT(
assignment assignment
); );
return Response.json({}); return Response.json({});
} });

View File

@@ -1,14 +1,15 @@
import { fileStorageService } from "@/services/fileStorage/fileStorageService"; import { fileStorageService } from "@/services/fileStorage/fileStorageService";
import { withErrorHandling } from "@/services/withErrorHandling";
export async function GET( export const GET = async (
_request: Request, _request: Request,
{ {
params: { courseName, moduleName }, params: { courseName, moduleName },
}: { params: { courseName: string; moduleName: string } } }: { params: { courseName: string; moduleName: string } }
) { ) => await withErrorHandling(async () => {
const settings = await fileStorageService.getAssignmentNames( const settings = await fileStorageService.getAssignmentNames(
courseName, courseName,
moduleName moduleName
); );
return Response.json(settings); return Response.json(settings);
} })

View File

@@ -1,31 +1,29 @@
import { fileStorageService } from "@/services/fileStorage/fileStorageService"; import { fileStorageService } from "@/services/fileStorage/fileStorageService";
import { withErrorHandling } from "@/services/withErrorHandling";
export async function GET( export const GET = async (
_request: Request, _request: Request,
{ {
params: { courseName, moduleName, pageName }, params: { courseName, moduleName, pageName },
}: { params: { courseName: string; moduleName: string; pageName: string } } }: { params: { courseName: string; moduleName: string; pageName: string } }
) { ) =>
await withErrorHandling(async () => {
const settings = await fileStorageService.getPage( const settings = await fileStorageService.getPage(
courseName, courseName,
moduleName, moduleName,
pageName pageName
); );
return Response.json(settings); return Response.json(settings);
} });
export async function PUT( export const PUT = async (
request: Request, request: Request,
{ {
params: { courseName, moduleName, pageName }, params: { courseName, moduleName, pageName },
}: { params: { courseName: string; moduleName: string; pageName: string } } }: { params: { courseName: string; moduleName: string; pageName: string } }
) { ) =>
const page = await request.json() await withErrorHandling(async () => {
await fileStorageService.updatePage( const page = await request.json();
courseName, await fileStorageService.updatePage(courseName, moduleName, pageName, page);
moduleName,
pageName,
page
);
return Response.json({}); return Response.json({});
} });

View File

@@ -1,14 +1,16 @@
import { fileStorageService } from "@/services/fileStorage/fileStorageService"; import { fileStorageService } from "@/services/fileStorage/fileStorageService";
import { withErrorHandling } from "@/services/withErrorHandling";
export async function GET( export const GET = async (
_request: Request, _request: Request,
{ {
params: { courseName, moduleName }, params: { courseName, moduleName },
}: { params: { courseName: string; moduleName: string } } }: { params: { courseName: string; moduleName: string } }
) { ) =>
await withErrorHandling(async () => {
const settings = await fileStorageService.getPageNames( const settings = await fileStorageService.getPageNames(
courseName, courseName,
moduleName moduleName
); );
return Response.json(settings); return Response.json(settings);
} });

View File

@@ -1,25 +1,26 @@
import { fileStorageService } from "@/services/fileStorage/fileStorageService"; import { fileStorageService } from "@/services/fileStorage/fileStorageService";
import { withErrorHandling } from "@/services/withErrorHandling";
export async function GET( export const GET = async (
_request: Request, _request: Request,
{ {
params: { courseName, moduleName, quizName }, params: { courseName, moduleName, quizName },
}: { params: { courseName: string; moduleName: string; quizName: string } } }: { params: { courseName: string; moduleName: string; quizName: string } }
) { ) => await withErrorHandling(async () => {
const quiz = await fileStorageService.getQuiz( const quiz = await fileStorageService.getQuiz(
courseName, courseName,
moduleName, moduleName,
quizName quizName
); );
return Response.json(quiz); return Response.json(quiz);
} })
export async function PUT( export const PUT = async (
request: Request, request: Request,
{ {
params: { courseName, moduleName, quizName }, params: { courseName, moduleName, quizName },
}: { params: { courseName: string; moduleName: string; quizName: string } } }: { params: { courseName: string; moduleName: string; quizName: string } }
) { ) => await withErrorHandling(async () => {
const quiz = await request.json() const quiz = await request.json()
await fileStorageService.updateQuiz( await fileStorageService.updateQuiz(
courseName, courseName,
@@ -28,4 +29,4 @@ export async function PUT(
quiz quiz
); );
return Response.json({}); return Response.json({});
} })

View File

@@ -1,14 +1,16 @@
import { fileStorageService } from "@/services/fileStorage/fileStorageService"; import { fileStorageService } from "@/services/fileStorage/fileStorageService";
import { withErrorHandling } from "@/services/withErrorHandling";
export async function GET( export const GET = async (
_request: Request, _request: Request,
{ {
params: { courseName, moduleName }, params: { courseName, moduleName },
}: { params: { courseName: string; moduleName: string } } }: { params: { courseName: string; moduleName: string } }
) { ) =>
await withErrorHandling(async () => {
const settings = await fileStorageService.getQuizNames( const settings = await fileStorageService.getQuizNames(
courseName, courseName,
moduleName moduleName
); );
return Response.json(settings); return Response.json(settings);
} });

View File

@@ -1,9 +1,11 @@
import { fileStorageService } from "@/services/fileStorage/fileStorageService"; import { fileStorageService } from "@/services/fileStorage/fileStorageService";
import { withErrorHandling } from "@/services/withErrorHandling";
export async function GET( export const GET = async (
_request: Request, _request: Request,
{ params: { courseName } }: { params: { courseName: string } } { params: { courseName } }: { params: { courseName: string } }
) { ) =>
const settings = await fileStorageService.getModuleNames(courseName) await withErrorHandling(async () => {
const settings = await fileStorageService.getModuleNames(courseName);
return Response.json(settings); return Response.json(settings);
} });

View File

@@ -1,9 +1,11 @@
import { fileStorageService } from "@/services/fileStorage/fileStorageService"; import { fileStorageService } from "@/services/fileStorage/fileStorageService";
import { withErrorHandling } from "@/services/withErrorHandling";
export async function PUT( export const PUT = async (
request: Request, request: Request,
{ params: { courseName } }: { params: { courseName: string } } { params: { courseName } }: { params: { courseName: string } }
) { ) =>
await withErrorHandling(async () => {
const { updatedCourse, previousCourse } = await request.json(); const { updatedCourse, previousCourse } = await request.json();
console.log(updatedCourse); console.log(updatedCourse);
@@ -11,4 +13,4 @@ export async function PUT(
// await fileStorageService.saveCourseAsync(updatedCourse, previousCourse); // await fileStorageService.saveCourseAsync(updatedCourse, previousCourse);
return Response.json({}); return Response.json({});
} });

View File

@@ -1,12 +1,14 @@
import { fileStorageService } from "@/services/fileStorage/fileStorageService"; import { fileStorageService } from "@/services/fileStorage/fileStorageService";
import { withErrorHandling } from "@/services/withErrorHandling";
export async function GET( export const GET = async (
_request: Request, _request: Request,
{ params: { courseName } }: { params: { courseName: string } } { params: { courseName } }: { params: { courseName: string } }
) { ) =>
await withErrorHandling(async () => {
if (courseName.includes(".js.map")) { if (courseName.includes(".js.map")) {
return Response.json({}); return Response.json({});
} }
const settings = await fileStorageService.getCourseSettings(courseName); const settings = await fileStorageService.getCourseSettings(courseName);
return Response.json(settings); return Response.json(settings);
} });

View File

@@ -1,7 +1,8 @@
import { fileStorageService } from "@/services/fileStorage/fileStorageService"; import { fileStorageService } from "@/services/fileStorage/fileStorageService";
import { withErrorHandling } from "@/services/withErrorHandling";
export async function GET() { export const GET = async () =>
await withErrorHandling(async () => {
const courses = await fileStorageService.getCourseNames(); const courses = await fileStorageService.getCourseNames();
return Response.json(courses); return Response.json(courses);
} });

View File

@@ -7,6 +7,7 @@ import { useDraggingContext } from "../context/draggingContext";
import { useCalendarItemsContext } from "../context/calendarItemsContext"; import { useCalendarItemsContext } from "../context/calendarItemsContext";
import { useCourseContext } from "../context/courseContext"; import { useCourseContext } from "../context/courseContext";
import Link from "next/link"; import Link from "next/link";
import { IModuleItem } from "@/models/local/IModuleItem";
export default function Day({ day, month }: { day: string; month: number }) { export default function Day({ day, month }: { day: string; month: number }) {
const dayAsDate = getDateFromStringOrThrow( const dayAsDate = getDateFromStringOrThrow(
@@ -18,27 +19,88 @@ export default function Day({ day, month }: { day: string; month: number }) {
const itemsContext = useCalendarItemsContext(); const itemsContext = useCalendarItemsContext();
const { itemDrop } = useDraggingContext(); const { itemDrop } = useDraggingContext();
const { courseName } = useCourseContext();
const dateKey = getDateOnlyMarkdownString(dayAsDate); const dateKey = getDateOnlyMarkdownString(dayAsDate);
const todaysModules = itemsContext[dateKey]; const todaysModules = itemsContext[dateKey];
const todaysAssignments = todaysModules
? Object.keys(todaysModules).flatMap((moduleName) =>
todaysModules[moduleName].assignments.map((assignment) => ({
moduleName,
assignment,
}))
)
: [];
const todaysQuizzes = todaysModules
? Object.keys(todaysModules).flatMap((moduleName) =>
todaysModules[moduleName].quizzes.map((quiz) => ({
moduleName,
quiz,
}))
)
: [];
const todaysPages = todaysModules
? Object.keys(todaysModules).flatMap((moduleName) =>
todaysModules[moduleName].pages.map((page) => ({
moduleName,
page,
}))
)
: [];
return ( return (
<div <div
className={ className={
"border border-slate-600 rounded-lg p-2 pb-4 m-1 " + backgroundClass "border border-slate-600 rounded-lg p-2 pb-4 m-1 " + backgroundClass
} }
onDrop={(e) => { onDrop={(e) => itemDrop(e, day)}
itemDrop(e, day);
}}
onDragOver={(e) => e.preventDefault()} onDragOver={(e) => e.preventDefault()}
> >
{dayAsDate.getDate()} {dayAsDate.getDate()}
{todaysModules && <ul className="list-disc">
Object.keys(todaysModules).flatMap((moduleName) => {todaysAssignments.map(({ assignment, moduleName }) => (
todaysModules[moduleName].assignments.map((a) => ( <DraggableListItem
key={assignment.name}
type={"assignment"}
moduleName={moduleName}
item={assignment}
/>
))}
{todaysQuizzes.map(({ quiz, moduleName }) => (
<DraggableListItem
key={quiz.name}
type={"quiz"}
moduleName={moduleName}
item={quiz}
/>
))}
{todaysPages.map(({ page, moduleName }) => (
<DraggableListItem
key={page.name}
type={"page"}
moduleName={moduleName}
item={page}
/>
))}
</ul>
</div>
);
}
function DraggableListItem({
type,
moduleName,
item,
}: {
type: "assignment" | "page" | "quiz";
moduleName: string;
item: IModuleItem;
}) {
const { courseName } = useCourseContext();
return (
<li <li
key={a.name}
role="button" role="button"
draggable="true" draggable="true"
onDragStart={(e) => { onDragStart={(e) => {
@@ -46,7 +108,7 @@ export default function Day({ day, month }: { day: string; month: number }) {
"draggableItem", "draggableItem",
JSON.stringify({ JSON.stringify({
type: "assignment", type: "assignment",
item: a, item,
sourceModuleName: moduleName, sourceModuleName: moduleName,
}) })
); );
@@ -58,117 +120,13 @@ export default function Day({ day, month }: { day: string; month: number }) {
encodeURIComponent(courseName) + encodeURIComponent(courseName) +
"/modules/" + "/modules/" +
encodeURIComponent(moduleName) + encodeURIComponent(moduleName) +
"/assignment/" + `/${type}/` +
encodeURIComponent(a.name) encodeURIComponent(item.name)
} }
shallow={true} shallow={true}
> >
{a.name} {item.name}
</Link> </Link>
</li> </li>
))
)}
{todaysModules &&
Object.keys(todaysModules).flatMap((moduleName) =>
todaysModules[moduleName].quizzes.map((q) => (
<li
key={q.name}
role="button"
draggable="true"
onDragStart={(e) => {
e.dataTransfer.setData(
"draggableItem",
JSON.stringify({
type: "quiz",
item: q,
sourceModuleName: moduleName,
})
);
}}
>
<Link
href={
"/course/" +
encodeURIComponent(courseName) +
"/modules/" +
encodeURIComponent(moduleName) +
"/quiz/" +
encodeURIComponent(q.name)
}
shallow={true}
>
{q.name}
</Link>
</li>
))
)}
{todaysModules &&
Object.keys(todaysModules).flatMap((moduleName) =>
todaysModules[moduleName].pages.map((p) => (
<li
key={p.name}
role="button"
draggable="true"
onDragStart={(e) => {
e.dataTransfer.setData(
"draggableItem",
JSON.stringify({
type: "page",
item: p,
sourceModuleName: moduleName,
})
);
}}
>
<Link
href={
"/course/" +
encodeURIComponent(courseName) +
"/modules/" +
encodeURIComponent(moduleName) +
"/page/" +
encodeURIComponent(p.name)
}
shallow={true}
>
{p.name}
</Link>
</li>
))
)}
</div>
); );
} }
// export default function Day({ day, month }: { day: string; month: number }) {
// const { data: moduleNames } = useModuleNamesQuery();
// const dayAsDate = getDateFromStringOrThrow(
// day,
// "calculating same month in day"
// );
// const isInSameMonth = dayAsDate.getMonth() + 1 != month;
// const backgroundClass = isInSameMonth ? "" : "bg-slate-900";
// const { itemDrop } = useDraggingContext();
// return (
// <div
// className={
// "border border-slate-600 rounded-lg p-2 pb-4 m-1 " + backgroundClass
// }
// onDrop={(e) => {
// itemDrop(e, day);
// }}
// onDragOver={(e) => e.preventDefault()}
// >
// {dayAsDate.getDate()}
// {moduleNames.map((moduleName) => (
// <DayItemsInModule
// key={"" + day + month + moduleName}
// moduleName={moduleName}
// day={day}
// />
// ))}
// </div>
// );
// }

View File

@@ -0,0 +1,13 @@
import { NextResponse } from "next/server";
export async function withErrorHandling(handler: () => Promise<Response | NextResponse>) {
try {
return await handler();
} catch (error) {
console.error("Error caught in centralized handler:", error);
return NextResponse.json(
{ error: (error as Error).message || "Internal Server Error" },
{ status: 500 }
);
}
}