diff options
| author | patrick-scho | 2025-03-05 16:11:58 +0100 |
|---|---|---|
| committer | patrick-scho | 2025-03-05 16:11:58 +0100 |
| commit | f2f69ce6e3a748b394a38e234800171acbcd7666 (patch) | |
| tree | e8b98d82947e0a6ec7354a4b9440c7be598ff33b /src/main.zig | |
| parent | 2ef30b70c3bc464defb933cb7a5b5ca88f827be0 (diff) | |
| download | chirp-f2f69ce6e3a748b394a38e234800171acbcd7666.tar.gz chirp-f2f69ce6e3a748b394a38e234800171acbcd7666.zip | |
Add feeds
Diffstat (limited to 'src/main.zig')
| -rw-r--r-- | src/main.zig | 78 |
1 files changed, 78 insertions, 0 deletions
diff --git a/src/main.zig b/src/main.zig index bf68da0..3dc30a8 100644 --- a/src/main.zig +++ b/src/main.zig @@ -794,6 +794,21 @@ const GET = struct { \\type="submit" value="Follow" }); } + + // add to feed + const feeds_view = try login.user.feeds.open(self.txn); + try self.res.write("<form action=\"/feed_add\" method=\"post\">", .{}); + try self.res.write("<select name=\"feed_id\">", .{}); + var it = feeds_view.iterator(); + while (it.next()) |kv| { + const name = kv.val.name; + const id = kv.val.list.idx.?; + try self.res.write("<option value=\"{x}\">{s}</option>", .{ id, name.constSlice() }); + } + try self.res.write("</select>", .{}); + try self.res.write("<input type=\"hidden\" name=\"user_id\" value=\"{x}\"></input>", .{@intFromEnum(user_id)}); + try self.res.write("<input type=\"submit\" value=\"Add to feed\"></input>", .{}); + try self.res.write("</form>", .{}); } try self.res.write( \\ <a href="/following/{s}">{} following</a> @@ -929,6 +944,32 @@ const GET = struct { try self.res.write("not logged in", .{}); } } + pub fn @"/feed/"(self: Self, args: struct { feed_id: UserList.Index }) !void { + try write_timeline(self.res, self.txn, self.logged_in, UserList{ .idx = args.feed_id }); + } + pub fn @"/feeds"(self: Self) !void { + if (self.logged_in) |login| { + const feeds_view = try login.user.feeds.open(self.txn); + + try html_form(self.res, "/new_feed", .{}, .{ + "type=\"text\" name=\"name\"", + "type=\"submit\" value=\"Add\"", + }); + + try self.res.write("<br /><br />", .{}); + + var it = feeds_view.iterator(); + while (it.next()) |kv| { + const name = kv.val.name; + const user_list = kv.val.list; + try self.res.write( + \\<a href="/feed/{x}">{s}</a><br /> + , .{ user_list.idx.?, name.constSlice() }); + } + } else { + try self.res.write("not logged in", .{}); + } + } pub fn @"/post"(self: Self) !void { if (self.logged_in) |login| { _ = login; @@ -1164,6 +1205,43 @@ const POST = struct { } } } + pub fn @"/new_feed"(self: Self) !void { + if (self.logged_in) |login| { + const name_str = self.req.get_value("name") orelse return error.NoName; + const name = try Name.fromSlice(name_str); + + var txn = try self.env.txn(); + + const userlist = try UserList.init(txn); + try txn.commit(); + + txn = try self.env.txn(); + var feeds_view = try login.user.feeds.open(txn); + _ = try feeds_view.append(.{ .name = name, .list = userlist }); + try txn.commit(); + } + } + pub fn @"/feed_add"(self: Self) !void { + if (self.logged_in) |login| { + _ = login; + + const list_id_str = self.req.get_value("feed_id") orelse return error.NoListId; + const user_id_str = self.req.get_value("user_id") orelse return error.NoUserId; + const list_id = try std.fmt.parseUnsigned(UserList.Index, list_id_str, 16); + const user_id = try parse_enum(UserId, user_id_str, 16); + + const txn = try self.env.txn(); + defer txn.commit() catch {}; + + const user_list = UserList{ .idx = list_id }; + var user_list_view = try user_list.open(txn); + if (try user_list_view.has(user_id)) { + try user_list_view.del(user_id); + } else { + try user_list_view.append(user_id); + } + } + } pub fn @"/upvote"(self: Self) !void { const login = self.logged_in orelse return error.NotLoggedIn; |
