task-managment / src / lib / schemas / taskSchema.ts
taskSchema.ts
Raw
import { z } from "zod";
import { formatDate } from "@/lib/utils";
import { v4 as uuidv4 } from "uuid";
import { priorityType, taskStatus } from "@/server/task/domain/models";
import moment from "moment";

const baseTaskSchema = z.object({
  projectId: z
    .string({ message: "Proyecto inválido" })
    .uuid({ message: "Selecciona un proyecto" }),
  floorName: z
    .string({ message: "Piso inválido" })
    .min(1, { message: "Selecciona un piso" }),
  areaName: z
    .string({ message: "Área inválida" })
    .min(1, { message: "Selecciona un área" }),
  projectName: z
    .string({ message: "Proyecto inválido" })
    .min(1, { message: "Selecciona un proyecto" }),
  userId: z
    .string({ message: "Selecciona un usuario " })
    .min(1, { message: "Usuario invalido" }),
  areaId: z
    .string({ message: "Area no valida" })
    .uuid({ message: "Selecciona un area" }),
  priority: z.enum(priorityType, { message: "Selecciona una prioridad" }),
  startDate: z.string(),
  expireDate: z.string().optional(),
  comments: z.string(),
});

const withCustomRefinements = (schema: z.ZodType<any>) =>
  schema
    .refine(
      (data) => {
        if (data.comments && data.comments.length > 0) {
          return data.comments.length >= 5 && data.comments.length <= 120;
        }
        return true; // Si está vacío o no está presente, no aplicar validación
      },
      {
        message:
          "El mensaje debe contener entre 5 y 120 caracteres si está presente",
        path: ["comments"],
      }
    )
    .refine(
      (data) => {
        if (data.expireDate) {
          return formatDate(data.expireDate) >= formatDate(data.startDate!);
        }
        return true;
      },
      {
        message:
          "La fecha de expiración debe ser igual o posterior a la fecha de inicio",
        path: ["expireDate"],
      }
    )


export const createTaskSchema = withCustomRefinements(
  baseTaskSchema.extend({
    id: z
      .string()
      .uuid()
      .default(() => uuidv4()),
  })
);

export const updateTaskSchema = withCustomRefinements(
  baseTaskSchema
    .extend({
      id: z.string().uuid({ message: "Tarea inválida" }),
      areaId: z.string().uuid(),
      status: z.enum(taskStatus).optional(),
    })
    .partial()
);