34 lines
1.1 KiB
TypeScript
Executable File
34 lines
1.1 KiB
TypeScript
Executable File
import { createServerClient } from "@supabase/ssr";
|
|
import { cookies } from "next/headers";
|
|
import { db } from "@/lib/prisma";
|
|
import { UserRole } from "@prisma/client";
|
|
|
|
export async function requireUser() {
|
|
const cookieStore = await cookies();
|
|
const supabase = createServerClient(
|
|
process.env.NEXT_PUBLIC_SUPABASE_URL!,
|
|
process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY!,
|
|
{ cookies: { getAll() { return cookieStore.getAll() } } }
|
|
);
|
|
|
|
const { data: { user } } = await supabase.auth.getUser();
|
|
if (!user) return null;
|
|
|
|
const profile = await db.profile.findUnique({ where: { id: user.id } }).catch((error) => {
|
|
console.error("Failed to load profile for authenticated user.", error);
|
|
return null;
|
|
});
|
|
if (profile) return profile;
|
|
|
|
// Keep authenticated flows working even if profile lookup fails.
|
|
return {
|
|
id: user.id,
|
|
email: user.email ?? "unknown@acve.local",
|
|
fullName: (user.user_metadata?.full_name as string | undefined) ?? null,
|
|
avatarUrl: null,
|
|
role: UserRole.LEARNER,
|
|
createdAt: new Date(0),
|
|
updatedAt: new Date(0),
|
|
};
|
|
}
|