diff --git a/app/Http/Controllers/StatusController.php b/app/Http/Controllers/StatusController.php index 59cd5e6a8..1de2ad66e 100644 --- a/app/Http/Controllers/StatusController.php +++ b/app/Http/Controllers/StatusController.php @@ -9,7 +9,7 @@ use App\Media; use App\Profile; use App\Status; use App\Transformer\ActivityPub\StatusTransformer; -use App\Transformer\ActivityPub\Verb\CreateNote; +use App\Transformer\ActivityPub\Verb\Note; use App\User; use Auth; use Cache; @@ -250,7 +250,7 @@ class StatusController extends Controller public function showActivityPub(Request $request, $status) { $fractal = new Fractal\Manager(); - $resource = new Fractal\Resource\Item($status, new CreateNote()); + $resource = new Fractal\Resource\Item($status, new Note()); $res = $fractal->createData($resource)->toArray(); return response(json_encode($res['data']))->header('Content-Type', 'application/activity+json'); diff --git a/app/Transformer/ActivityPub/Verb/Note.php b/app/Transformer/ActivityPub/Verb/Note.php new file mode 100644 index 000000000..4479e1454 --- /dev/null +++ b/app/Transformer/ActivityPub/Verb/Note.php @@ -0,0 +1,56 @@ +mentions->map(function ($mention) { + return [ + 'type' => 'Mention', + 'href' => $mention->permalink(), + 'name' => $mention->emailUrl() + ]; + })->toArray(); + $hashtags = $status->hashtags->map(function ($hashtag) { + return [ + 'type' => 'Hashtag', + 'href' => $hashtag->url(), + 'name' => "#{$hashtag->name}", + ]; + })->toArray(); + $tags = array_merge($mentions, $hashtags); + + return [ + '@context' => [ + 'https://www.w3.org/ns/activitystreams', + 'https://w3id.org/security/v1', + ], + 'id' => $status->url(), + 'type' => 'Note', + 'summary' => null, + 'content' => $status->rendered ?? $status->caption, + 'inReplyTo' => $status->in_reply_to_id ? $status->parent()->url() : null, + 'published' => $status->created_at->toAtomString(), + 'url' => $status->url(), + 'attributedTo' => $status->profile->permalink(), + 'to' => $status->scopeToAudience('to'), + 'cc' => $status->scopeToAudience('cc'), + 'sensitive' => (bool) $status->is_nsfw, + 'attachment' => $status->media->map(function ($media) { + return [ + 'type' => $media->activityVerb(), + 'mediaType' => $media->mime, + 'url' => $media->url(), + 'name' => null, + ]; + })->toArray(), + 'tag' => $tags, + ]; + } +}