34 lines
1.2 KiB
JavaScript
34 lines
1.2 KiB
JavaScript
import { z } from 'zod'
|
|
|
|
export const adminNavigationItemInputSchema = z.object({
|
|
id: z.string().uuid(),
|
|
label: z.string().trim().min(1),
|
|
url: z.string().trim().min(1).regex(/^(\/|https?:\/\/|#)/),
|
|
descriptionText: z.string().trim().max(200).optional().default(''),
|
|
thumbnailUrl: z.string().trim().max(500).optional().default(''),
|
|
location: z.enum(['primary', 'footer', 'recommended']),
|
|
sortOrder: z.coerce.number().int().min(0).default(0),
|
|
isVisible: z.boolean().default(true),
|
|
parentId: z.union([z.string().uuid(), z.null()]).optional(),
|
|
isFolder: z.boolean().default(false)
|
|
}).superRefine((data, ctx) => {
|
|
if ((data.location === 'footer' || data.location === 'recommended') && data.parentId) {
|
|
ctx.addIssue({
|
|
code: 'custom',
|
|
path: ['parentId'],
|
|
message: '해당 위치 메뉴는 하위 항목을 가질 수 없습니다.'
|
|
})
|
|
}
|
|
})
|
|
|
|
export const adminNavigationInputSchema = z.object({
|
|
items: z.array(adminNavigationItemInputSchema)
|
|
})
|
|
|
|
/**
|
|
* 관리자 네비게이션 입력값 정리
|
|
* @param {unknown} body - 요청 본문
|
|
* @returns {import('zod').SafeParseReturnType<unknown, Object>} 검증 결과
|
|
*/
|
|
export const parseAdminNavigationInput = (body) => adminNavigationInputSchema.safeParse(body)
|