abouttreesummaryrefslogcommitdiff
path: root/src/main.zig
diff options
context:
space:
mode:
authorpatrick-scho2025-03-05 16:11:58 +0100
committerpatrick-scho2025-03-05 16:11:58 +0100
commitf2f69ce6e3a748b394a38e234800171acbcd7666 (patch)
treee8b98d82947e0a6ec7354a4b9440c7be598ff33b /src/main.zig
parent2ef30b70c3bc464defb933cb7a5b5ca88f827be0 (diff)
downloadchirp-f2f69ce6e3a748b394a38e234800171acbcd7666.tar.gz
chirp-f2f69ce6e3a748b394a38e234800171acbcd7666.zip
Add feeds
Diffstat (limited to 'src/main.zig')
-rw-r--r--src/main.zig78
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;