72 lines
2.0 KiB
TypeScript
72 lines
2.0 KiB
TypeScript
import useDatabase from '~/composables/useDatabase';
|
|
import { Navigation } from '~/types/api';
|
|
|
|
type NavigatioNExtension = Navigation & { owner: number, navigable: boolean };
|
|
|
|
export default defineEventHandler(async (e) => {
|
|
const project = getRouterParam(e, "projectId");
|
|
const { user } = await getUserSession(e);
|
|
|
|
if(!project)
|
|
{
|
|
setResponseStatus(e, 404);
|
|
return;
|
|
}
|
|
|
|
const db = useDatabase();
|
|
|
|
const content = db.query(`SELECT "path", "title", "type", "order", "private", "navigable", "owner" FROM explorer_files`).sort((a: any, b: any) => a.path.length - b.path.length) as NavigatioNExtension[];
|
|
|
|
if(content.length > 0)
|
|
{
|
|
const navigation: Navigation[] = [];
|
|
|
|
for(const idx in content)
|
|
{
|
|
const item = content[idx];
|
|
if(!!item.private && (user?.id ?? -1) !== item.owner || !item.navigable)
|
|
{
|
|
delete content[idx];
|
|
continue;
|
|
}
|
|
|
|
const parent = item.path.includes('/') ? item.path.substring(0, item.path.lastIndexOf('/')) : undefined;
|
|
|
|
if(parent && !content.find(e => e && e.path === parent))
|
|
{
|
|
delete content[idx];
|
|
continue;
|
|
}
|
|
}
|
|
for(const item of content.filter(e => !!e))
|
|
{
|
|
addChild(navigation, item);
|
|
}
|
|
|
|
return navigation;
|
|
}
|
|
|
|
setResponseStatus(e, 404);
|
|
});
|
|
|
|
function addChild(arr: Navigation[], e: Navigation): 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({ title: e.title, path: e.path, type: e.type, order: e.order, private: e.private });
|
|
arr.sort((a, b) => {
|
|
if(a.order && b.order)
|
|
return a.order - b.order;
|
|
return a.title.localeCompare(b.title);
|
|
});
|
|
}
|
|
} |