aboutsummaryrefslogtreecommitdiff
path: root/src/routes/api
diff options
context:
space:
mode:
authorNathan Reiner <nathan@nathanreiner.xyz>2025-11-19 09:15:49 +0100
committerNathan Reiner <nathan@nathanreiner.xyz>2025-11-19 09:15:49 +0100
commit4c06eb64cbed3562e428ce59857d1763098638f3 (patch)
treecc9c8164e76cd48e1dd4ef963329dcfa3c1b152f /src/routes/api
parent6201307fecf8398a1b53bf276bc08bfbb3524899 (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.zig19
-rw-r--r--src/routes/api/image/load.zig2
-rw-r--r--src/routes/api/image/upload.zig2
-rw-r--r--src/routes/api/profile/image/load.zig17
-rw-r--r--src/routes/api/profile/image/root.zig5
-rw-r--r--src/routes/api/profile/image/upload.zig19
-rw-r--r--src/routes/api/profile/root.zig1
-rw-r--r--src/routes/api/root.zig1
-rw-r--r--src/routes/api/session/current.zig2
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,
};
}