summaryrefslogtreecommitdiff
path: root/lib/integration/validations.ts
blob: 4cdf5adcacecc1bbb81bf761ff7c0d7d6f2f9af1 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
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>;