PublicApiController.php 3.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. <?php
  2. namespace App\Http\Controllers;
  3. use Illuminate\Http\Request;
  4. use App\{
  5. Hashtag,
  6. Like,
  7. Media,
  8. Notification,
  9. Profile,
  10. StatusHashtag,
  11. Status,
  12. };
  13. use Auth,Cache;
  14. use Carbon\Carbon;
  15. use League\Fractal;
  16. use App\Transformer\Api\{
  17. AccountTransformer,
  18. StatusTransformer,
  19. };
  20. use App\Jobs\StatusPipeline\NewStatusPipeline;
  21. use League\Fractal\Serializer\ArraySerializer;
  22. use League\Fractal\Pagination\IlluminatePaginatorAdapter;
  23. class PublicApiController extends Controller
  24. {
  25. protected $fractal;
  26. public function __construct()
  27. {
  28. $this->middleware('throttle:200, 15');
  29. $this->fractal = new Fractal\Manager();
  30. $this->fractal->setSerializer(new ArraySerializer());
  31. }
  32. protected function getUserData()
  33. {
  34. if(false == Auth::check()) {
  35. return [];
  36. } else {
  37. $profile = Auth::user()->profile;
  38. $user = new Fractal\Resource\Item($profile, new AccountTransformer());
  39. return $this->fractal->createData($user)->toArray();
  40. }
  41. }
  42. public function status(Request $request, $username, int $postid)
  43. {
  44. $profile = Profile::whereUsername($username)->first();
  45. $status = Status::whereProfileId($profile->id)->find($postid);
  46. $status = new Fractal\Resource\Item($status, new StatusTransformer());
  47. $res = [
  48. 'status' => $this->fractal->createData($status)->toArray(),
  49. 'user' => $this->getUserData()
  50. ];
  51. return response()->json($res, 200, [], JSON_PRETTY_PRINT);
  52. }
  53. public function statusComments(Request $request, $username, int $postId)
  54. {
  55. $this->validate($request, [
  56. 'min_id' => 'nullable|integer|min:1',
  57. 'max_id' => 'nullable|integer|min:1|max:'.PHP_INT_MAX,
  58. 'limit' => 'nullable|integer|min:5|max:50'
  59. ]);
  60. $limit = $request->limit ?? 10;
  61. $profile = Profile::whereUsername($username)->first();
  62. $status = Status::whereProfileId($profile->id)->find($postId);
  63. if($request->filled('min_id') || $request->filled('max_id')) {
  64. if($request->filled('min_id')) {
  65. $replies = $status->comments()
  66. ->select('id', 'caption', 'rendered', 'profile_id', 'in_reply_to_id', 'created_at')
  67. ->where('id', '>=', $request->min_id)
  68. ->orderBy('id', 'desc')
  69. ->paginate($limit);
  70. }
  71. if($request->filled('max_id')) {
  72. $replies = $status->comments()
  73. ->select('id', 'caption', 'rendered', 'profile_id', 'in_reply_to_id', 'created_at')
  74. ->where('id', '<=', $request->max_id)
  75. ->orderBy('id', 'desc')
  76. ->paginate($limit);
  77. }
  78. } else {
  79. $replies = $status->comments()
  80. ->select('id', 'caption', 'rendered', 'profile_id', 'in_reply_to_id', 'created_at')
  81. ->orderBy('id', 'desc')
  82. ->paginate($limit);
  83. }
  84. $resource = new Fractal\Resource\Collection($replies, new StatusTransformer(), 'data');
  85. $resource->setPaginator(new IlluminatePaginatorAdapter($replies));
  86. $res = $this->fractal->createData($resource)->toArray();
  87. return response()->json($res, 200, [], JSON_PRETTY_PRINT);
  88. }
  89. }