diff options
| author | Nathan Reiner <nathan@nathanreiner.xyz> | 2025-11-19 09:15:49 +0100 |
|---|---|---|
| committer | Nathan Reiner <nathan@nathanreiner.xyz> | 2025-11-19 09:15:49 +0100 |
| commit | 4c06eb64cbed3562e428ce59857d1763098638f3 (patch) | |
| tree | cc9c8164e76cd48e1dd4ef963329dcfa3c1b152f /src/routes/api | |
| parent | 6201307fecf8398a1b53bf276bc08bfbb3524899 (diff) | |
allow images to upload and sort if according to their datetime
Diffstat (limited to 'src/routes/api')
| -rw-r--r-- | src/routes/api/image/list.zig | 19 | ||||
| -rw-r--r-- | src/routes/api/image/load.zig | 2 | ||||
| -rw-r--r-- | src/routes/api/image/upload.zig | 2 | ||||
| -rw-r--r-- | src/routes/api/profile/image/load.zig | 17 | ||||
| -rw-r--r-- | src/routes/api/profile/image/root.zig | 5 | ||||
| -rw-r--r-- | src/routes/api/profile/image/upload.zig | 19 | ||||
| -rw-r--r-- | src/routes/api/profile/root.zig | 1 | ||||
| -rw-r--r-- | src/routes/api/root.zig | 1 | ||||
| -rw-r--r-- | src/routes/api/session/current.zig | 2 |
9 files changed, 62 insertions, 6 deletions
diff --git a/src/routes/api/image/list.zig b/src/routes/api/image/list.zig index d305276..5d2eace 100644 --- a/src/routes/api/image/list.zig +++ b/src/routes/api/image/list.zig @@ -7,6 +7,7 @@ pub const access = .users; const ImageInfo = struct { id: []const u8, + timestamp: ?i64, }; const Result = struct { @@ -16,13 +17,23 @@ const Result = struct { pub fn get(ctx: *Context) !Result { var images: std.ArrayList(ImageInfo) = .empty; - const images_list = ctx.storage.images.list(); - defer images_list.deinit(); + var images_list = ctx.storage.images.list(); + defer images_list.unlock(); + + var locked = ctx.storage.images.first_by_timestamp(); + defer locked.unlock(); + + var current = locked.value; + + while (current) |c| { + const image = ctx.storage.images.items.items[c.index]; - for (images_list.images) |*image| { try images.append(ctx.allocator, .{ - .id = image.id + .id = try ctx.allocator.dupe(u8, image.id), + .timestamp = image.timestamp, }); + + current = c.next(); } return .{ diff --git a/src/routes/api/image/load.zig b/src/routes/api/image/load.zig index 4f0a072..1b2a3e2 100644 --- a/src/routes/api/image/load.zig +++ b/src/routes/api/image/load.zig @@ -8,6 +8,6 @@ pub const access = .users; pub fn get(ctx: *Context) !memora.Stream { const id = ctx.request.head.target["/api/image/load/".len..]; - var image = Storage.Image { .id = id }; + var image = Storage.Image { .id = id, .timestamp = null }; return .from_file(try image.file(ctx.storage)); } diff --git a/src/routes/api/image/upload.zig b/src/routes/api/image/upload.zig index bbdd47c..72c8a2d 100644 --- a/src/routes/api/image/upload.zig +++ b/src/routes/api/image/upload.zig @@ -12,6 +12,6 @@ pub fn post(ctx: *Context) !void { if (ctx.request.head.content_length) |length| { var buffer: [1024]u8 = undefined; const reader = try ctx.request.readerExpectContinue(&buffer); - try ctx.storage.images.add(ctx.storage, reader, length); + try ctx.storage.images.save(ctx.storage, reader, length); } } diff --git a/src/routes/api/profile/image/load.zig b/src/routes/api/profile/image/load.zig new file mode 100644 index 0000000..4b696ce --- /dev/null +++ b/src/routes/api/profile/image/load.zig @@ -0,0 +1,17 @@ +const std = @import("std"); + +const memora = @import("memora"); +const Context = memora.Context; +const Storage = memora.Storage; + +pub const access = .users; + +pub fn get(ctx: *Context) !memora.Stream { + const name = ctx.request.head.target["/api/profile/image/load/".len..]; + if (Storage.User.image(ctx.storage, name)) |file| { + ctx.response.headers.content_type = "image/jpeg"; + return .from_file(file); + } + + return error.NotFound; +} diff --git a/src/routes/api/profile/image/root.zig b/src/routes/api/profile/image/root.zig new file mode 100644 index 0000000..d6b77f2 --- /dev/null +++ b/src/routes/api/profile/image/root.zig @@ -0,0 +1,5 @@ +const memora = @import("memora"); +const HandlerInfo = memora.routes.HandlerInfo; + +pub const upload: HandlerInfo = .from_type(@import("upload.zig")); +pub const load: HandlerInfo = .from_type(@import("load.zig")); diff --git a/src/routes/api/profile/image/upload.zig b/src/routes/api/profile/image/upload.zig new file mode 100644 index 0000000..db140d4 --- /dev/null +++ b/src/routes/api/profile/image/upload.zig @@ -0,0 +1,19 @@ +const std = @import("std"); + +const memora = @import("memora"); +const Context = memora.Context; +const Storage = memora.Storage; + +pub const access = .users; + +pub fn post(ctx: *Context) !void { + const name = ctx.request.head.target["/api/profile/image/upload/".len..]; + if (ctx.request.head.content_length) |length| { + var buffer: [1024]u8 = undefined; + const reader = try ctx.request.readerExpectContinue(&buffer); + + try Storage.User.set_image(ctx.storage, name, reader, length); + + ctx.response.headers.content_type = "image/jpeg"; + } +} diff --git a/src/routes/api/profile/root.zig b/src/routes/api/profile/root.zig new file mode 100644 index 0000000..632c09c --- /dev/null +++ b/src/routes/api/profile/root.zig @@ -0,0 +1 @@ +pub const image = @import("image/root.zig"); diff --git a/src/routes/api/root.zig b/src/routes/api/root.zig index 6d5745f..5f731c3 100644 --- a/src/routes/api/root.zig +++ b/src/routes/api/root.zig @@ -1,3 +1,4 @@ pub const auth = @import("auth/root.zig"); pub const session = @import("session/root.zig"); pub const image = @import("image/root.zig"); +pub const profile = @import("profile/root.zig"); diff --git a/src/routes/api/session/current.zig b/src/routes/api/session/current.zig index e86c115..897d01c 100644 --- a/src/routes/api/session/current.zig +++ b/src/routes/api/session/current.zig @@ -9,6 +9,7 @@ const Result = struct { name: []const u8, full_name: []const u8, birthday: []const u8, + is_admin: bool, }; pub fn get(ctx: *Context) !Result { @@ -21,5 +22,6 @@ pub fn get(ctx: *Context) !Result { .name = session.info.name, .full_name = session.info.full_name, .birthday = session.info.birthday, + .is_admin = session.info.is_admin, }; } |