PublicApiController.php 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  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. $item = new Fractal\Resource\Item($status, new StatusTransformer());
  47. $res = [
  48. 'status' => $this->fractal->createData($item)->toArray(),
  49. 'user' => $this->getUserData(),
  50. 'reactions' => [
  51. 'liked' => $status->liked(),
  52. 'shared' => $status->shared(),
  53. 'bookmarked' => $status->bookmarked(),
  54. ],
  55. ];
  56. return response()->json($res, 200, [], JSON_PRETTY_PRINT);
  57. }
  58. public function statusComments(Request $request, $username, int $postId)
  59. {
  60. $this->validate($request, [
  61. 'min_id' => 'nullable|integer|min:1',
  62. 'max_id' => 'nullable|integer|min:1|max:'.PHP_INT_MAX,
  63. 'limit' => 'nullable|integer|min:5|max:50'
  64. ]);
  65. $limit = $request->limit ?? 10;
  66. $profile = Profile::whereUsername($username)->first();
  67. $status = Status::whereProfileId($profile->id)->find($postId);
  68. if($request->filled('min_id') || $request->filled('max_id')) {
  69. if($request->filled('min_id')) {
  70. $replies = $status->comments()
  71. ->select('id', 'caption', 'rendered', 'profile_id', 'in_reply_to_id', 'created_at')
  72. ->where('id', '>=', $request->min_id)
  73. ->orderBy('id', 'desc')
  74. ->paginate($limit);
  75. }
  76. if($request->filled('max_id')) {
  77. $replies = $status->comments()
  78. ->select('id', 'caption', 'rendered', 'profile_id', 'in_reply_to_id', 'created_at')
  79. ->where('id', '<=', $request->max_id)
  80. ->orderBy('id', 'desc')
  81. ->paginate($limit);
  82. }
  83. } else {
  84. $replies = $status->comments()
  85. ->select('id', 'caption', 'rendered', 'profile_id', 'in_reply_to_id', 'created_at')
  86. ->orderBy('id', 'desc')
  87. ->paginate($limit);
  88. }
  89. $resource = new Fractal\Resource\Collection($replies, new StatusTransformer(), 'data');
  90. $resource->setPaginator(new IlluminatePaginatorAdapter($replies));
  91. $res = $this->fractal->createData($resource)->toArray();
  92. return response()->json($res, 200, [], JSON_PRETTY_PRINT);
  93. }
  94. }