import page, { RequestHandlerParams } from '/lib/page.ts'; import { Directory, DirectoryFile } from '/lib/types.ts'; import { AppConfig } from '/lib/config.ts'; import { DirectoryModel, FileModel } from '/lib/models/files.ts'; import { basicLayoutResponse } from '/lib/utils/layout.tsx'; import { html } from '/public/ts/utils/misc.ts'; import Loading from '/components/Loading.ts'; async function get({ request, user, match, session, isRunningLocally }: RequestHandlerParams) { if (!(await AppConfig.isAppEnabled('notes'))) { return new Response('Redirect', { status: 303, headers: { 'Location': `/files` } }); } const searchParams = new URL(request.url).searchParams; let currentPath = searchParams.get('path') || '/Notes/'; // Send invalid paths back to Notes root if (!currentPath.startsWith('/Notes/') || currentPath.includes('../')) { currentPath = '/Notes/'; } // Always append a trailing slash if (!currentPath.endsWith('/')) { currentPath = `${currentPath}/`; } const userDirectories = await DirectoryModel.list(user!.id, currentPath); const userFiles = await FileModel.list(user!.id, currentPath); const userNotes = userFiles.filter((file) => file.file_name.endsWith('.md')); const htmlContent = defaultHtmlContent({ userDirectories, userNotes, currentPath }); return basicLayoutResponse(htmlContent, { currentPath: match.pathname.input, titlePrefix: 'Notes', match, request, user, session, isRunningLocally, }); } function defaultHtmlContent({ userDirectories, userNotes, currentPath }: { userDirectories: Directory[]; userNotes: DirectoryFile[]; currentPath: string; }) { const htmlContent = html`
${Loading()}
`; return htmlContent; } export default page({ get, accessMode: 'user', });