aboutsummaryrefslogtreecommitdiff
path: root/src/routes
diff options
context:
space:
mode:
authorNathan Reiner <nathan@nathanreiner.xyz>2025-11-19 18:58:54 +0100
committerNathan Reiner <nathan@nathanreiner.xyz>2025-11-19 18:58:54 +0100
commit25228df6d13b5e8541672c4cdd84e200ff56a4c4 (patch)
tree924cc6bdc00440c6bf592b04602261cdab17d60a /src/routes
parent4c06eb64cbed3562e428ce59857d1763098638f3 (diff)
add profile settings to backend and add image loader
Diffstat (limited to 'src/routes')
-rw-r--r--src/routes/api/auth/login.zig2
-rw-r--r--src/routes/api/profile/root.zig4
-rw-r--r--src/routes/api/profile/set.zig26
-rw-r--r--src/routes/handler-info.zig9
4 files changed, 37 insertions, 4 deletions
diff --git a/src/routes/api/auth/login.zig b/src/routes/api/auth/login.zig
index d7ee5cb..8a33082 100644
--- a/src/routes/api/auth/login.zig
+++ b/src/routes/api/auth/login.zig
@@ -16,7 +16,7 @@ const Result = struct {
pub const access = .everyone;
pub fn post(ctx: *Context, body: Body) anyerror!Result {
- var user = Storage.User.open(ctx.storage, body.user, ctx.allocator) catch return .{
+ var user = Storage.User.open(ctx.storage, body.user) catch return .{
.success = false
};
defer user.deinit();
diff --git a/src/routes/api/profile/root.zig b/src/routes/api/profile/root.zig
index 632c09c..04bf042 100644
--- a/src/routes/api/profile/root.zig
+++ b/src/routes/api/profile/root.zig
@@ -1 +1,5 @@
+const memora = @import("memora");
+const HandlerInfo = memora.routes.HandlerInfo;
+
pub const image = @import("image/root.zig");
+pub const set: HandlerInfo = .from_type(@import("set.zig"));
diff --git a/src/routes/api/profile/set.zig b/src/routes/api/profile/set.zig
new file mode 100644
index 0000000..a007b23
--- /dev/null
+++ b/src/routes/api/profile/set.zig
@@ -0,0 +1,26 @@
+const std = @import("std");
+
+const memora = @import("memora");
+const Context = memora.Context;
+const Storage = memora.Storage;
+
+pub const access = .users;
+
+const Body = struct {
+ full_name: []const u8,
+ birthday: []const u8,
+};
+
+pub fn post(ctx: *Context, body: Body) !void {
+ if (ctx.storage.sessions.get(ctx.storage, ctx.fingerprint)) |session| {
+ var user = try Storage.User.open(ctx.storage, session.info.name);
+ defer user.deinit();
+
+ user.info.full_name = body.full_name;
+ user.info.birthday = body.birthday;
+
+ try user.sync();
+ } else {
+ return error.UnknownSession;
+ }
+}
diff --git a/src/routes/handler-info.zig b/src/routes/handler-info.zig
index 97eb9bd..5183628 100644
--- a/src/routes/handler-info.zig
+++ b/src/routes/handler-info.zig
@@ -51,6 +51,9 @@ pub fn handle(
storage: *Storage,
allocator: std.mem.Allocator,
) !void {
+ const target = try allocator.dupe(u8, request.head.target);
+ defer allocator.free(target);
+
const handler = self.handler_from_method(request.head.method) orelse return request.respond(
"{ \"error\": \"Bad Request\" }",
.{ .status = .bad_request }
@@ -102,7 +105,7 @@ pub fn handle(
error.Forbidden => .{ "{ \"error\": \"Forbidden\" }", .forbidden },
error.NotFound => .{ "{ \"error\": \"Not Found\" }", .not_found },
else => blk: {
- log.err("handler for '{s}' returned {}", .{request.head.target, err});
+ log.err("handler for '{s}' returned {}", .{target, err});
break :blk .{ "{ \"error\": \"Internal Server Error\" }", .internal_server_error };
},
};
@@ -122,7 +125,7 @@ pub fn handle(
if (context.response.headers.fingerprint) |auth_token| {
var value = std.Io.Writer.Allocating.init(arena.allocator());
- try value.writer.print("fingerprint={s}; Secure; Path=/", .{auth_token});
+ try value.writer.print("fingerprint={s}; Path=/", .{auth_token});
try headers.append(allocator, .{
.name = "Set-Cookie",
@@ -184,7 +187,7 @@ fn HandlerWrapper(T: type, name: []const u8) type {
return @call(.auto, @field(T, name), args);
} else if (payload_type == void) {
try @call(.auto, @field(T, name), args);
- return memora.Stream.from_buffer("");
+ return memora.Stream.from_buffer("{}");
} else {
var writer = std.Io.Writer.Allocating.init(ctx.allocator);
var stringify = std.json.Stringify { .writer = &writer.writer };