diff --git a/src/app/api/login/route.ts b/src/app/api/login/route.ts index 3afca94..38341b5 100644 --- a/src/app/api/login/route.ts +++ b/src/app/api/login/route.ts @@ -23,8 +23,6 @@ export async function POST(req: Request) { }); if (user && bcryptjs.compareSync(password, user.passwordHash)) { - // todo remove password from returned user - // get user and relations user = await prisma.user.findUnique({ where: { id: user.id }, @@ -42,6 +40,7 @@ export async function POST(req: Request) { }, }, }); + const { passwordHash, ...userSansHash } = user!; const secret = new TextEncoder().encode(env.JWT_SECRET_KEY); const token = await new SignJWT({ userId: user!.id }) @@ -49,7 +48,7 @@ export async function POST(req: Request) { .setExpirationTime("2w") .sign(secret); - const response = NextResponse.json({ message: "Login successful!", user, token }, { status: 200 }); + const response = NextResponse.json({ message: "Login successful!", user: userSansHash, token }, { status: 200 }); response.cookies.set("jwt", token, { httpOnly: true, secure: process.env.NODE_ENV === "production", diff --git a/src/app/api/get-user/route.ts b/src/app/api/user/route.ts similarity index 85% rename from src/app/api/get-user/route.ts rename to src/app/api/user/route.ts index 0904559..a6da762 100644 --- a/src/app/api/get-user/route.ts +++ b/src/app/api/user/route.ts @@ -4,7 +4,7 @@ import { env } from "@utils/env"; import { verifyJwt } from "@utils/verifyJwt"; import { prisma } from "@utils/prisma"; -export async function POST(req: Request) { +export async function GET() { let cookieStore; try { cookieStore = await cookies(); @@ -14,18 +14,19 @@ export async function POST(req: Request) { const payload = await verifyJwt({ token, secret: env.JWT_SECRET_KEY }); const user = await prisma.user.findUnique({ - where: { id: payload.userId }, + where: { id: payload.userId as number }, include: { + earthquakes: true, + observatories: true, + artefacts: true, + purchasedOrders: true, + requests: true, scientist: { include: { - earthquakes: true, - observatories: true, - artefacts: true, superior: true, subordinates: true, }, }, - purchasedArtefacts: true, }, }); diff --git a/src/app/layout.tsx b/src/app/layout.tsx index 9ed4308..0a30c39 100644 --- a/src/app/layout.tsx +++ b/src/app/layout.tsx @@ -1,4 +1,5 @@ "use client"; +import useSWR from "swr"; import axios from "axios"; import { useEffect } from "react"; import type { Metadata } from "next"; @@ -10,6 +11,7 @@ import { Inter } from "next/font/google"; import { StoreModel } from "@appTypes/StoreModel"; import Navbar from "@components/Navbar"; +import { fetcher } from "@utils/axiosHelpers"; const inter = Inter({ subsets: ["latin"], @@ -34,25 +36,17 @@ const store = createStore({ function UserFetcher() { const setUser = useStoreActions((actions) => actions.setUser); + const { data, error } = useSWR("/api/user", fetcher); useEffect(() => { - async function fetchUser() { - try { - const response = await axios.post("/api/get-user"); - if (response.status === 200 && response.data.user) { - setUser(response.data.user); - } else { - setUser(null); // Clear user if no user found - } - } catch (error) { - console.error("Error fetching user:", error); - setUser(null); - } - } - fetchUser(); - }, [setUser]); // Run once on mount + data && data.user && setUser(data.user); + }, [setUser, data]); - return null; // No UI needed + useEffect(() => { + error && error.status === 401 && setUser(null); + }, [setUser, error]); + + return null; } export default function RootLayout({ children, @@ -66,7 +60,7 @@ export default function RootLayout({
{children}
- + );