import 'server-only'; import { cookies } from 'next/headers'; import { JwtPayload, verify } from 'jsonwebtoken'; import { eq, InferSelectModel } from 'drizzle-orm'; import { db } from '@/lib/db/drizzle'; import { usersTable } from '@/lib/db/schema'; import { Permission } from '@/lib/enums'; interface TokenData extends JwtPayload { id: string; } export const getSessionToken = async () => { const cookie = (await cookies()).get( process.env.NEXT_PUBLIC_COOKIE || 'tcf_token' )?.value; if (!cookie) return undefined; return cookie; }; export const userAuthorized = async ( permissions: Permission[] ): Promise => { const token = await getSessionToken(); if (!token) return false; try { const data = verify(token, process.env.JWT_SECRET!) as TokenData; const user = await db .select({ permissions: usersTable.permissions }) .from(usersTable) .where(eq(usersTable.id, BigInt(data.id))) .limit(1); if (user.length !== 1) return false; const required = permissions.reduce((acc, p) => acc | p, 0); return (user[0].permissions & required) === required; } catch (_: unknown) { return false; } }; export const getUser = async (): Promise< InferSelectModel | undefined > => { const token = await getSessionToken(); if (!token) return undefined; try { const data = verify(token, process.env.JWT_SECRET!) as TokenData; const user = await db .select() .from(usersTable) .where(eq(usersTable.id, BigInt(data.id))) .limit(1); if (user.length !== 1) return undefined; return user[0]; } catch (_: unknown) { return undefined; } };