commit 07fec71
default
·
2022-11-28 09:46:42 +0000 UTC
parent 9c136da
Upgraded followers to the new db.
5 files changed,
+84,
-63
+3,
-5
1@@ -192,12 +192,10 @@ d_char *recipient_list(snac *snac, char *msg, int expand_public)
2 if (expand_public && strcmp(v, public_address) == 0) {
3 /* iterate the followers and add them */
4 xs *fwers = follower_list(snac);
5- char *fw;
6+ char *actor;
7
8 char *p = fwers;
9- while (xs_list_iter(&p, &fw)) {
10- char *actor = xs_dict_get(fw, "actor");
11-
12+ while (xs_list_iter(&p, &actor)) {
13 if (xs_list_in(list, actor) == -1)
14 list = xs_list_append(list, actor);
15 }
16@@ -832,7 +830,7 @@ int process_message(snac *snac, char *msg, char *req)
17
18 timeline_add(snac, xs_dict_get(f_msg, "id"), f_msg, NULL, NULL);
19
20- follower_add(snac, actor, f_msg);
21+ follower_add(snac, actor);
22
23 snac_log(snac, xs_fmt("New follower %s", actor));
24 do_notify = 1;
M
data.c
+30,
-51
1@@ -15,7 +15,7 @@
2 #include <sys/file.h>
3 #include <fcntl.h>
4
5-double db_layout = 2.4;
6+double db_layout = 2.5;
7
8
9 int db_upgrade(d_char **error);
10@@ -641,94 +641,73 @@ int object_user_cache_in(snac *snac, const char *id, const char *cachedir)
11 }
12
13
14-/** specialized functions **/
15-
16-d_char *_follower_fn(snac *snac, char *actor)
17+d_char *object_user_cache_list(snac *snac, const char *cachedir, int max)
18+/* returns the objects in a cache as a list */
19 {
20- xs *md5 = xs_md5_hex(actor, strlen(actor));
21- return xs_fmt("%s/followers/%s.json", snac->basedir, md5);
22+ xs *idx = xs_fmt("%s/%s.idx", snac->basedir, cachedir);
23+ return index_list(idx, max);
24 }
25
26
27-int follower_add(snac *snac, char *actor, char *msg)
28-/* adds a follower */
29-{
30- int ret = 201; /* created */
31- xs *fn = _follower_fn(snac, actor);
32- FILE *f;
33+/** specialized functions **/
34
35- if ((f = fopen(fn, "w")) != NULL) {
36- xs *j = xs_json_dumps_pp(msg, 4);
37+/** followers **/
38
39- fwrite(j, 1, strlen(j), f);
40- fclose(f);
41- }
42- else
43- ret = 500;
44+int follower_add(snac *snac, const char *actor)
45+/* adds a follower */
46+{
47+ int status = object_user_cache_add(snac, actor, "followers");
48
49- snac_debug(snac, 2, xs_fmt("follower_add %s %s", actor, fn));
50+ snac_debug(snac, 2, xs_fmt("follower_add %s %s", actor));
51
52- return ret;
53+ return status;
54 }
55
56
57-int follower_del(snac *snac, char *actor)
58+int follower_del(snac *snac, const char *actor)
59 /* deletes a follower */
60 {
61- int status = 200;
62- xs *fn = _follower_fn(snac, actor);
63-
64- if (fn != NULL)
65- unlink(fn);
66- else
67- status = 404;
68+ int status = object_user_cache_del(snac, actor, "followers");
69
70- snac_debug(snac, 2, xs_fmt("follower_del %s %s", actor, fn));
71+ snac_debug(snac, 2, xs_fmt("follower_del %s %s", actor));
72
73 return status;
74 }
75
76
77-int follower_check(snac *snac, char *actor)
78+int follower_check(snac *snac, const char *actor)
79 /* checks if someone is a follower */
80 {
81- xs *fn = _follower_fn(snac, actor);
82-
83- return !!(mtime(fn) != 0.0);
84+ return object_user_cache_in(snac, actor, "followers");
85 }
86
87
88 d_char *follower_list(snac *snac)
89 /* returns the list of followers */
90 {
91- xs *spec = xs_fmt("%s/followers/" "*.json", snac->basedir);
92- xs *glist = xs_glob(spec, 0, 0);
93+ xs *list = object_user_cache_list(snac, "followers", XS_ALL);
94+ d_char *fwers = xs_list_new();
95 char *p, *v;
96- d_char *list = xs_list_new();
97
98- /* iterate the list of files */
99- p = glist;
100+ /* resolve the list of md5 to be a list of actors */
101+ p = list;
102 while (xs_list_iter(&p, &v)) {
103- FILE *f;
104+ xs *a_obj = NULL;
105
106- /* load the follower data */
107- if ((f = fopen(v, "r")) != NULL) {
108- xs *j = xs_readall(f);
109- fclose(f);
110+ if (valid_status(object_get_by_md5(v, &a_obj, NULL))) {
111+ char *actor = xs_dict_get(a_obj, "id");
112
113- if (j != NULL) {
114- xs *o = xs_json_loads(j);
115-
116- if (o != NULL)
117- list = xs_list_append(list, o);
118- }
119+ if (!xs_is_null(actor))
120+ fwers = xs_list_append(fwers, actor);
121 }
122 }
123
124- return list;
125+ return fwers;
126 }
127
128
129+/** timeline **/
130+
131 double timeline_mtime(snac *snac)
132 {
133 xs *fn = xs_fmt("%s/timeline", snac->basedir);
M
html.c
+3,
-4
1@@ -840,13 +840,12 @@ d_char *html_people_list(snac *snac, d_char *os, d_char *list, const char *heade
2 {
3 xs *s = xs_str_new(NULL);
4 xs *h = xs_fmt("<h2>%s</h2>\n", header);
5- char *p, *v;
6+ char *p, *actor_id;
7
8 s = xs_str_cat(s, h);
9
10 p = list;
11- while (xs_list_iter(&p, &v)) {
12- char *actor_id = xs_dict_get(v, "actor");
13+ while (xs_list_iter(&p, &actor_id)) {
14 xs *md5 = xs_md5_hex(actor_id, strlen(actor_id));
15 xs *actor = NULL;
16
17@@ -939,7 +938,7 @@ d_char *html_people(snac *snac)
18
19 s = html_user_header(snac, s, 0);
20
21- s = html_people_list(snac, s, wing, L("People you follow"), "i");
22+// s = html_people_list(snac, s, wing, L("People you follow"), "i");
23
24 s = html_people_list(snac, s, wers, L("People that follows you"), "e");
25
M
snac.h
+3,
-3
1@@ -62,9 +62,9 @@ d_char *index_list_desc(const char *fn, int max);
2 int object_del(const char *id);
3 int object_del_if_unref(const char *id);
4
5-int follower_add(snac *snac, char *actor, char *msg);
6-int follower_del(snac *snac, char *actor);
7-int follower_check(snac *snac, char *actor);
8+int follower_add(snac *snac, const char *actor);
9+int follower_del(snac *snac, const char *actor);
10+int follower_check(snac *snac, const char *actor);
11 d_char *follower_list(snac *snac);
12
13 double timeline_mtime(snac *snac);
+45,
-0
1@@ -128,6 +128,51 @@ int db_upgrade(d_char **error)
2
3 nf = 2.4;
4 }
5+ else
6+ if (f < 2.5) {
7+ /* upgrade followers */
8+ xs *users = user_list();
9+ char *p, *v;
10+
11+ xs_debug();
12+
13+ p = users;
14+ while (xs_list_iter(&p, &v)) {
15+ snac snac;
16+
17+ if (user_open(&snac, v)) {
18+ xs *spec = xs_fmt("%s/followers/" "*.json", snac.basedir);
19+ xs *dir = xs_glob(spec, 0, 0);
20+ char *p, *v;
21+
22+ p = dir;
23+ while (xs_list_iter(&p, &v)) {
24+ FILE *f;
25+
26+ if ((f = fopen(v, "r")) != NULL) {
27+ xs *s = xs_readall(f);
28+ xs *o = xs_json_loads(s);
29+ fclose(f);
30+
31+ char *type = xs_dict_get(o, "type");
32+
33+ if (!xs_is_null(type) && strcmp(type, "Follow") == 0) {
34+ unlink(v);
35+
36+ char *actor = xs_dict_get(o, "actor");
37+
38+ if (!xs_is_null(actor))
39+ follower_add(&snac, actor);
40+ }
41+ }
42+ }
43+
44+ user_free(&snac);
45+ }
46+ }
47+
48+ nf = 2.5;
49+ }
50
51 if (f < nf) {
52 f = nf;