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
|
import {
createSearchParamsCache,
parseAsArrayOf,
parseAsInteger,
parseAsString,
parseAsStringEnum,
} from 'nuqs/server';
import { z } from 'zod';
import { getFiltersStateParser, getSortingStateParser } from '@/lib/parsers';
import { approvalTemplateCategories } from '@/db/schema/knox/approvals';
// 검색 파라미터 캐시
export const SearchParamsApprovalTemplateCategoryCache = createSearchParamsCache({
flags: parseAsArrayOf(z.enum(['advancedTable', 'floatingBar'])).withDefault([]),
page: parseAsInteger.withDefault(1),
perPage: parseAsInteger.withDefault(10),
sort: getSortingStateParser<typeof approvalTemplateCategories>().withDefault([
{ id: 'sortOrder', desc: false },
{ id: 'name', desc: false },
]),
filters: getFiltersStateParser().withDefault([]),
joinOperator: parseAsStringEnum(['and', 'or']).withDefault('and'),
search: parseAsString.withDefault(''),
});
export type GetApprovalTemplateCategorySchema = Awaited<
ReturnType<typeof SearchParamsApprovalTemplateCategoryCache.parse>
>;
// 카테고리 생성 스키마
export const createApprovalTemplateCategorySchema = z.object({
name: z.string().min(1, '카테고리 이름을 입력해주세요.').max(100, '카테고리 이름은 100자 이내로 입력해주세요.'),
description: z.string().max(500, '설명은 500자 이내로 입력해주세요.').optional(),
sortOrder: z.number().int().min(0).default(0),
});
// 카테고리 업데이트 스키마
export const updateApprovalTemplateCategorySchema = z.object({
name: z.string().min(1, '카테고리 이름을 입력해주세요.').max(100, '카테고리 이름은 100자 이내로 입력해주세요.').optional(),
description: z.string().max(500, '설명은 500자 이내로 입력해주세요.').optional(),
isActive: z.boolean().optional(),
sortOrder: z.number().int().min(0).optional(),
});
export type CreateApprovalTemplateCategorySchema = z.infer<typeof createApprovalTemplateCategorySchema>;
export type UpdateApprovalTemplateCategorySchema = z.infer<typeof updateApprovalTemplateCategorySchema>;
|