diff --git a/src/main/controllers/web.zig b/src/main/controllers/web.zig index 5ec6d55..d176239 100644 --- a/src/main/controllers/web.zig +++ b/src/main/controllers/web.zig @@ -233,6 +233,7 @@ const user_details = struct { const drive = struct { const dir_tmpl = @embedFile("./web/drive/directory.tmpl.html"); + const file_tmpl = @embedFile("./web/drive/file.tmpl.html"); fn servePage(req: anytype, res: anytype, srv: anytype) !void { const info = try srv.driveGet(req.args.path); defer util.deepFree(srv.allocator, info); @@ -246,6 +247,14 @@ const drive = struct { try breadcrumbs.append(if (p.len != 0) p else continue); } + // TODO: put this into the db layer + const FileClass = enum { + image, + video, + audio, + other, + }; + switch (info) { .dir => |dir| try res.template(.ok, srv, dir_tmpl, .{ .dir = dir, @@ -253,7 +262,16 @@ const drive = struct { .mount_path = req.mount_path, .base_drive_path = "drive", }), - else => unreachable, + .file => |file| try res.template(.ok, srv, file_tmpl, .{ + .file = file, + .breadcrumbs = breadcrumbs.items, + .mount_path = req.mount_path, + .base_drive_path = "drive", + .class = if (std.mem.eql(u8, file.meta.content_type orelse "", "image/jpeg")) + FileClass.image + else + FileClass.other, + }), } } @@ -281,6 +299,7 @@ const drive = struct { const Action = enum { mkdir, delete, + upload, }; pub const body_tag_from_query_param = "action"; @@ -289,9 +308,15 @@ const drive = struct { name: []const u8, }, delete: struct {}, + upload: struct { + file: http.FormFile, + sensitive: bool = false, + description: []const u8 = "", + }, }; pub fn handler(req: anytype, res: anytype, srv: anytype) !void { + const trimmed_path = std.mem.trim(u8, req.args.path, "/"); switch (req.body) { .mkdir => |body| { _ = try srv.driveMkdir(req.args.path, body.name); @@ -300,7 +325,6 @@ const drive = struct { try servePage(req, res, srv); }, .delete => { - const trimmed_path = std.mem.trim(u8, req.args.path, "/"); _ = try srv.driveDelete(trimmed_path); const dir = trimmed_path[0 .. std.mem.lastIndexOfScalar(u8, trimmed_path, '/') orelse trimmed_path.len]; @@ -312,6 +336,27 @@ const drive = struct { try res.headers.put("Location", url); return res.status(.see_other); }, + .upload => |body| { + const entry = try srv.driveUpload( + .{ + .filename = body.file.filename, + .dir = trimmed_path, + .description = body.description, + .content_type = body.file.content_type, + .sensitive = body.sensitive, + }, + body.file.data, + ); + defer util.deepFree(srv.allocator, entry); + + const url = try std.fmt.allocPrint(srv.allocator, "{s}/drive/{s}", .{ + req.mount_path, + std.mem.trim(u8, entry.file.path, "/"), + }); + defer srv.allocator.free(url); + try res.headers.put("Location", url); + return res.status(.see_other); + }, } } }; diff --git a/src/main/controllers/web/drive/directory.tmpl.html b/src/main/controllers/web/drive/directory.tmpl.html index 39f4b2d..db94cbd 100644 --- a/src/main/controllers/web/drive/directory.tmpl.html +++ b/src/main/controllers/web/drive/directory.tmpl.html @@ -37,6 +37,30 @@ +