diff --git a/app/Http/Controllers/Api/AdminApiController.php b/app/Http/Controllers/Api/AdminApiController.php index ad587c756..94707ca8d 100644 --- a/app/Http/Controllers/Api/AdminApiController.php +++ b/app/Http/Controllers/Api/AdminApiController.php @@ -9,6 +9,7 @@ use Auth, Cache, DB; use Carbon\Carbon; use App\{ AccountInterstitial, + Instance, Like, Media, Profile, @@ -19,9 +20,12 @@ use App\{ use App\Services\AccountService; use App\Services\AdminStatsService; use App\Services\ConfigCacheService; +use App\Services\InstanceService; use App\Services\ModLogService; use App\Services\StatusService; +use App\Services\NetworkTimelineService; use App\Services\NotificationService; +use App\Http\Resources\AdminInstance; use App\Http\Resources\AdminUser; class AdminApiController extends Controller @@ -486,4 +490,94 @@ class AdminApiController extends Controller ] ]]); } + + public function instances(Request $request) + { + abort_if(!$request->user(), 404); + abort_unless($request->user()->is_admin === 1, 404); + $this->validate($request, [ + 'q' => 'sometimes', + 'sort' => 'sometimes|in:asc,desc', + 'sort_by' => 'sometimes|in:id,status_count,user_count,domain', + 'filter' => 'sometimes|in:all,unlisted,auto_cw,banned', + ]); + + $q = $request->input('q'); + $sort = $request->input('sort', 'desc') === 'asc' ? 'asc' : 'desc'; + $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') { + return $query; + } else { + return $query->where($filter, true); + } + }) + ->when($sortBy, function($query, $sortBy) use($sort) { + return $query->orderBy($sortBy, $sort); + }, function($query) { + return $query->orderBy('id', 'desc'); + }) + ->cursorPaginate(10) + ->withQueryString(); + + return AdminInstance::collection($res); + } + + public function getInstance(Request $request) + { + abort_if(!$request->user(), 404); + abort_unless($request->user()->is_admin === 1, 404); + + $id = $request->input('id'); + $res = Instance::findOrFail($id); + + return new AdminInstance($res); + } + + public function moderateInstance(Request $request) + { + abort_if(!$request->user(), 404); + abort_unless($request->user()->is_admin === 1, 404); + + $this->validate($request, [ + 'id' => 'required', + 'key' => 'required|in:unlisted,auto_cw,banned', + 'value' => 'required' + ]); + + $id = $request->input('id'); + $key = $request->input('key'); + $value = (bool) filter_var($request->input('value'), FILTER_VALIDATE_BOOLEAN); + $res = Instance::findOrFail($id); + $res->{$key} = $value; + $res->save(); + + InstanceService::refresh(); + NetworkTimelineService::warmCache(true); + + return new AdminInstance($res); + } + + public function refreshInstanceStats(Request $request) + { + abort_if(!$request->user(), 404); + abort_unless($request->user()->is_admin === 1, 404); + + $this->validate($request, [ + 'id' => 'required', + ]); + + $id = $request->input('id'); + $instance = Instance::findOrFail($id); + $instance->user_count = Profile::whereDomain($instance->domain)->count(); + $instance->status_count = Profile::whereDomain($instance->domain)->leftJoin('statuses', 'profiles.id', '=', 'statuses.profile_id')->count(); + $instance->save(); + + return new AdminInstance($instance); + } } diff --git a/routes/api.php b/routes/api.php index f3ab0c31f..72fbf53c1 100644 --- a/routes/api.php +++ b/routes/api.php @@ -193,5 +193,9 @@ Route::group(['prefix' => 'api'], function() use($middleware) { Route::get('users/list', 'Api\AdminApiController@getUsers')->middleware($middleware); Route::get('users/get', 'Api\AdminApiController@getUser')->middleware($middleware); Route::post('users/action', 'Api\AdminApiController@userAdminAction')->middleware($middleware); + Route::get('instances/list', 'Api\AdminApiController@instances')->middleware($middleware); + Route::get('instances/get', 'Api\AdminApiController@getInstance')->middleware($middleware); + Route::post('instances/moderate', 'Api\AdminApiController@moderateInstance')->middleware($middleware); + Route::post('instances/refresh-stats', 'Api\AdminApiController@refreshInstanceStats')->middleware($middleware); }); });