import { gtcDocuments, type GtcDocument, type GtcDocumentWithRelations } from "@/db/schema/gtc" import { createSearchParamsCache, parseAsArrayOf, parseAsInteger, parseAsString, parseAsStringEnum, } from "nuqs/server" import * as z from "zod" import { getFiltersStateParser, getSortingStateParser } from "@/lib/parsers" import { checkProjectExists } from "./service" export const searchParamsCache = createSearchParamsCache({ flags: parseAsArrayOf(z.enum(["advancedTable", "floatingBar"])).withDefault( [] ), page: parseAsInteger.withDefault(1), perPage: parseAsInteger.withDefault(10), sort: getSortingStateParser().withDefault([ { id: "updatedAt", desc: true }, ]), // 검색 필터들 type: parseAsStringEnum(["standard", "project"]).withDefault(""), projectId: parseAsInteger.withDefault(0), // advanced filter filters: getFiltersStateParser().withDefault([]), joinOperator: parseAsStringEnum(["and", "or"]).withDefault("and"), search: parseAsString.withDefault(""), }) export const createGtcDocumentSchema = z.object({ type: z.enum(["standard", "project"]), projectId: z .number() .nullable() .optional() .refine( async (projectId, ctx) => { // 프로젝트 타입인 경우 projectId 필수 if (ctx.parent.type === "project" && !projectId) { ctx.addIssue({ code: z.ZodIssueCode.custom, message: "Project is required for project type GTC", }) return false } // 표준 타입인 경우 projectId null이어야 함 if (ctx.parent.type === "standard" && projectId) { ctx.addIssue({ code: z.ZodIssueCode.custom, message: "Project should not be set for standard type GTC", }) return false } // 프로젝트 ID가 유효한지 검사 if (projectId) { const exists = await checkProjectExists(projectId) if (!exists) { ctx.addIssue({ code: z.ZodIssueCode.custom, message: "Invalid project ID", }) return false } } return true } ), revision: z.number().min(0).default(0), editReason: z.string().optional(), }) export const updateGtcDocumentSchema = z.object({ editReason: z.string().optional(), isActive: z.boolean().optional(), }) // 리비전 업데이트용 스키마 export const createNewRevisionSchema = z.object({ editReason: z.string().min(1, "Edit reason is required for new revision"), }) export type GetGtcDocumentsSchema = Awaited> export type CreateGtcDocumentSchema = z.infer export type UpdateGtcDocumentSchema = z.infer export type CreateNewRevisionSchema = z.infer