feat: init routes protection

This commit is contained in:
swve 2023-04-10 19:59:50 +02:00
parent 49b6d1dfe7
commit 1ad8ee12b1
25 changed files with 82 additions and 64 deletions

View file

@ -9,7 +9,7 @@ import AuthProvider from "@components/Security/AuthProvider";
import EditorWrapper from "@components/Editor/EditorWrapper"; import EditorWrapper from "@components/Editor/EditorWrapper";
import useSWR, { mutate } from "swr"; import useSWR, { mutate } from "swr";
import { getAPIUrl } from "@services/config/config"; import { getAPIUrl } from "@services/config/config";
import { swrFetcher } from "@services/utils/requests"; import { swrFetcher } from "@services/utils/ts/requests";
function EditActivity(params: any) { function EditActivity(params: any) {

View file

@ -5,7 +5,7 @@ import { Title } from "@components/UI/Elements/Styles/Title";
import { createCollection } from "@services/courses/collections"; import { createCollection } from "@services/courses/collections";
import useSWR from "swr"; import useSWR from "swr";
import { getAPIUrl } from "@services/config/config"; import { getAPIUrl } from "@services/config/config";
import { swrFetcher } from "@services/utils/requests"; import { swrFetcher } from "@services/utils/ts/requests";
import { getOrganizationContextInfo } from "@services/organizations/orgs"; import { getOrganizationContextInfo } from "@services/organizations/orgs";
function NewCollection(params : any) { function NewCollection(params : any) {

View file

@ -5,7 +5,7 @@ import styled from "styled-components";
import { Title } from "@components/UI/Elements/Styles/Title"; import { Title } from "@components/UI/Elements/Styles/Title";
import { deleteCollection } from "@services/courses/collections"; import { deleteCollection } from "@services/courses/collections";
import { getAPIUrl, getBackendUrl, getUriWithOrg } from "@services/config/config"; import { getAPIUrl, getBackendUrl, getUriWithOrg } from "@services/config/config";
import { swrFetcher } from "@services/utils/requests"; import { swrFetcher } from "@services/utils/ts/requests";
import useSWR, { mutate } from "swr"; import useSWR, { mutate } from "swr";
function Collections(params: any) { function Collections(params: any) {

View file

@ -10,7 +10,7 @@ import { getCourse } from "@services/courses/courses";
import VideoActivity from "@components/Pages/Activities/Video/Video"; import VideoActivity from "@components/Pages/Activities/Video/Video";
import useSWR, { mutate } from "swr"; import useSWR, { mutate } from "swr";
import { Check } from "lucide-react"; import { Check } from "lucide-react";
import { swrFetcher } from "@services/utils/requests"; import { swrFetcher } from "@services/utils/ts/requests";
import { markActivityAsComplete } from "@services/courses/activity"; import { markActivityAsComplete } from "@services/courses/activity";
function ActivityPage(params: any) { function ActivityPage(params: any) {

View file

@ -15,6 +15,7 @@ import { createActivity, createFileActivity } from "@services/courses/activities
import { getOrganizationContextInfo } from "@services/organizations/orgs"; import { getOrganizationContextInfo } from "@services/organizations/orgs";
import Modal from "@components/UI/Modal/Modal"; import Modal from "@components/UI/Modal/Modal";
import AuthProvider from "@components/Security/AuthProvider"; import AuthProvider from "@components/Security/AuthProvider";
import { denyAccessToUser } from "@services/utils/react/middlewares/views";
function CourseEdit(params: any) { function CourseEdit(params: any) {
@ -38,9 +39,7 @@ function CourseEdit(params: any) {
const courseChapters = await getCourseChaptersMetadata(courseid); const courseChapters = await getCourseChaptersMetadata(courseid);
setData(courseChapters); setData(courseChapters);
} catch (error: any) { } catch (error: any) {
if (error.status === 401) { denyAccessToUser(error, router)
router.push("/login");
}
} }
} }

View file

@ -1,21 +1,26 @@
"use client"; "use client";
import { EyeOpenIcon, Pencil2Icon } from "@radix-ui/react-icons"; import { EyeOpenIcon, Pencil2Icon } from "@radix-ui/react-icons";
import { removeCourse, startCourse } from "@services/courses/activity"; import { removeCourse, startCourse } from "@services/courses/activity";
import Link from "next/link"; import Link from "next/link";
import React from "react"; import React from "react";
import styled from "styled-components"; import styled from "styled-components";
import { getAPIUrl, getBackendUrl, getUriWithOrg } from "@services/config/config"; import { getAPIUrl, getBackendUrl, getUriWithOrg } from "@services/config/config";
import useSWR, { mutate } from "swr"; import useSWR, { mutate } from "swr";
import { swrFetcher } from "@services/utils/requests"; import { swrFetcher } from "@services/utils/ts/requests";
import { useRouter } from "next/navigation";
const CourseIdPage = (params: any) => { const CourseIdPage = (params: any) => {
const courseid = params.params.courseid; const courseid = params.params.courseid;
const orgslug = params.params.orgslug; const orgslug = params.params.orgslug;
const { data: course, error: error } = useSWR(`${getAPIUrl()}courses/meta/course_${courseid}`, swrFetcher); const router = useRouter();
const { data: course, error: error } = useSWR(`${getAPIUrl()}courses/meta/course_${courseid}`,
(url: string, body: any) => swrFetcher(url, body, router)
);
async function startCourseUI() { async function startCourseUI() {
// Create activity // Create activity
await startCourse("course_" + courseid, orgslug); await startCourse("course_" + courseid, orgslug);
// Mutate course // Mutate course
mutate(`${getAPIUrl()}courses/meta/course_${courseid}`); mutate(`${getAPIUrl()}courses/meta/course_${courseid}`);
@ -24,7 +29,7 @@ const CourseIdPage = (params: any) => {
async function quitCourse() { async function quitCourse() {
// Close activity // Close activity
let activity = await removeCourse("course_" + courseid, orgslug); let activity = await removeCourse("course_" + courseid, orgslug);
console.log(activity); console.log(activity);
// Mutate course // Mutate course
@ -42,7 +47,7 @@ const CourseIdPage = (params: any) => {
<p>Course</p> <p>Course</p>
<h1> <h1>
{course.course.name}{" "} {course.course.name}{" "}
<Link href={getUriWithOrg(orgslug,"") +`/course/${courseid}/edit`} rel="noopener noreferrer"> <Link href={getUriWithOrg(orgslug, "") + `/course/${courseid}/edit`} rel="noopener noreferrer">
<Pencil2Icon /> <Pencil2Icon />
</Link>{" "} </Link>{" "}
</h1> </h1>
@ -53,7 +58,7 @@ const CourseIdPage = (params: any) => {
{chapter.activities.map((activity: any) => { {chapter.activities.map((activity: any) => {
return ( return (
<> <>
<Link href={getUriWithOrg(orgslug,"") +`/course/${courseid}/activity/${activity.id.replace("activity_", "")}`}> <Link href={getUriWithOrg(orgslug, "") + `/course/${courseid}/activity/${activity.id.replace("activity_", "")}`}>
<ChapterIndicator /> <ChapterIndicator />
</Link>{" "} </Link>{" "}
</> </>
@ -94,7 +99,7 @@ const CourseIdPage = (params: any) => {
<> <>
<p> <p>
Activity {activity.name} Activity {activity.name}
<Link href={getUriWithOrg(orgslug,"") +`/course/${courseid}/activity/${activity.id.replace("activity_", "")}`} rel="noopener noreferrer"> <Link href={getUriWithOrg(orgslug, "") + `/course/${courseid}/activity/${activity.id.replace("activity_", "")}`} rel="noopener noreferrer">
<EyeOpenIcon /> <EyeOpenIcon />
</Link>{" "} </Link>{" "}
</p> </p>

View file

@ -7,7 +7,7 @@ import { Title } from "@components/UI/Elements/Styles/Title";
import { getAPIUrl, getBackendUrl, getSelfHostedOption, getUriWithOrg } from "@services/config/config"; import { getAPIUrl, getBackendUrl, getSelfHostedOption, getUriWithOrg } from "@services/config/config";
import { deleteCourseFromBackend } from "@services/courses/courses"; import { deleteCourseFromBackend } from "@services/courses/courses";
import useSWR, { mutate } from "swr"; import useSWR, { mutate } from "swr";
import { swrFetcher } from "@services/utils/requests"; import { swrFetcher } from "@services/utils/ts/requests";
import { Edit2, Trash } from "lucide-react"; import { Edit2, Trash } from "lucide-react";
const CoursesIndexPage = (params: any) => { const CoursesIndexPage = (params: any) => {

View file

@ -1,6 +1,6 @@
"use client"; "use client";
import { getAPIUrl, getBackendUrl } from "@services/config/config"; import { getAPIUrl, getBackendUrl } from "@services/config/config";
import { swrFetcher } from "@services/utils/requests"; import { swrFetcher } from "@services/utils/ts/requests";
import React from "react"; import React from "react";
import { styled } from "styled-components"; import { styled } from "styled-components";
import useSWR from "swr"; import useSWR from "swr";

View file

@ -1,7 +1,7 @@
"use client"; "use client";
import React from 'react' import React from 'react'
import useSWR, { mutate } from "swr"; import useSWR, { mutate } from "swr";
import { swrFetcher } from "@services/utils/requests"; import { swrFetcher } from "@services/utils/ts/requests";
import { getAPIUrl } from '@services/config/config'; import { getAPIUrl } from '@services/config/config';
import { Field, Form, Formik } from 'formik'; import { Field, Form, Formik } from 'formik';
import { updateOrganization } from '@services/settings/org'; import { updateOrganization } from '@services/settings/org';

View file

@ -4,7 +4,7 @@ import React from "react";
import { Title } from "../../components/UI/Elements/Styles/Title"; import { Title } from "../../components/UI/Elements/Styles/Title";
import { deleteOrganizationFromBackend } from "@services/organizations/orgs"; import { deleteOrganizationFromBackend } from "@services/organizations/orgs";
import useSWR, { mutate } from "swr"; import useSWR, { mutate } from "swr";
import { swrFetcher } from "@services/utils/requests"; import { swrFetcher } from "@services/utils/ts/requests";
import { getAPIUrl, getUriWithOrg } from "@services/config/config"; import { getAPIUrl, getUriWithOrg } from "@services/config/config";
import AuthProvider from "@components/Security/AuthProvider"; import AuthProvider from "@components/Security/AuthProvider";

View file

@ -1,5 +1,5 @@
import { getAPIUrl } from "@services/config/config"; import { getAPIUrl } from "@services/config/config";
import { RequestBody, RequestBodyForm } from "@services/utils/requests"; import { RequestBody, RequestBodyForm } from "@services/utils/ts/requests";
export async function uploadNewImageFile(file: any, activity_id: string) { export async function uploadNewImageFile(file: any, activity_id: string) {
// Send file thumbnail as form data // Send file thumbnail as form data

View file

@ -1,5 +1,5 @@
import { getAPIUrl } from "@services/config/config"; import { getAPIUrl } from "@services/config/config";
import { RequestBody, RequestBodyForm } from "@services/utils/requests"; import { RequestBody, RequestBodyForm } from "@services/utils/ts/requests";
export async function uploadNewPDFFile(file: any, activity_id: string) { export async function uploadNewPDFFile(file: any, activity_id: string) {
// Send file thumbnail as form data // Send file thumbnail as form data

View file

@ -1,5 +1,5 @@
import { getAPIUrl } from "@services/config/config"; import { getAPIUrl } from "@services/config/config";
import { RequestBody, RequestBodyForm } from "@services/utils/requests"; import { RequestBody, RequestBodyForm } from "@services/utils/ts/requests";
export async function submitQuizBlock(activity_id: string, data: any) { export async function submitQuizBlock(activity_id: string, data: any) {

View file

@ -1,5 +1,5 @@
import { getAPIUrl } from "@services/config/config"; import { getAPIUrl } from "@services/config/config";
import { RequestBody, RequestBodyForm } from "@services/utils/requests"; import { RequestBody, RequestBodyForm } from "@services/utils/ts/requests";
export async function uploadNewVideoFile(file: any, activity_id: string) { export async function uploadNewVideoFile(file: any, activity_id: string) {
// Send file thumbnail as form data // Send file thumbnail as form data

View file

@ -1,5 +1,5 @@
import { getAPIUrl } from "@services/config/config"; import { getAPIUrl } from "@services/config/config";
import { RequestBody, RequestBodyForm } from "@services/utils/requests"; import { RequestBody, RequestBodyForm } from "@services/utils/ts/requests";
export async function createActivity(data: any, chapter_id: any, org_id: any) { export async function createActivity(data: any, chapter_id: any, org_id: any) {
data.content = {}; data.content = {};

View file

@ -1,4 +1,4 @@
import { RequestBody } from "@services/utils/requests"; import { RequestBody } from "@services/utils/ts/requests";
import { getAPIUrl } from "@services/config/config"; import { getAPIUrl } from "@services/config/config";
/* /*

View file

@ -1,6 +1,5 @@
import { initialData } from "../../components/Pages/CourseEdit/Draggables/data";
import { getAPIUrl } from "@services/config/config"; import { getAPIUrl } from "@services/config/config";
import { RequestBody } from "@services/utils/requests"; import { RequestBody, errorHandling } from "@services/utils/ts/requests";
/* /*
This file includes only POST, PUT, DELETE requests This file includes only POST, PUT, DELETE requests
@ -9,38 +8,26 @@ import { RequestBody } from "@services/utils/requests";
//TODO : depreciate this function //TODO : depreciate this function
export async function getCourseChaptersMetadata(course_id: any) { export async function getCourseChaptersMetadata(course_id: any) {
const response = await fetch(`${getAPIUrl()}chapters/meta/course_${course_id}`, RequestBody("GET", null)); const result = await fetch(`${getAPIUrl()}chapters/meta/course_${course_id}`, RequestBody("GET", null));
const res = await errorHandling(result);
if (!response.ok) { return res;
const error: any = new Error(`Error ${response.status}: ${response.statusText}`, {});
error.status = response.status;
throw error;
}
const data = await response.json();
return data;
} }
export async function updateChaptersMetadata(course_id: any, data: any) { export async function updateChaptersMetadata(course_id: any, data: any) {
const result: any = await fetch(`${getAPIUrl()}chapters/meta/course_${course_id}`, RequestBody("PUT", data)) const result: any = await fetch(`${getAPIUrl()}chapters/meta/course_${course_id}`, RequestBody("PUT", data));
.then((result) => result.json()) const res = await errorHandling(result);
.catch((error) => console.log("error", error)); return res;
return result;
} }
export async function createChapter(data: any, course_id: any) { export async function createChapter(data: any, course_id: any) {
const result: any = await fetch(`${getAPIUrl()}chapters/?course_id=course_${course_id}`, RequestBody("POST", data)) const result: any = await fetch(`${getAPIUrl()}chapters/?course_id=course_${course_id}`, RequestBody("POST", data));
.then((result) => result.json()) const res = await errorHandling(result);
.catch((error) => console.log("error", error));
return result; return res;
} }
export async function deleteChapter(coursechapter_id: any) { export async function deleteChapter(coursechapter_id: any) {
const result: any = await fetch(`${getAPIUrl()}chapters/${coursechapter_id}`, RequestBody("DELETE", null)) const result: any = await fetch(`${getAPIUrl()}chapters/${coursechapter_id}`, RequestBody("DELETE", null));
.then((result) => result.json()) const res = await errorHandling(result);
.catch((error) => console.log("error", error)); return res;
return result;
} }

View file

@ -1,5 +1,5 @@
import { getAPIUrl } from "../config/config"; import { getAPIUrl } from "../config/config";
import { RequestBody } from "../utils/requests"; import { RequestBody } from "../utils/ts/requests";
/* /*
This file includes only POST, PUT, DELETE requests This file includes only POST, PUT, DELETE requests

View file

@ -1,5 +1,5 @@
import { getAPIUrl } from "@services/config/config"; import { getAPIUrl } from "@services/config/config";
import { RequestBody, RequestBodyForm } from "@services/utils/requests"; import { RequestBody, RequestBodyForm } from "@services/utils/ts/requests";
/* /*
This file includes only POST, PUT, DELETE requests This file includes only POST, PUT, DELETE requests

View file

@ -1,5 +1,5 @@
import { getAPIUrl } from "@services/config/config"; import { getAPIUrl } from "@services/config/config";
import { RequestBody } from "../utils/requests"; import { RequestBody } from "../utils/ts/requests";
/* /*
This file includes only POST, PUT, DELETE requests This file includes only POST, PUT, DELETE requests

View file

@ -1,5 +1,5 @@
import { getAPIUrl } from "@services/config/config"; import { getAPIUrl } from "@services/config/config";
import { RequestBody } from "@services/utils/requests"; import { RequestBody } from "@services/utils/ts/requests";
/* /*
This file includes only POST, PUT, DELETE requests This file includes only POST, PUT, DELETE requests

View file

@ -1,5 +1,5 @@
import { getAPIUrl } from "@services/config/config"; import { getAPIUrl } from "@services/config/config";
import { RequestBody } from "@services/utils/requests"; import { RequestBody } from "@services/utils/ts/requests";
/* /*
This file includes only POST, PUT, DELETE requests This file includes only POST, PUT, DELETE requests

View file

@ -1,5 +1,5 @@
import { getAPIUrl } from "@services/config/config"; import { getAPIUrl } from "@services/config/config";
import { RequestBody } from "@services/utils/requests"; import { RequestBody } from "@services/utils/ts/requests";
/* /*
This file includes only POST, PUT, DELETE requests This file includes only POST, PUT, DELETE requests

View file

@ -0,0 +1,14 @@
import { AppRouterInstance } from "next/dist/shared/lib/app-router-context";
import { NextRouter } from "next/router";
export const denyAccessToUser = (error : any, router: AppRouterInstance) => {
if (error.status === 401) {
router.push("/login");
}
if (error.status === 403) {
router.push("/login");
// TODO : add a message to the user to tell him he is not allowed to access this page, route to /error
}
}

View file

@ -1,3 +1,6 @@
import { AppRouterInstance } from "next/dist/shared/lib/app-router-context";
import { denyAccessToUser } from "../react/middlewares/views";
export const RequestBody = (method: string, data: any) => { export const RequestBody = (method: string, data: any) => {
let HeadersConfig = new Headers({ "Content-Type": "application/json" }); let HeadersConfig = new Headers({ "Content-Type": "application/json" });
let options: any = { let options: any = {
@ -24,7 +27,7 @@ export const RequestBodyForm = (method: string, data: any) => {
return options; return options;
}; };
export const swrFetcher = async (url: string, body: any) => { export const swrFetcher = async (url: string, body: any, router?: AppRouterInstance) => {
// Create the request options // Create the request options
let HeadersConfig = new Headers({ "Content-Type": "application/json" }); let HeadersConfig = new Headers({ "Content-Type": "application/json" });
let options: any = { let options: any = {
@ -39,15 +42,25 @@ export const swrFetcher = async (url: string, body: any) => {
options.body = JSON.stringify(body); options.body = JSON.stringify(body);
} }
// Fetch the data try {
const res = await fetch(url, options); // Fetch the data
const request = await fetch(url, options);
let res = errorHandling(request);
// If the response is not in the 200 range, throw an error // Return the data
return res;
} catch (error: any) {
if (router) {
denyAccessToUser(error, router);
}
}
};
export const errorHandling = (res: any) => {
if (!res.ok) { if (!res.ok) {
const error = new Error("An error occurred while fetching the data."); const error: any = new Error(`Error ${res.status}: ${res.statusText}`, {});
error.status = res.status;
throw error; throw error;
} }
// Return the data
return res.json(); return res.json();
}; };