메뉴 관리 기능 추가
This commit is contained in:
21
server/utils/admin-navigation-input.js
Normal file
21
server/utils/admin-navigation-input.js
Normal file
@@ -0,0 +1,21 @@
|
||||
import { z } from 'zod'
|
||||
|
||||
export const adminNavigationItemInputSchema = z.object({
|
||||
id: z.string().optional().nullable(),
|
||||
label: z.string().trim().min(1),
|
||||
url: z.string().trim().min(1).regex(/^(\/|https?:\/\/)/),
|
||||
location: z.enum(['primary', 'footer']),
|
||||
sortOrder: z.coerce.number().int().min(0).default(0),
|
||||
isVisible: z.boolean().default(true)
|
||||
})
|
||||
|
||||
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)
|
||||
26
server/utils/navigation-items.js
Normal file
26
server/utils/navigation-items.js
Normal file
@@ -0,0 +1,26 @@
|
||||
/**
|
||||
* 기본 네비게이션 항목 반환
|
||||
* @returns {Array<Object>} 기본 네비게이션 항목
|
||||
*/
|
||||
export const getDefaultNavigationItems = () => [
|
||||
{ id: 'default-primary-home', label: 'Home pages', url: '/', location: 'primary', sortOrder: 10, isVisible: true },
|
||||
{ id: 'default-primary-tags', label: 'Tags', url: '/tags', location: 'primary', sortOrder: 20, isVisible: true },
|
||||
{ id: 'default-primary-authors', label: 'Authors', url: '/pages/about', location: 'primary', sortOrder: 30, isVisible: true },
|
||||
{ id: 'default-primary-style', label: 'Style', url: '/post/hello-sori-studio', location: 'primary', sortOrder: 40, isVisible: true },
|
||||
{ id: 'default-primary-post-types', label: 'Post types', url: '/post/custom-writing-tool', location: 'primary', sortOrder: 50, isVisible: true },
|
||||
{ id: 'default-primary-members', label: 'Members', url: '/pages/contact', location: 'primary', sortOrder: 60, isVisible: true },
|
||||
{ id: 'default-primary-landing', label: 'Landing pages', url: '/pages/projects', location: 'primary', sortOrder: 70, isVisible: true },
|
||||
{ id: 'default-footer-portal', label: 'Portal', url: '/pages/links', location: 'footer', sortOrder: 10, isVisible: true },
|
||||
{ id: 'default-footer-docs', label: 'Docs', url: '/pages/about', location: 'footer', sortOrder: 20, isVisible: true },
|
||||
{ id: 'default-footer-projects', label: 'Projects', url: '/pages/projects', location: 'footer', sortOrder: 30, isVisible: true }
|
||||
]
|
||||
|
||||
/**
|
||||
* 네비게이션 항목을 위치별로 묶기
|
||||
* @param {Array<Object>} items - 네비게이션 항목 목록
|
||||
* @returns {{primary: Array<Object>, footer: Array<Object>}} 위치별 네비게이션 항목
|
||||
*/
|
||||
export const groupNavigationItems = (items) => ({
|
||||
primary: items.filter((item) => item.location === 'primary'),
|
||||
footer: items.filter((item) => item.location === 'footer')
|
||||
})
|
||||
Reference in New Issue
Block a user