浏览代码

Fix AP Note bug

Daniel Supernault 6 年之前
父节点
当前提交
4e777995c9
共有 2 个文件被更改,包括 58 次插入2 次删除
  1. 2 2
      app/Http/Controllers/StatusController.php
  2. 56 0
      app/Transformer/ActivityPub/Verb/Note.php

+ 2 - 2
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');

+ 56 - 0
app/Transformer/ActivityPub/Verb/Note.php

@@ -0,0 +1,56 @@
+<?php
+
+namespace App\Transformer\ActivityPub\Verb;
+
+use App\Status;
+use League\Fractal;
+
+class Note extends Fractal\TransformerAbstract
+{
+	public function transform(Status $status)
+	{
+
+		$mentions = $status->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,
+		];
+	}
+}