]> gitweb.ps.run Git - chirp/blobdiff - src/main.zig
add TODOs
[chirp] / src / main.zig
index 7583d8de0c9ca955bcc77d4314951cadfbae35fd..80a174ac6b6d33d011475673f411159aee667124 100644 (file)
@@ -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>
@@ -903,7 +918,7 @@ const GET = struct {
             try self.res.write("<br />", .{});
         }
     }
-    pub fn @"/list/"(self: Self, args: struct { list_id: PostListList.Index }) !void {
+    pub fn @"/list/"(self: Self, args: struct { list_id: PostList.Index }) !void {
         try write_posts(self.res, self.txn, self.logged_in, PostList{ .idx = args.list_id });
     }
     pub fn @"/lists"(self: Self) !void {
@@ -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;
@@ -1127,10 +1168,12 @@ const POST = struct {
             }
         }
     }
+    // TODO: add arguments instead of parsing manually
     pub fn @"/new_list"(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);
+            // TODO: decode name
 
             var txn = try self.env.txn();
 
@@ -1164,6 +1207,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;