InternalApiController.php 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. <?php
  2. namespace App\Http\Controllers;
  3. use Illuminate\Http\Request;
  4. use App\{
  5. Like,
  6. Media,
  7. Profile,
  8. Status,
  9. };
  10. use Auth,Cache;
  11. use League\Fractal;
  12. use App\Transformer\Api\{
  13. AccountTransformer,
  14. StatusTransformer,
  15. };
  16. use App\Jobs\StatusPipeline\NewStatusPipeline;
  17. use League\Fractal\Serializer\ArraySerializer;
  18. use League\Fractal\Pagination\IlluminatePaginatorAdapter;
  19. class InternalApiController extends Controller
  20. {
  21. protected $fractal;
  22. public function __construct()
  23. {
  24. $this->middleware('auth');
  25. $this->fractal = new Fractal\Manager();
  26. $this->fractal->setSerializer(new ArraySerializer());
  27. }
  28. public function status(Request $request, $username, int $postid)
  29. {
  30. $auth = Auth::user()->profile;
  31. $profile = Profile::whereUsername($username)->first();
  32. $status = Status::whereProfileId($profile->id)->find($postid);
  33. $status = new Fractal\Resource\Item($status, new StatusTransformer());
  34. $user = new Fractal\Resource\Item($auth, new AccountTransformer());
  35. $res = [];
  36. $res['status'] = $this->fractal->createData($status)->toArray();
  37. $res['user'] = $this->fractal->createData($user)->toArray();
  38. return response()->json($res, 200, [], JSON_PRETTY_PRINT);
  39. }
  40. public function statusComments(Request $request, $username, int $postId)
  41. {
  42. $this->validate($request, [
  43. 'min_id' => 'nullable|integer|min:1',
  44. 'max_id' => 'nullable|integer|min:1|max:'.PHP_INT_MAX,
  45. 'limit' => 'nullable|integer|min:5|max:50'
  46. ]);
  47. $limit = $request->limit ?? 10;
  48. $auth = Auth::user()->profile;
  49. $profile = Profile::whereUsername($username)->first();
  50. $status = Status::whereProfileId($profile->id)->find($postId);
  51. if($request->filled('min_id') || $request->filled('max_id')) {
  52. $q = false;
  53. $limit = 50;
  54. if($request->filled('min_id')) {
  55. $replies = $status->comments()
  56. ->select('id', 'caption', 'rendered', 'profile_id', 'created_at')
  57. ->where('id', '>=', $request->min_id)
  58. ->orderBy('id', 'desc')
  59. ->paginate($limit);
  60. }
  61. if($request->filled('max_id')) {
  62. $replies = $status->comments()
  63. ->select('id', 'caption', 'rendered', 'profile_id', 'created_at')
  64. ->where('id', '<=', $request->max_id)
  65. ->orderBy('id', 'desc')
  66. ->paginate($limit);
  67. }
  68. } else {
  69. $replies = $status->comments()
  70. ->select('id', 'caption', 'rendered', 'profile_id', 'created_at')
  71. ->orderBy('id', 'desc')
  72. ->paginate($limit);
  73. }
  74. $resource = new Fractal\Resource\Collection($replies, new StatusTransformer(), 'data');
  75. $resource->setPaginator(new IlluminatePaginatorAdapter($replies));
  76. $res = $this->fractal->createData($resource)->toArray();
  77. return response()->json($res, 200, [], JSON_PRETTY_PRINT);
  78. }
  79. public function compose(Request $request)
  80. {
  81. $this->validate($request, [
  82. 'caption' => 'nullable|string',
  83. 'media.*' => 'required',
  84. 'media.*.id' => 'required|integer|min:1',
  85. 'media.*.filter' => 'nullable|string|max:30',
  86. 'media.*.license' => 'nullable|string|max:80',
  87. 'visibility' => 'required|string|in:public,private|min:2|max:10'
  88. ]);
  89. $profile = Auth::user()->profile;
  90. $visibility = $request->input('visibility');
  91. $medias = $request->input('media');
  92. $attachments = [];
  93. $status = new Status;
  94. foreach($medias as $media) {
  95. $m = Media::findOrFail($media['id']);
  96. if($m->profile_id !== $profile->id || $m->status_id) {
  97. abort(403, 'Invalid media id');
  98. }
  99. $m->filter_class = $media['filter'];
  100. $m->license = $media['license'];
  101. if($media['cw'] == true) {
  102. $m->is_nsfw = true;
  103. $status->is_nsfw = true;
  104. }
  105. $m->save();
  106. $attachments[] = $m;
  107. }
  108. $status->caption = strip_tags($request->caption);
  109. $status->visibility = 'draft';
  110. $status->scope = 'draft';
  111. $status->profile_id = $profile->id;
  112. $status->save();
  113. foreach($attachments as $media) {
  114. $media->status_id = $status->id;
  115. $media->save();
  116. }
  117. $status->visibility = $visibility;
  118. $status->scope = $visibility;
  119. $status->save();
  120. NewStatusPipeline::dispatch($status);
  121. return $status->url();
  122. }
  123. }