task-managment / src / server / routers / materials.ts
materials.ts
Raw
import {
  router,
  publicProcedure,
  isAdminMiddleware,
} from "../trpc";
import { z } from "zod";
import { materialServiceFacade } from "../material/application/facade";
import { v4 as uuidv4 } from 'uuid';
import { materialSchema, projectMaterialSchema } from "@/lib/schemas/materialSchema";

export const materialsRouter = router({
  getMaterials: publicProcedure.query(async ({ctx}) => {
    return await materialServiceFacade.getAllMaterials()
  }),
  updateProjectMaterial: publicProcedure
    .use(isAdminMiddleware)
    .input(
      projectMaterialSchema.partial()
    )
    .mutation(async ({ input, ctx }) => {
      const userId={value:ctx.user.userId}
      return await materialServiceFacade.updateProjectMaterial({...input},userId)    
    }),
  addMaterialToProject: publicProcedure
    .use(isAdminMiddleware)
    .input(
     projectMaterialSchema.extend({
      id:z.string().uuid().default(()=>uuidv4())
     })
    )    
    .mutation(async ({ input, ctx }) => {
      const userId={value:ctx.user.userId}
      const projectId={value:input.projectId}
      const materialId={value:input.materialId}
     return await materialServiceFacade.createProjectMaterial({...input,projectId,materialId},userId)
   
    }),
  createMaterial: publicProcedure
    .use(isAdminMiddleware)
    .input(
     materialSchema
    )
    .mutation(async ({ input, ctx }) => {
      const userId={value:ctx.user.userId}
      return await materialServiceFacade.createMaterial(input,userId)
    }),
  deleteMaterials: publicProcedure
    .use(isAdminMiddleware)
    .input(
      z.object({
        materialIds:z.array(z.string())
      })  
    )
    .mutation(async ({ input, ctx }) => {
      const userId={value:ctx.user.userId}
      return await materialServiceFacade.deleteMaterials(input,userId)
    }),
    deleteProjectMaterial: publicProcedure
    .use(isAdminMiddleware)
    .input(
      z.object({
        materialId: z.string().uuid(),
        name:z.string(),
        projectName:z.string(),
        projectId:z.string()
      })
    )
    .mutation(async ({ input, ctx }) => {
      const userId={value:ctx.user.userId}
      return await materialServiceFacade.deleteProjectMaterials(input,userId)
    }),
});