task-managment / src / server / routers / projects.ts
projects.ts
Raw
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})
    }),
});