commit ce041ee
Merge pull request 'mastoapi: added `v1/accounts/.../lists` endpoint (issue #371)' (#372) from dandelions/snac2:pr-lists-mastoapi into master Reviewed-on: https://codeberg.org/grunfink/snac2/pulls/372
2 files changed,
+49,
-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 }
+47,
-15
1@@ -1500,6 +1500,44 @@ 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 = NULL;
10+ xs *lol = list_maint(user, NULL, 0);
11+
12+ if (uid) {
13+ if (!xs_is_hex(uid))
14+ actor_md5 = xs_md5_hex(uid, strlen(uid));
15+ else
16+ actor_md5 = xs_dup(uid);
17+ }
18+
19+ const xs_list *li;
20+ xs_list_foreach(lol, li) {
21+ const char *list_id = xs_list_get(li, 0);
22+ const char *list_title = xs_list_get(li, 1);
23+ if (uid) {
24+ xs *users = list_content(user, list_id, NULL, 0);
25+ if (xs_list_in(users, actor_md5) == -1)
26+ continue;
27+ }
28+
29+ xs *d = xs_dict_new();
30+
31+ d = xs_dict_append(d, "id", list_id);
32+ d = xs_dict_append(d, "title", list_title);
33+ d = xs_dict_append(d, "replies_policy", "list");
34+ d = xs_dict_append(d, "exclusive", xs_stock(XSTYPE_FALSE));
35+
36+ out = xs_list_append(out, d);
37+ }
38+
39+ return out;
40+}
41+
42+
43 int mastoapi_get_handler(const xs_dict *req, const char *q_path,
44 char **body, int *b_size, char **ctype, xs_str **link)
45 {
46@@ -1723,6 +1761,10 @@ int mastoapi_get_handler(const xs_dict *req, const char *q_path,
47 if (strcmp(opt, "followers") == 0) {
48 out = xs_list_new();
49 }
50+ else
51+ if (strcmp(opt, "lists") == 0) {
52+ out = mastoapi_account_lists(&snac1, uid);
53+ }
54
55 user_free(&snac2);
56 }
57@@ -1744,6 +1786,10 @@ int mastoapi_get_handler(const xs_dict *req, const char *q_path,
58 /* implement empty response so apps like Tokodon don't show an error */
59 out = xs_list_new();
60 }
61+ else
62+ if (strcmp(opt, "lists") == 0) {
63+ out = mastoapi_account_lists(&snac1, uid);
64+ }
65 }
66 }
67
68@@ -1975,21 +2021,7 @@ int mastoapi_get_handler(const xs_dict *req, const char *q_path,
69 else
70 if (strcmp(cmd, "/v1/lists") == 0) { /** list of lists **/
71 if (logged_in) {
72- xs *lol = list_maint(&snac1, NULL, 0);
73- xs *l = xs_list_new();
74- int c = 0;
75- const xs_list *li;
76-
77- while (xs_list_next(lol, &li, &c)) {
78- xs *d = xs_dict_new();
79-
80- d = xs_dict_append(d, "id", xs_list_get(li, 0));
81- d = xs_dict_append(d, "title", xs_list_get(li, 1));
82- d = xs_dict_append(d, "replies_policy", "list");
83- d = xs_dict_append(d, "exclusive", xs_stock(XSTYPE_FALSE));
84-
85- l = xs_list_append(l, d);
86- }
87+ xs *l = mastoapi_account_lists(&snac1, NULL);
88
89 *body = xs_json_dumps(l, 4);
90 *ctype = "application/json";