From aded79c1923d221d137aaab2644946f0cdc3328b Mon Sep 17 00:00:00 2001 From: Alec Murphy Date: Thu, 6 Mar 2025 10:54:25 -0500 Subject: [PATCH] Slon/Modules/Db: Save/load accounts to/from individual JSON files --- Slon/Api/V1/Accounts.HC | 2 +- Slon/Modules/ActivityPub.HC | 2 +- Slon/Modules/Db.HC | 35 ++++++++++++++++++++++++++++++----- 3 files changed, 32 insertions(+), 7 deletions(-) diff --git a/Slon/Api/V1/Accounts.HC b/Slon/Api/V1/Accounts.HC index 1f7f03a..5f4493f 100644 --- a/Slon/Api/V1/Accounts.HC +++ b/Slon/Api/V1/Accounts.HC @@ -62,7 +62,7 @@ JsonObject* @slon_accounts_create_local_for_remote_actor(SlonHttpSession* sessio db->a("accounts")->append(Json.CreateItem(account, JSON_OBJECT)); // db->o("statuses")->set(acct->@("id"), Json.CreateArray(), JSON_ARRAY); - @slon_db_save_accounts_to_disk; + @slon_db_save_account_to_disk(account); @slon_free(session, created_at); @slon_free(session, id); diff --git a/Slon/Modules/ActivityPub.HC b/Slon/Modules/ActivityPub.HC index 340437c..254b042 100644 --- a/Slon/Modules/ActivityPub.HC +++ b/Slon/Modules/ActivityPub.HC @@ -717,7 +717,7 @@ U0 @slon_activitypub_users_inbox(SlonHttpSession* session, U8* user) followers->append(Json.CreateItem(request_json->@("actor"), JSON_STRING)); account->set("followers_count", account->@("followers_count") + 1); @slon_db_save_followers_to_disk; - @slon_db_save_accounts_to_disk; + @slon_db_save_account_to_disk(account); } request_object = Json.Clone(request_json); } diff --git a/Slon/Modules/Db.HC b/Slon/Modules/Db.HC index 832a6fe..dca5f1f 100644 --- a/Slon/Modules/Db.HC +++ b/Slon/Modules/Db.HC @@ -7,9 +7,21 @@ JsonObject* db = Json.CreateObject(); U0 @slon_db_load_accounts_from_disk() { + JsonArray* accounts = Json.CreateArray(); U8 scratch_buffer[256]; - StrPrint(scratch_buffer, "%s/accounts.json", SLON_DB_PATH); - db->set("accounts", Json.ParseFile(scratch_buffer), JSON_ARRAY); + StrPrint(scratch_buffer, "%s/accounts/*.json", SLON_DB_PATH); + CDirEntry* files = FilesFind(scratch_buffer); + CDirEntry* de = files; + JsonObject* account = NULL; + while (de) { + account = Json.ParseFile(de->full_name); + if (account) { + accounts->append(Json.CreateItem(account, JSON_OBJECT)); + } + de = de->next; + } + DirTreeDel(files); + db->set("accounts", accounts, JSON_ARRAY); } U0 @slon_db_load_actors_from_disk() @@ -160,11 +172,24 @@ U0 @slon_db_load_timelines_from_disk() db->set("timelines", timelines, JSON_OBJECT); } +U0 @slon_db_save_account_to_disk(JsonObject* account) +{ + U8 scratch_buffer[256]; + StrPrint(scratch_buffer, "%s/accounts/%s.json", SLON_DB_PATH, account->@("id")); + Json.DumpToFile(scratch_buffer, account); +} + U0 @slon_db_save_accounts_to_disk() { U8 scratch_buffer[256]; - StrPrint(scratch_buffer, "%s/accounts.json", SLON_DB_PATH); - Json.DumpToFile(scratch_buffer, db->a("accounts")); + I64 i; + JsonArray* accounts = db->a("accounts"); + JsonObject* account = NULL; + for (i = 0; i < accounts->length; i++) { + account = accounts->o(i); + StrPrint(scratch_buffer, "%s/accounts/%s.json", SLON_DB_PATH, account->@("id")); + Json.DumpToFile(scratch_buffer, account); + } } U0 @slon_db_save_actors_to_disk() @@ -353,7 +378,7 @@ U0 @slon_db_actors_update_user(JsonObject* acct) { acct->set("avatar_static", acct->@("avatar")); acct->set("header_static", acct->@("header")); - @slon_db_save_accounts_to_disk; + @slon_db_save_account_to_disk(acct); JsonObject* actors = db->o("actors"); JsonObject* actor = actors->o(acct->@("username"));