+
+ if (has_referer) |r| {
+ const decoded = try decode(r);
+ try res.redirect(decoded.constSlice());
+ }
+ }
+ } else if (std.mem.eql(u8, req.target, "/new_list")) {
+ if (logged_in) |login| {
+ const name_str = req.get_value("name") orelse return error.NoName;
+ const name = try Name.fromSlice(name_str);
+
+ var txn = try env.txn();
+
+ const postlist = try PostList.init(txn);
+ try txn.commit();
+
+ txn = try env.txn();
+ var post_lists_view = try login.user.post_lists.open(txn);
+ _ = try post_lists_view.append(.{ .name = name, .list = postlist });
+ try txn.commit();
+ }
+ } else if (std.mem.eql(u8, req.target, "/list_add")) {
+ if (logged_in) |login| {
+ _ = login;
+
+ const list_id_str = req.get_value("list_id") orelse return error.NoListId;
+ const post_id_str = req.get_value("post_id") orelse return error.NoPostId;
+ const list_id = try std.fmt.parseUnsigned(PostList.Index, list_id_str, 16);
+ const post_id = try parse_enum(PostId, post_id_str, 16);
+
+ const txn = try env.txn();
+ defer txn.commit() catch {};
+
+ const post_list = PostList{ .idx = list_id };
+ var post_list_view = try post_list.open(txn);
+ std.debug.print("adding {x} to {x}\n", .{ post_id, list_id });
+ if (try post_list_view.has(post_id)) {
+ try post_list_view.del(post_id);
+ } else {
+ try post_list_view.append(post_id);
+ }