diff --git a/src/main/controllers/web.zig b/src/main/controllers/web.zig new file mode 100644 index 0000000..5a6d52f --- /dev/null +++ b/src/main/controllers/web.zig @@ -0,0 +1,58 @@ +const std = @import("std"); + +pub const routes = .{ + index, + about, + login, +}; + +const index = struct { + pub const path = "/"; + pub const method = .GET; + + pub fn handler(_: anytype, res: anytype, srv: anytype) !void { + if (srv.user_id == null) { + try res.headers.put("Location", about.path); + return res.status(.see_other); + } + + try res.template(.ok, "Hello", .{}); + } +}; + +const about = struct { + pub const path = "/about"; + pub const method = .GET; + + pub fn handler(_: anytype, res: anytype, srv: anytype) !void { + try res.headers.put("Content-Type", "text/html"); + + try res.template(.ok, tmpl, .{ + .community = srv.community, + }); + } + + const tmpl = @embedFile("./web/index.tmpl.html"); +}; + +const login = struct { + pub const path = "/login"; + pub const method = .POST; + + pub const Body = struct { + username: []const u8, + password: []const u8, + }; + + pub fn handler(req: anytype, res: anytype, srv: anytype) !void { + const token = try srv.login(req.body.username, req.body.password); + + try res.headers.put("Location", index.path); + var buf: [64]u8 = undefined; + const cookie_name = try std.fmt.bufPrint(&buf, "token.{s}", .{req.body.username}); + try res.headers.setCookie(cookie_name, token.token, .{}); + try res.headers.setCookie("active_account", req.body.username, .{ .HttpOnly = false }); + + try res.status(.see_other); + } +}; diff --git a/src/main/controllers/web/index.zig b/src/main/controllers/web/index.zig deleted file mode 100644 index d1c6821..0000000 --- a/src/main/controllers/web/index.zig +++ /dev/null @@ -1,19 +0,0 @@ -const template = @import("template"); - -pub const path = "/"; -pub const method = .GET; - -pub fn handler(_: anytype, res: anytype, srv: anytype) !void { - try res.headers.put("Content-Type", "text/html"); - - var stream = try res.open(.ok); - defer stream.close(); - - try template.execute(stream.writer(), tmpl, .{ - .community = srv.community, - }); - - try stream.finish(); -} - -const tmpl = @embedFile("./index.tmpl.html");