diff options
| author | dujinkim <dujin.kim@dtsolution.co.kr> | 2025-07-01 02:53:18 +0000 |
|---|---|---|
| committer | dujinkim <dujin.kim@dtsolution.co.kr> | 2025-07-01 02:53:18 +0000 |
| commit | d66d308169e559457878c02e3b0443da22693241 (patch) | |
| tree | 257b4d1d3345d2828e6ea8473938b5113d2ae733 /lib/information/validations.ts | |
| parent | 4ab3f7fd98f544244df972f3f333bbe3525d54f8 (diff) | |
(최겸) 정보시스템 인포메이션 기능 개발
Diffstat (limited to 'lib/information/validations.ts')
| -rw-r--r-- | lib/information/validations.ts | 89 |
1 files changed, 89 insertions, 0 deletions
diff --git a/lib/information/validations.ts b/lib/information/validations.ts new file mode 100644 index 00000000..216e3354 --- /dev/null +++ b/lib/information/validations.ts @@ -0,0 +1,89 @@ +import { z } from "zod"
+import {
+ createSearchParamsCache,
+ parseAsArrayOf,
+ parseAsInteger,
+ parseAsString,
+ parseAsStringEnum,
+ parseAsBoolean,
+} from "nuqs/server"
+import { getFiltersStateParser, getSortingStateParser } from "@/lib/parsers"
+import { PageInformation } from "@/db/schema/information"
+
+// 인포메이션 생성 스키마
+export const createInformationSchema = z.object({
+ pageCode: z.string().min(1, "페이지 코드를 입력해주세요"),
+ pageName: z.string().min(1, "페이지명을 입력해주세요"),
+ title: z.string().min(1, "제목을 입력해주세요"),
+ description: z.string().min(1, "설명을 입력해주세요"),
+ noticeTitle: z.string().optional(),
+ noticeContent: z.string().optional(),
+ attachmentFileName: z.string().optional(),
+ attachmentFilePath: z.string().optional(),
+ attachmentFileSize: z.string().optional(),
+ isActive: z.boolean().default(true),
+})
+
+// 인포메이션 수정 스키마
+export const updateInformationSchema = z.object({
+ id: z.number(),
+ pageCode: z.string().min(1, "페이지 코드를 입력해주세요"),
+ pageName: z.string().min(1, "페이지명을 입력해주세요"),
+ title: z.string().min(1, "제목을 입력해주세요"),
+ description: z.string().min(1, "설명을 입력해주세요"),
+ noticeTitle: z.string().optional(),
+ noticeContent: z.string().optional(),
+ attachmentFileName: z.string().optional(),
+ attachmentFilePath: z.string().optional(),
+ attachmentFileSize: z.string().optional(),
+ isActive: z.boolean().default(true),
+})
+
+// 현대적인 검색 파라미터 캐시 (프로젝트 패턴과 동일)
+export const searchParamsInformationCache = createSearchParamsCache({
+ flags: parseAsArrayOf(z.enum(["advancedTable", "floatingBar"])).withDefault([]),
+ page: parseAsInteger.withDefault(1),
+ perPage: parseAsInteger.withDefault(10),
+ sort: getSortingStateParser<PageInformation>().withDefault([
+ { id: "createdAt", desc: true },
+ ]),
+
+ // 기본 검색 필드들
+ pageCode: parseAsString.withDefault(""),
+ pageName: parseAsString.withDefault(""),
+ title: parseAsString.withDefault(""),
+ isActive: parseAsBoolean,
+
+ // 고급 필터
+ filters: getFiltersStateParser().withDefault([]),
+ joinOperator: parseAsStringEnum(["and", "or"]).withDefault("and"),
+ search: parseAsString.withDefault(""),
+
+ // 날짜 범위
+ from: parseAsString,
+ to: parseAsString,
+})
+
+// 타입 추출
+export type CreateInformationSchema = z.infer<typeof createInformationSchema>
+export type UpdateInformationSchema = z.infer<typeof updateInformationSchema>
+export type GetInformationSchema = Awaited<ReturnType<typeof searchParamsInformationCache.parse>>
+
+// 기존 스키마 (하위 호환성을 위해 유지)
+export const getInformationSchema = z.object({
+ page: z.coerce.number().default(1),
+ per_page: z.coerce.number().default(10),
+ sort: z.string().optional(),
+ pageCode: z.string().optional(),
+ pageName: z.string().optional(),
+ isActive: z.coerce.boolean().optional(),
+ from: z.string().optional(),
+ to: z.string().optional(),
+})
+
+// 페이지 코드별 인포메이션 조회 스키마
+export const getPageInformationSchema = z.object({
+ pageCode: z.string().min(1, "페이지 코드를 입력해주세요"),
+})
+
+export type GetPageInformationSchema = z.infer<typeof getPageInformationSchema>
\ No newline at end of file |
