diff --git a/src/app/admin/[type]/page.js b/src/app/admin/[type]/page.js index 82dec4c2b..35f74757e 100644 --- a/src/app/admin/[type]/page.js +++ b/src/app/admin/[type]/page.js @@ -1,4 +1,3 @@ -"use client"; import ProtectedPage from "@/components/ProtectedPage"; import Admins from "@/components/admin/dashboards/Admins"; import Events from "@/components/admin/services/calendar"; diff --git a/src/components/ProtectedPage.jsx b/src/components/ProtectedPage.jsx index 0d9b51b19..45a92e971 100644 --- a/src/components/ProtectedPage.jsx +++ b/src/components/ProtectedPage.jsx @@ -1,69 +1,106 @@ -"use client"; -import { useEffect, useState } from "react"; -import { signIn, useSession } from "next-auth/react"; -import Loading from "@/components/Loading"; -import { usePathname } from "next/navigation"; import RELEASES from "@/data/Releases"; import Fault from "@/utils/error"; import Navigation from "@/components/Navigation"; +import { headers } from "next/headers"; +import { redirect } from "next/navigation"; +import { getSession } from "@/utils/auth"; -const ProtectedPage = ({ children, restrictions, title }) => { - const { data: session, status } = useSession(); - const [confirmed, setConfirmed] = useState(false); - - const pathName = usePathname(); - - useEffect(() => { - if (RELEASES[pathName] > new Date()) { - throw new Fault( - 423, - "Locked Resource", - "This resource has not been released", - ); - } - - if (status === "loading") return; - if (status !== "authenticated") { - void signIn("google"); - return; - } - - if (!session.user.roles && Object.keys(restrictions).length > 0) { - throw new Fault( - 403, - "Unauthorized", - "You do not have any assigned roles", - ); - } - - const authorized = Object.entries(restrictions).some(([key, values]) => - Array.isArray(values) - ? values.includes(session.user.roles[key]) - : session.user.roles[key] === values, +const ProtectedPage = async ({ children, restrictions, title }) => { + const session = await getSession(); + const header = headers(); + const pathName = header.get("x-url") || ""; + + if (!session) { + redirect(`/api/auth/signin/google?callbackUrl=${pathName}`); + } + + if (RELEASES[pathName] > new Date()) { + throw new Fault( + 423, + "Locked Resource", + "This resource has not been released", ); + } + + if (!session.user.roles && Object.keys(restrictions).length > 0) { + throw new Fault(403, "Unauthorized", "You do not have any assigned roles"); + } - if (!authorized && Object.keys(restrictions).length > 0) { - throw new Fault(403, "Unauthorized", "You do not have access this page"); - } - setConfirmed(true); - }, [status]); + console.log("session:", session.user.roles); + const authorized = Object.entries(restrictions).some(([key, values]) => + Array.isArray(values) + ? values.includes(session.user.roles[key]) + : session.user.roles[key] === values, + ); + + if (!authorized && Object.keys(restrictions).length > 0) { + throw new Fault(403, "Unauthorized", "You do not have access this page"); + } const navigation = RegExp(/user\/|admin\//).test(pathName); return ( <> - {status === "loading" && } - {confirmed && ( - <> - {title} - {navigation && } -
-
{children}
-
- - )} + {title} + {navigation && } +
+
{children}
+
); }; export default ProtectedPage; + +// delete later +// useEffect(() => { +// if (RELEASES[pathName] > new Date()) { +// throw new Fault( +// 423, +// "Locked Resource", +// "This resource has not been released", +// ); +// } + +// if (status === "loading") return; +// if (status !== "authenticated") { +// void signIn("google"); +// return; +// } + +// if (!session.user.roles && Object.keys(restrictions).length > 0) { +// throw new Fault( +// 403, +// "Unauthorized", +// "You do not have any assigned roles", +// ); +// } + +// const authorized = Object.entries(restrictions).some(([key, values]) => +// Array.isArray(values) +// ? values.includes(session.user.roles[key]) +// : session.user.roles[key] === values, +// ); + +// if (!authorized && Object.keys(restrictions).length > 0) { +// throw new Fault(403, "Unauthorized", "You do not have access this page"); +// } +// setConfirmed(true); +// }, [status]); + +// const navigation = RegExp(/user\/|admin\//).test(pathName); + +// return ( +// <> +// {status === "loading" && } +// {confirmed && ( +// <> +// {title} +// {navigation && } +//
+//
{children}
+//
+// +// )} +// +// ); diff --git a/src/components/admin/services/timer/Timer.tsx b/src/components/admin/services/timer/Timer.tsx index 16106ef6c..6b3c59f74 100644 --- a/src/components/admin/services/timer/Timer.tsx +++ b/src/components/admin/services/timer/Timer.tsx @@ -1,3 +1,4 @@ +"use client"; import { useState } from "react"; import Clock from "./Clock"; import { v4 as uuidv4 } from "uuid"; diff --git a/src/middleware.ts b/src/middleware.ts new file mode 100644 index 000000000..919c75e6d --- /dev/null +++ b/src/middleware.ts @@ -0,0 +1,13 @@ +import { NextResponse } from "next/server"; +import type { NextRequest } from "next/server"; + +export function middleware(request: NextRequest) { + const requestHeaders = new Headers(request.headers); + requestHeaders.set("x-url", request.nextUrl.pathname); + + return NextResponse.next({ + request: { + headers: requestHeaders, + }, + }); +}