import page, { RequestHandlerParams } from '/lib/page.ts'; import { Directory, DirectoryFile } from '/lib/types.ts'; import { DirectoryModel, FileModel } from '/lib/models/files.ts'; import { AppConfig } from '/lib/config.ts'; import { html } from '/public/ts/utils/misc.ts'; import { basicLayoutResponse } from '/lib/utils/layout.tsx'; import Loading from '/components/Loading.ts'; async function get({ request, user, match, session, isRunningLocally }: RequestHandlerParams) { const baseUrl = (await AppConfig.getConfig()).auth.baseUrl; if (!(await AppConfig.isAppEnabled('files'))) { return new Response('Redirect', { status: 303, headers: { 'Location': `/` } }); } const searchParams = new URL(request.url).searchParams; let currentPath = searchParams.get('path') || '/'; // Send invalid paths back to root if (!currentPath.startsWith('/') || currentPath.includes('../')) { currentPath = '/'; } // 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 isPublicFileSharingAllowed = await AppConfig.isPublicFileSharingAllowed(); const areDirectoryDownloadsAllowed = await AppConfig.areDirectoryDownloadsAllowed(); const htmlContent = defaultHtmlContent({ userDirectories, userFiles, currentPath, baseUrl, isFileSharingAllowed: isPublicFileSharingAllowed, areDirectoryDownloadsAllowed, }); return basicLayoutResponse(htmlContent, { currentPath: match.pathname.input, titlePrefix: 'Files', match, request, user, session, isRunningLocally, }); } function defaultHtmlContent( { userDirectories, userFiles, currentPath, baseUrl, isFileSharingAllowed, areDirectoryDownloadsAllowed }: { userDirectories: Directory[]; userFiles: DirectoryFile[]; currentPath: string; baseUrl: string; isFileSharingAllowed: boolean; areDirectoryDownloadsAllowed: boolean; }, ) { return html`
${Loading()}
`; } export default page({ get, accessMode: 'user', });