commit ce041ee

grunfink  ·  2025-04-26 05:24:57 +0000 UTC
parents 327fb00, c1502ca
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";