diff options
Diffstat (limited to 'src/storage/user.zig')
| -rw-r--r-- | src/storage/user.zig | 40 |
1 files changed, 38 insertions, 2 deletions
diff --git a/src/storage/user.zig b/src/storage/user.zig index d5260fe..09f7716 100644 --- a/src/storage/user.zig +++ b/src/storage/user.zig @@ -1,6 +1,8 @@ const std = @import("std"); const Storage = @import("root.zig"); +const log = std.log.scoped(.user); + const Self = @This(); pub const Info = struct { @@ -157,8 +159,42 @@ pub fn deinit(self: *Self) void { pub fn exists(storage: *Storage, name: []const u8) bool { var user = storage.dir.openDir("user", .{}) catch return false; - defer user.deinit(); + defer user.close(); - user.access(name) catch return false; + user.access(name, .{}) catch return false; return true; } + +pub fn image(storage: *Storage, name: []const u8) ?std.fs.File { + var user = storage.dir.openDir("user", .{}) catch return null; + defer user.close(); + + var profile = user.openDir(name, .{}) catch return null; + defer profile.close(); + return profile.openFile("image.jpg", .{ .lock = .shared }) catch null; +} + +pub fn set_image( + storage: *Storage, + name: []const u8, + reader: *std.Io.Reader, + size: usize, +) !void { + var user = try storage.dir.openDir("user", .{}); + defer user.close(); + + var profile = try user.openDir(name, .{}); + defer profile.close(); + + var image_file = try profile.createFile("image.jpg", .{ .lock = .exclusive }); + defer image_file.close(); + + var buffer: [1024]u8 = undefined; + var file_writer = image_file.writer(&buffer); + + log.info("uploaded to profile {s} [{} bytes]", .{ name, size }); + + try reader.streamExact(&file_writer.interface, size); + + try file_writer.interface.flush(); +} |