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`
`;
return htmlContent;
}
export default page({
get,
accessMode: 'user',
});