import { TRPCError, initTRPC } from '@trpc/server' import { Context } from './context' import { OpenApiMeta } from 'trpc-openapi' import superjson from 'superjson' import * as Sentry from '@sentry/nextjs' import { ZodError } from 'zod' const t = initTRPC .context() .meta() .create({ transformer: superjson, errorFormatter({ shape, error }) { return { ...shape, data: { ...shape.data, zodError: error.cause instanceof ZodError ? error.cause.flatten() : null, }, } }, }) const sentryMiddleware = t.middleware( Sentry.Handlers.trpcMiddleware({ attachRpcInput: true, }) ) const isAuthed = t.middleware(({ next, ctx }) => { if (!ctx.user?.id) { throw new TRPCError({ code: 'UNAUTHORIZED', }) } return next({ ctx: { user: ctx.user, }, }) }) const finalMiddleware = sentryMiddleware.unstable_pipe(isAuthed) export const middleware = t.middleware export const router = t.router export const publicProcedure = t.procedure.use(sentryMiddleware) export const authenticatedProcedure = t.procedure.use(finalMiddleware)