import { initTRPC, TRPCError } from '@trpc/server'; import { z } from 'zod'; import type { TRPCContext } from './types'; // Initialize tRPC with context const t = initTRPC.context().create(); // Middleware for authentication const isAuthenticated = t.middleware(({ ctx, next }) => { if (!ctx.userId) { throw new TRPCError({ code: 'UNAUTHORIZED', message: 'User not authenticated' }); } return next({ ctx: { ...ctx, userId: ctx.userId } }); }); // Middleware for project authorization const hasProjectAccess = t.middleware(({ ctx, next }) => { const projectId = ctx.projectId; if (!projectId) { throw new TRPCError({ code: 'FORBIDDEN', message: 'Project access required' }); } return next({ ctx: { ...ctx, projectId } }); }); // Base router export const baseRouter = t.router; // Procedure builders export const publicProcedure = t.procedure; export const protectedProcedure = t.procedure.use(isAuthenticated); export const projectProcedure = t.procedure.use(hasProjectAccess); // Validation middleware export const validateInput = (schema: T) => { return t.middleware(({ input, next }) => { const validated = schema.parse(input); return next({ input: validated }); }); }; export { t, TRPCError };