aboutsummaryrefslogtreecommitdiff
path: root/src/routes/root.zig
diff options
context:
space:
mode:
Diffstat (limited to 'src/routes/root.zig')
-rw-r--r--src/routes/root.zig57
1 files changed, 50 insertions, 7 deletions
diff --git a/src/routes/root.zig b/src/routes/root.zig
index 0330404..01952bb 100644
--- a/src/routes/root.zig
+++ b/src/routes/root.zig
@@ -1,15 +1,58 @@
const std = @import("std");
pub const fallback = @import("fallback.zig");
+pub const login = @import("login.zig");
-pub const Handler = *const fn (
- request: *std.http.Server.Request,
- allocator: std.mem.Allocator,
-) anyerror!void;
+pub const HandlerInfo = struct {
+ handler: *const fn (
+ request: *std.http.Server.Request,
+ allocator: std.mem.Allocator,
+ ) anyerror!void,
+ needs_auth: bool,
+ method: std.http.Method,
-pub const handlers = std.StaticStringMap(Handler).initComptime(.{
+ pub fn handle(
+ self: *const @This(),
+ request: *std.http.Server.Request,
+ allocator: std.mem.Allocator,
+ ) !void {
+ if (request.head.method != self.method) {
+ try request.respond("{ \"error\": \"Bad Request\" }", .{ .status = .bad_request });
+ }
+
+ self.handler(request, allocator) catch |err| {
+ const response, const status_code: std.http.Status = switch (err) {
+ error.BadRequest => .{ "{ \"error\": \"Bad Request\" }", .bad_request },
+ error.Unauthorized => .{ "{ \"error\": \"Unauthorized\" }", .unauthorized },
+ error.Forbidden => .{ "{ \"error\": \"Forbidden\" }", .forbidden },
+ error.NotFound => .{ "{ \"error\": \"Not Found\" }", .not_found },
+ else => .{ "{ \"error\": \"Internal Server Error\" }", .internal_server_error },
+ };
+
+ try request.respond(response, .{ .status = status_code });
+ };
+ }
+};
+
+pub const handlers = std.StaticStringMap(HandlerInfo).initComptime(.{
+ .{
+ "",
+ HandlerInfo {
+ .handler = fallback.handler,
+ .needs_auth = false,
+ .method = .GET,
+ }
+ },
+ .{
+ "/api/login",
+ HandlerInfo {
+ .handler = login.handler,
+ .needs_auth = false,
+ .method = .POST,
+ }
+ },
});
-pub fn get(path: []const u8) Handler {
- return handlers.get(path) orelse fallback.handler;
+pub fn get(path: []const u8) HandlerInfo {
+ return (handlers.getLongestPrefix(std.mem.trimEnd(u8, path, "/")) orelse unreachable).value;
}