diff --git a/app/Http/Controllers/StatusController.php b/app/Http/Controllers/StatusController.php index 651d632d..57a7e41c 100644 --- a/app/Http/Controllers/StatusController.php +++ b/app/Http/Controllers/StatusController.php @@ -3,33 +3,40 @@ namespace App\Http\Controllers; use Auth, Cache; -use App\Jobs\StatusPipeline\{NewStatusPipeline, StatusDelete}; -use App\Jobs\ImageOptimizePipeline\ImageOptimize; +use League\Fractal; use Illuminate\Http\Request; -use App\{Media, Profile, Status, User}; use Vinkla\Hashids\Facades\Hashids; +use App\{Media, Profile, Status, User}; +use App\Jobs\ImageOptimizePipeline\ImageOptimize; +use App\Transformer\ActivityPub\StatusTransformer; +use App\Jobs\StatusPipeline\{NewStatusPipeline, StatusDelete}; class StatusController extends Controller { public function show(Request $request, $username, int $id) { $user = Profile::whereUsername($username)->firstOrFail(); + $status = Status::whereProfileId($user->id) ->withCount(['likes', 'comments', 'media']) ->findOrFail($id); + if(!$status->media_path && $status->in_reply_to_id) { return redirect($status->url()); } + + if($request->wantsJson() && config('pixelfed.activitypub_enabled')) { + return $this->showActivityPub($request, $status); + } + $replies = Status::whereInReplyToId($status->id)->simplePaginate(30); + return view('status.show', compact('user', 'status', 'replies')); } public function compose() { - if(Auth::check() == false) - { - abort(403); - } + $this->authCheck(); return view('status.compose'); } @@ -156,4 +163,20 @@ class StatusController extends Controller return $response; } + + public function showActivityPub(Request $request, $status) + { + $fractal = new Fractal\Manager(); + $resource = new Fractal\Resource\Item($status, new StatusTransformer); + $res = $fractal->createData($resource)->toArray(); + return response(json_encode($res['data']))->header('Content-Type', 'application/activity+json'); + } + + protected function authCheck() + { + if(Auth::check() == false) + { + abort(403); + } + } } diff --git a/app/Transformer/ActivityPub/ProfileTransformer.php b/app/Transformer/ActivityPub/ProfileTransformer.php index c3ee0063..a41313e4 100644 --- a/app/Transformer/ActivityPub/ProfileTransformer.php +++ b/app/Transformer/ActivityPub/ProfileTransformer.php @@ -16,7 +16,9 @@ class ProfileTransformer extends Fractal\TransformerAbstract 'https://w3id.org/security/v1', [ "manuallyApprovesFollowers" => "as:manuallyApprovesFollowers", - "featured" => 'https://pixelfed.org/ns/featured', + "featured" => [ + "https://pixelfed.org/ns#featured" => ["@type" => "@id"], + ] ] ], 'id' => $profile->permalink(), diff --git a/app/Transformer/ActivityPub/StatusTransformer.php b/app/Transformer/ActivityPub/StatusTransformer.php new file mode 100644 index 00000000..4b48b1f6 --- /dev/null +++ b/app/Transformer/ActivityPub/StatusTransformer.php @@ -0,0 +1,62 @@ + [ + 'https://www.w3.org/ns/activitystreams', + 'https://w3id.org/security/v1', + [ + "manuallyApprovesFollowers" => "as:manuallyApprovesFollowers", + "featured" => [ + "https://pixelfed.org/ns#featured" => ["@type" => "@id"], + ] + ] + ], + 'id' => $status->url(), + + // TODO: handle other types + 'type' => 'Note', + + // XXX: CW Title + 'summary' => null, + 'content' => $status->rendered ?? $status->caption, + 'inReplyTo' => null, + + // TODO: fix date format + 'published' => $status->created_at->toAtomString(), + 'url' => $status->url(), + 'attributedTo' => $status->profile->permalink(), + 'to' => [ + // TODO: handle proper scope + 'https://www.w3.org/ns/activitystreams#Public' + ], + 'cc' => [ + // TODO: add cc's + $status->profile->permalink('/followers'), + ], + 'sensitive' => (bool) $status->is_nsfw, + 'atomUri' => $status->url(), + 'inReplyToAtomUri' => null, + 'conversation' => $status->url(), + 'attachment' => $status->media->map(function($media) { + return [ + 'type' => 'Document', + 'mediaType' => $media->mime, + 'url' => $media->url(), + 'name' => null + ]; + }), + 'tag' => [] + ]; + } + +} \ No newline at end of file diff --git a/config/pixelfed.php b/config/pixelfed.php index 0717479d..527a9f0f 100644 --- a/config/pixelfed.php +++ b/config/pixelfed.php @@ -23,7 +23,7 @@ return [ | This value is the version of your PixelFed instance. | */ - 'version' => '0.1.5', + 'version' => '0.1.6', /* |-------------------------------------------------------------------------- diff --git a/resources/views/status/show.blade.php b/resources/views/status/show.blade.php index 7f711f24..cf9b9db5 100644 --- a/resources/views/status/show.blade.php +++ b/resources/views/status/show.blade.php @@ -169,4 +169,4 @@ @push('meta') -@endpush + @endpush