From 945253c20820f74a56109f99b7dd3ccd6cd0efd9 Mon Sep 17 00:00:00 2001 From: Alex Mickelson Date: Mon, 9 Sep 2024 19:52:47 -0600 Subject: [PATCH] workign on api errors --- .../assignments/[assignmentName]/route.ts | 47 ++-- .../modules/[moduleName]/assignments/route.ts | 7 +- .../[moduleName]/pages/[pageName]/route.ts | 38 ++- .../modules/[moduleName]/pages/route.ts | 18 +- .../[moduleName]/quizzes/[quizName]/route.ts | 13 +- .../modules/[moduleName]/quizzes/route.ts | 18 +- .../api/courses/[courseName]/modules/route.ts | 12 +- .../src/app/api/courses/[courseName]/route.ts | 18 +- .../courses/[courseName]/settings/route.ts | 18 +- nextjs/src/app/api/courses/route.ts | 11 +- .../app/course/[courseName]/calendar/Day.tsx | 234 +++++++----------- nextjs/src/services/withErrorHandling.ts | 13 + 12 files changed, 217 insertions(+), 230 deletions(-) create mode 100644 nextjs/src/services/withErrorHandling.ts diff --git a/nextjs/src/app/api/courses/[courseName]/modules/[moduleName]/assignments/[assignmentName]/route.ts b/nextjs/src/app/api/courses/[courseName]/modules/[moduleName]/assignments/[assignmentName]/route.ts index d3a3cb7..f5ba2ba 100644 --- a/nextjs/src/app/api/courses/[courseName]/modules/[moduleName]/assignments/[assignmentName]/route.ts +++ b/nextjs/src/app/api/courses/[courseName]/modules/[moduleName]/assignments/[assignmentName]/route.ts @@ -1,33 +1,38 @@ import { fileStorageService } from "@/services/fileStorage/fileStorageService"; +import { withErrorHandling } from "@/services/withErrorHandling"; -export async function GET( +export const GET = async ( _request: Request, { params: { courseName, moduleName, assignmentName }, }: { params: { courseName: string; moduleName: string; assignmentName: string }; } -) { - const settings = await fileStorageService.getAssignment( - courseName, - moduleName, - assignmentName - ); - return Response.json(settings); -} +) => + await withErrorHandling(async () => { + const settings = await fileStorageService.getAssignment( + courseName, + moduleName, + assignmentName + ); + return Response.json(settings); + }); -export async function PUT( +export const PUT = async ( request: Request, { params: { courseName, moduleName, assignmentName }, - }: { params: { courseName: string; moduleName: string; assignmentName: string } } -) { - const assignment = await request.json() - await fileStorageService.updateAssignment( - courseName, - moduleName, - assignmentName, - assignment - ); - return Response.json({}); -} + }: { + params: { courseName: string; moduleName: string; assignmentName: string }; + } +) => + await withErrorHandling(async () => { + const assignment = await request.json(); + await fileStorageService.updateAssignment( + courseName, + moduleName, + assignmentName, + assignment + ); + return Response.json({}); + }); diff --git a/nextjs/src/app/api/courses/[courseName]/modules/[moduleName]/assignments/route.ts b/nextjs/src/app/api/courses/[courseName]/modules/[moduleName]/assignments/route.ts index 45ccddb..9e64e13 100644 --- a/nextjs/src/app/api/courses/[courseName]/modules/[moduleName]/assignments/route.ts +++ b/nextjs/src/app/api/courses/[courseName]/modules/[moduleName]/assignments/route.ts @@ -1,14 +1,15 @@ import { fileStorageService } from "@/services/fileStorage/fileStorageService"; +import { withErrorHandling } from "@/services/withErrorHandling"; -export async function GET( +export const GET = async ( _request: Request, { params: { courseName, moduleName }, }: { params: { courseName: string; moduleName: string } } -) { +) => await withErrorHandling(async () => { const settings = await fileStorageService.getAssignmentNames( courseName, moduleName ); return Response.json(settings); -} +}) diff --git a/nextjs/src/app/api/courses/[courseName]/modules/[moduleName]/pages/[pageName]/route.ts b/nextjs/src/app/api/courses/[courseName]/modules/[moduleName]/pages/[pageName]/route.ts index 6f1cbe1..d8a0b10 100644 --- a/nextjs/src/app/api/courses/[courseName]/modules/[moduleName]/pages/[pageName]/route.ts +++ b/nextjs/src/app/api/courses/[courseName]/modules/[moduleName]/pages/[pageName]/route.ts @@ -1,31 +1,29 @@ import { fileStorageService } from "@/services/fileStorage/fileStorageService"; +import { withErrorHandling } from "@/services/withErrorHandling"; -export async function GET( +export const GET = async ( _request: Request, { params: { courseName, moduleName, pageName }, }: { params: { courseName: string; moduleName: string; pageName: string } } -) { - const settings = await fileStorageService.getPage( - courseName, - moduleName, - pageName - ); - return Response.json(settings); -} +) => + await withErrorHandling(async () => { + const settings = await fileStorageService.getPage( + courseName, + moduleName, + pageName + ); + return Response.json(settings); + }); -export async function PUT( +export const PUT = async ( request: Request, { params: { courseName, moduleName, pageName }, }: { params: { courseName: string; moduleName: string; pageName: string } } -) { - const page = await request.json() - await fileStorageService.updatePage( - courseName, - moduleName, - pageName, - page - ); - return Response.json({}); -} +) => + await withErrorHandling(async () => { + const page = await request.json(); + await fileStorageService.updatePage(courseName, moduleName, pageName, page); + return Response.json({}); + }); diff --git a/nextjs/src/app/api/courses/[courseName]/modules/[moduleName]/pages/route.ts b/nextjs/src/app/api/courses/[courseName]/modules/[moduleName]/pages/route.ts index 7064f77..38e22f8 100644 --- a/nextjs/src/app/api/courses/[courseName]/modules/[moduleName]/pages/route.ts +++ b/nextjs/src/app/api/courses/[courseName]/modules/[moduleName]/pages/route.ts @@ -1,14 +1,16 @@ import { fileStorageService } from "@/services/fileStorage/fileStorageService"; +import { withErrorHandling } from "@/services/withErrorHandling"; -export async function GET( +export const GET = async ( _request: Request, { params: { courseName, moduleName }, }: { params: { courseName: string; moduleName: string } } -) { - const settings = await fileStorageService.getPageNames( - courseName, - moduleName - ); - return Response.json(settings); -} +) => + await withErrorHandling(async () => { + const settings = await fileStorageService.getPageNames( + courseName, + moduleName + ); + return Response.json(settings); + }); diff --git a/nextjs/src/app/api/courses/[courseName]/modules/[moduleName]/quizzes/[quizName]/route.ts b/nextjs/src/app/api/courses/[courseName]/modules/[moduleName]/quizzes/[quizName]/route.ts index e9b1fff..834ec1f 100644 --- a/nextjs/src/app/api/courses/[courseName]/modules/[moduleName]/quizzes/[quizName]/route.ts +++ b/nextjs/src/app/api/courses/[courseName]/modules/[moduleName]/quizzes/[quizName]/route.ts @@ -1,25 +1,26 @@ import { fileStorageService } from "@/services/fileStorage/fileStorageService"; +import { withErrorHandling } from "@/services/withErrorHandling"; -export async function GET( +export const GET = async ( _request: Request, { params: { courseName, moduleName, quizName }, }: { params: { courseName: string; moduleName: string; quizName: string } } -) { +) => await withErrorHandling(async () => { const quiz = await fileStorageService.getQuiz( courseName, moduleName, quizName ); return Response.json(quiz); -} +}) -export async function PUT( +export const PUT = async ( request: Request, { params: { courseName, moduleName, quizName }, }: { params: { courseName: string; moduleName: string; quizName: string } } -) { +) => await withErrorHandling(async () => { const quiz = await request.json() await fileStorageService.updateQuiz( courseName, @@ -28,4 +29,4 @@ export async function PUT( quiz ); return Response.json({}); -} +}) diff --git a/nextjs/src/app/api/courses/[courseName]/modules/[moduleName]/quizzes/route.ts b/nextjs/src/app/api/courses/[courseName]/modules/[moduleName]/quizzes/route.ts index 3c88238..b105a50 100644 --- a/nextjs/src/app/api/courses/[courseName]/modules/[moduleName]/quizzes/route.ts +++ b/nextjs/src/app/api/courses/[courseName]/modules/[moduleName]/quizzes/route.ts @@ -1,14 +1,16 @@ import { fileStorageService } from "@/services/fileStorage/fileStorageService"; +import { withErrorHandling } from "@/services/withErrorHandling"; -export async function GET( +export const GET = async ( _request: Request, { params: { courseName, moduleName }, }: { params: { courseName: string; moduleName: string } } -) { - const settings = await fileStorageService.getQuizNames( - courseName, - moduleName - ); - return Response.json(settings); -} +) => + await withErrorHandling(async () => { + const settings = await fileStorageService.getQuizNames( + courseName, + moduleName + ); + return Response.json(settings); + }); diff --git a/nextjs/src/app/api/courses/[courseName]/modules/route.ts b/nextjs/src/app/api/courses/[courseName]/modules/route.ts index 1b1afdd..b155d31 100644 --- a/nextjs/src/app/api/courses/[courseName]/modules/route.ts +++ b/nextjs/src/app/api/courses/[courseName]/modules/route.ts @@ -1,9 +1,11 @@ import { fileStorageService } from "@/services/fileStorage/fileStorageService"; +import { withErrorHandling } from "@/services/withErrorHandling"; -export async function GET( +export const GET = async ( _request: Request, { params: { courseName } }: { params: { courseName: string } } -) { - const settings = await fileStorageService.getModuleNames(courseName) - return Response.json(settings); -} +) => + await withErrorHandling(async () => { + const settings = await fileStorageService.getModuleNames(courseName); + return Response.json(settings); + }); diff --git a/nextjs/src/app/api/courses/[courseName]/route.ts b/nextjs/src/app/api/courses/[courseName]/route.ts index 13d62a4..716f220 100644 --- a/nextjs/src/app/api/courses/[courseName]/route.ts +++ b/nextjs/src/app/api/courses/[courseName]/route.ts @@ -1,14 +1,16 @@ import { fileStorageService } from "@/services/fileStorage/fileStorageService"; +import { withErrorHandling } from "@/services/withErrorHandling"; -export async function PUT( +export const PUT = async ( request: Request, { params: { courseName } }: { params: { courseName: string } } -) { - const { updatedCourse, previousCourse } = await request.json(); +) => + await withErrorHandling(async () => { + const { updatedCourse, previousCourse } = await request.json(); - console.log(updatedCourse); - console.log(courseName); + console.log(updatedCourse); + console.log(courseName); - // await fileStorageService.saveCourseAsync(updatedCourse, previousCourse); - return Response.json({}); -} + // await fileStorageService.saveCourseAsync(updatedCourse, previousCourse); + return Response.json({}); + }); diff --git a/nextjs/src/app/api/courses/[courseName]/settings/route.ts b/nextjs/src/app/api/courses/[courseName]/settings/route.ts index 6591715..82a3fcf 100644 --- a/nextjs/src/app/api/courses/[courseName]/settings/route.ts +++ b/nextjs/src/app/api/courses/[courseName]/settings/route.ts @@ -1,12 +1,14 @@ import { fileStorageService } from "@/services/fileStorage/fileStorageService"; +import { withErrorHandling } from "@/services/withErrorHandling"; -export async function GET( +export const GET = async ( _request: Request, { params: { courseName } }: { params: { courseName: string } } -) { - if (courseName.includes(".js.map")) { - return Response.json({}); - } - const settings = await fileStorageService.getCourseSettings(courseName); - return Response.json(settings); -} +) => + await withErrorHandling(async () => { + if (courseName.includes(".js.map")) { + return Response.json({}); + } + const settings = await fileStorageService.getCourseSettings(courseName); + return Response.json(settings); + }); diff --git a/nextjs/src/app/api/courses/route.ts b/nextjs/src/app/api/courses/route.ts index fb9a972..7c35f44 100644 --- a/nextjs/src/app/api/courses/route.ts +++ b/nextjs/src/app/api/courses/route.ts @@ -1,7 +1,8 @@ import { fileStorageService } from "@/services/fileStorage/fileStorageService"; +import { withErrorHandling } from "@/services/withErrorHandling"; -export async function GET() { - const courses = await fileStorageService.getCourseNames(); - - return Response.json(courses); -} +export const GET = async () => + await withErrorHandling(async () => { + const courses = await fileStorageService.getCourseNames(); + return Response.json(courses); + }); diff --git a/nextjs/src/app/course/[courseName]/calendar/Day.tsx b/nextjs/src/app/course/[courseName]/calendar/Day.tsx index e297aa4..5eefcd6 100644 --- a/nextjs/src/app/course/[courseName]/calendar/Day.tsx +++ b/nextjs/src/app/course/[courseName]/calendar/Day.tsx @@ -7,6 +7,7 @@ import { useDraggingContext } from "../context/draggingContext"; import { useCalendarItemsContext } from "../context/calendarItemsContext"; import { useCourseContext } from "../context/courseContext"; import Link from "next/link"; +import { IModuleItem } from "@/models/local/IModuleItem"; export default function Day({ day, month }: { day: string; month: number }) { const dayAsDate = getDateFromStringOrThrow( @@ -18,157 +19,114 @@ export default function Day({ day, month }: { day: string; month: number }) { const itemsContext = useCalendarItemsContext(); const { itemDrop } = useDraggingContext(); - const { courseName } = useCourseContext(); const dateKey = getDateOnlyMarkdownString(dayAsDate); 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 (
{ - itemDrop(e, day); - }} + onDrop={(e) => itemDrop(e, day)} onDragOver={(e) => e.preventDefault()} > {dayAsDate.getDate()} - {todaysModules && - Object.keys(todaysModules).flatMap((moduleName) => - todaysModules[moduleName].assignments.map((a) => ( -
  • { - e.dataTransfer.setData( - "draggableItem", - JSON.stringify({ - type: "assignment", - item: a, - sourceModuleName: moduleName, - }) - ); - }} - > - - {a.name} - -
  • - )) - )} - {todaysModules && - Object.keys(todaysModules).flatMap((moduleName) => - todaysModules[moduleName].quizzes.map((q) => ( -
  • { - e.dataTransfer.setData( - "draggableItem", - JSON.stringify({ - type: "quiz", - item: q, - sourceModuleName: moduleName, - }) - ); - }} - > - - {q.name} - -
  • - )) - )} - {todaysModules && - Object.keys(todaysModules).flatMap((moduleName) => - todaysModules[moduleName].pages.map((p) => ( -
  • { - e.dataTransfer.setData( - "draggableItem", - JSON.stringify({ - type: "page", - item: p, - sourceModuleName: moduleName, - }) - ); - }} - > - - {p.name} - -
  • - )) - )} +
    ); } -// 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 ( -//
    { -// itemDrop(e, day); -// }} -// onDragOver={(e) => e.preventDefault()} -// > -// {dayAsDate.getDate()} -// {moduleNames.map((moduleName) => ( -// -// ))} -//
    -// ); -// } +function DraggableListItem({ + type, + moduleName, + item, +}: { + type: "assignment" | "page" | "quiz"; + moduleName: string; + item: IModuleItem; +}) { + const { courseName } = useCourseContext(); + return ( +
  • { + e.dataTransfer.setData( + "draggableItem", + JSON.stringify({ + type: "assignment", + item, + sourceModuleName: moduleName, + }) + ); + }} + > + + {item.name} + +
  • + ); +} diff --git a/nextjs/src/services/withErrorHandling.ts b/nextjs/src/services/withErrorHandling.ts new file mode 100644 index 0000000..8ea244f --- /dev/null +++ b/nextjs/src/services/withErrorHandling.ts @@ -0,0 +1,13 @@ +import { NextResponse } from "next/server"; + +export async function withErrorHandling(handler: () => Promise) { + 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 } + ); + } +}