import { initTRPC, TRPCError } from "@trpc/server"; import type { Context } from "./context"; import type { Permission } from "./permissions"; export const t = initTRPC.context().create(); export const router = t.router; export const publicProcedure = t.procedure; export const protectedProcedure = t.procedure.use(({ ctx, next }) => { if (!ctx.session) { throw new TRPCError({ code: "UNAUTHORIZED", message: "Authentication required", cause: "No session", }); } return next({ ctx: { ...ctx, session: ctx.session, }, }); }); export function requirePermission(permission: Permission) { return t.middleware(({ ctx, next }) => { if (!ctx.session) { throw new TRPCError({ code: "UNAUTHORIZED", message: "Authentication required", cause: "No session", }); } if (!ctx.authorization.permissions.includes(permission)) { throw new TRPCError({ code: "FORBIDDEN", message: `Missing permission: ${permission}`, }); } return next({ ctx: { ...ctx, session: ctx.session, }, }); }); } export function permissionedProcedure(permission: Permission) { return t.procedure.use(requirePermission(permission)); }