Files
sori.studio/server/utils/admin-navigation-input.js
zenn 5b2ed97748 v1.7.1: 멤버 권한·추천 사이트·네비게이션 UI 개선
관리자는 VIP·멤버만 수정 가능하도록 서버·UI 권한을 정리하고 소유자 권한 이전 API와 확인 모달을 추가했다. 추천 사이트 파비콘 캐시·URL 접두사·카드 편집 UI를 보강하고 확인 얼럿을 AdminConfirmModal로 통일했다.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-17 14:32:11 +09:00

38 lines
1.5 KiB
JavaScript

import { z } from 'zod'
import { isValidNavigationUrl, normalizeNavigationUrl } from '../../lib/navigation-url.js'
export const adminNavigationItemInputSchema = z.object({
id: z.string().uuid(),
label: z.string().trim().min(1),
url: z.string().trim().min(1).transform(normalizeNavigationUrl).refine(
isValidNavigationUrl,
{ message: 'URL은 / 로 시작하는 내부 경로, http(s):// 외부 URL, # 중 하나여야 합니다.' }
),
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)