diff --git a/app/(main)/create-team/page.js b/app/(main)/create-team/page.js index 156d301..0695a78 100644 --- a/app/(main)/create-team/page.js +++ b/app/(main)/create-team/page.js @@ -43,7 +43,10 @@ export default function CreateTeam() { try { const response = await fetch("/api/teams", { method: "POST", - headers: { "Content-Type": "application/json" }, + headers: { + "Content-Type": "application/json", + }, + credentials: "include", // Important for cookies body: JSON.stringify({ name: teamName }), }); @@ -53,7 +56,24 @@ export default function CreateTeam() { throw new Error(data.error || "Failed to create team"); } - router.push(`/team/${data.teamId}`); + // Force a session update to get the new teamId + try { + // Update the client-side session data with the new teamId + if (session && session.user) { + session.user.teamId = data.teamId; + } + + console.log("Team created successfully, redirecting to:", `/team/${data.teamId}`); + + // Add a small delay to allow session update + setTimeout(() => { + router.push(`/team/${data.teamId}`); + }, 100); + } catch (navError) { + console.error("Navigation error:", navError); + // Fallback to direct navigation + window.location.href = `/team/${data.teamId}`; + } } catch (err) { setError(err.message); setIsLoading(false); diff --git a/app/(main)/team/[teamId]/page.js b/app/(main)/team/[teamId]/page.js index cef2740..10cb789 100644 --- a/app/(main)/team/[teamId]/page.js +++ b/app/(main)/team/[teamId]/page.js @@ -19,6 +19,8 @@ export default function TeamPage({ params }) { throw new Error("Invalid team ID"); } + console.log("Fetching team data for team ID:", teamId); + const response = await fetch(`/api/teams/${teamId}`, { method: "GET", headers: { @@ -46,6 +48,7 @@ export default function TeamPage({ params }) { throw new Error("Team not found"); } + console.log("Team data fetched successfully:", data); setTeam(data.team); setTeamMembers(data.members || []); setError(""); @@ -62,12 +65,17 @@ export default function TeamPage({ params }) { }, [teamId, router]); useEffect(() => { + // Only attempt to fetch data when session is ready and we have a teamId if (status === "authenticated" && teamId) { + console.log("Session authenticated, fetching team data"); fetchTeamData(); const interval = setInterval(fetchTeamData, 5000); // Refresh every 5 seconds return () => clearInterval(interval); } else if (status === "unauthenticated") { + console.log("User not authenticated, redirecting to login"); router.push("/login"); + } else { + console.log("Waiting for session...", status); } }, [teamId, status, fetchTeamData, router]); diff --git a/app/(main)/team/[teamId]/route.js b/app/(main)/team/[teamId]/route.js index 89ac0a3..bf759fa 100644 --- a/app/(main)/team/[teamId]/route.js +++ b/app/(main)/team/[teamId]/route.js @@ -1,16 +1,23 @@ import { redirect } from "next/navigation"; -import { getServerSession } from "next-auth/next"; -import { authOptions } from "@/app/api/auth/[...nextauth]/route"; -import { queryOne, query } from "@/lib/db"; +import { query, queryOne } from "@/lib/db"; +import { cookies } from "next/headers"; +import { verifyToken } from "@/app/api/auth/[...nextauth]/route"; export async function GET(_, context) { - const session = await getServerSession(authOptions); - - if (!session) { - return redirect("/login"); - } - try { + // Use our custom token verification instead of getServerSession + const cookieStore = await cookies(); + const sessionToken = cookieStore.get("next-auth.session-token")?.value; + + if (!sessionToken) { + return redirect("/login"); + } + + const userData = verifyToken(sessionToken); + if (!userData) { + return redirect("/login"); + } + const params = await context.params; const teamId = params.teamId; diff --git a/app/api/teams/[teamId]/route.js b/app/api/teams/[teamId]/route.js index c94cdb7..4986a09 100644 --- a/app/api/teams/[teamId]/route.js +++ b/app/api/teams/[teamId]/route.js @@ -1,16 +1,22 @@ import { query, queryOne } from "@/lib/db"; -import { getServerSession } from "next-auth/next"; -import { authOptions } from "../../auth/[...nextauth]/route"; - -export async function GET(_, context) { - // Changed 'request' to '_' to indicate unused parameter - const session = await getServerSession(authOptions); - - if (!session) { - return Response.json({ error: "Unauthorized" }, { status: 401 }); - } +import { cookies } from "next/headers"; +import { verifyToken } from "@/app/api/auth/[...nextauth]/route"; +export async function GET(request, context) { try { + // Use our custom token verification + const cookieStore = await cookies(); + const sessionToken = cookieStore.get("next-auth.session-token")?.value; + + if (!sessionToken) { + return Response.json({ error: "Unauthorized" }, { status: 401 }); + } + + const userData = verifyToken(sessionToken); + if (!userData) { + return Response.json({ error: "Invalid session" }, { status: 401 }); + } + const teamId = context.params.teamId; // Validate teamId diff --git a/app/api/teams/route.js b/app/api/teams/route.js index 45e27e5..7e1f82b 100644 --- a/app/api/teams/route.js +++ b/app/api/teams/route.js @@ -1,49 +1,70 @@ -import { queryOne } from "@/lib/db"; -import { getServerSession } from "next-auth/next"; -import { authOptions } from "@/app/api/auth/[...nextauth]/route"; +import { queryOne, run } from "@/lib/db"; +import { cookies } from "next/headers"; +import { verifyToken } from "@/app/api/auth/[...nextauth]/route"; export async function POST(request) { - const session = await getServerSession(authOptions); - - if (!session) { - return new Response(JSON.stringify({ error: "Unauthorized" }), { - status: 401, - }); - } - try { - const { name } = await request.json(); - if (!name) { - return new Response(JSON.stringify({ error: "Team name is required" }), { - status: 400, - }); + // Use our custom token verification instead of getServerSession + const cookieStore = await cookies(); + const sessionToken = cookieStore.get("next-auth.session-token")?.value; + + if (!sessionToken) { + return Response.json({ error: "Unauthorized" }, { status: 401 }); } - const result = await queryOne( + const userData = verifyToken(sessionToken); + if (!userData) { + return Response.json({ error: "Invalid session" }, { status: 401 }); + } + + // Now we have valid user data from our custom token + const { name } = await request.json(); + if (!name) { + return Response.json({ error: "Team name is required" }, { status: 400 }); + } + + // Generate a team code (6 uppercase alphanumeric characters) + const teamCode = generateTeamCode(); + + // Insert the new team + const teamResult = await run( "INSERT INTO teams (name, code) VALUES (?, ?)", - [name, generateTeamCode()] + [name, teamCode] ); - if (!result.insertId) { + if (!teamResult.lastID) { throw new Error("Failed to create team"); } - await queryOne("UPDATE users SET team_id = ? WHERE id = ?", [ - result.insertId, - session.user.id, + // Update the user's team_id + await run("UPDATE users SET team_id = ? WHERE id = ?", [ + teamResult.lastID, + userData.id, ]); - return new Response(JSON.stringify({ teamId: result.insertId }), { - status: 201, - }); + // Return success with the team ID for redirection + return Response.json( + { + teamId: teamResult.lastID, + teamCode: teamCode, + teamName: name, + }, + { status: 201 } + ); } catch (error) { console.error("Team creation error:", error); - return new Response(JSON.stringify({ error: "Failed to create team" }), { - status: 500, - }); + return Response.json( + { error: "Failed to create team: " + error.message }, + { status: 500 } + ); } } function generateTeamCode() { - return Math.random().toString(36).substring(2, 8).toUpperCase(); + const characters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; + let result = ""; + for (let i = 0; i < 6; i++) { + result += characters.charAt(Math.floor(Math.random() * characters.length)); + } + return result; } diff --git a/clue_hunt.db b/clue_hunt.db index a94dab6..92a3476 100644 Binary files a/clue_hunt.db and b/clue_hunt.db differ