#include "activity_pub.h" // Submodules #include "http/server/request.h" #include "collections/array.h" #include "util/format.h" #include "ap/object.h" // Model #include "model/server.h" #include "model/status.h" #include "model/account.h" #include "model/activity.h" // Standard Library #include #include char* status_render_source( struct status* s ); // Route: /note/ bool route_ap_note( struct http_request* req ) { char* id_str = http_request_route_get_dir_or_file(req); if( !id_str || !*id_str ) { return false; } // Route: /note/%d{id} int id = -1; if( 1 != sscanf( id_str, "%d", &id ) ) { return false; } free(id_str); struct status* s = status_from_id( id ); if( !s ) { return false; } if( s->remote ) { return false; } struct ap_object* act = activity_create_Note( s ); http_request_add_header( req, "Access-Control-Allow-Origin", "*" ); http_request_send_headers( req, 200, "application/ld+json", true ); FILE* f = http_request_get_response_body( req ); ap_object_write_to_FILE( act, f ); fflush(f); ap_object_free(act); status_free(s); return true; } // Route: /activity/ bool route_ap_activity( struct http_request* req ) { char* id_str = http_request_route_get_dir_or_file(req); if( !id_str || !*id_str ) { return false; } // Route: /activity/%d{id} int id = -1; if( 1 != sscanf( id_str, "%d", &id ) ) { return false; } free(id_str); struct ap_object* act = activity_from_local_id( id ); http_request_add_header( req, "Access-Control-Allow-Origin", "*" ); http_request_send_headers( req, 200, "application/ld+json", true ); FILE* f = http_request_get_response_body( req ); ap_object_write_to_FILE( act, f ); fflush(f); ap_object_free(act); return true; } // Route: /outbox bool route_ap_outbox( struct http_request* req ) { bool result = false; struct account* owner_account = account_from_id( owner_account_id ); if( http_request_route_term(req,"") ) { struct ap_object* outbox = account_ap_outbox( owner_account ); http_request_send_headers( req, 200, "application/ld+json", true ); FILE* f = http_request_get_response_body( req ); ap_object_write_to_FILE( outbox, f ); fflush(f); ap_object_free(outbox); } else if( http_request_route( req, "/page-" ) ) { char* page_str = http_request_route_get_dir_or_file(req); int page = -1; if( !page_str || (1 != sscanf(page_str,"%d",&page) ) || page < 0 ) { goto failed; } struct ap_object* outbox_page = account_ap_outbox_page( owner_account, page ); if( !outbox_page ) { goto failed; } http_request_send_headers( req, 200, "application/ld+json", true ); FILE* f = http_request_get_response_body( req ); ap_object_write_to_FILE( outbox_page, f ); fflush(f); ap_object_free(outbox_page); } goto success; failed: result = false; goto cleanup; success: result = true; goto cleanup; cleanup: account_free(owner_account); return result; }