Slon/Api/V1/Announcements: Implement Announcements

Fixes #9
This commit is contained in:
Alec Murphy 2025-03-12 16:19:00 -04:00
parent 6e9f86b4ae
commit 475e648feb
11 changed files with 345 additions and 0 deletions

View file

@ -248,6 +248,28 @@ U0 @slon_admin_delete_account(SlonHttpSession* session)
session->send(SLON_EMPTY_JSON_OBJECT);
}
U0 @slon_admin_delete_announcement(SlonHttpSession* session)
{
SLON_SCRATCH_BUFFER_AND_REQUEST_JSON
no_warn scratch_buffer;
if (!request_json->@("id"))
return;
I64 i;
JsonArray* announcements = db->a("announcements");
JsonObject* announcement = NULL;
for (i = 0; i < announcements->length; i++) {
announcement = announcements->o(i);
if (announcement && !StrICmp(request_json->@("id"), announcement->@("id"))) {
AdamLog("deleting announcement %d\n", i);
announcements->remove(i);
break;
}
}
@slon_db_save_announcements_to_disk;
session->send(SLON_EMPTY_JSON_OBJECT);
}
U0 @slon_admin_new_account(SlonHttpSession* session)
{
SLON_SCRATCH_BUFFER_AND_REQUEST_JSON
@ -262,6 +284,38 @@ U0 @slon_admin_new_account(SlonHttpSession* session)
}
}
U0 @slon_admin_new_announcement(SlonHttpSession* session)
{
SLON_SCRATCH_BUFFER_AND_REQUEST_JSON
if (request_json->@("content")) {
U8* id = @slon_api_generate_unique_id(session);
U8* timestamp = @slon_api_timestamp_from_cdate(session, Now);
JsonObject* announcement = Json.CreateObject(slon_db_mem_task);
announcement->set("id", id, JSON_STRING);
announcement->set("content", request_json->@("content"), JSON_STRING);
announcement->set("starts_at", NULL, JSON_NULL);
announcement->set("ends_at", NULL, JSON_NULL);
announcement->set("all_day", FALSE, JSON_BOOLEAN);
announcement->set("published_at", timestamp, JSON_STRING);
announcement->set("updated_at", timestamp, JSON_STRING);
announcement->set("read", FALSE, JSON_BOOLEAN);
announcement->set("read_users", Json.CreateArray(slon_db_mem_task), JSON_ARRAY);
announcement->set("mentions", SLON_EMPTY_JSON_ARRAY, JSON_ARRAY);
announcement->set("statuses", SLON_EMPTY_JSON_ARRAY, JSON_ARRAY);
announcement->set("tags", Json.CreateArray(slon_db_mem_task), JSON_ARRAY);
announcement->set("emojis", Json.CreateArray(slon_db_mem_task), JSON_ARRAY);
// Internally, "reactions" is { "emoji": [ "account_id", "account_id", ... ]}
// This is presented to the client as: "reactions": [ { "name": "emoji", "count": xxx, "me": true/false }, ... ]
announcement->set("reactions", Json.CreateObject(slon_db_mem_task), JSON_OBJECT);
db->a("announcements")->append(announcement);
@slon_db_save_announcements_to_disk;
@slon_free(session, id);
@slon_free(session, timestamp);
}
session->send(SLON_EMPTY_JSON_OBJECT);
}
U0 @slon_admin_manage_accounts(SlonHttpSession* session)
{
SLON_SCRATCH_BUFFER_AND_REQUEST_JSON
@ -324,14 +378,26 @@ U0 @slon_admin_server_get(SlonHttpSession* session)
return;
}
if (!StrICmp("/delete/announcement", session->path())) {
@slon_admin_delete_announcement(session);
return;
}
if (!StrICmp("/manage/accounts", session->path())) {
@slon_admin_manage_accounts(session);
return;
}
if (!StrICmp("/manage/announcements", session->path())) {
session->send(db->a("announcements"));
return;
}
if (!StrICmp("/manage/instance", session->path())) {
session->send(db->o("instance"));
return;
}
if (!StrICmp("/manage/settings", session->path())) {
session->send(db->o("settings"));
return;
@ -395,6 +461,11 @@ U0 @slon_admin_server_post(SlonHttpSession* session)
return;
}
if (!StrICmp("/new/announcement", session->path())) {
@slon_admin_new_announcement(session);
return;
}
session->status(404);
}

View file

@ -645,6 +645,7 @@ U0 @slon_http_handle_delete_request(SlonHttpSession* session)
/* clang-format off */
#include "Endpoints/Delete/Announcements";
#include "Endpoints/Delete/Statuses";
/* clang-format on */
@ -664,6 +665,7 @@ U0 @slon_http_handle_get_request(SlonHttpSession* session)
/* clang-format off */
#include "Endpoints/Get/Accounts";
#include "Endpoints/Get/Announcements";
#include "Endpoints/Get/ActivityPub";
#include "Endpoints/Get/Blocks";
#include "Endpoints/Get/Bookmarks";
@ -735,6 +737,7 @@ U0 @slon_http_handle_post_request(SlonHttpSession* session)
/* clang-format off */
#include "Endpoints/Post/Accounts";
#include "Endpoints/Post/Announcements";
#include "Endpoints/Post/ActivityPub";
#include "Endpoints/Post/Apps";
#include "Endpoints/Post/Markers";
@ -763,6 +766,7 @@ U0 @slon_http_handle_put_request(SlonHttpSession* session)
/* clang-format off */
#include "Endpoints/Put/Announcements";
#include "Endpoints/Put/Media";
/* clang-format on */