You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

96 lines
2.2 KiB
C

#include "Notification.h"
#include "json/json.h"
#include "json/layout.h"
#include "util/format.h"
#include "model/notification.h"
#include "model/status.h"
#include "view/api/Status.h"
#include "view/api/Account.h"
bool int_to_string_callback( void* field_data, bool is_read, char** res );
static struct json_enum type_enum[] = {
{ "favourite", nt_favorite },
{ "follow", nt_follow },
{ "favourite", nt_like },
{ "mention", nt_unfollow },
{ "mention", nt_block },
{ "mention", nt_mention },
{ "pleroma:emoji_reaction", nt_react },
{ NULL, 0 },
};
#define OBJ_TYPE struct notification
static struct json_object_field Notification_Pleroma_layout[] = {
JSON_FIELD_FIXED_BOOL( is_muted, false ),
JSON_FIELD_FIXED_BOOL( is_seen, false ),
JSON_FIELD_END,
};
static struct json_object_field api_Notification_layout[] = {
{
.key = "account",
.offset = offsetof( OBJ_TYPE, account_id ),
.type = &api_Account_type,
},
JSON_FIELD_DATETIME( created_at, true ),
{
.key = "id",
.offset = offsetof( OBJ_TYPE, id ),
.type = &json_field_callback_string,
.string_callback = int_to_string_callback
},
{
.key = "pleroma",
.offset = 0,
.type = &json_field_object_composite,
.composite_layout = Notification_Pleroma_layout,
},
{
.key = "status",
.offset = offsetof( OBJ_TYPE, status_id ),
.required = false,
.type = &api_Status_from_id_type,
},
{
.key = "status",
.offset = offsetof( OBJ_TYPE, system_status ),
.required = false,
.type = &api_Status_type,
},
{
.key = "emoji",
.offset = offsetof( OBJ_TYPE, react ),
.required = false,
.type = &json_field_string,
},
JSON_FIELD_ENUM( type, type_enum, true ),
JSON_FIELD_END,
};
#undef OBJ_TYPE
void api_Notification_write( struct notification* note, FILE* f, int indent )
{
struct json_writer jw = {
.f = f,
.indentation = "\t",
.indent = indent,
};
// Handle notifications requiring a system-generated note as they are not part of Mastodon or Pleroma
switch( note->type ) {
case nt_unfollow:
note->system_status = status_new_system_unfollow( note->ref_account_id );
break;
case nt_block:
note->system_status = status_new_system_block( note->ref_account_id );
break;
}
json_write_pretty_object_layout( &jw, api_Notification_layout, note );
}