44 lines
1.2 KiB
TypeScript
44 lines
1.2 KiB
TypeScript
import { headers } from "next/headers";
|
|
import { cache } from "react";
|
|
import { auth } from "./auth";
|
|
import { prisma } from "@/lib/types/prisma";
|
|
|
|
/**
|
|
* Get the current session in a Server Component or Server Action
|
|
*
|
|
* Best practices:
|
|
* - Cached to avoid multiple lookups in the same request
|
|
* - Includes user role from database
|
|
* - Returns null if not authenticated
|
|
* - Use this in Server Components and Server Actions
|
|
*
|
|
* @returns The session object with user role or null if not authenticated
|
|
*/
|
|
export const getServerSession = cache(async () => {
|
|
try {
|
|
const session = await auth.api.getSession({ headers: await headers() });
|
|
|
|
if (!session || !session.user) {
|
|
return null;
|
|
}
|
|
|
|
// Fetch role from database if not in session
|
|
// Better Auth's session cache may not include custom fields
|
|
if (!session.user.role) {
|
|
const dbUser = await prisma.user.findUnique({
|
|
where: { id: session.user.id },
|
|
select: { role: true },
|
|
});
|
|
|
|
if (dbUser) {
|
|
session.user.role = dbUser.role || "patient";
|
|
}
|
|
}
|
|
|
|
return session;
|
|
} catch (error) {
|
|
console.error("[getServerSession] Error:", error);
|
|
return null;
|
|
}
|
|
});
|