diff --git a/data.c b/data.c index cf66b9a..939ede6 100644 --- a/data.c +++ b/data.c @@ -1537,6 +1537,55 @@ void notify_add(snac *snac, const char *type, const char *utype, } +xs_dict *notify_get(snac *snac, const char *id) +/* gets a notification */ +{ + xs *fn = xs_fmt("%s/notify/%s.json", snac->basedir); + FILE *f; + xs_dict *out = NULL; + + if ((f = fopen(fn, "r")) != NULL) { + xs *j = xs_readall(f); + fclose(f); + + out = xs_json_loads(j); + } + + return out; +} + + +xs_list *notify_list(snac *snac, int new_only) +/* returns a list of notifications, optionally only the new ones */ +{ + xs *t = NULL; + + /* if only new ones are requested, get the last time */ + if (new_only) + t = notify_check_time(snac, 0); + + xs *spec = xs_fmt("%s/notify/" "*.json", snac->basedir); + xs *lst = xs_glob(spec, 1, 0); + xs_list *out = xs_list_new(); + xs_list *p = lst; + xs_str *v; + + while (xs_list_iter(&p, &v)) { + xs *id = xs_replace(v, ".json", ""); + + /* old? */ + if (t != NULL && strcmp(id, t) < 0) + continue; + + xs *noti = notify_get(snac, id); + + out = xs_list_append(out, noti); + } + + return out; +} + + /** the queue **/ static xs_dict *_enqueue_put(const char *fn, xs_dict *msg) diff --git a/mastoapi.c b/mastoapi.c index 7029dfb..fc636a9 100644 --- a/mastoapi.c +++ b/mastoapi.c @@ -855,9 +855,15 @@ int mastoapi_get_handler(const xs_dict *req, const char *q_path, else if (strcmp(cmd, "/notifications") == 0) { /* TBD */ - *body = xs_dup("[]"); - *ctype = "application/json"; - status = 200; + if (logged_in) { + xs *l = notify_list(&snac1, 0); + + *body = xs_dup("[]"); + *ctype = "application/json"; + status = 200; + } + else + status = 401; } else if (strcmp(cmd, "/filters") == 0) { diff --git a/snac.h b/snac.h index e201801..f1fe13f 100644 --- a/snac.h +++ b/snac.h @@ -140,6 +140,8 @@ void lastlog_write(snac *snac); xs_str *notify_check_time(snac *snac, int reset); void notify_add(snac *snac, const char *type, const char *utype, const char *actor, const char *objid); +xs_dict *notify_get(snac *snac, const char *id); +xs_list *notify_list(snac *snac, int new_only); void inbox_add(const char *inbox); void inbox_add_by_actor(const xs_dict *actor);