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
+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);