import { z } from "zod"; import type { PageableParams, PageableList } from "@/shared/model"; export interface Link { link_sn: string; link_nm: string; link_clsf_cd: string; link_url: string; link_srvr_ip: string; link_db_cd: string; link_key: string; link_id: string; link_pswd: string; link_cycle_stng: string; srvc_usg: string; last_link_rslt_cd: string; last_link_excn_dt: string; next_link_excn_dt: string; last_link_err_cd: string; mdfcn_dt: string; mdfr_id_id: string; link_cycle_mi: string; } export interface LinkLog { rownum: number; link_sn: string; link_nm: string; link_rslt_cd: string; err_cn: string; link_err_cd: string; log_crt_dt: string; } export interface LinkInfo extends LinkFormData { link_sn: string; link_nm: string; link_clsf_cd: string; link_url: string; link_srvr_ip: string; link_db_cd: string; link_key: string; link_id: string; link_pswd: string; srvc_usg: string; last_link_rslt_cd: string; last_link_excn_dt: string; next_link_excn_dt: string; last_link_err_cd: string; mdfcn_dt: string; mdfr_id: string; link_cycle_mi: number; } export interface LinkStats { link_sn: string; link_nm: string; count: number; } export interface LinkVrbl { link_vrbl_sn: string; link_vrbl_nm: string; link_vrbl_vl: string; link_vrbl_cd: string; link_vrbl_expln: string; mdfcn_dt: string; mdfr_id: string; } export interface LinkTable { link_nm: string; link_sn: string; tbl_sn: string; sou_tbl_nm: string; sou_tbl_korn_nm: string; sou_tbl_expln: string; trsf_tbl_nm: string; trsf_tbl_korn_nm: string; trsf_tbl_expln: string; } export interface LinkTableColumns { tbl_sn: string; col_sn: string; sou_col_nm: string; sou_col_korn_nm: string; sou_col_data_frm: string; sou_col_sz: number; trsf_col_nm: string; trsf_col_korn_nm: string; trsf_col_data_frm: string; trsf_col_sz: number pk_yn: string; col_seq: number; mdfcn_dt: string; mdfr_id: string; } export const linkFormSchema = z.object({ link_clsf_cd: z.string().max(8).nullable().refine((val) => { // 빈 값이나 "none" 값이면 false 반환 return val && val !== "none"; }, { message: "연계 분류를 선택해주세요" }), link_sn: z.string().max(50).nullable().optional(), link_nm: z.string().max(40, { message: '연계명은 40자 이하로 입력해 주세요.' }).nonempty({ message: '연계명은 필수입니다.' }), link_url: z.string().max(1000, { message: '연계 URL은 1000자 이하로 입력해 주세요.' }).nonempty({ message: '연계 URL은 필수입니다.' }), link_srvr_ip: z.string().max(20).nullable().optional(), link_db_cd: z.string().max(10).nullable().optional(), link_key: z.string().max(100, { message: '연계 KEY는 100자 이하로 입력해 주세요.' }).nonempty({ message: '연계 KEY는 필수입니다.' }), link_id: z.string().max(20).nullable().optional(), link_pswd: z.string().max(128).nullable().optional(), srvc_usg: z.string().max(40).nullable().optional(), last_link_rslt_cd: z.string().max(4).nullable().optional(), last_link_excn_dt: z.string().max(40).nullable().optional(), next_link_excn_dt: z.string().max(40).nullable().optional(), last_link_err_cd: z.string().max(10).nullable().optional(), mdfcn_dt: z.string().nullable().optional(), mdfr_id: z.string().nullable().optional(), link_cycle_mi: z.coerce.number().nullable().optional().refine((val) => { if (val == null) return true; return val >= 5; }, { message: "연계 주기는 5분 이상이어야 합니다." }), }); export const linkVrblFormSchema = z.object({ link_sn: z.string().max(50).nullable().optional(), link_vrbl_sn: z.string().max(50).nullable().optional(), link_vrbl_nm: z.string().max(40, { message: '변수명은 40자 이하로 입력해 주세요.' }).nonempty({ message: '변수명은 필수입니다.' }), link_vrbl_expln: z.string().max(4000, { message: '설명은 400자 이하로 입력해 주세요.' }).nullable().optional(), link_vrbl_cd: z.string().max(10, { message: '변수코드는 10자 이하로 입력해 주세요.' }).nullable().optional(), link_vrbl_vl: z.string().max(1000, { message: '변수값은 1000자 이하로 입력해 주세요.' }).nonempty({ message: '변수값은 필수입니다.' }), mdfcn_dt: z.string().nullable().optional(), mdfr_id: z.string().nullable().optional(), }); export const LinkTableColumnsSchema = z.object({ link_sn: z.string().max(50).nullable().optional(), tbl_sn: z.string().max(50).nullable().optional(), col_sn: z.string().max(50).nullable().optional(), sou_col_nm: z.string().max(40, { message: '40자 이하로 입력해 주세요.' }).nullable().optional(), sou_col_korn_nm: z.string().max(40, { message: '40자 이하로 입력해 주세요.' }).nullable().optional(), sou_col_data_frm: z.string().max(40, { message: '40자 이하로 입력해 주세요.' }).nullable().optional(), sou_col_sz: z.coerce.number().nullable().optional().refine((val) => { if (val == null) return true; return val.toString().replace('.', '').length <= 14; }, { message: '최대 14자리까지 입력 가능합니다.', }), pk_yn: z.string().max(1).nonempty(), trsf_col_nm: z.string().max(40, { message: '40자 이하로 입력해 주세요.' }).nonempty({ message: '변환컬럼명은 필수입니다.' }), trsf_col_korn_nm: z.string().max(40, { message: '40자 이하로 입력해 주세요.' }).nonempty({ message: '변환컬럼 한글명은 필수입니다.' }), trsf_col_data_frm: z.string().max(40, { message: '40자 이하로 입력해 주세요.' }).nonempty({ message: '변환컬럼 데이터 형식은 필수입니다.' }), trsf_col_sz: z.coerce.number().nullable().optional().refine((val) => { if (val == null) return true; return val.toString().replace('.', '').length <= 14; }, { message: '최대 14자리까지 입력 가능합니다.', }), col_seq: z.coerce.number().nullable().optional(), mdfcn_dt: z.string().nullable().optional(), mdfr_id: z.string().nullable().optional(), }); export const LinkTableSchema = z.object({ link_sn: z.string().max(50).nullable().optional(), tbl_sn: z.string().max(50).nullable().optional(), link_nm: z.string().max(50).nullable().optional(), sou_tbl_nm: z.string().max(40, { message: '40자 이하로 입력해 주세요.' }).nullable().optional(), sou_tbl_korn_nm: z.string().max(40, { message: '40자 이하로 입력해 주세요.' }).nullable().optional(), sou_tbl_expln: z.string().max(2000, { message: '설명은 2000자 이하로 입력해 주세요.' }).nullable().optional(), trsf_tbl_nm: z.string().max(40, { message: '40자 이하로 입력해 주세요.' }).nonempty({ message: '변환테이블명은 필수입니다.' }), trsf_tbl_korn_nm: z.string().max(40, { message: '40자 이하로 입력해 주세요.' }).nonempty({ message: '변환테이블 한글명은 필수입니다.' }), trsf_tbl_expln: z.string().max(2000, { message: '설명은 2000자 이하로 입력해 주세요.' }).nullable().optional(), mdfcn_dt: z.string().nullable().optional(), mdfr_id: z.string().nullable().optional(), }); interface LinkStatsListObject { linkSuccStats: LinkStats[] | null; linkFailStats: LinkStats[] | null; } export interface LinkSearchParam extends PageableParams { linkSn?: string; linkNm?: string; startDate?: string; endDate?: string; isSucc?: string; linkClfsCd?: string; } export type LinkFormData = z.infer; export type LinkVrblFormData = z.infer; export type LinkTableColData = z.infer; export type LinkTableFormData = z.infer; export type LinkList = PageableList; export type LinkLogList = PageableList; export type LinkStatsList = LinkStatsListObject; export type LinkVrblList = PageableList; export type LinkTableColumnsList = PageableList; export interface LinkService { getLinkList(params: LinkSearchParam): Promise; getLinkInfo(params: string): Promise; linkQuickStart(params: string): Promise; updateLinkInfo(data: LinkFormData): Promise; deleteLink(params: string): Promise; getLinkLogList(params: LinkSearchParam): Promise; getLinkStatsList(params: LinkSearchParam): Promise; getLinkVrblList(params: string): Promise; insertLinkVrbl(data: LinkVrblFormData): Promise; deleteLinkVrbl(data: string[]): Promise; getLinkVrblInfo(params: string): Promise; updateLinkVrblInfo(data: LinkVrblFormData): Promise; getLinkTableInfo(params: string): Promise; getLinkTableColList(params: string): Promise; getLinkTableColInfo(params: { colSn: string; tblSn: string; }): Promise; insertLinkTableCol(data: LinkTableColData): Promise; deleteLinkTableCol(data: string[]): Promise; updateLinkTableCol(data: LinkTableColData): Promise; insertLinkTableInfo(data: LinkTableFormData): Promise; updateLinkTableInfo(data: LinkTableFormData): Promise; insertLinkInfo(data: LinkFormData): Promise; countLinkTblNm(tblNm: string): Promise<{ count: number, tbl_sn: string }>; updateLinkResultCode(linkSn: string): Promise; }