import useDatabase from '~/composables/useDatabase'; import { explorerContentTable } from '~/db/schema'; import type { NavigationItem } from '~/schemas/navigation'; import type { ProjectItem, Project } from '~/schemas/project'; import { hasPermissions } from '~/shared/auth.util'; export default defineEventHandler(async (e) => { const { user } = await getUserSession(e); if(!user || !hasPermissions(user.permissions, ['editor', 'admin'])) { throw createError({ statusCode: 401, statusMessage: 'Unauthorized', }); } const db = useDatabase(); const content = db.select({ path: explorerContentTable.path, type: explorerContentTable.type, owner: explorerContentTable.owner, title: explorerContentTable.title, navigable: explorerContentTable.navigable, private: explorerContentTable.private, order: explorerContentTable.order, }).from(explorerContentTable).prepare().all(); if(content.length > 0) { const project: Project = { items: [], } for(const item of content.filter(e => !!e)) { addChild(project.items, item); } return project; } setResponseStatus(e, 404); return; }); function addChild(arr: ProjectItem[], e: NavigationItem): void { const parent = arr.find(f => e.path.startsWith(f.path)); if(parent) { if(!parent.children) parent.children = []; addChild(parent.children, e); } else { arr.push({ path: e.path, parent: e.path.substring(0, e.path.lastIndexOf('/')), name: e.path.substring(e.path.lastIndexOf('/') + 1), title: e.title, type: e.type, navigable: e.navigable, private: e.private, order: e.order, }); arr.sort((a, b) => { if(a.order !== b.order) return a.order - b.order; return a.title.localeCompare(b.title); }); } }