minmon/packages/api/src/index.ts

56 lines
1.3 KiB
TypeScript

import { initTRPC, TRPCError } from "@trpc/server";
import type { Context } from "./context";
import type { Permission } from "./permissions";
export const t = initTRPC.context<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));
}