import { createSearchParamsCache, parseAsArrayOf, parseAsInteger, parseAsString, parseAsStringEnum, } from "nuqs/server"; import * as z from "zod"; import { getFiltersStateParser, getSortingStateParser } from "@/lib/parsers"; import { integrations } from "@/db/schema/integration"; export const SearchParamsCache = createSearchParamsCache({ // UI 모드나 플래그 관련 flags: parseAsArrayOf(z.enum(["advancedTable", "floatingBar"])).withDefault([]), // 페이징 page: parseAsInteger.withDefault(1), perPage: parseAsInteger.withDefault(10), // 정렬 (createdAt 기준 내림차순) sort: getSortingStateParser().withDefault([ { id: "createdAt", desc: true } ]), // 기존 필드 code: parseAsString.withDefault(""), name: parseAsString.withDefault(""), type: parseAsString.withDefault(""), description: parseAsString.withDefault(""), sourceSystem: parseAsString.withDefault(""), targetSystem: parseAsString.withDefault(""), status: parseAsString.withDefault(""), filters: getFiltersStateParser().withDefault([]), joinOperator: parseAsStringEnum(["and", "or"]).withDefault("and"), search: parseAsString.withDefault(""), }); export type GetIntegrationsSchema = Awaited>; // 통합 타입 정의 export const integrationTypeEnum = z.enum(["rest_api", "soap", "db_to_db"]); export const integrationStatusEnum = z.enum(["active", "inactive", "deprecated"]); // 통합 생성 스키마 export const createIntegrationSchema = z.object({ code: z.string().min(1, "코드는 필수입니다."), name: z.string().min(1, "이름은 필수입니다."), type: integrationTypeEnum, description: z.string().optional(), sourceSystem: z.string().min(1, "소스 시스템은 필수입니다."), targetSystem: z.string().min(1, "타겟 시스템은 필수입니다."), status: integrationStatusEnum.default("active"), metadata: z.any().optional(), }); // 통합 수정 스키마 export const updateIntegrationSchema = z.object({ code: z.string().min(1, "코드는 필수입니다."), name: z.string().min(1, "이름은 필수입니다."), type: integrationTypeEnum, description: z.string().optional(), sourceSystem: z.string().min(1, "소스 시스템은 필수입니다."), targetSystem: z.string().min(1, "타겟 시스템은 필수입니다."), status: integrationStatusEnum, metadata: z.any().optional(), }); // 통합 조회 스키마 export const getIntegrationsSchema = z.object({ page: z.number().min(1).default(1), limit: z.number().min(1).max(100).default(10), search: z.string().optional(), type: integrationTypeEnum.optional(), status: integrationStatusEnum.optional(), sourceSystem: z.string().optional(), targetSystem: z.string().optional(), }); // 통합 타입 export type Integration = { id: number; code: string; name: string; type: "rest_api" | "soap" | "db_to_db"; description?: string | null; sourceSystem: string; targetSystem: string; status: "active" | "inactive" | "deprecated"; metadata?: any; createdBy?: number | null; updatedBy?: number | null; createdAt: Date; updatedAt: Date; }; export type CreateIntegrationInput = z.infer; export type UpdateIntegrationInput = z.infer; export type GetIntegrationsInput = z.infer;