BaseApiController.php 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  1. <?php
  2. namespace App\Http\Controllers\Api;
  3. use App\Avatar;
  4. use App\Http\Controllers\AvatarController;
  5. use App\Http\Controllers\Controller;
  6. use App\Jobs\AvatarPipeline\AvatarOptimize;
  7. use App\Jobs\ImageOptimizePipeline\ImageOptimize;
  8. use App\Media;
  9. use App\Profile;
  10. use App\Transformer\Api\AccountTransformer;
  11. use App\Transformer\Api\MediaTransformer;
  12. use App\Transformer\Api\StatusTransformer;
  13. use Auth;
  14. use Cache;
  15. use Illuminate\Http\Request;
  16. use League\Fractal;
  17. use League\Fractal\Serializer\ArraySerializer;
  18. class BaseApiController extends Controller
  19. {
  20. protected $fractal;
  21. public function __construct()
  22. {
  23. $this->middleware('auth');
  24. $this->fractal = new Fractal\Manager();
  25. $this->fractal->setSerializer(new ArraySerializer());
  26. }
  27. public function accounts(Request $request, $id)
  28. {
  29. $profile = Profile::findOrFail($id);
  30. $resource = new Fractal\Resource\Item($profile, new AccountTransformer());
  31. $res = $this->fractal->createData($resource)->toArray();
  32. return response()->json($res, 200, [], JSON_PRETTY_PRINT);
  33. }
  34. public function accountFollowers(Request $request, $id)
  35. {
  36. $profile = Profile::findOrFail($id);
  37. $followers = $profile->followers;
  38. $resource = new Fractal\Resource\Collection($followers, new AccountTransformer());
  39. $res = $this->fractal->createData($resource)->toArray();
  40. return response()->json($res, 200, [], JSON_PRETTY_PRINT);
  41. }
  42. public function accountFollowing(Request $request, $id)
  43. {
  44. $profile = Profile::findOrFail($id);
  45. $following = $profile->following;
  46. $resource = new Fractal\Resource\Collection($following, new AccountTransformer());
  47. $res = $this->fractal->createData($resource)->toArray();
  48. return response()->json($res, 200, [], JSON_PRETTY_PRINT);
  49. }
  50. public function accountStatuses(Request $request, $id)
  51. {
  52. $pid = Auth::user()->profile->id;
  53. $profile = Profile::findOrFail($id);
  54. $statuses = $profile->statuses();
  55. if($pid === $profile->id) {
  56. $statuses = $statuses->orderBy('id', 'desc')->paginate(20);
  57. } else {
  58. $statuses = $statuses->whereVisibility('public')->orderBy('id', 'desc')->paginate(20);
  59. }
  60. $resource = new Fractal\Resource\Collection($statuses, new StatusTransformer());
  61. $res = $this->fractal->createData($resource)->toArray();
  62. return response()->json($res, 200, [], JSON_PRETTY_PRINT);
  63. }
  64. public function followSuggestions(Request $request)
  65. {
  66. $followers = Auth::user()->profile->recommendFollowers();
  67. $resource = new Fractal\Resource\Collection($followers, new AccountTransformer());
  68. $res = $this->fractal->createData($resource)->toArray();
  69. return response()->json($res);
  70. }
  71. public function avatarUpdate(Request $request)
  72. {
  73. $this->validate($request, [
  74. 'upload' => 'required|mimes:jpeg,png,gif|max:2000',
  75. ]);
  76. try {
  77. $user = Auth::user();
  78. $profile = $user->profile;
  79. $file = $request->file('upload');
  80. $path = (new AvatarController())->getPath($user, $file);
  81. $dir = $path['root'];
  82. $name = $path['name'];
  83. $public = $path['storage'];
  84. $currentAvatar = storage_path('app/'.$profile->avatar->media_path);
  85. $loc = $request->file('upload')->storeAs($public, $name);
  86. $avatar = Avatar::whereProfileId($profile->id)->firstOrFail();
  87. $opath = $avatar->media_path;
  88. $avatar->media_path = "$public/$name";
  89. $avatar->thumb_path = null;
  90. $avatar->change_count = ++$avatar->change_count;
  91. $avatar->last_processed_at = null;
  92. $avatar->save();
  93. Cache::forget("avatar:{$profile->id}");
  94. AvatarOptimize::dispatch($user->profile, $currentAvatar);
  95. } catch (Exception $e) {
  96. }
  97. return response()->json([
  98. 'code' => 200,
  99. 'msg' => 'Avatar successfully updated',
  100. ]);
  101. }
  102. public function uploadMedia(Request $request)
  103. {
  104. $this->validate($request, [
  105. 'file.*' => function() {
  106. return [
  107. 'required',
  108. 'mimes:' . config('pixelfed.media_types'),
  109. 'max:' . config('pixelfed.max_photo_size'),
  110. ];
  111. },
  112. ]);
  113. $user = Auth::user();
  114. $profile = $user->profile;
  115. $monthHash = hash('sha1', date('Y').date('m'));
  116. $userHash = hash('sha1', $user->id.(string) $user->created_at);
  117. $photo = $request->file('file');
  118. $storagePath = "public/m/{$monthHash}/{$userHash}";
  119. $path = $photo->store($storagePath);
  120. $hash = \hash_file('sha256', $photo);
  121. $media = new Media();
  122. $media->status_id = null;
  123. $media->profile_id = $profile->id;
  124. $media->user_id = $user->id;
  125. $media->media_path = $path;
  126. $media->original_sha256 = $hash;
  127. $media->size = $photo->getClientSize();
  128. $media->mime = $photo->getClientMimeType();
  129. $media->filter_class = null;
  130. $media->filter_name = null;
  131. $media->save();
  132. ImageOptimize::dispatch($media);
  133. $resource = new Fractal\Resource\Item($media, new MediaTransformer());
  134. $res = $this->fractal->createData($resource)->toArray();
  135. return response()->json($res);
  136. }
  137. }