80 lines
2.1 KiB
TypeScript
80 lines
2.1 KiB
TypeScript
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();
|
|
|
|
content.sort((a, b) => {
|
|
return a.path.split('/').length - b.path.split('/').length;
|
|
});
|
|
|
|
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);
|
|
});
|
|
}
|
|
} |