commit 8275a5f

default  ·  2024-04-29 05:43:01 +0000 UTC
parent a297b55
Start of list support.
3 files changed,  +108, -3
M data.c
M snac.h
M data.c
+62, -0
 1@@ -1729,6 +1729,68 @@ xs_list *tag_search(char *tag, int skip, int show)
 2 }
 3 
 4 
 5+/** lists **/
 6+
 7+xs_list *list_maint(snac *user, const char *list, int op)
 8+{
 9+    xs_list *l = NULL;
10+
11+    switch (op) {
12+    case 0: /** list of lists **/
13+        {
14+            FILE *f;
15+            xs *spec = xs_fmt("%s/list/" "*.id", user->basedir);
16+            xs *ls   = xs_glob(spec, 0, 0);
17+            int c = 0;
18+            char *v;
19+
20+            l = xs_list_new();
21+
22+            while (xs_list_next(ls, &v, &c)) {
23+                if ((f = fopen(v, "r")) != NULL) {
24+                    xs *title = xs_readline(f);
25+                    fclose(f);
26+
27+                    title = xs_strip_i(title);
28+                    xs *md5 = xs_md5_hex(title, strlen(title));
29+
30+                    /* return [ list_id, list_title ] */
31+                    l = xs_list_append(l, xs_list_append(xs_list_new(), md5, title));
32+                }
33+            }
34+        }
35+
36+        break;
37+
38+    case 1: /** create new list (list is the name) **/
39+        {
40+            FILE *f;
41+            xs *dir = xs_fmt("%s/list/", user->basedir);
42+            xs *md5 = xs_md5_hex(list, strlen(list));
43+
44+            mkdirx(dir);
45+
46+            xs *fn = xs_fmt("%s%s.id", dir, md5);
47+
48+            if ((f = fopen(fn, "w")) != NULL) {
49+                fprintf(f, "%s\n", list);
50+                fclose(f);
51+            }
52+        }
53+
54+        break;
55+
56+    case 2: /** delete list (list is md5 id) **/
57+        break;
58+
59+    case 3: /** list content (list is md5 id) **/
60+        break;
61+    }
62+
63+    return l;
64+}
65+
66+
67 /** static data **/
68 
69 static int _load_raw_file(const char *fn, xs_val **data, int *size,
+44, -3
 1@@ -1767,9 +1767,27 @@ int mastoapi_get_handler(const xs_dict *req, const char *q_path,
 2     else
 3     if (strcmp(cmd, "/v1/lists") == 0) { /** **/
 4         /* snac does not support lists */
 5-        *body  = xs_dup("[]");
 6-        *ctype = "application/json";
 7-        status = 200;
 8+        if (logged_in) {
 9+            xs *lol = list_maint(&snac1, NULL, 0);
10+            xs *l   = xs_list_new();
11+            int c = 0;
12+            xs_list *li;
13+
14+            while (xs_list_next(lol, &li, &c)) {
15+                xs *d = xs_dict_new();
16+
17+                d = xs_dict_append(d, "id", xs_list_get(li, 0));
18+                d = xs_dict_append(d, "title", xs_list_get(li, 1));
19+                d = xs_dict_append(d, "replies_policy", "list");
20+                d = xs_dict_append(d, "exclusive", xs_stock(XSTYPE_FALSE));
21+
22+                l = xs_list_append(l, d);
23+            }
24+
25+            *body  = xs_json_dumps(l, 4);
26+            *ctype = "application/json";
27+            status = 200;
28+        }
29     }
30     else
31     if (strcmp(cmd, "/v1/scheduled_statuses") == 0) { /** **/
32@@ -2631,6 +2649,29 @@ int mastoapi_post_handler(const xs_dict *req, const char *q_path,
33         else
34             status = 401;
35     }
36+    else
37+    if (strcmp(cmd, "/v1/lists") == 0) {
38+        if (logged_in) {
39+            const char *title = xs_dict_get(args, "title");
40+
41+            if (xs_type(title) == XSTYPE_STRING) {
42+                /* add the list */
43+                list_maint(&snac, title, 1);
44+
45+                xs *out = xs_dict_new();
46+
47+                out = xs_dict_append(out, "title", title);
48+                out = xs_dict_append(out, "replies_policy", xs_dict_get_def(args, "replies_policy", "list"));
49+                out = xs_dict_append(out, "exclusive", xs_stock(XSTYPE_FALSE));
50+
51+                *body  = xs_json_dumps(out, 4);
52+                *ctype = "application/json";
53+                status = 200;
54+            }
55+            else
56+                status = 422;
57+        }
58+    }
59 
60     /* user cleanup */
61     if (logged_in)
M snac.h
+2, -0
1@@ -174,6 +174,8 @@ int is_hidden(snac *snac, const char *id);
2 void tag_index(const char *id, const xs_dict *obj);
3 xs_list *tag_search(char *tag, int skip, int show);
4 
5+xs_list *list_maint(snac *user, const char *list, int op);
6+
7 int actor_add(const char *actor, xs_dict *msg);
8 int actor_get(const char *actor, xs_dict **data);
9 int actor_get_refresh(snac *user, const char *actor, xs_dict **data);