diff --git a/fresh.gen.ts b/fresh.gen.ts index ede2534..c8ecc01 100644 --- a/fresh.gen.ts +++ b/fresh.gen.ts @@ -17,6 +17,7 @@ import * as $api_file_upload from "./routes/api/file/upload.ts"; import * as $api_filemeta from "./routes/api/filemeta.ts"; import * as $api_filemeta_token_ from "./routes/api/filemeta/[token].ts"; import * as $api_files_token_ from "./routes/api/files/[token].ts"; +import * as $api_fs_list from "./routes/api/fs/list.ts"; import * as $api_gallery_gid_ from "./routes/api/gallery/[gid].ts"; import * as $api_gallery_list from "./routes/api/gallery/list.ts"; import * as $api_gallery_meta_gids_ from "./routes/api/gallery/meta/[gids].ts"; @@ -62,6 +63,7 @@ const manifest = { "./routes/api/filemeta.ts": $api_filemeta, "./routes/api/filemeta/[token].ts": $api_filemeta_token_, "./routes/api/files/[token].ts": $api_files_token_, + "./routes/api/fs/list.ts": $api_fs_list, "./routes/api/gallery/[gid].ts": $api_gallery_gid_, "./routes/api/gallery/list.ts": $api_gallery_list, "./routes/api/gallery/meta/[gids].ts": $api_gallery_meta_gids_, diff --git a/routes/api/fs/list.ts b/routes/api/fs/list.ts new file mode 100644 index 0000000..21167d3 --- /dev/null +++ b/routes/api/fs/list.ts @@ -0,0 +1,54 @@ +import { Handlers } from "$fresh/server.ts"; +import { User, UserPermission } from "../../../db.ts"; +import { get_task_manager } from "../../../server.ts"; +import { parse_bool } from "../../../server/parse_form.ts"; +import { return_data, return_error } from "../../../server/utils.ts"; +import { walk } from "@std/fs/walk"; +import { isAbsolute } from "@std/path"; + +type _File = { + name: string; + dir: boolean; +}; + +export type FileList = { + current: string; + list: _File[]; +}; + +export const handler: Handlers = { + async GET(req, ctx) { + const user = ctx.state.user; + if ( + user && !user.is_admin && + !(user.permissions & UserPermission.ManageTasks) + ) { + return return_error(403, "Permission denied."); + } + const u = new URL(req.url); + const dir = await parse_bool(u.searchParams.get("dir"), true); + const file = await parse_bool(u.searchParams.get("file"), true); + let path = u.searchParams.get("path"); + const m = get_task_manager(); + if (!path) { + path = m.cfg.base; + } + if (!isAbsolute(path)) { + path = await Deno.realPath(path); + } + const list: _File[] = []; + for await ( + const i of walk(path, { + maxDepth: 1, + includeDirs: dir, + includeFiles: file, + followSymlinks: true, + }) + ) { + if (i.path != path) { + list.push({ name: i.name, dir: i.isDirectory }); + } + } + return return_data({ current: path, list }); + }, +};