aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/routes/api/image/remove.zig14
-rw-r--r--src/routes/api/image/root.zig1
-rw-r--r--src/storage/image-manager/image.zig11
-rw-r--r--src/storage/image-manager/root.zig34
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();
+ }
+ }
+}