123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227 |
- <?php
- namespace App\Http\Controllers\Api;
- use App\Avatar;
- use App\Http\Controllers\AvatarController;
- use App\Http\Controllers\Controller;
- use App\Jobs\AvatarPipeline\AvatarOptimize;
- use App\Jobs\NotificationPipeline\NotificationWarmUserCache;
- use App\Services\AccountService;
- use App\Services\NotificationService;
- use App\Services\StatusService;
- use App\Status;
- use App\StatusArchived;
- use App\Transformer\Api\StatusStatelessTransformer;
- use Auth;
- use Cache;
- use Illuminate\Http\Request;
- use League\Fractal;
- use League\Fractal\Serializer\ArraySerializer;
- class BaseApiController extends Controller
- {
- protected $fractal;
- public function __construct()
- {
- // $this->middleware('auth');
- $this->fractal = new Fractal\Manager;
- $this->fractal->setSerializer(new ArraySerializer);
- }
- public function notifications(Request $request)
- {
- abort_if(! $request->user(), 403);
- $pid = $request->user()->profile_id;
- $limit = $request->input('limit', 20);
- $since = $request->input('since_id');
- $min = $request->input('min_id');
- $max = $request->input('max_id');
- if (! $since && ! $min && ! $max) {
- $min = 1;
- }
- $maxId = null;
- $minId = null;
- if ($max) {
- $res = NotificationService::getMax($pid, $max, $limit);
- $ids = NotificationService::getRankedMaxId($pid, $max, $limit);
- if (! empty($ids)) {
- $maxId = max($ids);
- $minId = min($ids);
- }
- } else {
- $res = NotificationService::getMin($pid, $min ?? $since, $limit);
- $ids = NotificationService::getRankedMinId($pid, $min ?? $since, $limit);
- if (! empty($ids)) {
- $maxId = max($ids);
- $minId = min($ids);
- }
- }
- if (empty($res) && ! Cache::has('pf:services:notifications:hasSynced:'.$pid)) {
- Cache::put('pf:services:notifications:hasSynced:'.$pid, 1, 1209600);
- NotificationWarmUserCache::dispatch($pid);
- }
- return response()->json($res);
- }
- public function avatarUpdate(Request $request)
- {
- abort_if(! $request->user(), 403);
- $this->validate($request, [
- 'upload' => 'required|mimetypes:image/jpeg,image/jpg,image/png|max:'.config('pixelfed.max_avatar_size'),
- ]);
- try {
- $user = Auth::user();
- $profile = $user->profile;
- $file = $request->file('upload');
- $path = (new AvatarController)->getPath($user, $file);
- $dir = $path['root'];
- $name = $path['name'];
- $public = $path['storage'];
- $currentAvatar = storage_path('app/'.$profile->avatar->media_path);
- $loc = $request->file('upload')->storePubliclyAs($public, $name);
- $avatar = Avatar::whereProfileId($profile->id)->firstOrFail();
- $opath = $avatar->media_path;
- $avatar->media_path = "$public/$name";
- $avatar->change_count = ++$avatar->change_count;
- $avatar->last_processed_at = null;
- $avatar->save();
- Cache::forget("avatar:{$profile->id}");
- AvatarOptimize::dispatch($user->profile, $currentAvatar);
- } catch (Exception $e) {
- }
- return response()->json([
- 'code' => 200,
- 'msg' => 'Avatar successfully updated',
- ]);
- }
- public function verifyCredentials(Request $request)
- {
- abort_if(! $request->user(), 403);
- $user = $request->user();
- if ($user->status != null) {
- Auth::logout();
- abort(403);
- }
- $res = AccountService::get($user->profile_id);
- return response()->json($res);
- }
- public function accountLikes(Request $request)
- {
- abort_if(! $request->user(), 403);
- $this->validate($request, [
- 'page' => 'sometimes|int|min:1|max:20',
- 'limit' => 'sometimes|int|min:1|max:10',
- ]);
- $user = $request->user();
- $limit = $request->input('limit', 10);
- $res = \DB::table('likes')
- ->whereProfileId($user->profile_id)
- ->latest()
- ->simplePaginate($limit)
- ->map(function ($id) use ($user) {
- $status = StatusService::get($id->status_id, false);
- $status['favourited'] = true;
- $status['reblogged'] = (bool) StatusService::isShared($id->status_id, $user->profile_id);
- return $status;
- })
- ->filter(function ($post) {
- return $post && isset($post['account']);
- })
- ->values();
- return response()->json($res);
- }
- public function archive(Request $request, $id)
- {
- abort_if(! $request->user(), 403);
- $status = Status::whereNull('in_reply_to_id')
- ->whereNull('reblog_of_id')
- ->whereProfileId($request->user()->profile_id)
- ->findOrFail($id);
- if ($status->scope === 'archived') {
- return [200];
- }
- $archive = new StatusArchived;
- $archive->status_id = $status->id;
- $archive->profile_id = $status->profile_id;
- $archive->original_scope = $status->scope;
- $archive->save();
- $status->scope = 'archived';
- $status->visibility = 'draft';
- $status->save();
- StatusService::del($status->id, true);
- AccountService::syncPostCount($status->profile_id);
- return [200];
- }
- public function unarchive(Request $request, $id)
- {
- abort_if(! $request->user(), 403);
- $status = Status::whereNull('in_reply_to_id')
- ->whereNull('reblog_of_id')
- ->whereProfileId($request->user()->profile_id)
- ->findOrFail($id);
- if ($status->scope !== 'archived') {
- return [200];
- }
- $archive = StatusArchived::whereStatusId($status->id)
- ->whereProfileId($status->profile_id)
- ->firstOrFail();
- $status->scope = $archive->original_scope;
- $status->visibility = $archive->original_scope;
- $status->save();
- $archive->delete();
- StatusService::del($status->id, true);
- AccountService::syncPostCount($status->profile_id);
- return [200];
- }
- public function archivedPosts(Request $request)
- {
- abort_if(! $request->user(), 403);
- $statuses = Status::whereProfileId($request->user()->profile_id)
- ->whereScope('archived')
- ->orderByDesc('id')
- ->simplePaginate(10);
- $fractal = new Fractal\Manager;
- $fractal->setSerializer(new ArraySerializer);
- $resource = new Fractal\Resource\Collection($statuses, new StatusStatelessTransformer);
- return $fractal->createData($resource)->toArray();
- }
- }
|