commit ec21e15
green
·
2025-04-24 13:49:55 +0000 UTC
parent 53e662c
mastoapi: support lists for users
2 files changed,
+42,
-16
M
data.c
M
data.c
+2,
-1
1@@ -2265,7 +2265,8 @@ xs_val *list_maint(snac *user, const char *list, int op)
2 xs *l2 = xs_split(v2, "/");
3
4 /* return [ list_id, list_title ] */
5- l = xs_list_append(l, xs_list_append(xs_list_new(), xs_list_get(l2, -1), title));
6+ xs *tmp_list = xs_list_append(xs_list_new(), xs_list_get(l2, -1), title);
7+ l = xs_list_append(l, tmp_list);
8 }
9 }
10 }
+40,
-15
1@@ -1500,6 +1500,37 @@ xs_str *timeline_link_header(const char *endpoint, xs_list *timeline)
2 }
3
4
5+xs_list *mastoapi_account_lists(snac *user, const char *uid)
6+/* returns the list of list an user is in */
7+{
8+ xs_list *out = xs_list_new();
9+ xs *actor_md5 = uid ? xs_md5_hex(uid, strlen(uid)) : NULL;
10+ xs *lol = list_maint(user, NULL, 0);
11+
12+ const xs_list *li;
13+ xs_list_foreach(lol, li) {
14+ const char *list_id = xs_list_get(li, 0);
15+ const char *list_title = xs_list_get(li, 1);
16+ if (uid) {
17+ xs *users = list_content(user, list_id, NULL, 0);
18+ if (xs_list_in(users, actor_md5) == -1)
19+ continue;
20+ }
21+
22+ xs *d = xs_dict_new();
23+
24+ d = xs_dict_append(d, "id", list_id);
25+ d = xs_dict_append(d, "title", list_title);
26+ d = xs_dict_append(d, "replies_policy", "list");
27+ d = xs_dict_append(d, "exclusive", xs_stock(XSTYPE_FALSE));
28+
29+ out = xs_list_append(out, d);
30+ }
31+
32+ return out;
33+}
34+
35+
36 int mastoapi_get_handler(const xs_dict *req, const char *q_path,
37 char **body, int *b_size, char **ctype, xs_str **link)
38 {
39@@ -1723,6 +1754,10 @@ int mastoapi_get_handler(const xs_dict *req, const char *q_path,
40 if (strcmp(opt, "followers") == 0) {
41 out = xs_list_new();
42 }
43+ else
44+ if (strcmp(opt, "lists") == 0) {
45+ out = mastoapi_account_lists(&snac1, uid);
46+ }
47
48 user_free(&snac2);
49 }
50@@ -1744,6 +1779,10 @@ int mastoapi_get_handler(const xs_dict *req, const char *q_path,
51 /* implement empty response so apps like Tokodon don't show an error */
52 out = xs_list_new();
53 }
54+ else
55+ if (strcmp(opt, "lists") == 0) {
56+ out = mastoapi_account_lists(&snac1, uid);
57+ }
58 }
59 }
60
61@@ -1975,21 +2014,7 @@ int mastoapi_get_handler(const xs_dict *req, const char *q_path,
62 else
63 if (strcmp(cmd, "/v1/lists") == 0) { /** list of lists **/
64 if (logged_in) {
65- xs *lol = list_maint(&snac1, NULL, 0);
66- xs *l = xs_list_new();
67- int c = 0;
68- const xs_list *li;
69-
70- while (xs_list_next(lol, &li, &c)) {
71- xs *d = xs_dict_new();
72-
73- d = xs_dict_append(d, "id", xs_list_get(li, 0));
74- d = xs_dict_append(d, "title", xs_list_get(li, 1));
75- d = xs_dict_append(d, "replies_policy", "list");
76- d = xs_dict_append(d, "exclusive", xs_stock(XSTYPE_FALSE));
77-
78- l = xs_list_append(l, d);
79- }
80+ xs *l = mastoapi_account_lists(&snac1, NULL);
81
82 *body = xs_json_dumps(l, 4);
83 *ctype = "application/json";