import type { UserRole } from "@/server/auth/permissions"; import { db } from "@/server/db"; import { sessions, users } from "@/server/db/schema"; import { DrizzleSQLiteAdapter } from "@lucia-auth/adapter-drizzle"; import { Lucia, type RegisteredDatabaseUserAttributes, type Session } from "lucia"; import { cookies } from "next/headers"; import { cache } from "react"; //@ts-ignore const adapter = new DrizzleSQLiteAdapter(db, sessions, users); export const lucia = new Lucia(adapter, { sessionCookie: { expires: false, attributes: { secure: process.env.NODE_ENV === "production", }, }, getUserAttributes: (attributes) => { return { id: attributes.id, username: attributes.username, displayName: attributes.displayName, email: attributes.email, role: attributes.role, }; }, }); export const validateRequest = cache( async (): Promise<{ user: RegisteredDatabaseUserAttributes; session: Session } | { user: null; session: null }> => { const sessionId = cookies().get(lucia.sessionCookieName)?.value ?? null; if (!sessionId) { return { user: null, session: null, }; } const result = await lucia.validateSession(sessionId); // next.js throws when you attempt to set cookie when rendering page try { if (result.session?.fresh) { const sessionCookie = lucia.createSessionCookie(result.session.id); cookies().set(sessionCookie.name, sessionCookie.value, sessionCookie.attributes); } if (!result.session) { const sessionCookie = lucia.createBlankSessionCookie(); cookies().set(sessionCookie.name, sessionCookie.value, sessionCookie.attributes); } } catch {} return result as { user: RegisteredDatabaseUserAttributes; session: Session; }; }, ); declare module "lucia" { interface Register { Lucia: typeof Lucia; DatabaseUserAttributes: { id: string; github_id: number; username: string; displayName: string; email: string; role: UserRole; }; } }