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