45 lines
1.0 KiB
TypeScript
Executable File
45 lines
1.0 KiB
TypeScript
Executable File
import { db } from "@/lib/prisma";
|
|
import { UserRole } from "@prisma/client";
|
|
import { logger } from "@/lib/logger";
|
|
import { supabaseServer } from "@/lib/supabase/server";
|
|
|
|
export async function requireTeacher() {
|
|
const supabase = await supabaseServer();
|
|
if (!supabase) {
|
|
return null;
|
|
}
|
|
|
|
const {
|
|
data: { user },
|
|
} = await supabase.auth.getUser();
|
|
|
|
if (!user) {
|
|
return null; // Let the caller handle the redirect
|
|
}
|
|
|
|
const profile = await db.profile.findUnique({
|
|
where: { id: user.id },
|
|
}).catch((error) => {
|
|
logger.error("Failed to load profile in requireTeacher", {
|
|
userId: user.id,
|
|
email: user.email,
|
|
error: error instanceof Error ? error.message : "unknown",
|
|
});
|
|
return null;
|
|
});
|
|
|
|
if (
|
|
!profile ||
|
|
(profile.role !== UserRole.TEACHER && profile.role !== UserRole.SUPER_ADMIN)
|
|
) {
|
|
logger.info("User authenticated but not authorized as teacher", {
|
|
userId: user.id,
|
|
email: user.email,
|
|
role: profile?.role ?? "none",
|
|
});
|
|
return null;
|
|
}
|
|
|
|
return profile;
|
|
}
|