import { router, publicProcedure, isAdminMiddleware, } from "../trpc"; import { tuple, z } from "zod"; import { createProjectSchema, updateProjectSchema, } from "@/lib/schemas/projectSchema"; import { modifyProjectCostsSchema } from "@/lib/schemas/modifyProjectCostSchema"; import { projectServiceFacade } from "../project/application/facade"; import { projectStatusEnum } from "@/database/schema"; import { v4 as uuidv4 } from "uuid"; export const paramsSchema = z.object({ range: z.string().nullable().optional(), status: projectStatusEnum .or(z.literal("all")) .transform((value) => (value === "all" ? undefined : value)).optional(), searchQuery: z.string().nullable().default(null), page: z.coerce.number().default(1), limit: z.coerce.number().default(10), includeTasks: z.boolean().optional(), includeAreas: z.boolean().optional(), includeFloor: z.boolean().optional(), }); export const projectsRouter = router({ createProject: publicProcedure .use(isAdminMiddleware) .input(createProjectSchema) .mutation(async ({ input, ctx }) => { const userId = { value: ctx.user.userId }; const id = uuidv4(); return await projectServiceFacade.createProject({ ...input, id }, userId); }), updateProject: publicProcedure .use(isAdminMiddleware) .input(updateProjectSchema) .mutation(async ({ input, ctx }) => { const userId = { value: ctx.user.userId }; return await projectServiceFacade.updateProject(input, userId); }), getProjects: publicProcedure .use(isAdminMiddleware) .input(paramsSchema) .query(async ({ input, ctx }) => { return await projectServiceFacade.getProjects(input as any); }), getProjectById: publicProcedure .input( z.object({ value: z.string().uuid(), }) ) .query(async ({ input, ctx }) => { return await projectServiceFacade.getProjectById(input); }), getProjectsSearch: publicProcedure .input( z.object({ searchQuery: z.string(), }) ) .query(async ({ input, ctx }) => { return await projectServiceFacade.searchProjects(input); }), getAllProjectMaterials: publicProcedure .use(isAdminMiddleware) .input( z.object({ status: z.string().default("all"), }) ) .query(async ({ input, ctx }) => { return await projectServiceFacade.getAllProjectMaterials(); }), getProjectsSummary: publicProcedure .use(isAdminMiddleware) .input( z.object({ range: z.string().optional(), }) .optional() ) .query(async ({ input, ctx }) => { return await projectServiceFacade.getProjectSummary(input as any); }), getProjectEarningsYear: publicProcedure .use(isAdminMiddleware) .input( z .object({ range: z.string().optional(), }) .optional() ) .query(async ({ input, ctx }) => { return await projectServiceFacade.getProjectEarnings({range:input?.range as any}) }), });