1
0
Fork 0
forked from mirror/pixelfed

Update ActivityPub Outbox, fixes #2100

This commit is contained in:
Daniel Supernault 2020-04-11 22:12:28 -06:00
parent f5e4e468a2
commit c84cee5ae0
No known key found for this signature in database
GPG key ID: 0DEF1C662C9033F7
2 changed files with 37 additions and 8 deletions

View file

@ -80,9 +80,19 @@ class FederationController extends Controller
abort_if(!config('federation.activitypub.enabled'), 404); abort_if(!config('federation.activitypub.enabled'), 404);
abort_if(!config('federation.activitypub.outbox'), 404); abort_if(!config('federation.activitypub.outbox'), 404);
$res = Outbox::get($username); $profile = Profile::whereNull('domain')
->whereNull('status')
->whereIsPrivate(false)
->whereUsername($username)
->firstOrFail();
return response(json_encode($res))->header('Content-Type', 'application/activity+json'); $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, JSON_UNESCAPED_SLASHES))->header('Content-Type', 'application/activity+json');
} }
public function userInbox(Request $request, $username) public function userInbox(Request $request, $username)

View file

@ -3,30 +3,49 @@
namespace App\Util\ActivityPub; namespace App\Util\ActivityPub;
use App\Profile; use App\Profile;
use App\Status;
use League\Fractal; use League\Fractal;
use App\Http\Controllers\ProfileController; use App\Http\Controllers\ProfileController;
use App\Transformer\ActivityPub\ProfileOutbox; use App\Transformer\ActivityPub\ProfileOutbox;
use App\Transformer\ActivityPub\Verb\CreateNote;
class Outbox { class Outbox {
public static function get($username) public static function get($profile)
{ {
abort_if(!config('federation.activitypub.enabled'), 404); abort_if(!config('federation.activitypub.enabled'), 404);
abort_if(!config('federation.activitypub.outbox'), 404); abort_if(!config('federation.activitypub.outbox'), 404);
$profile = Profile::whereNull('remote_url')->whereUsername($username)->firstOrFail();
if($profile->status != null) { if($profile->status != null) {
return ProfileController::accountCheck($profile); return ProfileController::accountCheck($profile);
} }
if($profile->is_private) { 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(); $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(); $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;
} }
} }