import { initTRPC, TRPCError } from "@trpc/server"; import { ZodError } from "zod"; import { Context, createContext } from "./context"; import { auth, currentUser } from "@clerk/nextjs/server"; import { db } from "@/database/db"; import { areas, eventsLog, eventType, floor, materials, project, projectMaterials, } from "@/database/schema"; import { eq, SQL, sql, sum } from "drizzle-orm"; import { removeLocalOffsetFromDate } from "@/lib/utils"; import { extractPayload, getCookie, VARIABLES_CONFIG } from "@/lib/db/util"; const t = initTRPC.context().create({ errorFormatter(opts) { const { shape, error } = opts; return { ...shape, data: { ...shape.data, zodError: error.code === "BAD_REQUEST" && error.cause instanceof ZodError ? error.cause.flatten() : null, }, }; }, }); //reusable middleware that verifies user is admin before signin export const isAdminMiddleware = t.middleware(async (opts) => { const { sessionClaims, userId } = auth(); const { ctx, next } = opts; const verificationToken = getCookie( VARIABLES_CONFIG.VERIFICATION_TOKEN! )?.value; const payload = verificationToken ? extractPayload(verificationToken):null const authUser = { userId: userId as string, rol: sessionClaims?.metadata.role || payload?.role }; if (authUser?.rol !== "admin") { throw new Error("Solo un administrador puede hacer esta acción"); } return next({ ctx: { user: authUser, }, }); }); //reusable middleware, verifies user is signin export const isSigninMiddleware = t.middleware(async ({ ctx, next }) => { const { sessionClaims, userId } = auth(); //fix error, context not working on mutations, only on queries, ensure user data is path in both. const authUser = { userId: userId as string, rol: sessionClaims?.metadata.role , }; if (!authUser?.userId) { throw new TRPCError({ code: "UNAUTHORIZED", message: "User must be signed in", }); } return next({ ctx: { user: authUser, }, }); }); export const createLogRecord = async ( tx: typeof db, values: any ) => { const { eventType, userId, oldValues, newValues, modifiedItem, tableName } = values; try { const values: any = { eventType, userId, modifiedItem, tableName, }; if (oldValues) { values.oldValues = sql`${oldValues}::jsonb`; } if (newValues) { values.newValues = sql`${newValues}::jsonb`; } await tx.insert(eventsLog).values(values); } catch (err) { console.log("err", err); throw new Error("Error al crear log record"); } }; export const router = t.router; export const publicProcedure = t.procedure;