BaseApiController.php 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227
  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\NotificationPipeline\NotificationWarmUserCache;
  8. use App\Services\AccountService;
  9. use App\Services\NotificationService;
  10. use App\Services\StatusService;
  11. use App\Status;
  12. use App\StatusArchived;
  13. use App\Transformer\Api\StatusStatelessTransformer;
  14. use Auth;
  15. use Cache;
  16. use Illuminate\Http\Request;
  17. use League\Fractal;
  18. use League\Fractal\Serializer\ArraySerializer;
  19. class BaseApiController 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 notifications(Request $request)
  29. {
  30. abort_if(! $request->user(), 403);
  31. $pid = $request->user()->profile_id;
  32. $limit = $request->input('limit', 20);
  33. $since = $request->input('since_id');
  34. $min = $request->input('min_id');
  35. $max = $request->input('max_id');
  36. if (! $since && ! $min && ! $max) {
  37. $min = 1;
  38. }
  39. $maxId = null;
  40. $minId = null;
  41. if ($max) {
  42. $res = NotificationService::getMax($pid, $max, $limit);
  43. $ids = NotificationService::getRankedMaxId($pid, $max, $limit);
  44. if (! empty($ids)) {
  45. $maxId = max($ids);
  46. $minId = min($ids);
  47. }
  48. } else {
  49. $res = NotificationService::getMin($pid, $min ?? $since, $limit);
  50. $ids = NotificationService::getRankedMinId($pid, $min ?? $since, $limit);
  51. if (! empty($ids)) {
  52. $maxId = max($ids);
  53. $minId = min($ids);
  54. }
  55. }
  56. if (empty($res) && ! Cache::has('pf:services:notifications:hasSynced:'.$pid)) {
  57. Cache::put('pf:services:notifications:hasSynced:'.$pid, 1, 1209600);
  58. NotificationWarmUserCache::dispatch($pid);
  59. }
  60. return response()->json($res);
  61. }
  62. public function avatarUpdate(Request $request)
  63. {
  64. abort_if(! $request->user(), 403);
  65. $this->validate($request, [
  66. 'upload' => 'required|mimetypes:image/jpeg,image/jpg,image/png|max:'.config('pixelfed.max_avatar_size'),
  67. ]);
  68. try {
  69. $user = Auth::user();
  70. $profile = $user->profile;
  71. $file = $request->file('upload');
  72. $path = (new AvatarController)->getPath($user, $file);
  73. $dir = $path['root'];
  74. $name = $path['name'];
  75. $public = $path['storage'];
  76. $currentAvatar = storage_path('app/'.$profile->avatar->media_path);
  77. $loc = $request->file('upload')->storePubliclyAs($public, $name);
  78. $avatar = Avatar::whereProfileId($profile->id)->firstOrFail();
  79. $opath = $avatar->media_path;
  80. $avatar->media_path = "$public/$name";
  81. $avatar->change_count = ++$avatar->change_count;
  82. $avatar->last_processed_at = null;
  83. $avatar->save();
  84. Cache::forget("avatar:{$profile->id}");
  85. AvatarOptimize::dispatch($user->profile, $currentAvatar);
  86. } catch (Exception $e) {
  87. }
  88. return response()->json([
  89. 'code' => 200,
  90. 'msg' => 'Avatar successfully updated',
  91. ]);
  92. }
  93. public function verifyCredentials(Request $request)
  94. {
  95. abort_if(! $request->user(), 403);
  96. $user = $request->user();
  97. if ($user->status != null) {
  98. Auth::logout();
  99. abort(403);
  100. }
  101. $res = AccountService::get($user->profile_id);
  102. return response()->json($res);
  103. }
  104. public function accountLikes(Request $request)
  105. {
  106. abort_if(! $request->user(), 403);
  107. $this->validate($request, [
  108. 'page' => 'sometimes|int|min:1|max:20',
  109. 'limit' => 'sometimes|int|min:1|max:10',
  110. ]);
  111. $user = $request->user();
  112. $limit = $request->input('limit', 10);
  113. $res = \DB::table('likes')
  114. ->whereProfileId($user->profile_id)
  115. ->latest()
  116. ->simplePaginate($limit)
  117. ->map(function ($id) use ($user) {
  118. $status = StatusService::get($id->status_id, false);
  119. $status['favourited'] = true;
  120. $status['reblogged'] = (bool) StatusService::isShared($id->status_id, $user->profile_id);
  121. return $status;
  122. })
  123. ->filter(function ($post) {
  124. return $post && isset($post['account']);
  125. })
  126. ->values();
  127. return response()->json($res);
  128. }
  129. public function archive(Request $request, $id)
  130. {
  131. abort_if(! $request->user(), 403);
  132. $status = Status::whereNull('in_reply_to_id')
  133. ->whereNull('reblog_of_id')
  134. ->whereProfileId($request->user()->profile_id)
  135. ->findOrFail($id);
  136. if ($status->scope === 'archived') {
  137. return [200];
  138. }
  139. $archive = new StatusArchived;
  140. $archive->status_id = $status->id;
  141. $archive->profile_id = $status->profile_id;
  142. $archive->original_scope = $status->scope;
  143. $archive->save();
  144. $status->scope = 'archived';
  145. $status->visibility = 'draft';
  146. $status->save();
  147. StatusService::del($status->id, true);
  148. AccountService::syncPostCount($status->profile_id);
  149. return [200];
  150. }
  151. public function unarchive(Request $request, $id)
  152. {
  153. abort_if(! $request->user(), 403);
  154. $status = Status::whereNull('in_reply_to_id')
  155. ->whereNull('reblog_of_id')
  156. ->whereProfileId($request->user()->profile_id)
  157. ->findOrFail($id);
  158. if ($status->scope !== 'archived') {
  159. return [200];
  160. }
  161. $archive = StatusArchived::whereStatusId($status->id)
  162. ->whereProfileId($status->profile_id)
  163. ->firstOrFail();
  164. $status->scope = $archive->original_scope;
  165. $status->visibility = $archive->original_scope;
  166. $status->save();
  167. $archive->delete();
  168. StatusService::del($status->id, true);
  169. AccountService::syncPostCount($status->profile_id);
  170. return [200];
  171. }
  172. public function archivedPosts(Request $request)
  173. {
  174. abort_if(! $request->user(), 403);
  175. $statuses = Status::whereProfileId($request->user()->profile_id)
  176. ->whereScope('archived')
  177. ->orderByDesc('id')
  178. ->simplePaginate(10);
  179. $fractal = new Fractal\Manager;
  180. $fractal->setSerializer(new ArraySerializer);
  181. $resource = new Fractal\Resource\Collection($statuses, new StatusStatelessTransformer);
  182. return $fractal->createData($resource)->toArray();
  183. }
  184. }