Outbox.php 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. <?php
  2. namespace App\Util\ActivityPub;
  3. use App\Http\Controllers\ProfileController;
  4. use App\Status;
  5. use App\Transformer\ActivityPub\Verb\CreateNote;
  6. use League\Fractal;
  7. class Outbox
  8. {
  9. public static function get($profile)
  10. {
  11. abort_if(! (bool) config_cache('federation.activitypub.enabled'), 404);
  12. abort_if(! config('federation.activitypub.outbox'), 404);
  13. if ($profile->status != null) {
  14. return ProfileController::accountCheck($profile);
  15. }
  16. if ($profile->is_private) {
  17. return ['error' => '403', 'msg' => 'private profile'];
  18. }
  19. $timeline = $profile
  20. ->statuses()
  21. ->whereScope('public')
  22. ->orderBy('created_at', 'desc')
  23. ->take(10)
  24. ->get();
  25. $count = Status::whereProfileId($profile->id)->count();
  26. $fractal = new Fractal\Manager();
  27. $resource = new Fractal\Resource\Collection($timeline, new CreateNote());
  28. $res = $fractal->createData($resource)->toArray();
  29. $outbox = [
  30. '@context' => 'https://www.w3.org/ns/activitystreams',
  31. '_debug' => 'Outbox only supports latest 10 objects, pagination is not supported',
  32. 'id' => $profile->permalink('/outbox'),
  33. 'type' => 'OrderedCollection',
  34. 'totalItems' => $count,
  35. 'orderedItems' => $res['data'],
  36. ];
  37. return $outbox;
  38. }
  39. }