import type { MiddlewareHandler } from 'hono'; import { auth } from '@/modules/auth/auth'; import type { BackendEnv } from './env'; import { problemJson, unauthorizedProblem } from './problem-details'; export const sessionAuthMiddleware: MiddlewareHandler = async (c, next) => { if (isPublicApiRequest(c.req.method, c.req.path)) { await next(); return; } const session = await auth.api.getSession({ headers: c.req.raw.headers }); if (!session) { return problemJson(c, unauthorizedProblem(c.req.path)); } c.set('user', session.user); c.set('session', session.session); await next(); }; export function isPublicApiRequest(method: string, path: string): boolean { if (method === 'OPTIONS') { return true; } const normalizedPath = normalizePath(path); return ( normalizedPath === '/api/v1/health' || matchesPublicPrefix(normalizedPath, '/api/v1/auth') || matchesPublicPrefix(normalizedPath, '/api/auth') || matchesPublicPrefix(normalizedPath, '/api/v1/invitations') ); } function matchesPublicPrefix(path: string, prefix: string): boolean { return path === prefix || path.startsWith(`${prefix}/`); } function normalizePath(path: string): string { return path.length > 1 && path.endsWith('/') ? path.slice(0, -1) : path; }