浏览代码

Update ActivityPub Outbox, fixes #2100

Daniel Supernault 5 年之前
父节点
当前提交
c84cee5ae0
共有 2 个文件被更改,包括 37 次插入8 次删除
  1. 12 2
      app/Http/Controllers/FederationController.php
  2. 25 6
      app/Util/ActivityPub/Outbox.php

+ 12 - 2
app/Http/Controllers/FederationController.php

@@ -80,9 +80,19 @@ class FederationController extends Controller
         abort_if(!config('federation.activitypub.enabled'), 404);
         abort_if(!config('federation.activitypub.outbox'), 404);
 
-        $res = Outbox::get($username);
+        $profile = Profile::whereNull('domain')
+            ->whereNull('status')
+            ->whereIsPrivate(false)
+            ->whereUsername($username)
+            ->firstOrFail();
+
+        $key = 'ap:outbox:latest_10:pid:' . $profile->id;
+        $ttl = now()->addMinutes(15);
+        $res = Cache::remember($key, $ttl, function() use($profile) {
+            return Outbox::get($profile);
+        });
 
-        return response(json_encode($res))->header('Content-Type', 'application/activity+json');
+        return response(json_encode($res, JSON_UNESCAPED_SLASHES))->header('Content-Type', 'application/activity+json');
     }
 
     public function userInbox(Request $request, $username)

+ 25 - 6
app/Util/ActivityPub/Outbox.php

@@ -3,30 +3,49 @@
 namespace App\Util\ActivityPub;
 
 use App\Profile;
+use App\Status;
 use League\Fractal;
 use App\Http\Controllers\ProfileController;
 use App\Transformer\ActivityPub\ProfileOutbox;
+use App\Transformer\ActivityPub\Verb\CreateNote;
 
 class Outbox {
 
-	public static function get($username)
+	public static function get($profile)
 	{
         abort_if(!config('federation.activitypub.enabled'), 404);
         abort_if(!config('federation.activitypub.outbox'), 404);
 
-        $profile = Profile::whereNull('remote_url')->whereUsername($username)->firstOrFail();
         if($profile->status != null) {
             return ProfileController::accountCheck($profile);
         }
+
         if($profile->is_private) {
-            return response()->json(['error'=>'403', 'msg' => 'private profile'], 403);
+            return ['error'=>'403', 'msg' => 'private profile'];
         }
-        $timeline = $profile->statuses()->whereVisibility('public')->orderBy('created_at', 'desc')->paginate(10);
+
+        $timeline = $profile
+                    ->statuses()
+                    ->whereVisibility('public')
+                    ->orderBy('created_at', 'desc')
+                    ->take(10)
+                    ->get();
+
+        $count = Status::whereProfileId($profile->id)->count();
+
         $fractal = new Fractal\Manager();
-        $resource = new Fractal\Resource\Item($profile, new ProfileOutbox());
+        $resource = new Fractal\Resource\Collection($timeline, new CreateNote());
         $res = $fractal->createData($resource)->toArray();
 
-        return $res['data'];
+        $outbox = [
+            '@context'     => 'https://www.w3.org/ns/activitystreams',
+            '_debug'       => 'Outbox only supports latest 10 objects, pagination is not supported',
+            'id'           => $profile->permalink('/outbox'),
+            'type'         => 'OrderedCollection',
+            'totalItems'   => $count,
+            'orderedItems' => $res['data']
+        ];
+        return $outbox;
 	}
 
 }