+ while (it.next()) |follower_id| {
+ const follower_user = try users.get(follower_id);
+
+ try res.write(
+ \\<a href="/user/{s}">{s}</a><br />
+ , .{ follower_user.name.constSlice(), follower_user.display_name.constSlice() });
+ }
+ } else |err| {
+ try res.write(
+ \\<p>User not found [{}]</p>
+ , .{err});
+ }
+ } else if (std.mem.startsWith(u8, req.target, "/post/")) {
+ const post_id_str = req.target[6..req.target.len];
+ const post_id = try parse_enum(PostId, post_id_str, 16);
+
+ try write_post(&res, txn, logged_in, post_id, .{
+ .recurse = 3, // TODO: factor out
+ .show_comment_field = true,
+ });
+ } else if (std.mem.startsWith(u8, req.target, "/quotes/")) {
+ const post_id_str = req.target[8..req.target.len];
+ const post_id = try parse_enum(PostId, post_id_str, 16);
+
+ const posts = try Db.posts(txn);
+ const post = try posts.get(post_id);
+
+ const referer = if (req.get_header("Referer")) |ref| ref else req.target;
+
+ try html_form(&res, "/quote", .{}, .{
+ .{ "type=\"hidden\" name=\"referer\" value=\"{s}\"", .{referer} },
+ .{ "type=\"hidden\" name=\"post_id\" value=\"{x}\"", .{@intFromEnum(post.id)} },
+ "type=\"text\" name=\"text\" placeholder=\"Text\"",
+ "type=\"submit\" value=\"Quote\"",
+ });
+ try res.write("<br />", .{});
+
+ const quotes_view = try post.quotes.open(txn);
+ var it = quotes_view.iterator();
+ while (it.next()) |quote_id| {
+ try write_post(&res, txn, logged_in, quote_id, .{ .recurse = 1 });
+ try res.write("<br />", .{});
+ }
+ } else if (std.mem.startsWith(u8, req.target, "/list/")) {
+ const list_id_str = req.target[6..req.target.len];
+ const list_id = try std.fmt.parseUnsigned(PostListList.Index, list_id_str, 16);
+
+ try write_posts(&res, txn, logged_in, PostList{ .idx = list_id });
+ } else if (std.mem.eql(u8, req.target, "/lists")) {
+ if (logged_in) |login| {
+ const post_lists_view = try login.user.post_lists.open(txn);
+
+ try html_form(&res, "/new_list", .{}, .{
+ "type=\"text\" name=\"name\"",
+ "type=\"submit\" value=\"Add\"",
+ });
+
+ try res.write("<br /><br />", .{});
+
+ var it = post_lists_view.iterator();
+ while (it.next()) |kv| {
+ const name = kv.val.name;
+ const post_list = kv.val.list;
+ try res.write(
+ \\<a href="/list/{x}">{s}</a><br />
+ , .{ post_list.idx.?, name.constSlice() });
+ }
+ } else {
+ try res.write("not logged in", .{});
+ }
+ } else if (std.mem.eql(u8, req.target, "/post")) {
+ if (logged_in) |login| {
+ _ = login;
+ const referer = if (req.get_header("Referer")) |ref| ref else req.target;
+
+ try html_form(&res, "/post", .{}, .{
+ .{ "type=\"hidden\" name=\"referer\" value=\"{s}\"", .{referer} },
+ "type=\"text\" name=\"text\"",
+ "type=\"submit\" value=\"Post\"",
+ });
+ } else {
+ try res.write("not logged in", .{});
+ }
+ } else if (std.mem.eql(u8, req.target, "/edit")) {
+ if (logged_in) |login| {
+ try res.write("<br />Username: ", .{});
+ try html_form(&res, "/set_username", .{}, .{
+ .{ "type=\"text\" name=\"username\" placeholder=\"{s}\"", .{login.user.name.constSlice()} },
+ "type=\"submit\" value=\"Change\"",
+ });
+ try res.write("<br />Display Name: ", .{});
+ try html_form(&res, "/set_display_name", .{}, .{
+ .{ "type=\"text\" name=\"display_name\" placeholder=\"{s}\"", .{login.user.display_name.constSlice()} },
+ "type=\"submit\" value=\"Change\"",
+ });
+ try res.write("<br />Password: ", .{});
+ try html_form(&res, "/set_password", .{}, .{
+ "type=\"text\" name=\"password\"",
+ "type=\"submit\" value=\"Change\"",
+ });
+ } else {
+ try res.write("not logged in", .{});
+ }
+ } else if (std.mem.eql(u8, req.target, "/")) {
+ if (logged_in) |login| {
+ try write_timeline(&res, txn, logged_in, login.user.following);