From 186b0e840150a130f2c4141f9233ae0ba7ba372d Mon Sep 17 00:00:00 2001 From: swve Date: Mon, 10 Apr 2023 20:35:14 +0200 Subject: [PATCH] fix: better error handling across the app --- .../[courseid]/activity/[activityid]/page.tsx | 9 ++--- front/services/courses/activities.ts | 37 ++++++------------- front/services/courses/activity.ts | 17 ++++----- front/services/courses/collections.ts | 14 +++---- front/services/courses/courses.ts | 34 +++++++---------- front/services/organizations/orgs.ts | 20 +++++----- front/services/settings/org.ts | 12 +++--- front/services/settings/password.ts | 8 ++-- front/services/settings/profile.ts | 8 ++-- front/services/utils/ts/requests.ts | 1 + src/services/courses/courses.py | 2 +- 11 files changed, 66 insertions(+), 96 deletions(-) diff --git a/front/app/_orgs/[orgslug]/(withmenu)/course/[courseid]/activity/[activityid]/page.tsx b/front/app/_orgs/[orgslug]/(withmenu)/course/[courseid]/activity/[activityid]/page.tsx index b8d2d2b2..020c734d 100644 --- a/front/app/_orgs/[orgslug]/(withmenu)/course/[courseid]/activity/[activityid]/page.tsx +++ b/front/app/_orgs/[orgslug]/(withmenu)/course/[courseid]/activity/[activityid]/page.tsx @@ -19,7 +19,7 @@ function ActivityPage(params: any) { const orgslug = params.params.orgslug; const { data: course, error: error_course } = useSWR(`${getAPIUrl()}courses/meta/course_${courseid}`, swrFetcher); - const { data: activity, error: error_activity } = useSWR(`${getAPIUrl()}trail/org_slug/${orgslug}/trail`, swrFetcher); + const { data: activity, error: error_activity } = useSWR(`${getAPIUrl()}activities/activity_${activityid}`, swrFetcher); async function markActivityAsCompleteFront() { @@ -31,7 +31,7 @@ function ActivityPage(params: any) { return ( <> {error_course &&

Failed to load

} - {!course || !activity ? ( + {!course && !activity ? (
Loading...
) : ( @@ -95,9 +95,8 @@ function ActivityPage(params: any) { )} - ) : ( -
Loading...
- )} + ) : (
)} + {error_activity &&

Failed to load {error_activity.message}

}
)} diff --git a/front/services/courses/activities.ts b/front/services/courses/activities.ts index 02d8726c..fa378281 100644 --- a/front/services/courses/activities.ts +++ b/front/services/courses/activities.ts @@ -5,15 +5,10 @@ export async function createActivity(data: any, chapter_id: any, org_id: any) { data.content = {}; // remove chapter_id from data delete data.chapterId; - - const result: any = await fetch(`${getAPIUrl()}activities/?coursechapter_id=${chapter_id}&org_id=${org_id}`, RequestBody("POST", data)) - .then((result) => result.json()) - .catch((error) => console.log("error", error)); - - console.log("result", result); - - return result; + const result = await fetch(`${getAPIUrl()}activities/?coursechapter_id=${chapter_id}&org_id=${org_id}`, RequestBody("POST", data)); + const res = await result.json(); + return res; } export async function createFileActivity(file: File, type: string, data: any, chapter_id: any) { @@ -29,27 +24,19 @@ export async function createFileActivity(file: File, type: string, data: any, ch endpoint = `${getAPIUrl()}activities/video`; } - const result: any = await fetch(endpoint, RequestBodyForm("POST", formData)) - .then((result) => result.json()) - .catch((error) => console.log("error", error)); - - console.log("result", result); - - return result; + const result: any = await fetch(endpoint, RequestBodyForm("POST", formData)); + const res = await result.json(); + return res; } export async function getActivity(activity_id: any) { - const result: any = await fetch(`${getAPIUrl()}activities/${activity_id}`, RequestBody("GET", null)) - .then((result) => result.json()) - .catch((error) => console.log("error", error)); - - return result; + const result = await fetch(`${getAPIUrl()}activities/${activity_id}`, RequestBody("GET", null)); + const res = await result.json(); + return res; } export async function updateActivity(data: any, activity_id: any) { - const result: any = await fetch(`${getAPIUrl()}activities/${activity_id}`, RequestBody("PUT", data)) - .then((result) => result.json()) - .catch((error) => console.log("error", error)); - - return result; + const result = await fetch(`${getAPIUrl()}activities/${activity_id}`, RequestBody("PUT", data)); + const res = await result.json(); + return res; } diff --git a/front/services/courses/activity.ts b/front/services/courses/activity.ts index cce7f84f..aec4ec45 100644 --- a/front/services/courses/activity.ts +++ b/front/services/courses/activity.ts @@ -1,4 +1,4 @@ -import { RequestBody } from "@services/utils/ts/requests"; +import { RequestBody, errorHandling } from "@services/utils/ts/requests"; import { getAPIUrl } from "@services/config/config"; /* @@ -8,21 +8,18 @@ import { getAPIUrl } from "@services/config/config"; export async function startCourse(course_id: string, org_slug: string) { const result: any = await fetch(`${getAPIUrl()}trail/org_slug/${org_slug}/add_course/${course_id}`, RequestBody("POST", null)) - .then((result) => result.json()) - .catch((error) => console.log("error", error)); - return result; + const res = await errorHandling(result); + return res; } export async function removeCourse(course_id: string, org_slug: string) { const result: any = await fetch(`${getAPIUrl()}trail/org_slug/${org_slug}/remove_course/${course_id}`, RequestBody("POST", null)) - .then((result) => result.json()) - .catch((error) => console.log("error", error)); - return result; + const res = await errorHandling(result); + return res; } export async function markActivityAsComplete(org_slug: string, course_id: string, activity_id: string) { const result: any = await fetch(`${getAPIUrl()}trail/org_slug/${org_slug}/add_activity/course_id/${course_id}/activity_id/${activity_id}`, RequestBody("POST", null)) - .then((result) => result.json()) - .catch((error) => console.log("error", error)); - return result; + const res = await errorHandling(result); + return res; } diff --git a/front/services/courses/collections.ts b/front/services/courses/collections.ts index 7429f5a6..09ca1610 100644 --- a/front/services/courses/collections.ts +++ b/front/services/courses/collections.ts @@ -1,5 +1,5 @@ import { getAPIUrl } from "../config/config"; -import { RequestBody } from "../utils/ts/requests"; +import { RequestBody, errorHandling } from "@services/utils/ts/requests"; /* This file includes only POST, PUT, DELETE requests @@ -7,14 +7,14 @@ import { RequestBody } from "../utils/ts/requests"; */ export async function deleteCollection(collection_id: any) { - return fetch(`${getAPIUrl()}collections/${collection_id}`, RequestBody("DELETE", null)) - .then((result) => result.json()) - .catch((error) => console.log("error", error)); + const result: any = await fetch(`${getAPIUrl()}collections/${collection_id}`, RequestBody("DELETE", null)); + const res = await errorHandling(result); + return res; } // Create a new collection export async function createCollection(collection: any) { - return fetch(`${getAPIUrl()}collections/`, RequestBody("POST", collection)) - .then((result) => result.json()) - .catch((error) => console.log("error", error)); + const result: any = await fetch(`${getAPIUrl()}collections/`, RequestBody("POST", collection)); + const res = await errorHandling(result); + return res; } diff --git a/front/services/courses/courses.ts b/front/services/courses/courses.ts index a0236419..13486429 100644 --- a/front/services/courses/courses.ts +++ b/front/services/courses/courses.ts @@ -1,5 +1,5 @@ import { getAPIUrl } from "@services/config/config"; -import { RequestBody, RequestBodyForm } from "@services/utils/ts/requests"; +import { RequestBody, RequestBodyForm, errorHandling } from "@services/utils/ts/requests"; /* This file includes only POST, PUT, DELETE requests @@ -7,23 +7,18 @@ import { RequestBody, RequestBodyForm } from "@services/utils/ts/requests"; */ export async function getOrgCourses(org_id: number) { - - - return fetch(`${getAPIUrl()}courses/${org_id}/page/1/limit/10`, RequestBody("GET", null)) - .then((result) => result.json()) - .catch((error) => console.log("error", error)); + const result: any = await fetch(`${getAPIUrl()}courses/${org_id}/page/1/limit/10`, RequestBody("GET", null)); + const res = await errorHandling(result); + return res; } export async function getCourse(course_id: string) { - // todo : add course id to url - return fetch(`${getAPIUrl()}courses/${course_id}`, RequestBody("GET", null)) - .then((result) => result.json()) - .catch((error) => console.log("error", error)); + const result: any = await fetch(`${getAPIUrl()}courses/${course_id}`, RequestBody("GET", null)); + const res = await errorHandling(result); + return res; } - export async function createNewCourse(org_id: string, course_body: any, thumbnail: any) { - // Send file thumbnail as form data const formData = new FormData(); formData.append("thumbnail", thumbnail); @@ -32,16 +27,13 @@ export async function createNewCourse(org_id: string, course_body: any, thumbnai formData.append("mini_description", "course_body.mini_description"); formData.append("public", "true"); - - return fetch(`${getAPIUrl()}courses/?org_id=${org_id}`, RequestBodyForm("POST", formData)) - .then((result) => result.json()) - .catch((error) => console.log("error", error)); + const result = await fetch(`${getAPIUrl()}courses/?org_id=${org_id}`, RequestBodyForm("POST", formData)); + const res = await errorHandling(result); + return res; } export async function deleteCourseFromBackend(course_id: any) { - - - return fetch(`${getAPIUrl()}courses/${course_id}`, RequestBody("DELETE", null)) - .then((result) => result.json()) - .catch((error) => console.log("error", error)); + const result: any = await fetch(`${getAPIUrl()}courses/${course_id}`, RequestBody("DELETE", null)); + const res = await errorHandling(result); + return res; } diff --git a/front/services/organizations/orgs.ts b/front/services/organizations/orgs.ts index eb648285..2718df70 100644 --- a/front/services/organizations/orgs.ts +++ b/front/services/organizations/orgs.ts @@ -1,5 +1,5 @@ import { getAPIUrl } from "@services/config/config"; -import { RequestBody } from "../utils/ts/requests"; +import { RequestBody, errorHandling } from "@services/utils/ts/requests"; /* This file includes only POST, PUT, DELETE requests @@ -7,19 +7,19 @@ import { RequestBody } from "../utils/ts/requests"; */ export async function createNewOrganization(body: any) { - return fetch(`${getAPIUrl()}orgs/`, RequestBody("POST", body)) - .then((result) => result.json()) - .catch((error) => console.log("error", error)); + const result = await fetch(`${getAPIUrl()}orgs/`, RequestBody("POST", body)); + const res = await errorHandling(result); + return res; } export async function deleteOrganizationFromBackend(org_id: any) { - return fetch(`${getAPIUrl()}orgs/${org_id}`, RequestBody("DELETE", null)) - .then((result) => result.json()) - .catch((error) => console.log("error", error)); + const result = await fetch(`${getAPIUrl()}orgs/${org_id}`, RequestBody("DELETE", null)); + const res = await errorHandling(result); + return res; } export async function getOrganizationContextInfo(org_slug: any) { - return fetch(`${getAPIUrl()}orgs/slug/${org_slug}`, RequestBody("GET", null)) - .then((result) => result.json()) - .catch((error) => console.log("error", error)); + const result = await fetch(`${getAPIUrl()}orgs/slug/${org_slug}`, RequestBody("GET", null)); + const res = await errorHandling(result); + return res; } diff --git a/front/services/settings/org.ts b/front/services/settings/org.ts index 4f225fce..1f4a0fd8 100644 --- a/front/services/settings/org.ts +++ b/front/services/settings/org.ts @@ -1,15 +1,13 @@ import { getAPIUrl } from "@services/config/config"; -import { RequestBody } from "@services/utils/ts/requests"; +import { RequestBody, errorHandling } from "@services/utils/ts/requests"; /* This file includes only POST, PUT, DELETE requests GET requests are called from the frontend using SWR (https://swr.vercel.app/) */ -export async function updateOrganization(org_id : string, data: any) { - const result: any = await fetch(`${getAPIUrl()}orgs/` + org_id, RequestBody("PUT", data)) - .then((result) => result.json()) - .catch((error) => console.log("error", error)); - - return result; +export async function updateOrganization(org_id: string, data: any) { + const result: any = await fetch(`${getAPIUrl()}orgs/` + org_id, RequestBody("PUT", data)); + const res = await errorHandling(result); + return res; } diff --git a/front/services/settings/password.ts b/front/services/settings/password.ts index 9cd57b28..a93483f3 100644 --- a/front/services/settings/password.ts +++ b/front/services/settings/password.ts @@ -1,5 +1,5 @@ import { getAPIUrl } from "@services/config/config"; -import { RequestBody } from "@services/utils/ts/requests"; +import { RequestBody, errorHandling } from "@services/utils/ts/requests"; /* This file includes only POST, PUT, DELETE requests @@ -8,8 +8,6 @@ import { RequestBody } from "@services/utils/ts/requests"; export async function updatePassword(user_id : string, data: any) { const result: any = await fetch(`${getAPIUrl()}users/password/user_id/` + user_id, RequestBody("PUT", data)) - .then((result) => result.json()) - .catch((error) => console.log("error", error)); - - return result; + const res = await errorHandling(result); + return res; } diff --git a/front/services/settings/profile.ts b/front/services/settings/profile.ts index b6322d65..06f0667e 100644 --- a/front/services/settings/profile.ts +++ b/front/services/settings/profile.ts @@ -1,5 +1,5 @@ import { getAPIUrl } from "@services/config/config"; -import { RequestBody } from "@services/utils/ts/requests"; +import { RequestBody, errorHandling } from "@services/utils/ts/requests"; /* This file includes only POST, PUT, DELETE requests @@ -8,8 +8,6 @@ import { RequestBody } from "@services/utils/ts/requests"; export async function updateProfile(data: any) { const result: any = await fetch(`${getAPIUrl()}users/user_id/` + data.user_id, RequestBody("PUT", data)) - .then((result) => result.json()) - .catch((error) => console.log("error", error)); - - return result; + const res = await errorHandling(result); + return res; } diff --git a/front/services/utils/ts/requests.ts b/front/services/utils/ts/requests.ts index ee372a47..802f92ec 100644 --- a/front/services/utils/ts/requests.ts +++ b/front/services/utils/ts/requests.ts @@ -53,6 +53,7 @@ export const swrFetcher = async (url: string, body: any, router?: AppRouterInsta if (router) { denyAccessToUser(error, router); } + throw error; } }; diff --git a/src/services/courses/courses.py b/src/services/courses/courses.py index d8dee31a..55b12d67 100644 --- a/src/services/courses/courses.py +++ b/src/services/courses/courses.py @@ -288,7 +288,7 @@ async def verify_rights(request: Request, course_id: str, current_user: PublicUs course = await courses.find_one({"course_id": course_id}) - if current_user.user_id == "anonymous" and course["public"] == True: + if current_user.user_id == "anonymous" and course["public"] == True and action == "read": return True if not course: