commit 6b1721c

default  ·  2024-05-07 17:40:28 +0000 UTC
parent c5ae10a
List timelines can now be (manually) navigated from the web UI.

URLs are {srv_baseurl}/{user}/list/{list_id} (you must know the list id).
4 files changed,  +44, -6
M data.c
M html.c
M snac.h
M data.c
+19, -5
 1@@ -1836,6 +1836,23 @@ xs_val *list_maint(snac *user, const char *list, int op)
 2 }
 3 
 4 
 5+xs_list *list_timeline(snac *user, const char *list, int skip, int show)
 6+/* returns the timeline of a list */
 7+{
 8+    xs_list *l = NULL;
 9+
10+    if (!xs_is_hex(list))
11+        return NULL;
12+
13+    xs *fn = xs_fmt("%s/list/%s.idx", user->basedir, list);
14+
15+    if (mtime(fn) > 0.0)
16+        l = index_list_desc(fn, skip, show);
17+
18+    return l;
19+}
20+
21+
22 xs_val *list_content(snac *user, const char *list, const char *actor_md5, int op)
23 /* list content management */
24 {
25@@ -1869,11 +1886,8 @@ xs_val *list_content(snac *user, const char *list, const char *actor_md5, int op
26 
27         break;
28 
29-    case 3: /** list timeline **/
30-        fn = xs_replace_i(fn, ".lst", ".idx");
31-
32-        l = index_list_desc(fn, 0, 2048);
33-
34+    default:
35+        srv_log(xs_fmt("ERROR: list_content: bad op %d", op));
36         break;
37     }
38 
M html.c
+23, -0
 1@@ -2658,6 +2658,29 @@ int html_get_handler(const xs_dict *req, const char *q_path,
 2         }
 3     }
 4     else
 5+    if (xs_startswith(p_path, "list/")) { /** list timelines **/
 6+        if (!login(&snac, req)) {
 7+            *body  = xs_dup(uid);
 8+            status = 401;
 9+        }
10+        else {
11+            xs *l = xs_split(p_path, "/");
12+            char *lid = xs_list_get(l, -1);
13+
14+            xs *list = list_timeline(&snac, lid, skip, show);
15+            xs *next = list_timeline(&snac, lid, skip + show, 1);
16+
17+            if (list != NULL) {
18+                xs *base = xs_fmt("/list/%s", lid);
19+
20+                *body = html_timeline(&snac, list, 0, skip, show,
21+                    xs_list_len(next), NULL, base, 0);
22+                *b_size = strlen(*body);
23+                status  = 200;
24+            }
25+        }
26+    }
27+    else
28     if (xs_startswith(p_path, "p/")) { /** a timeline with just one entry **/
29         if (xs_type(xs_dict_get(snac.config, "private")) == XSTYPE_TRUE)
30             return 403;
+1, -1
1@@ -1669,7 +1669,7 @@ int mastoapi_get_handler(const xs_dict *req, const char *q_path,
2             xs *l = xs_split(cmd, "/");
3             char *list = xs_list_get(l, -1);
4 
5-            xs *timeline = list_content(&snac1, list, NULL, 3);
6+            xs *timeline = list_timeline(&snac1, list, 0, 2048);
7             xs *out      = xs_list_new();
8             int c = 0;
9             char *md5;
M snac.h
+1, -0
1@@ -175,6 +175,7 @@ void tag_index(const char *id, const xs_dict *obj);
2 xs_list *tag_search(char *tag, int skip, int show);
3 
4 xs_val *list_maint(snac *user, const char *list, int op);
5+xs_list *list_timeline(snac *user, const char *list, int skip, int show);
6 xs_val *list_content(snac *user, const char *list_id, const char *actor_md5, int op);
7 void list_distribute(snac *user, const char *who, const xs_dict *post);
8