diff --git a/app/Http/Controllers/Admin/UserController.php b/app/Http/Controllers/Admin/UserController.php index 81eb38802..5c2920afb 100644 --- a/app/Http/Controllers/Admin/UserController.php +++ b/app/Http/Controllers/Admin/UserController.php @@ -2,11 +2,10 @@ namespace App\Http\Controllers\Admin; +use Illuminate\Http\JsonResponse; use Illuminate\View\View; use Illuminate\Http\Request; use App\Models\User; -use App\Models\Model; -use Illuminate\Support\Collection; use Illuminate\Http\RedirectResponse; use Prologue\Alerts\AlertsMessageBag; use Spatie\QueryBuilder\QueryBuilder; @@ -129,22 +128,25 @@ class UserController extends Controller /** * Get a JSON response of users on the system. */ - public function json(Request $request): Model|Collection + public function json(Request $request): JsonResponse { - $users = QueryBuilder::for(User::query())->allowedFilters(['email'])->paginate(25); + $userPaginator = QueryBuilder::for(User::query())->allowedFilters(['email'])->paginate(25); + + /** @var User[] $users */ + $users = $userPaginator->items(); // Handle single user requests. if ($request->query('user_id')) { $user = User::query()->findOrFail($request->input('user_id')); $user['md5'] = md5(strtolower($user->email)); - return $user; + return response()->json($user); } - return $users->map(function (User $item) { - $item['md5'] = md5(strtolower($item->email)); + return response()->json(collect($users)->map(function (User $user) { + $user['md5'] = md5(strtolower($user->email)); - return $item; - }); + return $user; + })); } } diff --git a/app/Http/Controllers/Api/Application/Nodes/NodeDeploymentController.php b/app/Http/Controllers/Api/Application/Nodes/NodeDeploymentController.php index 1cdba3ce0..180a8d954 100644 --- a/app/Http/Controllers/Api/Application/Nodes/NodeDeploymentController.php +++ b/app/Http/Controllers/Api/Application/Nodes/NodeDeploymentController.php @@ -30,7 +30,7 @@ class NodeDeploymentController extends ApplicationApiController $nodes = $this->viableNodesService ->setMemory($data['memory']) ->setDisk($data['disk']) - ->handle($request->query('per_page'), $request->query('page')); + ->handle((int) $request->query('per_page'), (int) $request->query('page')); return $this->fractal->collection($nodes) ->transformWith($this->getTransformer(NodeTransformer::class)) diff --git a/app/Http/Controllers/Api/Client/ActivityLogController.php b/app/Http/Controllers/Api/Client/ActivityLogController.php index 2ca5ee6d9..ae9af248e 100644 --- a/app/Http/Controllers/Api/Client/ActivityLogController.php +++ b/app/Http/Controllers/Api/Client/ActivityLogController.php @@ -20,7 +20,7 @@ class ActivityLogController extends ClientApiController ->allowedSorts(['timestamp']) ->with('actor') ->whereNotIn('activity_logs.event', ActivityLog::DISABLED_EVENTS) - ->paginate(min($request->query('per_page', 25), 100)) + ->paginate(min($request->query('per_page', '25'), 100)) ->appends($request->query()); return $this->fractal->collection($activity) diff --git a/app/Http/Controllers/Api/Client/ClientController.php b/app/Http/Controllers/Api/Client/ClientController.php index 758d81175..319d59919 100644 --- a/app/Http/Controllers/Api/Client/ClientController.php +++ b/app/Http/Controllers/Api/Client/ClientController.php @@ -61,7 +61,7 @@ class ClientController extends ClientApiController $builder = $builder->whereIn('servers.id', $user->accessibleServers()->pluck('id')->all()); } - $servers = $builder->paginate(min($request->query('per_page', 50), 100))->appends($request->query()); + $servers = $builder->paginate(min($request->query('per_page', '50'), 100))->appends($request->query()); return $this->fractal->transformWith($transformer)->collection($servers)->toArray(); } diff --git a/app/Http/Controllers/Api/Client/Servers/ActivityLogController.php b/app/Http/Controllers/Api/Client/Servers/ActivityLogController.php index 76005682f..efef02681 100644 --- a/app/Http/Controllers/Api/Client/Servers/ActivityLogController.php +++ b/app/Http/Controllers/Api/Client/Servers/ActivityLogController.php @@ -31,7 +31,7 @@ class ActivityLogController extends ClientApiController ->when(config('activity.hide_admin_activity'), function (Builder $builder) use ($server) { // We could do this with a query and a lot of joins, but that gets pretty // painful so for now we'll execute a simpler query. - $subusers = $server->subusers()->pluck('user_id')->merge($server->owner_id); + $subusers = $server->subusers()->pluck('user_id')->merge([$server->owner_id]); $builder->select('activity_logs.*') ->leftJoin('users', function (JoinClause $join) { @@ -44,7 +44,7 @@ class ActivityLogController extends ClientApiController ->orWhereIn('users.id', $subusers); }); }) - ->paginate(min($request->query('per_page', 25), 100)) + ->paginate(min($request->query('per_page', '25'), 100)) ->appends($request->query()); return $this->fractal->collection($activity) diff --git a/app/Http/Controllers/Api/Client/Servers/BackupController.php b/app/Http/Controllers/Api/Client/Servers/BackupController.php index 5c88666fd..f59b087aa 100644 --- a/app/Http/Controllers/Api/Client/Servers/BackupController.php +++ b/app/Http/Controllers/Api/Client/Servers/BackupController.php @@ -50,7 +50,7 @@ class BackupController extends ClientApiController return $this->fractal->collection($server->backups()->paginate($limit)) ->transformWith($this->getTransformer(BackupTransformer::class)) ->addMeta([ - 'backup_count' => $server->getNonFailedBackups()->count(), + 'backup_count' => $server->backups()->nonFailed()->count(), ]) ->toArray(); } diff --git a/app/Models/Backup.php b/app/Models/Backup.php index 4a922e110..35780dba9 100644 --- a/app/Models/Backup.php +++ b/app/Models/Backup.php @@ -2,6 +2,7 @@ namespace App\Models; +use Illuminate\Database\Eloquent\Builder; use Illuminate\Database\Eloquent\SoftDeletes; use Illuminate\Database\Eloquent\Relations\BelongsTo; @@ -73,4 +74,12 @@ class Backup extends Model { return $this->belongsTo(Server::class); } + + /** + * Returns a query filtering only non-failed backups for a specific server. + */ + public function scopeNonFailed(Builder $query): void + { + $query->whereNull('completed_at')->orWhere('is_successful', true); + } } diff --git a/app/Models/Server.php b/app/Models/Server.php index 4a4103f73..7a56eb39a 100644 --- a/app/Models/Server.php +++ b/app/Models/Server.php @@ -400,14 +400,4 @@ class Server extends Model ->withTrashed() ->get(); } - - /** - * Returns a query filtering only non-failed backups for a specific server. - */ - public function getNonFailedBackups(): HasMany - { - return $this->backups()->where( - fn ($query) => $query->whereNull('completed_at')->orWhere('is_successful', true) - ); - } } diff --git a/app/Services/Backups/InitiateBackupService.php b/app/Services/Backups/InitiateBackupService.php index 468f0d3cf..908979ff3 100644 --- a/app/Services/Backups/InitiateBackupService.php +++ b/app/Services/Backups/InitiateBackupService.php @@ -86,7 +86,7 @@ class InitiateBackupService // Check if the server has reached or exceeded its backup limit. // completed_at == null will cover any ongoing backups, while is_successful == true will cover any completed backups. - $successful = $server->getNonFailedBackups(); + $successful = $server->backups()->nonFailed(); if (!$server->backup_limit || $successful->count() >= $server->backup_limit) { // Do not allow the user to continue if this server is already at its limit and can't override. if (!$override || $server->backup_limit <= 0) { diff --git a/app/Services/Databases/DatabasePasswordService.php b/app/Services/Databases/DatabasePasswordService.php index a46868d0b..65198cd01 100644 --- a/app/Services/Databases/DatabasePasswordService.php +++ b/app/Services/Databases/DatabasePasswordService.php @@ -34,7 +34,7 @@ class DatabasePasswordService $this->connection->transaction(function () use ($database, $password) { $this->dynamic->set('dynamic', $database->database_host_id); - $database->update($database->id, [ + $database->update([ 'password' => $this->encrypter->encrypt($password), ]); diff --git a/app/Services/Eggs/Sharing/EggExporterService.php b/app/Services/Eggs/Sharing/EggExporterService.php index 92cfa7639..e3a561db2 100644 --- a/app/Services/Eggs/Sharing/EggExporterService.php +++ b/app/Services/Eggs/Sharing/EggExporterService.php @@ -45,11 +45,10 @@ class EggExporterService 'entrypoint' => $egg->copy_script_entry, ], ], - 'variables' => $egg->variables->transform(function (EggVariable $item) { - return Collection::make($item->toArray()) + 'variables' => $egg->variables->map(function (EggVariable $eggVariable) { + return Collection::make($eggVariable->toArray()) ->except(['id', 'egg_id', 'created_at', 'updated_at']) - ->merge(['field_type' => 'text']) - ->toArray(); + ->merge(['field_type' => 'text']); }), ]; diff --git a/app/Services/Eggs/Sharing/EggUpdateImporterService.php b/app/Services/Eggs/Sharing/EggUpdateImporterService.php index 4efe0866a..f2123e1f4 100644 --- a/app/Services/Eggs/Sharing/EggUpdateImporterService.php +++ b/app/Services/Eggs/Sharing/EggUpdateImporterService.php @@ -36,7 +36,7 @@ class EggUpdateImporterService EggVariable::unguarded(function () use ($egg, $variable) { $egg->variables()->updateOrCreate([ 'env_variable' => $variable['env_variable'], - ], Collection::make($variable)->except('egg_id', 'env_variable')->toArray()); + ], Collection::make($variable)->except(['egg_id', 'env_variable'])->toArray()); }); } diff --git a/app/Transformers/Api/Client/ActivityLogTransformer.php b/app/Transformers/Api/Client/ActivityLogTransformer.php index 565d502d8..f108248a1 100644 --- a/app/Transformers/Api/Client/ActivityLogTransformer.php +++ b/app/Transformers/Api/Client/ActivityLogTransformer.php @@ -22,7 +22,7 @@ class ActivityLogTransformer extends BaseClientTransformer // This is not for security, it is only to provide a unique identifier to // the front-end for each entry to improve rendering performance since there // is nothing else sufficiently unique to key off at this point. - 'id' => sha1($model->id), + 'id' => sha1((string) $model->id), 'batch' => $model->batch, 'event' => $model->event, 'is_api' => !is_null($model->api_key_id), @@ -73,7 +73,7 @@ class ActivityLogTransformer extends BaseClientTransformer $keys = $properties->keys()->filter(fn ($key) => Str::endsWith($key, '_count'))->values(); if ($keys->containsOneItem()) { - $properties = $properties->merge(['count' => $properties->get($keys[0])])->except($keys[0]); + $properties = $properties->merge(['count' => $properties->get($keys[0])])->except([$keys[0]]); } return (object) $properties->toArray(); diff --git a/phpstan.neon b/phpstan.neon index 6636f150a..58b6c8e91 100644 --- a/phpstan.neon +++ b/phpstan.neon @@ -7,7 +7,7 @@ parameters: - app/ # Level 9 is the highest level - level: 4 + level: 5 ignoreErrors: # Prologue\Alerts defines its methods from its configuration file dynamically