From 276b27b99cd4f9924f9eb5a9f0e147ae40f1a3a4 Mon Sep 17 00:00:00 2001
From: Sean Quiambao <91030482+toastmeal@users.noreply.github.com>
Date: Fri, 20 Sep 2024 02:52:17 -0700
Subject: [PATCH] converted protected page to RSC, may need to do some fixing
with error page + redirecting
---
src/app/admin/[type]/page.js | 1 -
src/components/ProtectedPage.jsx | 143 +++++++++++-------
src/components/admin/services/timer/Timer.tsx | 1 +
src/middleware.ts | 13 ++
4 files changed, 104 insertions(+), 54 deletions(-)
create mode 100644 src/middleware.ts
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" &&