import { ADMIN_USERNAME } from "../constants.ts"; import { db } from "../db"; import { redirect } from "../lib/redirect.ts"; export interface SessionUser { id: number; username: string; isAdmin: boolean; avatar_version: number; } export async function resolveSession( cookie: string | undefined, ): Promise { if (!cookie) return null; const now = new Date().toISOString(); const session = await db .selectFrom("sessions") .innerJoin("users", "users.id", "sessions.user_id") .select([ "users.id", "users.username", "users.avatar_version", "sessions.expires_at", ]) .where("sessions.id", "=", cookie) .where("sessions.expires_at", ">", now) .where("users.is_pending", "=", 0) .executeTakeFirst(); if (!session) return null; return { id: session.id, username: session.username, isAdmin: session.username === ADMIN_USERNAME, avatar_version: session.avatar_version, }; } export function requireAuth(user: SessionUser | null): Response | null { return user ? null : redirect("/login"); } export function requireAdmin(user: SessionUser | null): Response | null { if (!user) return redirect("/login"); if (!user.isAdmin) { return new Response("Forbidden", { status: 403, headers: { "Content-Type": "text/plain; charset=utf-8" }, }); } return null; }