diff --git a/app/Http/Controllers/Api/AdminApiController.php b/app/Http/Controllers/Api/AdminApiController.php index d70601d9..21a832a7 100644 --- a/app/Http/Controllers/Api/AdminApiController.php +++ b/app/Http/Controllers/Api/AdminApiController.php @@ -2,45 +2,40 @@ namespace App\Http\Controllers\Api; -use Illuminate\Http\Request; +use App\AccountInterstitial; use App\Http\Controllers\Controller; +use App\Http\Resources\AdminInstance; +use App\Http\Resources\AdminUser; +use App\Instance; +use App\Jobs\DeletePipeline\DeleteAccountPipeline; +use App\Jobs\DeletePipeline\DeleteRemoteProfilePipeline; use App\Jobs\StatusPipeline\StatusDelete; -use Auth, Cache, DB; -use Carbon\Carbon; -use App\{ - AccountInterstitial, - Instance, - Like, - Notification, - Media, - Profile, - Report, - Status, - User -}; use App\Models\Conversation; use App\Models\RemoteReport; +use App\Notification; +use App\Profile; +use App\Report; use App\Services\AccountService; use App\Services\AdminStatsService; use App\Services\ConfigCacheService; use App\Services\InstanceService; use App\Services\ModLogService; -use App\Services\SnowflakeService; -use App\Services\StatusService; -use App\Services\PublicTimelineService; use App\Services\NetworkTimelineService; use App\Services\NotificationService; -use App\Http\Resources\AdminInstance; -use App\Http\Resources\AdminUser; -use App\Jobs\DeletePipeline\DeleteAccountPipeline; -use App\Jobs\DeletePipeline\DeleteRemoteProfilePipeline; -use App\Jobs\DeletePipeline\DeleteRemoteStatusPipeline; +use App\Services\PublicTimelineService; +use App\Services\SnowflakeService; +use App\Services\StatusService; +use App\Status; +use App\User; +use Cache; +use DB; +use Illuminate\Http\Request; class AdminApiController extends Controller { public function supported(Request $request) { - abort_if(!$request->user() || !$request->user()->token(), 404); + abort_if(! $request->user() || ! $request->user()->token(), 404); abort_unless($request->user()->is_admin == 1, 404); abort_unless($request->user()->tokenCan('admin:read'), 404); @@ -50,7 +45,7 @@ class AdminApiController extends Controller public function getStats(Request $request) { - abort_if(!$request->user() || !$request->user()->token(), 404); + abort_if(! $request->user() || ! $request->user()->token(), 404); abort_unless($request->user()->is_admin == 1, 404); abort_unless($request->user()->tokenCan('admin:read'), 404); @@ -59,12 +54,13 @@ class AdminApiController extends Controller $res['autospam_count'] = AccountInterstitial::whereType('post.autospam') ->whereNull('appeal_handled_at') ->count(); + return $res; } public function autospam(Request $request) { - abort_if(!$request->user() || !$request->user()->token(), 404); + abort_if(! $request->user() || ! $request->user()->token(), 404); abort_unless($request->user()->is_admin == 1, 404); abort_unless($request->user()->tokenCan('admin:read'), 404); @@ -73,26 +69,27 @@ class AdminApiController extends Controller ->whereNull('appeal_handled_at') ->latest() ->simplePaginate(6) - ->map(function($report) { + ->map(function ($report) { $r = [ 'id' => $report->id, 'type' => $report->type, 'item_id' => $report->item_id, 'item_type' => $report->item_type, - 'created_at' => $report->created_at + 'created_at' => $report->created_at, ]; - if($report->item_type === 'App\\Status') { + if ($report->item_type === 'App\\Status') { $status = StatusService::get($report->item_id, false); - if(!$status) { + if (! $status) { return; } $r['status'] = $status; - if($status['in_reply_to_id']) { + if ($status['in_reply_to_id']) { $r['parent'] = StatusService::get($status['in_reply_to_id'], false); } } + return $r; }); @@ -101,14 +98,14 @@ class AdminApiController extends Controller public function autospamHandle(Request $request) { - abort_if(!$request->user() || !$request->user()->token(), 404); + abort_if(! $request->user() || ! $request->user()->token(), 404); abort_unless($request->user()->is_admin == 1, 404); abort_unless($request->user()->tokenCan('admin:write'), 404); $this->validate($request, [ 'action' => 'required|in:dismiss,approve,dismiss-all,approve-all,delete-post,delete-account', - 'id' => 'required' + 'id' => 'required', ]); $action = $request->input('action'); @@ -122,18 +119,19 @@ class AdminApiController extends Controller $user = $appeal->user; $profile = $user->profile; - if($action == 'dismiss') { + if ($action == 'dismiss') { $appeal->is_spam = true; $appeal->appeal_handled_at = $now; $appeal->save(); - Cache::forget('pf:bouncer_v0:exemption_by_pid:' . $profile->id); - Cache::forget('pf:bouncer_v0:recent_by_pid:' . $profile->id); + Cache::forget('pf:bouncer_v0:exemption_by_pid:'.$profile->id); + Cache::forget('pf:bouncer_v0:recent_by_pid:'.$profile->id); Cache::forget('admin-dash:reports:spam-count'); + return $res; } - if($action == 'delete-post') { + if ($action == 'delete-post') { $appeal->appeal_handled_at = now(); $appeal->is_spam = true; $appeal->save(); @@ -148,10 +146,11 @@ class AdminApiController extends Controller PublicTimelineService::deleteByProfileId($profile->id); StatusDelete::dispatch($appeal->status)->onQueue('high'); Cache::forget('admin-dash:reports:spam-count'); + return $res; } - if($action == 'delete-account') { + if ($action == 'delete-account') { abort_if($user->is_admin, 400, 'Cannot delete an admin account.'); $appeal->appeal_handled_at = now(); $appeal->is_spam = true; @@ -167,22 +166,24 @@ class AdminApiController extends Controller PublicTimelineService::deleteByProfileId($profile->id); DeleteAccountPipeline::dispatch($appeal->user)->onQueue('high'); Cache::forget('admin-dash:reports:spam-count'); + return $res; } - if($action == 'dismiss-all') { + if ($action == 'dismiss-all') { AccountInterstitial::whereType('post.autospam') ->whereItemType('App\Status') ->whereNull('appeal_handled_at') ->whereUserId($appeal->user_id) ->update(['appeal_handled_at' => $now, 'is_spam' => true]); - Cache::forget('pf:bouncer_v0:exemption_by_pid:' . $appeal->user->profile_id); - Cache::forget('pf:bouncer_v0:recent_by_pid:' . $appeal->user->profile_id); + Cache::forget('pf:bouncer_v0:exemption_by_pid:'.$appeal->user->profile_id); + Cache::forget('pf:bouncer_v0:recent_by_pid:'.$appeal->user->profile_id); Cache::forget('admin-dash:reports:spam-count'); + return $res; } - if($action == 'approve') { + if ($action == 'approve') { $status = $appeal->status; $status->is_nsfw = $meta->is_nsfw; $status->scope = 'public'; @@ -198,29 +199,30 @@ class AdminApiController extends Controller Notification::whereAction('autospam.warning') ->whereProfileId($appeal->user->profile_id) ->get() - ->each(function($n) use($appeal) { + ->each(function ($n) use ($appeal) { NotificationService::del($appeal->user->profile_id, $n->id); $n->forceDelete(); }); - Cache::forget('pf:bouncer_v0:exemption_by_pid:' . $appeal->user->profile_id); - Cache::forget('pf:bouncer_v0:recent_by_pid:' . $appeal->user->profile_id); + Cache::forget('pf:bouncer_v0:exemption_by_pid:'.$appeal->user->profile_id); + Cache::forget('pf:bouncer_v0:recent_by_pid:'.$appeal->user->profile_id); Cache::forget('admin-dash:reports:spam-count'); + return $res; } - if($action == 'approve-all') { + if ($action == 'approve-all') { AccountInterstitial::whereType('post.autospam') ->whereItemType('App\Status') ->whereNull('appeal_handled_at') ->whereUserId($appeal->user_id) ->get() - ->each(function($report) use($meta) { + ->each(function ($report) use ($meta) { $report->is_spam = false; $report->appeal_handled_at = now(); $report->save(); $status = Status::find($report->item_id); - if($status) { + if ($status) { $status->is_nsfw = $meta->is_nsfw; $status->scope = 'public'; $status->visibility = 'public'; @@ -231,14 +233,15 @@ class AdminApiController extends Controller Notification::whereAction('autospam.warning') ->whereProfileId($report->user->profile_id) ->get() - ->each(function($n) use($report) { + ->each(function ($n) use ($report) { NotificationService::del($report->user->profile_id, $n->id); $n->forceDelete(); }); }); - Cache::forget('pf:bouncer_v0:exemption_by_pid:' . $appeal->user->profile_id); - Cache::forget('pf:bouncer_v0:recent_by_pid:' . $appeal->user->profile_id); + Cache::forget('pf:bouncer_v0:exemption_by_pid:'.$appeal->user->profile_id); + Cache::forget('pf:bouncer_v0:recent_by_pid:'.$appeal->user->profile_id); Cache::forget('admin-dash:reports:spam-count'); + return $res; } @@ -247,47 +250,48 @@ class AdminApiController extends Controller public function modReports(Request $request) { - abort_if(!$request->user() || !$request->user()->token(), 404); + abort_if(! $request->user() || ! $request->user()->token(), 404); abort_unless($request->user()->is_admin == 1, 404); abort_unless($request->user()->tokenCan('admin:read'), 404); $reports = Report::whereNull('admin_seen') - ->orderBy('created_at','desc') + ->orderBy('created_at', 'desc') ->paginate(6) - ->map(function($report) { + ->map(function ($report) { $r = [ 'id' => $report->id, 'type' => $report->type, 'message' => $report->message, 'object_id' => $report->object_id, 'object_type' => $report->object_type, - 'created_at' => $report->created_at + 'created_at' => $report->created_at, ]; - if($report->profile_id) { + if ($report->profile_id) { $r['reported_by_account'] = AccountService::get($report->profile_id, true); } - if($report->object_type === 'App\\Status') { + if ($report->object_type === 'App\\Status') { $status = StatusService::get($report->object_id, false); - if(!$status) { + if (! $status) { return; } $r['status'] = $status; - if(isset($status['in_reply_to_id'])) { + if (isset($status['in_reply_to_id'])) { $r['parent'] = StatusService::get($status['in_reply_to_id'], false); } } - if($report->object_type === 'App\\Profile') { - $acct = AccountService::get($report->object_id, false); - if($acct) { + if ($report->object_type === 'App\\Profile') { + $acct = AccountService::get($report->object_id, true); + if ($acct) { $r['account'] = $acct; } } + return $r; }) ->filter() @@ -298,14 +302,14 @@ class AdminApiController extends Controller public function modReportHandle(Request $request) { - abort_if(!$request->user() || !$request->user()->token(), 404); + abort_if(! $request->user() || ! $request->user()->token(), 404); abort_unless($request->user()->is_admin == 1, 404); abort_unless($request->user()->tokenCan('admin:write'), 404); $this->validate($request, [ - 'action' => 'required|string', - 'id' => 'required' + 'action' => 'required|string', + 'id' => 'required', ]); $action = $request->input('action'); @@ -314,10 +318,10 @@ class AdminApiController extends Controller $actions = [ 'ignore', 'cw', - 'unlist' + 'unlist', ]; - if (!in_array($action, $actions)) { + if (! in_array($action, $actions)) { return abort(403); } @@ -358,7 +362,7 @@ class AdminApiController extends Controller public function getConfiguration(Request $request) { - abort_if(!$request->user() || !$request->user()->token(), 404); + abort_if(! $request->user() || ! $request->user()->token(), 404); abort_unless($request->user()->is_admin == 1, 404); abort_unless($request->user()->tokenCan('admin:read'), 404); @@ -369,42 +373,43 @@ class AdminApiController extends Controller [ 'name' => 'ActivityPub Federation', 'description' => 'Enable activitypub federation support, compatible with Pixelfed, Mastodon and other platforms.', - 'key' => 'federation.activitypub.enabled' + 'key' => 'federation.activitypub.enabled', ], [ 'name' => 'Open Registration', 'description' => 'Allow new account registrations.', - 'key' => 'pixelfed.open_registration' + 'key' => 'pixelfed.open_registration', ], [ 'name' => 'Stories', 'description' => 'Enable the ephemeral Stories feature.', - 'key' => 'instance.stories.enabled' + 'key' => 'instance.stories.enabled', ], [ 'name' => 'Require Email Verification', 'description' => 'Require new accounts to verify their email address.', - 'key' => 'pixelfed.enforce_email_verification' + 'key' => 'pixelfed.enforce_email_verification', ], [ 'name' => 'AutoSpam Detection', 'description' => 'Detect and remove spam from public timelines.', - 'key' => 'pixelfed.bouncer.enabled' + 'key' => 'pixelfed.bouncer.enabled', ], ]) - ->map(function($s) { - $s['state'] = (bool) config_cache($s['key']); - return $s; - }); + ->map(function ($s) { + $s['state'] = (bool) config_cache($s['key']); + + return $s; + }); } public function updateConfiguration(Request $request) { - abort_if(!$request->user() || !$request->user()->token(), 404); + abort_if(! $request->user() || ! $request->user()->token(), 404); abort_unless($request->user()->is_admin == 1, 404); abort_unless($request->user()->tokenCan('admin:write'), 404); @@ -413,7 +418,7 @@ class AdminApiController extends Controller $this->validate($request, [ 'key' => 'required', - 'value' => 'required' + 'value' => 'required', ]); $allowedKeys = [ @@ -426,50 +431,51 @@ class AdminApiController extends Controller $key = $request->input('key'); $value = (bool) filter_var($request->input('value'), FILTER_VALIDATE_BOOLEAN); - abort_if(!in_array($key, $allowedKeys), 400, 'Invalid cache key.'); + abort_if(! in_array($key, $allowedKeys), 400, 'Invalid cache key.'); ConfigCacheService::put($key, $value); - return collect([ + return collect([ [ 'name' => 'ActivityPub Federation', 'description' => 'Enable activitypub federation support, compatible with Pixelfed, Mastodon and other platforms.', - 'key' => 'federation.activitypub.enabled' + 'key' => 'federation.activitypub.enabled', ], [ 'name' => 'Open Registration', 'description' => 'Allow new account registrations.', - 'key' => 'pixelfed.open_registration' + 'key' => 'pixelfed.open_registration', ], [ 'name' => 'Stories', 'description' => 'Enable the ephemeral Stories feature.', - 'key' => 'instance.stories.enabled' + 'key' => 'instance.stories.enabled', ], [ 'name' => 'Require Email Verification', 'description' => 'Require new accounts to verify their email address.', - 'key' => 'pixelfed.enforce_email_verification' + 'key' => 'pixelfed.enforce_email_verification', ], [ 'name' => 'AutoSpam Detection', 'description' => 'Detect and remove spam from public timelines.', - 'key' => 'pixelfed.bouncer.enabled' + 'key' => 'pixelfed.bouncer.enabled', ], ]) - ->map(function($s) { - $s['state'] = (bool) config_cache($s['key']); - return $s; - }); + ->map(function ($s) { + $s['state'] = (bool) config_cache($s['key']); + + return $s; + }); } public function getUsers(Request $request) { - abort_if(!$request->user() || !$request->user()->token(), 404); + abort_if(! $request->user() || ! $request->user()->token(), 404); abort_unless($request->user()->is_admin == 1, 404); abort_unless($request->user()->tokenCan('admin:read'), 404); @@ -480,27 +486,29 @@ class AdminApiController extends Controller $q = $request->input('q'); $sort = $request->input('sort', 'desc') === 'asc' ? 'asc' : 'desc'; $res = User::whereNull('status') - ->when($q, function($query, $q) { - return $query->where('username', 'like', '%' . $q . '%'); + ->when($q, function ($query, $q) { + return $query->where('username', 'like', '%'.$q.'%'); }) ->orderBy('id', $sort) ->cursorPaginate(10); + return AdminUser::collection($res); } public function getUser(Request $request) { - abort_if(!$request->user() || !$request->user()->token(), 404); + abort_if(! $request->user() || ! $request->user()->token(), 404); abort_unless($request->user()->is_admin == 1, 404); abort_unless($request->user()->tokenCan('admin:read'), 404); $id = $request->input('user_id'); - $key = 'pf-admin-api:getUser:byId:' . $id; - if($request->has('refresh')) { + $key = 'pf-admin-api:getUser:byId:'.$id; + if ($request->has('refresh')) { Cache::forget($key); } - return Cache::remember($key, 86400, function() use($id) { + + return Cache::remember($key, 86400, function () use ($id) { $user = User::findOrFail($id); $profile = $user->profile; $account = AccountService::get($user->profile_id, true); @@ -513,8 +521,8 @@ class AdminApiController extends Controller 'moderation' => [ 'unlisted' => (bool) $profile->unlisted, 'cw' => (bool) $profile->cw, - 'no_autolink' => (bool) $profile->no_autolink - ] + 'no_autolink' => (bool) $profile->no_autolink, + ], ]]); return $res; @@ -523,7 +531,7 @@ class AdminApiController extends Controller public function userAdminAction(Request $request) { - abort_if(!$request->user() || !$request->user()->token(), 404); + abort_if(! $request->user() || ! $request->user()->token(), 404); abort_unless($request->user()->is_admin == 1, 404); abort_unless($request->user()->tokenCan('admin:write'), 404); @@ -531,7 +539,7 @@ class AdminApiController extends Controller $this->validate($request, [ 'id' => 'required', 'action' => 'required|in:unlisted,cw,no_autolink,refresh_stats,verify_email,delete', - 'value' => 'sometimes' + 'value' => 'sometimes', ]); $id = $request->input('id'); @@ -541,8 +549,8 @@ class AdminApiController extends Controller abort_if($user->is_admin == true && $action !== 'refresh_stats', 400, 'Cannot moderate admin accounts'); - if($action === 'delete') { - if(config('pixelfed.account_deletion') == false) { + if ($action === 'delete') { + if (config('pixelfed.account_deletion') == false) { abort(404); } @@ -570,7 +578,7 @@ class AdminApiController extends Controller PublicTimelineService::deleteByProfileId($profile->id); NetworkTimelineService::deleteByProfileId($profile->id); - if($profile->user_id) { + if ($profile->user_id) { DB::table('oauth_access_tokens')->whereUserId($user->id)->delete(); DB::table('oauth_auth_codes')->whereUserId($user->id)->delete(); $user->email = $user->id; @@ -589,11 +597,12 @@ class AdminApiController extends Controller AccountService::del($profile->id); DeleteRemoteProfilePipeline::dispatch($profile)->onQueue('high'); } + return [ 'status' => 200, 'msg' => 'deleted', ]; - } else if($action === 'refresh_stats') { + } elseif ($action === 'refresh_stats') { $profile->following_count = DB::table('followers')->whereProfileId($user->profile_id)->count(); $profile->followers_count = DB::table('followers')->whereFollowingId($user->profile_id)->count(); $statusCount = Status::whereProfileId($user->profile_id) @@ -603,7 +612,7 @@ class AdminApiController extends Controller ->count(); $profile->status_count = $statusCount; $profile->save(); - } else if($action === 'verify_email') { + } elseif ($action === 'verify_email') { $user->email_verified_at = now(); $user->save(); @@ -615,11 +624,11 @@ class AdminApiController extends Controller ->action('admin.user.moderate') ->metadata([ 'action' => 'Manually verified email address', - 'message' => 'Success!' + 'message' => 'Success!', ]) ->accessLevel('admin') ->save(); - } else if($action === 'unlisted') { + } elseif ($action === 'unlisted') { ModLogService::boot() ->objectUid($profile->id) ->objectId($profile->id) @@ -628,13 +637,13 @@ class AdminApiController extends Controller ->action('admin.user.moderate') ->metadata([ 'action' => $action, - 'message' => 'Success!' + 'message' => 'Success!', ]) ->accessLevel('admin') ->save(); - $profile->unlisted = !$profile->unlisted; + $profile->unlisted = ! $profile->unlisted; $profile->save(); - } else if($action === 'cw') { + } elseif ($action === 'cw') { ModLogService::boot() ->objectUid($profile->id) ->objectId($profile->id) @@ -643,13 +652,13 @@ class AdminApiController extends Controller ->action('admin.user.moderate') ->metadata([ 'action' => $action, - 'message' => 'Success!' + 'message' => 'Success!', ]) ->accessLevel('admin') ->save(); - $profile->cw = !$profile->cw; + $profile->cw = ! $profile->cw; $profile->save(); - } else if($action === 'no_autolink') { + } elseif ($action === 'no_autolink') { ModLogService::boot() ->objectUid($profile->id) ->objectId($profile->id) @@ -658,11 +667,11 @@ class AdminApiController extends Controller ->action('admin.user.moderate') ->metadata([ 'action' => $action, - 'message' => 'Success!' + 'message' => 'Success!', ]) ->accessLevel('admin') ->save(); - $profile->no_autolink = !$profile->no_autolink; + $profile->no_autolink = ! $profile->no_autolink; $profile->save(); } else { $profile->{$action} = filter_var($request->input('value'), FILTER_VALIDATE_BOOLEAN); @@ -676,7 +685,7 @@ class AdminApiController extends Controller ->action('admin.user.moderate') ->metadata([ 'action' => $action, - 'message' => 'Success!' + 'message' => 'Success!', ]) ->accessLevel('admin') ->save(); @@ -690,14 +699,14 @@ class AdminApiController extends Controller 'moderation' => [ 'unlisted' => (bool) $profile->unlisted, 'cw' => (bool) $profile->cw, - 'no_autolink' => (bool) $profile->no_autolink - ] + 'no_autolink' => (bool) $profile->no_autolink, + ], ]]); } public function instances(Request $request) { - abort_if(!$request->user() || !$request->user()->token(), 404); + abort_if(! $request->user() || ! $request->user()->token(), 404); abort_unless($request->user()->is_admin == 1, 404); abort_unless($request->user()->tokenCan('admin:write'), 404); @@ -714,19 +723,19 @@ class AdminApiController extends Controller $sortBy = $request->input('sort_by', 'id'); $filter = $request->input('filter'); - $res = Instance::when($q, function($query, $q) { - return $query->where('domain', 'like', '%' . $q . '%'); - }) - ->when($filter, function($query, $filter) { - if($filter === 'all') { + $res = Instance::when($q, function ($query, $q) { + return $query->where('domain', 'like', '%'.$q.'%'); + }) + ->when($filter, function ($query, $filter) { + if ($filter === 'all') { return $query; } else { return $query->where($filter, true); } }) - ->when($sortBy, function($query, $sortBy) use($sort) { + ->when($sortBy, function ($query, $sortBy) use ($sort) { return $query->orderBy($sortBy, $sort); - }, function($query) { + }, function ($query) { return $query->orderBy('id', 'desc'); }) ->cursorPaginate(10) @@ -737,7 +746,7 @@ class AdminApiController extends Controller public function getInstance(Request $request) { - abort_if(!$request->user() || !$request->user()->token(), 404); + abort_if(! $request->user() || ! $request->user()->token(), 404); abort_unless($request->user()->is_admin == 1, 404); abort_unless($request->user()->tokenCan('admin:read'), 404); @@ -750,7 +759,7 @@ class AdminApiController extends Controller public function moderateInstance(Request $request) { - abort_if(!$request->user() || !$request->user()->token(), 404); + abort_if(! $request->user() || ! $request->user()->token(), 404); abort_unless($request->user()->is_admin == 1, 404); abort_unless($request->user()->tokenCan('admin:write'), 404); @@ -758,7 +767,7 @@ class AdminApiController extends Controller $this->validate($request, [ 'id' => 'required', 'key' => 'required|in:unlisted,auto_cw,banned', - 'value' => 'required' + 'value' => 'required', ]); $id = $request->input('id'); @@ -776,7 +785,7 @@ class AdminApiController extends Controller public function refreshInstanceStats(Request $request) { - abort_if(!$request->user() || !$request->user()->token(), 404); + abort_if(! $request->user() || ! $request->user()->token(), 404); abort_unless($request->user()->is_admin == 1, 404); abort_unless($request->user()->tokenCan('admin:write'), 404); @@ -796,51 +805,51 @@ class AdminApiController extends Controller public function getAllStats(Request $request) { - abort_if(!$request->user() || !$request->user()->token(), 404); + abort_if(! $request->user() || ! $request->user()->token(), 404); abort_unless($request->user()->is_admin === 1, 404); abort_unless($request->user()->tokenCan('admin:read'), 404); - if($request->has('refresh')) { + if ($request->has('refresh')) { Cache::forget('admin-api:instance-all-stats-v1'); } - return Cache::remember('admin-api:instance-all-stats-v1', 1209600, function() { + return Cache::remember('admin-api:instance-all-stats-v1', 1209600, function () { $days = range(1, 7); $res = [ 'cached_at' => now()->format('c'), ]; $minStatusId = SnowflakeService::byDate(now()->subDays(7)); - foreach($days as $day) { + foreach ($days as $day) { $label = now()->subDays($day)->format('D'); $labelShort = substr($label, 0, 1); $res['users']['days'][] = [ 'date' => now()->subDays($day)->format('M j Y'), 'label_full' => $label, 'label' => $labelShort, - 'count' => User::whereDate('created_at', now()->subDays($day))->count() + 'count' => User::whereDate('created_at', now()->subDays($day))->count(), ]; $res['posts']['days'][] = [ 'date' => now()->subDays($day)->format('M j Y'), 'label_full' => $label, 'label' => $labelShort, - 'count' => Status::whereNull('uri')->where('id', '>', $minStatusId)->whereDate('created_at', now()->subDays($day))->count() + 'count' => Status::whereNull('uri')->where('id', '>', $minStatusId)->whereDate('created_at', now()->subDays($day))->count(), ]; $res['instances']['days'][] = [ 'date' => now()->subDays($day)->format('M j Y'), 'label_full' => $label, 'label' => $labelShort, - 'count' => Instance::whereDate('created_at', now()->subDays($day))->count() + 'count' => Instance::whereDate('created_at', now()->subDays($day))->count(), ]; } $res['users']['total'] = DB::table('users')->count(); $res['users']['min'] = collect($res['users']['days'])->min('count'); $res['users']['max'] = collect($res['users']['days'])->max('count'); - $res['users']['change'] = collect($res['users']['days'])->sum('count');; + $res['users']['change'] = collect($res['users']['days'])->sum('count'); $res['posts']['total'] = DB::table('statuses')->whereNull('uri')->count(); $res['posts']['min'] = collect($res['posts']['days'])->min('count'); $res['posts']['max'] = collect($res['posts']['days'])->max('count');