Daniel Supernault преди 2 години
родител
ревизия
d5dc928224
променени са 2 файла, в които са добавени 98 реда и са изтрити 0 реда
  1. 94 0
      app/Http/Controllers/Api/AdminApiController.php
  2. 4 0
      routes/api.php

+ 94 - 0
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);
+    }
 }

+ 4 - 0
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);
 	});
 });