Browse Source

Upgraded followers to the new db.

default 2 years ago
parent
commit
07fec71273
5 changed files with 84 additions and 63 deletions
  1. 3 5
      activitypub.c
  2. 30 51
      data.c
  3. 3 4
      html.c
  4. 3 3
      snac.h
  5. 45 0
      upgrade.c

+ 3 - 5
activitypub.c

@@ -192,12 +192,10 @@ d_char *recipient_list(snac *snac, char *msg, int expand_public)
             if (expand_public && strcmp(v, public_address) == 0) {
                 /* iterate the followers and add them */
                 xs *fwers = follower_list(snac);
-                char *fw;
+                char *actor;
 
                 char *p = fwers;
-                while (xs_list_iter(&p, &fw)) {
-                    char *actor = xs_dict_get(fw, "actor");
-
+                while (xs_list_iter(&p, &actor)) {
                     if (xs_list_in(list, actor) == -1)
                         list = xs_list_append(list, actor);
                 }
@@ -832,7 +830,7 @@ int process_message(snac *snac, char *msg, char *req)
 
         timeline_add(snac, xs_dict_get(f_msg, "id"), f_msg, NULL, NULL);
 
-        follower_add(snac, actor, f_msg);
+        follower_add(snac, actor);
 
         snac_log(snac, xs_fmt("New follower %s", actor));
         do_notify = 1;

+ 30 - 51
data.c

@@ -15,7 +15,7 @@
 #include <sys/file.h>
 #include <fcntl.h>
 
-double db_layout = 2.4;
+double db_layout = 2.5;
 
 
 int db_upgrade(d_char **error);
@@ -641,94 +641,73 @@ int object_user_cache_in(snac *snac, const char *id, const char *cachedir)
 }
 
 
-/** specialized functions **/
-
-d_char *_follower_fn(snac *snac, char *actor)
+d_char *object_user_cache_list(snac *snac, const char *cachedir, int max)
+/* returns the objects in a cache as a list */
 {
-    xs *md5 = xs_md5_hex(actor, strlen(actor));
-    return xs_fmt("%s/followers/%s.json", snac->basedir, md5);
+    xs *idx = xs_fmt("%s/%s.idx", snac->basedir, cachedir);
+    return index_list(idx, max);
 }
 
 
-int follower_add(snac *snac, char *actor, char *msg)
-/* adds a follower */
-{
-    int ret = 201; /* created */
-    xs *fn = _follower_fn(snac, actor);
-    FILE *f;
+/** specialized functions **/
 
-    if ((f = fopen(fn, "w")) != NULL) {
-        xs *j = xs_json_dumps_pp(msg, 4);
+/** followers **/
 
-        fwrite(j, 1, strlen(j), f);
-        fclose(f);
-    }
-    else
-        ret = 500;
+int follower_add(snac *snac, const char *actor)
+/* adds a follower */
+{
+    int status = object_user_cache_add(snac, actor, "followers");
 
-    snac_debug(snac, 2, xs_fmt("follower_add %s %s", actor, fn));
+    snac_debug(snac, 2, xs_fmt("follower_add %s %s", actor));
 
-    return ret;
+    return status;
 }
 
 
-int follower_del(snac *snac, char *actor)
+int follower_del(snac *snac, const char *actor)
 /* deletes a follower */
 {
-    int status = 200;
-    xs *fn = _follower_fn(snac, actor);
-
-    if (fn != NULL)
-        unlink(fn);
-    else
-        status = 404;
+    int status = object_user_cache_del(snac, actor, "followers");
 
-    snac_debug(snac, 2, xs_fmt("follower_del %s %s", actor, fn));
+    snac_debug(snac, 2, xs_fmt("follower_del %s %s", actor));
 
     return status;
 }
 
 
-int follower_check(snac *snac, char *actor)
+int follower_check(snac *snac, const char *actor)
 /* checks if someone is a follower */
 {
-    xs *fn = _follower_fn(snac, actor);
-
-    return !!(mtime(fn) != 0.0);
+    return object_user_cache_in(snac, actor, "followers");
 }
 
 
 d_char *follower_list(snac *snac)
 /* returns the list of followers */
 {
-    xs *spec = xs_fmt("%s/followers/" "*.json", snac->basedir);
-    xs *glist = xs_glob(spec, 0, 0);
+    xs *list      = object_user_cache_list(snac, "followers", XS_ALL);
+    d_char *fwers = xs_list_new();
     char *p, *v;
-    d_char *list = xs_list_new();
 
-    /* iterate the list of files */
-    p = glist;
+    /* resolve the list of md5 to be a list of actors */
+    p = list;
     while (xs_list_iter(&p, &v)) {
-        FILE *f;
+        xs *a_obj = NULL;
 
-        /* load the follower data */
-        if ((f = fopen(v, "r")) != NULL) {
-            xs *j = xs_readall(f);
-            fclose(f);
+        if (valid_status(object_get_by_md5(v, &a_obj, NULL))) {
+            char *actor = xs_dict_get(a_obj, "id");
 
-            if (j != NULL) {
-                xs *o = xs_json_loads(j);
-
-                if (o != NULL)
-                    list = xs_list_append(list, o);
-            }
+            if (!xs_is_null(actor))
+                fwers = xs_list_append(fwers, actor);
         }
     }
 
-    return list;
+    return fwers;
 }
 
 
+/** timeline **/
+
 double timeline_mtime(snac *snac)
 {
     xs *fn = xs_fmt("%s/timeline", snac->basedir);

+ 3 - 4
html.c

@@ -840,13 +840,12 @@ d_char *html_people_list(snac *snac, d_char *os, d_char *list, const char *heade
 {
     xs *s = xs_str_new(NULL);
     xs *h = xs_fmt("<h2>%s</h2>\n", header);
-    char *p, *v;
+    char *p, *actor_id;
 
     s = xs_str_cat(s, h);
 
     p = list;
-    while (xs_list_iter(&p, &v)) {
-        char *actor_id = xs_dict_get(v, "actor");
+    while (xs_list_iter(&p, &actor_id)) {
         xs *md5 = xs_md5_hex(actor_id, strlen(actor_id));
         xs *actor = NULL;
 
@@ -939,7 +938,7 @@ d_char *html_people(snac *snac)
 
     s = html_user_header(snac, s, 0);
 
-    s = html_people_list(snac, s, wing, L("People you follow"), "i");
+//    s = html_people_list(snac, s, wing, L("People you follow"), "i");
 
     s = html_people_list(snac, s, wers, L("People that follows you"), "e");
 

+ 3 - 3
snac.h

@@ -62,9 +62,9 @@ d_char *index_list_desc(const char *fn, int max);
 int object_del(const char *id);
 int object_del_if_unref(const char *id);
 
-int follower_add(snac *snac, char *actor, char *msg);
-int follower_del(snac *snac, char *actor);
-int follower_check(snac *snac, char *actor);
+int follower_add(snac *snac, const char *actor);
+int follower_del(snac *snac, const char *actor);
+int follower_check(snac *snac, const char *actor);
 d_char *follower_list(snac *snac);
 
 double timeline_mtime(snac *snac);

+ 45 - 0
upgrade.c

@@ -128,6 +128,51 @@ int db_upgrade(d_char **error)
 
             nf = 2.4;
         }
+        else
+        if (f < 2.5) {
+            /* upgrade followers */
+            xs *users = user_list();
+            char *p, *v;
+
+            xs_debug();
+
+            p = users;
+            while (xs_list_iter(&p, &v)) {
+                snac snac;
+
+                if (user_open(&snac, v)) {
+                    xs *spec = xs_fmt("%s/followers/" "*.json", snac.basedir);
+                    xs *dir  = xs_glob(spec, 0, 0);
+                    char *p, *v;
+
+                    p = dir;
+                    while (xs_list_iter(&p, &v)) {
+                        FILE *f;
+
+                        if ((f = fopen(v, "r")) != NULL) {
+                            xs *s = xs_readall(f);
+                            xs *o = xs_json_loads(s);
+                            fclose(f);
+
+                            char *type = xs_dict_get(o, "type");
+
+                            if (!xs_is_null(type) && strcmp(type, "Follow") == 0) {
+                                unlink(v);
+
+                                char *actor = xs_dict_get(o, "actor");
+
+                                if (!xs_is_null(actor))
+                                    follower_add(&snac, actor);
+                            }
+                        }
+                    }
+
+                    user_free(&snac);
+                }
+            }
+
+            nf = 2.5;
+        }
 
         if (f < nf) {
             f          = nf;