summaryrefslogtreecommitdiff
path: root/backend/src/Handler.zig
diff options
context:
space:
mode:
Diffstat (limited to 'backend/src/Handler.zig')
-rw-r--r--backend/src/Handler.zig40
1 files changed, 38 insertions, 2 deletions
diff --git a/backend/src/Handler.zig b/backend/src/Handler.zig
index 010dd0e..4623d36 100644
--- a/backend/src/Handler.zig
+++ b/backend/src/Handler.zig
@@ -1,9 +1,45 @@
const std = @import("std");
const httpz = @import("httpz");
+const userModel = @import("Models/User.zig");
+const tokens = @import("Authentication/Tokens.zig");
+
+pub const RequestData = struct {
+ User: ?userModel.User,
+
+ pub fn Init(req: *httpz.Request) !RequestData {
+ return .{
+ .User = try getUser(req),
+ };
+ }
+
+ fn getUser(req: *httpz.Request) !?userModel.User {
+ const header = req.header("authorization") orelse return null;
+ const stripped = stripBearerPrefix(header);
+ const parsed = tokens.GetUserFromToken(req.arena, stripped) catch |err| {
+ std.debug.print("Failed to parse a user: {any}\n", .{ err });
+ return err;
+ } orelse {
+ return null;
+ };
+
+ return parsed.value;
+ }
+};
pub const Handler = struct {
- pub fn dispatch(self: *Handler, action: httpz.Action(*Handler), req: *httpz.Request, res: *httpz.Response) !void {
- try action(self, req, res);
+ pub fn dispatch(_: *Handler, action: httpz.Action(*RequestData), req: *httpz.Request, res: *httpz.Response) !void {
+ var data = try RequestData.Init(req);
+ std.debug.print("Data: {any}\n", .{ data });
+ try action(&data, req, res);
std.debug.print("{any} {s}: {d}\n", .{req.method, req.url.raw, res.status});
}
};
+
+const headerPrefix = "Bearer ";
+
+fn stripBearerPrefix(header: []const u8) []const u8 {
+ if (std.mem.startsWith(u8, header, headerPrefix)) {
+ return header[headerPrefix.len..];
+ }
+ return header;
+}