tRPC Server Setup
Complete tRPC server with context, middleware, and procedures
import { initTRPC, TRPCError } from '@trpc/server';
import { z } from 'zod';
import { db } from './db';
// Context creation
export const createContext = async ({ req }: { req: Request }) => {
const token = req.headers.get('authorization')?.replace('Bearer ', '');
const user = token ? await verifyToken(token) : null;
return {
db,
user,
};
};
type Context = Awaited<ReturnType<typeof createContext>>;
const t = initTRPC.context<Context>().create();
// Middleware
const isAuthed = t.middleware(({ ctx, next }) => {
if (!ctx.user) {
throw new TRPCError({ code: 'UNAUTHORIZED' });
}
return next({
ctx: {
user: ctx.user,
},
});
});
// Procedures
export const publicProcedure = t.procedure;
export const protectedProcedure = t.procedure.use(isAuthed);
// Router
export const appRouter = t.router({
users: t.router({
list: publicProcedure.query(async ({ ctx }) => {
return ctx.db.user.findMany();
}),
create: protectedProcedure
.input(
z.object({
name: z.string().min(3),
email: z.string().email(),
})
)
.mutation(async ({ ctx, input }) => {
return ctx.db.user.create({
data: input,
});
}),
}),
});
export type AppRouter = typeof appRouter;