From 6c87604d561091753810006f349b08d7edc3fd8b Mon Sep 17 00:00:00 2001 From: Alec Murphy Date: Sat, 22 Feb 2025 20:58:56 -0500 Subject: [PATCH] Everywhere: Deduplicate status queries into @slon_api_v1_statuses_query --- Slon/Api/V1/Accounts.HC | 70 +------------------- Slon/Api/V1/Statuses.HC | 69 +++++++++++++++++++ Slon/Api/V1/Timelines.HC | 139 +-------------------------------------- 3 files changed, 74 insertions(+), 204 deletions(-) diff --git a/Slon/Api/V1/Accounts.HC b/Slon/Api/V1/Accounts.HC index 1e64fd1..f580cd1 100644 --- a/Slon/Api/V1/Accounts.HC +++ b/Slon/Api/V1/Accounts.HC @@ -1,4 +1,5 @@ U0 (*@slon_api_follow_fedi)(JsonObject* follow) = NULL; +extern U0 @slon_api_v1_statuses_query(SlonHttpSession* session, JsonArray* status_array); U0 @slon_api_v1_accounts_follow_request(U8* this_actor, U8* remote_actor) { @@ -179,74 +180,7 @@ U0 @slon_api_v1_accounts_get(SlonHttpSession* session) } if (!StrICmp("statuses", method)) { // Return the Account's Statuses - JsonArray* status_array = db->o("statuses")->a(some_account_id); - - I64 count = 0; - - // FILTERS - I64 limit = 20; // default - U64 max_id = 0; - U64 min_id = 0; - Bool only_media = request_json->@("only_media"); - Bool exclude_replies = request_json->@("exclude_replies"); - Bool exclude_reblogs = request_json->@("exclude_reblogs"); - no_warn exclude_reblogs; - Bool pinned = request_json->@("pinned"); - // FIXME: Implement "only_media", "exclude_reblogs", "tagged" - - Bool exclude_status = FALSE; - U64 status_id = 0; - - if (StrLen(request_json->@("limit")) > 0) { - // 40 = maximum per https://docs.joinmastodon.org/methods/accounts/#statuses - limit = MinI64(40, Str2I64(request_json->@("limit"))); - } - if (StrLen(request_json->@("max_id")) > 0) { - max_id = Str2I64(request_json->@("max_id")); - } - if (StrLen(request_json->@("min_id")) > 0) { - min_id = Str2I64(request_json->@("min_id")); - } - - JsonArray* statuses = Json.CreateArray(); - JsonObject* status = NULL; - - if (status_array && status_array->length) { - for (i = status_array->length - 1; i > -1; i--) { - status = status_array->o(i); - status_id = Str2I64(status->@("id")); - exclude_status = FALSE; - if (status->@("deleted")) { - exclude_status = TRUE; - } - if (max_id > 0 && status_id >= max_id) { - exclude_status = TRUE; - } - if (min_id > 0 && status_id <= min_id) { - exclude_status = TRUE; - } - if (only_media && !Json.Get(status, "media_attachments")(JsonArray*)->length) { - exclude_status = TRUE; - } - if (exclude_replies && StrLen(status->@("in_reply_to_account_id")) > 0 && StrICmp(account_id, status->@("in_reply_to_account_id"))) { - exclude_status = TRUE; - } - if (pinned && !status->@("pinned")) { - exclude_status = TRUE; - } - if (!exclude_status) { - statuses->append(Json.CreateItem(status, JSON_OBJECT)); - count++; - } - if (limit > 0 && count >= limit) { - break; - } - } - } - - session->send(statuses); - - Json.Delete(statuses); + @slon_api_v1_statuses_query(session, db->o("statuses")->a(some_account_id)); return; } session->status(404); diff --git a/Slon/Api/V1/Statuses.HC b/Slon/Api/V1/Statuses.HC index e0c5803..8292f7f 100644 --- a/Slon/Api/V1/Statuses.HC +++ b/Slon/Api/V1/Statuses.HC @@ -1,6 +1,75 @@ U0 (*@slon_api_status_create_fedi)(JsonObject* status) = NULL; U0 (*@slon_api_status_delete_fedi)(JsonObject* status) = NULL; +U0 @slon_api_v1_statuses_query(SlonHttpSession* session, JsonArray* status_array) +{ + SLON_SCRATCH_BUFFER_AND_REQUEST_JSON + no_warn scratch_buffer; + + SLON_AUTH_ACCOUNT_ID + + I64 i; + I64 count = 0; + // FILTERS + I64 limit = 20; // default + U64 max_id = 0; + U64 min_id = 0; + Bool only_media = request_json->@("only_media"); + Bool exclude_replies = request_json->@("exclude_replies"); + Bool exclude_reblogs = request_json->@("exclude_reblogs"); + no_warn exclude_reblogs; + Bool pinned = request_json->@("pinned"); + // FIXME: Implement "only_media", "exclude_reblogs", "tagged" + Bool exclude_status = FALSE; + U64 status_id = 0; + if (StrLen(request_json->@("limit")) > 0) { + // 40 = maximum per https://docs.joinmastodon.org/methods/accounts/#statuses + limit = MinI64(40, Str2I64(request_json->@("limit"))); + } + if (StrLen(request_json->@("max_id")) > 0) { + max_id = Str2I64(request_json->@("max_id")); + } + if (StrLen(request_json->@("min_id")) > 0) { + min_id = Str2I64(request_json->@("min_id")); + } + JsonArray* statuses = Json.CreateArray(); + JsonObject* status = NULL; + if (status_array && status_array->length) { + for (i = status_array->length - 1; i > -1; i--) { + status = status_array->o(i); + status_id = Str2I64(status->@("id")); + exclude_status = FALSE; + if (status->@("deleted")) { + exclude_status = TRUE; + } + if (max_id > 0 && status_id >= max_id) { + exclude_status = TRUE; + } + if (min_id > 0 && status_id <= min_id) { + exclude_status = TRUE; + } + if (only_media && !Json.Get(status, "media_attachments")(JsonArray*)->length) { + exclude_status = TRUE; + } + if (exclude_replies && StrLen(status->@("in_reply_to_account_id")) > 0 && StrICmp(account_id, status->@("in_reply_to_account_id"))) { + exclude_status = TRUE; + } + if (pinned && !status->@("pinned")) { + exclude_status = TRUE; + } + if (!exclude_status) { + statuses->append(Json.CreateItem(status, JSON_OBJECT)); + count++; + } + if (limit > 0 && count >= limit) { + break; + } + } + } + session->send(statuses); + Json.Delete(statuses); +} + U0 @slon_api_v1_statuses_delete(SlonHttpSession* session) { if (@slon_api_authorized(session)) { diff --git a/Slon/Api/V1/Timelines.HC b/Slon/Api/V1/Timelines.HC index 5269ec9..e3c7df7 100644 --- a/Slon/Api/V1/Timelines.HC +++ b/Slon/Api/V1/Timelines.HC @@ -1,82 +1,12 @@ U0 @slon_api_v1_timelines_home(SlonHttpSession* session, U8* account_id) { - SLON_SCRATCH_BUFFER_AND_REQUEST_JSON - no_warn scratch_buffer; - // Return the Account's Home timeline JsonArray* status_array = db->o("timelines")->o("home")->a(account_id); if (!status_array) { session->send(SLON_EMPTY_JSON_ARRAY); return; } - - I64 count = 0; - - // FILTERS - I64 limit = 20; // default - U64 max_id = 0; - U64 min_id = 0; - Bool only_media = request_json->@("only_media"); - Bool exclude_replies = request_json->@("exclude_replies"); - Bool exclude_reblogs = request_json->@("exclude_reblogs"); - no_warn exclude_reblogs; - Bool pinned = request_json->@("pinned"); - // FIXME: Implement "only_media", "exclude_reblogs", "tagged" - - Bool exclude_status = FALSE; - U64 status_id = 0; - - if (StrLen(request_json->@("limit")) > 0) { - // 40 = maximum per https://docs.joinmastodon.org/methods/accounts/#statuses - limit = MinI64(40, Str2I64(request_json->@("limit"))); - } - if (StrLen(request_json->@("max_id")) > 0) { - max_id = Str2I64(request_json->@("max_id")); - } - if (StrLen(request_json->@("min_id")) > 0) { - min_id = Str2I64(request_json->@("min_id")); - } - - JsonArray* statuses = Json.CreateArray(); - JsonObject* status = NULL; - - if (status_array && status_array->length) { - I64 i; - for (i = status_array->length - 1; i > -1; i--) { - status = status_array->o(i); - status_id = Str2I64(status->@("id")); - exclude_status = FALSE; - if (status->@("deleted")) { - exclude_status = TRUE; - } - if (max_id > 0 && status_id >= max_id) { - exclude_status = TRUE; - } - if (min_id > 0 && status_id <= min_id) { - exclude_status = TRUE; - } - if (only_media && !Json.Get(status, "media_attachments")(JsonArray*)->length) { - exclude_status = TRUE; - } - if (exclude_replies && StrLen(status->@("in_reply_to_account_id")) > 0 && StrICmp(account_id, status->@("in_reply_to_account_id"))) { - exclude_status = TRUE; - } - if (pinned && !status->@("pinned")) { - exclude_status = TRUE; - } - if (!exclude_status) { - statuses->append(Json.CreateItem(status, JSON_OBJECT)); - count++; - } - if (limit > 0 && count >= limit) { - break; - } - } - } - - session->send(statuses); - - Json.Delete(statuses); + @slon_api_v1_statuses_query(session, status_array); } U0 @slon_api_v1_timelines_public(SlonHttpSession* session) @@ -90,71 +20,8 @@ U0 @slon_api_v1_timelines_public(SlonHttpSession* session) session->send(SLON_EMPTY_JSON_ARRAY); return; } - - I64 count = 0; - - // FILTERS - I64 limit = 20; // default - U64 max_id = 0; - U64 min_id = 0; - Bool only_media = request_json->@("only_media"); - Bool exclude_replies = request_json->@("exclude_replies"); - Bool exclude_reblogs = request_json->@("exclude_reblogs"); - no_warn exclude_reblogs, exclude_replies; - Bool pinned = request_json->@("pinned"); - // FIXME: Implement "only_media", "exclude_reblogs", "tagged" - - Bool exclude_status = FALSE; - U64 status_id = 0; - - if (StrLen(request_json->@("limit")) > 0) { - // 40 = maximum per https://docs.joinmastodon.org/methods/accounts/#statuses - limit = MinI64(40, Str2I64(request_json->@("limit"))); - } - if (StrLen(request_json->@("max_id")) > 0) { - max_id = Str2I64(request_json->@("max_id")); - } - if (StrLen(request_json->@("min_id")) > 0) { - min_id = Str2I64(request_json->@("min_id")); - } - - JsonArray* statuses = Json.CreateArray(); - JsonObject* status = NULL; - - if (status_array && status_array->length) { - I64 i; - for (i = status_array->length - 1; i > -1; i--) { - status = status_array->o(i); - status_id = Str2I64(status->@("id")); - exclude_status = FALSE; - if (status->@("deleted")) { - exclude_status = TRUE; - } - if (max_id > 0 && status_id >= max_id) { - exclude_status = TRUE; - } - if (min_id > 0 && status_id <= min_id) { - exclude_status = TRUE; - } - if (only_media && !Json.Get(status, "media_attachments")(JsonArray*)->length) { - exclude_status = TRUE; - } - if (pinned && !status->@("pinned")) { - exclude_status = TRUE; - } - if (!exclude_status) { - statuses->append(Json.CreateItem(status, JSON_OBJECT)); - count++; - } - if (limit > 0 && count >= limit) { - break; - } - } - } - - session->send(statuses); - - Json.Delete(statuses); + request_json->unset("exclude_replies"); + @slon_api_v1_statuses_query(session, status_array); } U0 @slon_api_v1_timelines_get(SlonHttpSession* session)