diff options
Diffstat (limited to 'lib/integration/validations.ts')
| -rw-r--r-- | lib/integration/validations.ts | 99 |
1 files changed, 99 insertions, 0 deletions
diff --git a/lib/integration/validations.ts b/lib/integration/validations.ts new file mode 100644 index 00000000..4cdf5adc --- /dev/null +++ b/lib/integration/validations.ts @@ -0,0 +1,99 @@ +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<typeof integrations>().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<ReturnType<typeof SearchParamsCache.parse>>; + +// 통합 타입 정의 +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<typeof createIntegrationSchema>; +export type UpdateIntegrationInput = z.infer<typeof updateIntegrationSchema>; +export type GetIntegrationsInput = z.infer<typeof getIntegrationsSchema>;
\ No newline at end of file |
