import { z } from "zod" // 공지사항 생성 스키마 export const createNoticeSchema = z.object({ pagePath: z.string().min(1, "페이지 경로를 입력해주세요"), title: z.string().min(1, "제목을 입력해주세요"), content: z.string().min(1, "내용을 입력해주세요"), authorId: z.number().min(1, "작성자를 선택해주세요"), isActive: z.boolean().default(true), isPopup: z.boolean().default(false), startAt: z.date().optional(), endAt: z.date().optional(), dontShowDuration: z.string().transform((val) => val as 'day' | 'never').optional().default('never'), }).refine((data) => { // 팝업인 경우 시작일시와 종료일시는 필수 if (data.isPopup) { return data.startAt && data.endAt; } return true; }, { message: "팝업 공지사항은 시작일시와 종료일시를 모두 설정해야 합니다.", path: ["startAt"], }).refine((data) => { // 팝업인 경우에만 시작일시와 종료일시가 모두 설정된 경우 종료일이 시작일보다 과거인지 확인 if (data.isPopup && data.startAt && data.endAt) { return data.endAt >= data.startAt; } return true; }, { message: "종료일시는 시작일시보다 과거일 수 없습니다.", path: ["endAt"], }) // 공지사항 수정 스키마 export const updateNoticeSchema = z.object({ id: z.number(), pagePath: z.string().min(1, "페이지 경로를 입력해주세요"), title: z.string().min(1, "제목을 입력해주세요"), content: z.string().min(1, "내용을 입력해주세요"), isActive: z.boolean().default(true), isPopup: z.boolean().default(false), startAt: z.date().optional(), endAt: z.date().optional(), dontShowDuration: z.string().transform((val) => val as 'day' | 'never').optional().default('never'), }).refine((data) => { // 팝업인 경우 시작일시와 종료일시는 필수 if (data.isPopup) { return data.startAt && data.endAt; } return true; }, { message: "팝업 공지사항은 시작일시와 종료일시를 모두 설정해야 합니다.", path: ["startAt"], }).refine((data) => { // 팝업인 경우에만 시작일시와 종료일시가 모두 설정된 경우 종료일이 시작일보다 과거인지 확인 if (data.isPopup && data.startAt && data.endAt) { return data.endAt >= data.startAt; } return true; }, { message: "종료일시는 시작일시보다 과거일 수 없습니다.", path: ["endAt"], }) // 페이지 경로별 공지사항 조회 스키마 export const getPageNoticeSchema = z.object({ pagePath: z.string().min(1, "페이지 경로를 입력해주세요"), }) // 타입 추출 export type CreateNoticeSchema = z.infer export type UpdateNoticeSchema = z.infer export type GetPageNoticeSchema = z.infer