diff options
| author | Nathan Reiner <nathan@nathanreiner.xyz> | 2025-11-20 06:56:43 +0100 |
|---|---|---|
| committer | Nathan Reiner <nathan@nathanreiner.xyz> | 2025-11-20 06:56:43 +0100 |
| commit | efb92a00185963a763217d4bedce7a1591c6dc22 (patch) | |
| tree | 0ac7d86154b286195819de06decdbd850561bdcb /src | |
| parent | f6b7fe33ee7c08761f3403ca77b7530dbb2763df (diff) | |
image: implement removing
Diffstat (limited to 'src')
| -rw-r--r-- | src/routes/api/image/remove.zig | 14 | ||||
| -rw-r--r-- | src/routes/api/image/root.zig | 1 | ||||
| -rw-r--r-- | src/storage/image-manager/image.zig | 11 | ||||
| -rw-r--r-- | src/storage/image-manager/root.zig | 34 |
4 files changed, 60 insertions, 0 deletions
diff --git a/src/routes/api/image/remove.zig b/src/routes/api/image/remove.zig index e69de29..d99cbb4 100644 --- a/src/routes/api/image/remove.zig +++ b/src/routes/api/image/remove.zig @@ -0,0 +1,14 @@ +const std = @import("std"); + +const memora = @import("memora"); +const Context = memora.Context; + +pub const access = .users; + +const Body = struct { + id: []const u8, +}; + +pub fn post(ctx: *Context, body: Body) anyerror!void { + return ctx.storage.images.delete(ctx.storage, body.id); +} diff --git a/src/routes/api/image/root.zig b/src/routes/api/image/root.zig index dafa090..931bb06 100644 --- a/src/routes/api/image/root.zig +++ b/src/routes/api/image/root.zig @@ -3,3 +3,4 @@ const HandlerInfo = @import("../../handler-info.zig"); pub const upload: HandlerInfo = .from_type(@import("upload.zig")); pub const list: HandlerInfo = .from_type(@import("list.zig")); pub const load: HandlerInfo = .from_type(@import("load.zig")); +pub const remove: HandlerInfo = .from_type(@import("remove.zig")); diff --git a/src/storage/image-manager/image.zig b/src/storage/image-manager/image.zig index b11b7b1..bdac5c7 100644 --- a/src/storage/image-manager/image.zig +++ b/src/storage/image-manager/image.zig @@ -56,6 +56,17 @@ pub fn new( return self; } +pub fn delete(self: *Self, storage: *Storage) !void { + var dir = try storage.dir.openDir("image", .{}); + defer dir.close(); + + var file_name: [id_size + 4]u8 = undefined; + @memcpy(file_name[0..id_size], self.id); + @memcpy(file_name[id_size..], ".jpg"); + + try dir.deleteFile(&file_name); +} + pub fn init(storage: *Storage, id: []const u8) !Self { return .{ .id = try storage.allocator.dupe(u8, id), diff --git a/src/storage/image-manager/root.zig b/src/storage/image-manager/root.zig index 4188b88..c99ac00 100644 --- a/src/storage/image-manager/root.zig +++ b/src/storage/image-manager/root.zig @@ -103,3 +103,37 @@ pub fn first_by_timestamp(self: *Self) memora.locked.Shared(?*Timestamp) { .rw_lock = &self.rw_lock, }; } + +pub fn delete(self: *Self, storage: *Storage, id: []const u8) !void { + self.rw_lock.lock(); + defer self.rw_lock.unlock(); + + const index = index: { + for (self.items.items, 0..) |image, index| { + if (std.mem.eql(u8, image.id, id)) { + break :index index; + } + } + break :index null; + }; + + if (index) |idx| { + try self.items.items[idx].delete(storage); + const old_index = self.items.items.len - 1; + _ = self.items.swapRemove(idx); + + var current: ?*Timestamp = if (self.timestamp_order.first) |c| @fieldParentPtr("node", c) else null; + + while (current) |c| { + if (c.index == idx) { + self.timestamp_order.remove(&c.node); + storage.allocator.destroy(c); + } else if (c.index == old_index) { + c.index = idx; + break; + } + + current = c.next(); + } + } +} |