From b69576db246b9b6be0e42078a55ebeb04a5adc5b Mon Sep 17 00:00:00 2001 From: Atul Gunjal Date: Tue, 11 Feb 2025 12:25:54 +0530 Subject: [PATCH] second commit --- my-nextjs-app/src/app/dashboard/page.js | 40 ++++++++++++++++++--- my-nextjs-app/src/app/login/page.js | 30 +++++----------- my-nextjs-app/src/lib/auth.js | 8 +++-- my-nextjs-app/src/lib/roles.js | 16 +++++++++ my-nextjs-app/src/middlewares/middleware.js | 14 ++++++++ 5 files changed, 79 insertions(+), 29 deletions(-) create mode 100644 my-nextjs-app/src/lib/roles.js create mode 100644 my-nextjs-app/src/middlewares/middleware.js diff --git a/my-nextjs-app/src/app/dashboard/page.js b/my-nextjs-app/src/app/dashboard/page.js index e175f55..ab8a61f 100644 --- a/my-nextjs-app/src/app/dashboard/page.js +++ b/my-nextjs-app/src/app/dashboard/page.js @@ -1,19 +1,38 @@ "use client"; import { useEffect, useState } from "react"; import { supabase } from "@/lib/supabase"; +import { getUserRole } from "@/lib/roles"; import { useRouter } from "next/navigation"; export default function Dashboard() { const [user, setUser] = useState(null); + const [role, setRole] = useState("read"); // Default role const router = useRouter(); useEffect(() => { - const checkUser = async () => { - const { data: user } = await supabase.auth.getUser(); - if (!user) router.push("/login"); - else setUser(user); + const fetchUserData = async () => { + const { data: { session }, error } = await supabase.auth.getSession(); + console.log("Session:", session); + + if (error || !session?.user) { + console.error("Session error:", error); + router.push("/login"); + return; + } + + setUser(session.user); + + try { + const userRole = await getUserRole(session.user.id); + console.log("User Role:", userRole); + setRole(userRole); + } catch (error) { + console.error("Error fetching role:", error); + setRole("read"); // Default to read-only + } }; - checkUser(); + + fetchUserData(); }, []); const handleLogout = async () => { @@ -24,6 +43,17 @@ export default function Dashboard() { return (

Welcome, {user?.email || "Guest"}!

+

Your Role: {role}

+ + {/* Conditional rendering based on role */} + {role === "write" && ( +
+

Editable Content

+ + +
+ )} + diff --git a/my-nextjs-app/src/app/login/page.js b/my-nextjs-app/src/app/login/page.js index 5b3288c..2e11fb3 100644 --- a/my-nextjs-app/src/app/login/page.js +++ b/my-nextjs-app/src/app/login/page.js @@ -10,14 +10,14 @@ export default function Login() { const handleSignUp = async () => { const { error } = await supabase.auth.signUp({ email, password }); - if (error) alert(error.message); - else alert("Check your email for confirmation!"); + error ? alert(error.message) : alert("Check your email for confirmation!"); }; const handleSignIn = async () => { const { error } = await supabase.auth.signInWithPassword({ email, password }); - if (error) alert(error.message); - else { + if (error) { + alert(error.message); + } else { alert("Logged in successfully!"); router.push("/dashboard"); } @@ -27,24 +27,10 @@ export default function Login() {

Login / Sign Up

- setEmail(e.target.value)} - /> - setPassword(e.target.value)} - /> - - + setEmail(e.target.value)} /> + setPassword(e.target.value)} /> + +
); diff --git a/my-nextjs-app/src/lib/auth.js b/my-nextjs-app/src/lib/auth.js index 629421a..0a10b01 100644 --- a/my-nextjs-app/src/lib/auth.js +++ b/my-nextjs-app/src/lib/auth.js @@ -1,11 +1,15 @@ import { supabase } from "./supabase"; export const getUser = async () => { - const { data: user } = await supabase.auth.getUser(); + const { data: user, error } = await supabase.auth.getUser(); + if (error) { + console.error("Error fetching user:", error); + return null; + } return user; }; export const logout = async () => { await supabase.auth.signOut(); - window.location.href = "/login"; + window.location.href = "/login"; // Redirect to login after logout }; diff --git a/my-nextjs-app/src/lib/roles.js b/my-nextjs-app/src/lib/roles.js new file mode 100644 index 0000000..b6c25f4 --- /dev/null +++ b/my-nextjs-app/src/lib/roles.js @@ -0,0 +1,16 @@ +import { supabase } from "./supabase"; + +export const getUserRole = async (userId) => { + const { data, error } = await supabase + .from("user_roles") + .select("role") + .eq("user_id", userId) + .maybeSingle(); + + if (error) { + console.error("Error fetching role:", error); + return "read"; // Default role if there's an error + } + + return data?.role || "read"; // Default to "read" if no role is found +}; diff --git a/my-nextjs-app/src/middlewares/middleware.js b/my-nextjs-app/src/middlewares/middleware.js new file mode 100644 index 0000000..5f1649f --- /dev/null +++ b/my-nextjs-app/src/middlewares/middleware.js @@ -0,0 +1,14 @@ +import { NextResponse } from "next/server"; +import { supabase } from "./lib/supabase"; + +export async function middleware(req) { + const { data } = await supabase.auth.getUser(); + if (!data?.user) { + return NextResponse.redirect(new URL("/login", req.url)); + } + return NextResponse.next(); +} + +export const config = { + matcher: ["./dashboard"], // Protect the dashboard route +};