diff options
Diffstat (limited to 'lib/rfq-last/validations.ts')
| -rw-r--r-- | lib/rfq-last/validations.ts | 104 |
1 files changed, 87 insertions, 17 deletions
diff --git a/lib/rfq-last/validations.ts b/lib/rfq-last/validations.ts index b133433f..34110141 100644 --- a/lib/rfq-last/validations.ts +++ b/lib/rfq-last/validations.ts @@ -66,22 +66,92 @@ import { RfqLastAttachments } from "@/db/schema"; >; - export const searchParamsRfqAttachmentsCache = createSearchParamsCache({ - flags: parseAsArrayOf(z.enum(["advancedTable", "floatingBar"])).withDefault([]), - page: parseAsInteger.withDefault(1), - perPage: parseAsInteger.withDefault(10), - sort: getSortingStateParser<RfqLastAttachments>().withDefault([ - { id: "createdAt", desc: true }, - ]), - // 기본 필터 - attachmentType: parseAsArrayOf(z.string()).withDefault([]), - fileType: parseAsArrayOf(z.string()).withDefault([]), - search: parseAsString.withDefault(""), - // advanced filter - filters: getFiltersStateParser().withDefault([]), - joinOperator: parseAsStringEnum(["and", "or"]).withDefault("and"), - }) +// 공통 탭 파라미터 +export const searchParamsRfqTabCache = createSearchParamsCache({ + tab: parseAsStringEnum(['design', 'purchase']).withDefault('design'), +}) + +// 설계 탭 전용 파라미터 +export const searchParamsRfqDesignCache = createSearchParamsCache({ + design_page: parseAsInteger.withDefault(1), + design_perPage: parseAsInteger.withDefault(10), + design_sort: getSortingStateParser<RfqLastAttachments>().withDefault([ + { id: "createdAt", desc: true }, + ]), + design_search: parseAsString.withDefault(""), + design_fileType: parseAsArrayOf(z.string()).withDefault([]), + design_filters: getFiltersStateParser().withDefault([]), + design_joinOperator: parseAsStringEnum(["and", "or"]).withDefault("and"), +}) + +// 구매 탭 전용 파라미터 +export const searchParamsRfqPurchaseCache = createSearchParamsCache({ + purchase_page: parseAsInteger.withDefault(1), + purchase_perPage: parseAsInteger.withDefault(10), + purchase_sort: getSortingStateParser<RfqLastAttachments>().withDefault([ + { id: "createdAt", desc: true }, + ]), + purchase_search: parseAsString.withDefault(""), + purchase_fileType: parseAsArrayOf(z.string()).withDefault([]), + purchase_filters: getFiltersStateParser().withDefault([]), + purchase_joinOperator: parseAsStringEnum(["and", "or"]).withDefault("and"), +}) + +// 통합 파라미터 캐시 (모든 파라미터를 한 번에 파싱) +export const searchParamsRfqAttachmentsCache = createSearchParamsCache({ + // 공통 + tab: parseAsStringEnum(['design', 'purchase']).withDefault('design'), + flags: parseAsArrayOf(z.enum(["advancedTable", "floatingBar"])).withDefault([]), - // 스키마 타입들 - export type GetRfqLastAttachmentsSchema = Awaited<ReturnType<typeof searchParamsRfqAttachmentsCache.parse>> + // 설계 탭 파라미터 + design_page: parseAsInteger.withDefault(1), + design_perPage: parseAsInteger.withDefault(10), + design_sort: getSortingStateParser<RfqLastAttachments>().withDefault([ + { id: "createdAt", desc: true }, + ]), + design_search: parseAsString.withDefault(""), + design_fileType: parseAsArrayOf(z.string()).withDefault([]), + design_filters: getFiltersStateParser().withDefault([]), + design_joinOperator: parseAsStringEnum(["and", "or"]).withDefault("and"), + + // 구매 탭 파라미터 + purchase_page: parseAsInteger.withDefault(1), + purchase_perPage: parseAsInteger.withDefault(10), + purchase_sort: getSortingStateParser<RfqLastAttachments>().withDefault([ + { id: "createdAt", desc: true }, + ]), + purchase_search: parseAsString.withDefault(""), + purchase_fileType: parseAsArrayOf(z.string()).withDefault([]), + purchase_filters: getFiltersStateParser().withDefault([]), + purchase_joinOperator: parseAsStringEnum(["and", "or"]).withDefault("and"), +}) + +// 타입 정의 +export type GetRfqLastAttachmentsSchema = { + page: number + perPage: number + sort: Array<{ id: string; desc: boolean }> + search: string + fileType: string[] + filters: any[] + joinOperator: "and" | "or" + attachmentType?: string[] +} + +// 헬퍼 함수: prefix가 붙은 파라미터를 일반 파라미터로 변환 +export function extractTabParams( + allParams: Awaited<ReturnType<typeof searchParamsRfqAttachmentsCache.parse>>, + tabPrefix: 'design' | 'purchase' +): GetRfqLastAttachmentsSchema { + const prefix = `${tabPrefix}_` + return { + page: allParams[`${prefix}page` as keyof typeof allParams] as number, + perPage: allParams[`${prefix}perPage` as keyof typeof allParams] as number, + sort: allParams[`${prefix}sort` as keyof typeof allParams] as any, + search: allParams[`${prefix}search` as keyof typeof allParams] as string, + fileType: allParams[`${prefix}fileType` as keyof typeof allParams] as string[], + filters: allParams[`${prefix}filters` as keyof typeof allParams] as any[], + joinOperator: allParams[`${prefix}joinOperator` as keyof typeof allParams] as "and" | "or", + } +}
\ No newline at end of file |
