diff --git a/Slon/Api/V1/Markers.HC b/Slon/Api/V1/Markers.HC new file mode 100644 index 0000000..95ef2a1 --- /dev/null +++ b/Slon/Api/V1/Markers.HC @@ -0,0 +1,48 @@ +U0 @slon_api_v1_markers_get(SlonHttpSession* session) +{ + if (!@slon_api_authorized(session)) { + session->status(401); + return; + } + + SLON_AUTH_ACCOUNT_ID + + if (db->o("markers")->@(account_id)) { + session->send(db->o("markers")->@(account_id)); + } else { + session->send(SLON_EMPTY_JSON_OBJECT); + } +} + +U0 @slon_api_v1_markers_post(SlonHttpSession* session) +{ + if (!@slon_api_authorized(session)) { + session->status(401); + return; + } + + SLON_SCRATCH_BUFFER_AND_REQUEST_JSON + no_warn scratch_buffer; + + SLON_AUTH_ACCOUNT_ID + + U8* updated_at = @slon_api_timestamp_from_cdate(session, Now); + + JsonKey* key = request_json->keys; + JsonObject* obj = NULL; + I64 version = cnts.jiffies; + while (key) { + obj = key->value; + if (obj) { + obj->set("version", version, JSON_NUMBER); + obj->set("updated_at", updated_at, JSON_STRING); + } + key = key->next; + } + + db->o("markers")->set(account_id, request_json, JSON_OBJECT); + @slon_db_save_markers_to_disk; + + session->send(request_json); + @slon_free(session, updated_at); +} diff --git a/Slon/Endpoints/Get/Markers.HC b/Slon/Endpoints/Get/Markers.HC new file mode 100644 index 0000000..be9c704 --- /dev/null +++ b/Slon/Endpoints/Get/Markers.HC @@ -0,0 +1,4 @@ +if (!StrICmp("/api/v1/markers", session->path())) { + @slon_api_v1_markers_get(session); + return; +} diff --git a/Slon/Endpoints/Post/Markers.HC b/Slon/Endpoints/Post/Markers.HC new file mode 100644 index 0000000..40ad9d2 --- /dev/null +++ b/Slon/Endpoints/Post/Markers.HC @@ -0,0 +1,4 @@ +if (!StrICmp("/api/v1/markers", session->path())) { + @slon_api_v1_markers_post(session); + return; +} diff --git a/Slon/Http/Server.HC b/Slon/Http/Server.HC index 45a3532..0cc4003 100644 --- a/Slon/Http/Server.HC +++ b/Slon/Http/Server.HC @@ -526,6 +526,7 @@ U0 @slon_http_handle_get_request(SlonHttpSession* session) #include "Endpoints/Get/FollowRequests"; #include "Endpoints/Get/FollowedTags"; #include "Endpoints/Get/Instance"; + #include "Endpoints/Get/Markers"; #include "Endpoints/Get/Notifications"; #include "Endpoints/Get/NodeInfo"; #include "Endpoints/Get/OAuth"; @@ -587,6 +588,7 @@ U0 @slon_http_handle_post_request(SlonHttpSession* session) #include "Endpoints/Post/Accounts"; #include "Endpoints/Post/ActivityPub"; #include "Endpoints/Post/Apps"; + #include "Endpoints/Post/Markers"; #include "Endpoints/Post/OAuth"; #include "Endpoints/Post/Statuses"; diff --git a/Slon/MakeSlon.HC b/Slon/MakeSlon.HC index d51535c..98d0f4a 100644 --- a/Slon/MakeSlon.HC +++ b/Slon/MakeSlon.HC @@ -18,6 +18,7 @@ WinMax(Fs); #include "Api/V1/Filters"; #include "Api/V1/FollowRequests"; #include "Api/V1/FollowedTags"; +#include "Api/V1/Markers"; #include "Api/V1/Notifications"; #include "Api/V1/Statuses"; #include "Api/V1/Timelines"; diff --git a/Slon/Modules/Db.HC b/Slon/Modules/Db.HC index 1bacf3e..210c686 100644 --- a/Slon/Modules/Db.HC +++ b/Slon/Modules/Db.HC @@ -86,6 +86,26 @@ U0 @slon_db_load_following_from_disk() db->set("following", following, JSON_OBJECT); } +U0 @slon_db_load_markers_from_disk() +{ + JsonObject* markers = Json.CreateObject(); + U8 scratch_buffer[256]; + StrPrint(scratch_buffer, "%s/markers/*.json", SLON_DB_PATH); + CDirEntry* files = FilesFind(scratch_buffer); + CDirEntry* de = files; + JsonArray* marker_array = NULL; + while (de) { + marker_array = Json.ParseFile(de->full_name); + if (marker_array) { + StrFind(".json", de->name)[0] = NULL; + markers->set(de->name, marker_array, JSON_ARRAY); + } + de = de->next; + } + DirTreeDel(files); + db->set("markers", markers, JSON_OBJECT); +} + U0 @slon_db_load_statuses_from_disk() { JsonObject* statuses = Json.CreateObject(); @@ -196,6 +216,17 @@ U0 @slon_db_save_following_to_disk() } } +U0 @slon_db_save_markers_to_disk() +{ + U8 scratch_buffer[256]; + JsonKey* key = db->o("markers")->keys; + while (key) { + StrPrint(scratch_buffer, "%s/markers/%s.json", SLON_DB_PATH, key->name); + Json.DumpToFile(scratch_buffer, key->value); + key = key->next; + } +} + U0 @slon_db_save_statuses_to_disk() { U8 scratch_buffer[256]; @@ -228,6 +259,7 @@ U0 @slon_db_save_to_disk() @slon_db_save_followers_to_disk(); @slon_db_save_following_to_disk(); @slon_db_save_instance_to_disk(); + @slon_db_save_markers_to_disk(); @slon_db_save_oauth_to_disk(); @slon_db_save_private_keys_to_disk(); @slon_db_save_statuses_to_disk(); @@ -246,6 +278,7 @@ U0 @slon_db_load_from_defaults() db->set("followers", Json.CreateObject(), JSON_OBJECT); db->set("following", Json.CreateObject(), JSON_OBJECT); db->set("instance", Json.ParseFile("M:/Slon/Static/defaults/instance.json"), JSON_OBJECT); + db->set("markers", Json.CreateObject(), JSON_OBJECT); db->set("statuses", Json.CreateObject(), JSON_OBJECT); db->set("timelines", Json.CreateObject(), JSON_OBJECT); db->o("timelines")->set("home", Json.CreateObject(), JSON_OBJECT); @@ -271,6 +304,7 @@ U0 @slon_db_load_from_disk() @slon_db_load_followers_from_disk(); @slon_db_load_following_from_disk(); @slon_db_load_instance_from_disk(); + @slon_db_load_markers_from_disk(); @slon_db_load_oauth_from_disk(); @slon_db_load_statuses_from_disk(); @slon_db_load_timelines_from_disk();