diff --git a/.github/workflows/lint.yaml b/.github/workflows/lint.yaml index 3dd538aad..0b767fcf7 100644 --- a/.github/workflows/lint.yaml +++ b/.github/workflows/lint.yaml @@ -6,8 +6,8 @@ on: - '**' jobs: - lint: - name: Lint + pint: + name: Pint runs-on: ubuntu-latest steps: - name: Code Checkout @@ -16,7 +16,7 @@ jobs: - name: Setup PHP uses: shivammathur/setup-php@v2 with: - php-version: "8.2" + php-version: "8.3" extensions: bcmath, curl, gd, mbstring, mysql, openssl, pdo, tokenizer, xml, zip tools: composer:v2 coverage: none @@ -29,3 +29,26 @@ jobs: - name: Pint run: vendor/bin/pint --test + phpstan: + name: PHPStan + runs-on: ubuntu-latest + steps: + - name: Code Checkout + uses: actions/checkout@v4 + + - name: Setup PHP + uses: shivammathur/setup-php@v2 + with: + php-version: "8.3" + extensions: bcmath, curl, gd, mbstring, mysql, openssl, pdo, tokenizer, xml, zip + tools: composer:v2 + coverage: none + + - name: Setup .env + run: cp .env.example .env + + - name: Install dependencies + run: composer install --no-interaction --no-progress --prefer-dist + + - name: PHPStan + run: vendor/bin/phpstan --memory-limit=-1 diff --git a/app/Filament/Resources/EggResource/Pages/ListEggs.php b/app/Filament/Resources/EggResource/Pages/ListEggs.php index c3119b17d..8cd878a71 100644 --- a/app/Filament/Resources/EggResource/Pages/ListEggs.php +++ b/app/Filament/Resources/EggResource/Pages/ListEggs.php @@ -89,7 +89,6 @@ class ListEggs extends ListRecords ]) ->action(function (array $data): void { - /** @var EggImporterService $eggImportService */ $eggImportService = resolve(EggImporterService::class); diff --git a/app/Filament/Resources/NodeResource/Pages/EditNode.php b/app/Filament/Resources/NodeResource/Pages/EditNode.php index b7236232d..4b7f90ad1 100644 --- a/app/Filament/Resources/NodeResource/Pages/EditNode.php +++ b/app/Filament/Resources/NodeResource/Pages/EditNode.php @@ -395,10 +395,11 @@ class EditNode extends EditRecord ->requiresConfirmation() ->modalHeading('Reset Daemon Token?') ->modalDescription('Resetting the daemon token will void any request coming from the old token. This token is used for all sensitive operations on the daemon including server creation and deletion. We suggest changing this token regularly for security.') - ->action(fn (NodeUpdateService $nodeUpdateService, Node $node) => $nodeUpdateService->handle($node, [], true) - && Notification::make()->success()->title('Daemon Key Reset')->send() - && $this->fillForm() - ), + ->action(function (NodeUpdateService $nodeUpdateService, Node $node) { + $nodeUpdateService->handle($node, [], true); + Notification::make()->success()->title('Daemon Key Reset')->send(); + $this->fillForm(); + }), ]), ]), ]), diff --git a/app/Filament/Resources/NodeResource/RelationManagers/AllocationsRelationManager.php b/app/Filament/Resources/NodeResource/RelationManagers/AllocationsRelationManager.php index f74cf1fca..97eb8d37d 100644 --- a/app/Filament/Resources/NodeResource/RelationManagers/AllocationsRelationManager.php +++ b/app/Filament/Resources/NodeResource/RelationManagers/AllocationsRelationManager.php @@ -3,7 +3,7 @@ namespace App\Filament\Resources\NodeResource\RelationManagers; use App\Models\Allocation; -use App\Models\Server; +use App\Models\Node; use App\Services\Allocations\AssignmentService; use Filament\Forms; use Filament\Forms\Form; @@ -12,6 +12,9 @@ use Filament\Tables; use Filament\Tables\Table; use Illuminate\Support\HtmlString; +/** + * @method Node getOwnerRecord() + */ class AllocationsRelationManager extends RelationManager { protected static string $relationship = 'allocations'; @@ -66,7 +69,7 @@ class AllocationsRelationManager extends RelationManager Tables\Actions\Action::make('create new allocation')->label('Create Allocations') ->form(fn () => [ Forms\Components\TextInput::make('allocation_ip') - ->datalist($this->getOwnerRecord()->ipAddresses() ?? []) + ->datalist($this->getOwnerRecord()->ipAddresses()) ->label('IP Address') ->inlineLabel() ->ipv4() diff --git a/app/Filament/Resources/ServerResource/Pages/CreateServer.php b/app/Filament/Resources/ServerResource/Pages/CreateServer.php index 8928698c2..d61c141fe 100644 --- a/app/Filament/Resources/ServerResource/Pages/CreateServer.php +++ b/app/Filament/Resources/ServerResource/Pages/CreateServer.php @@ -426,7 +426,6 @@ class CreateServer extends CreateRecord $components = [$text, $select]; - /** @var Forms\Components\Component $component */ foreach ($components as &$component) { $component = $component ->live(onBlur: true) @@ -576,6 +575,7 @@ class CreateServer extends CreateRecord 'unlimited' => -1, 'disabled' => 0, 'limited' => 128, + default => throw new \LogicException('Invalid state'), }; $set('swap', $value); @@ -595,7 +595,7 @@ class CreateServer extends CreateRecord ->dehydratedWhenHidden() ->hidden(fn (Forms\Get $get) => match ($get('swap_support')) { 'disabled', 'unlimited' => true, - 'limited' => false, + default => false, }) ->label('Swap Memory') ->default(0) diff --git a/app/Filament/Resources/ServerResource/Pages/EditServer.php b/app/Filament/Resources/ServerResource/Pages/EditServer.php index e425a0331..c7a3ae4e5 100644 --- a/app/Filament/Resources/ServerResource/Pages/EditServer.php +++ b/app/Filament/Resources/ServerResource/Pages/EditServer.php @@ -2,6 +2,7 @@ namespace App\Filament\Resources\ServerResource\Pages; +use LogicException; use App\Filament\Resources\ServerResource; use App\Http\Controllers\Admin\ServersController; use App\Services\Servers\RandomWordService; @@ -299,6 +300,7 @@ class EditServer extends EditRecord 'unlimited' => -1, 'disabled' => 0, 'limited' => 128, + default => throw new LogicException('Invalid state') }; $set('swap', $value); @@ -308,6 +310,7 @@ class EditServer extends EditRecord $get('swap') > 0 => 'limited', $get('swap') == 0 => 'disabled', $get('swap') < 0 => 'unlimited', + default => throw new LogicException('Invalid state') }; }) ->options([ @@ -325,7 +328,7 @@ class EditServer extends EditRecord ->dehydratedWhenHidden() ->hidden(fn (Forms\Get $get) => match ($get('swap_support')) { 'disabled', 'unlimited', true => true, - 'limited', false => false, + default => false, }) ->label('Swap Memory')->inlineLabel() ->suffix('MiB') @@ -553,7 +556,6 @@ class EditServer extends EditRecord $components = [$text, $select]; - /** @var Forms\Components\Component $component */ foreach ($components as &$component) { $component = $component ->live(onBlur: true) @@ -606,7 +608,7 @@ class EditServer extends EditRecord ->action(function (ServersController $serversController, Server $server) { $serversController->toggleInstall($server); - return $this->refreshFormData(['status', 'docker']); + $this->refreshFormData(['status', 'docker']); }), ])->fullWidth(), Forms\Components\ToggleButtons::make('') @@ -624,7 +626,7 @@ class EditServer extends EditRecord $suspensionService->toggle($server, 'suspend'); Notification::make()->success()->title('Server Suspended!')->send(); - return $this->refreshFormData(['status', 'docker']); + $this->refreshFormData(['status', 'docker']); }), Forms\Components\Actions\Action::make('toggleUnsuspend') ->label('Unsuspend') @@ -634,7 +636,7 @@ class EditServer extends EditRecord $suspensionService->toggle($server, 'unsuspend'); Notification::make()->success()->title('Server Unsuspended!')->send(); - return $this->refreshFormData(['status', 'docker']); + $this->refreshFormData(['status', 'docker']); }), ])->fullWidth(), Forms\Components\ToggleButtons::make('') @@ -650,7 +652,7 @@ class EditServer extends EditRecord Forms\Components\Actions::make([ Forms\Components\Actions\Action::make('transfer') ->label('Transfer Soon™') - ->action(fn (TransferServerService $transfer, Server $server) => $transfer->handle($server, $data)) + ->action(fn (TransferServerService $transfer, Server $server) => $transfer->handle($server, [])) ->disabled() //TODO! ->form([ //TODO! Forms\Components\Select::make('newNode') diff --git a/app/Filament/Resources/ServerResource/Pages/ListServers.php b/app/Filament/Resources/ServerResource/Pages/ListServers.php index 00fff906e..3e20d8830 100644 --- a/app/Filament/Resources/ServerResource/Pages/ListServers.php +++ b/app/Filament/Resources/ServerResource/Pages/ListServers.php @@ -22,13 +22,7 @@ class ListServers extends ListRecords Tables\Columns\TextColumn::make('status') ->default('unknown') ->badge() - ->default(function (Server $server) { - if ($server->status !== null) { - return $server->status; - } - - return $server->retrieveStatus() ?? 'node_fail'; - }) + ->default(fn (Server $server) => $server->status ?? $server->retrieveStatus()) ->icon(fn ($state) => match ($state) { 'node_fail' => 'tabler-server-off', 'running' => 'tabler-heartbeat', diff --git a/app/Filament/Resources/ServerResource/RelationManagers/AllocationsRelationManager.php b/app/Filament/Resources/ServerResource/RelationManagers/AllocationsRelationManager.php index f698a393e..d2615a481 100644 --- a/app/Filament/Resources/ServerResource/RelationManagers/AllocationsRelationManager.php +++ b/app/Filament/Resources/ServerResource/RelationManagers/AllocationsRelationManager.php @@ -3,12 +3,16 @@ namespace App\Filament\Resources\ServerResource\RelationManagers; use App\Models\Allocation; +use App\Models\Server; use Filament\Forms; use Filament\Forms\Form; use Filament\Resources\RelationManagers\RelationManager; use Filament\Tables; use Filament\Tables\Table; +/** + * @method Server getOwnerRecord() + */ class AllocationsRelationManager extends RelationManager { protected static string $relationship = 'allocations'; @@ -38,12 +42,12 @@ class AllocationsRelationManager extends RelationManager Tables\Columns\TextInputColumn::make('ip_alias')->label('Alias'), Tables\Columns\IconColumn::make('primary') ->icon(fn ($state) => match ($state) { - false => 'tabler-star', true => 'tabler-star-filled', + default => 'tabler-star', }) ->color(fn ($state) => match ($state) { - false => 'gray', true => 'warning', + default => 'gray', }) ->action(fn (Allocation $allocation) => $this->getOwnerRecord()->update(['allocation_id' => $allocation->id])) ->default(fn (Allocation $allocation) => $allocation->id === $this->getOwnerRecord()->allocation_id) diff --git a/app/Http/Controllers/Api/Application/Servers/ServerManagementController.php b/app/Http/Controllers/Api/Application/Servers/ServerManagementController.php index d728ea83c..4c9b512ae 100644 --- a/app/Http/Controllers/Api/Application/Servers/ServerManagementController.php +++ b/app/Http/Controllers/Api/Application/Servers/ServerManagementController.php @@ -75,11 +75,11 @@ class ServerManagementController extends ApplicationApiController if ($this->transferServerService->handle($server, $validatedData)) { // Transfer started - $this->returnNoContent(); - } else { - // Node was not viable - return new Response('', Response::HTTP_NOT_ACCEPTABLE); + return $this->returnNoContent(); } + + // Node was not viable + return new Response('', Response::HTTP_NOT_ACCEPTABLE); } /** diff --git a/app/Http/Requests/Api/Application/Mounts/UpdateMountRequest.php b/app/Http/Requests/Api/Application/Mounts/UpdateMountRequest.php index 213507fca..7f76ec420 100644 --- a/app/Http/Requests/Api/Application/Mounts/UpdateMountRequest.php +++ b/app/Http/Requests/Api/Application/Mounts/UpdateMountRequest.php @@ -7,14 +7,13 @@ use App\Models\Mount; class UpdateMountRequest extends StoreMountRequest { /** - * Apply validation rules to this request. Uses the parent class rules() - * function but passes in the rules for updating rather than creating. + * Apply validation rules to this request. */ public function rules(array $rules = null): array { /** @var Mount $mount */ $mount = $this->route()->parameter('mount'); - return parent::rules(Mount::getRulesForUpdate($mount->id)); + return Mount::getRulesForUpdate($mount->id); } } diff --git a/app/Models/Allocation.php b/app/Models/Allocation.php index 33bc7f16d..abd60bfba 100644 --- a/app/Models/Allocation.php +++ b/app/Models/Allocation.php @@ -103,7 +103,8 @@ class Allocation extends Model return !is_null($this->ip_alias); } - public function address(): Attribute + /** @return Attribute */ + protected function address(): Attribute { return Attribute::make( get: fn () => "$this->ip:$this->port", diff --git a/app/Models/Server.php b/app/Models/Server.php index 9b5e5b1cc..5aca895dd 100644 --- a/app/Models/Server.php +++ b/app/Models/Server.php @@ -26,7 +26,7 @@ use App\Exceptions\Http\Server\ServerStateConflictException; * @property int $node_id * @property string $name * @property string $description - * @property string|null $status + * @property ServerState|null $status * @property bool $skip_scripts * @property int $owner_id * @property int $memory diff --git a/app/Repositories/Daemon/DaemonServerRepository.php b/app/Repositories/Daemon/DaemonServerRepository.php index 18c78f7fd..ce91ece2b 100644 --- a/app/Repositories/Daemon/DaemonServerRepository.php +++ b/app/Repositories/Daemon/DaemonServerRepository.php @@ -25,9 +25,9 @@ class DaemonServerRepository extends DaemonRepository Assert::isInstanceOf($this->server, Server::class); try { - $response = $this->getHttpClient()->get( + return $this->getHttpClient()->get( sprintf('/api/servers/%s', $this->server->uuid) - )->throw(); + )->throw()->json(); } catch (RequestException $exception) { $cfId = $exception->response->header('Cf-Ray'); $cfCache = $exception->response->header('Cf-Cache-Status'); @@ -48,7 +48,7 @@ class DaemonServerRepository extends DaemonRepository report($exception); } - return $response?->json() ?? ['state' => ContainerStatus::Missing->value]; + return ['state' => ContainerStatus::Missing->value]; } /** diff --git a/app/Transformers/Api/Client/ActivityLogTransformer.php b/app/Transformers/Api/Client/ActivityLogTransformer.php index d02f95988..af666beb6 100644 --- a/app/Transformers/Api/Client/ActivityLogTransformer.php +++ b/app/Transformers/Api/Client/ActivityLogTransformer.php @@ -55,7 +55,7 @@ class ActivityLogTransformer extends BaseClientTransformer $properties = $model->properties ->mapWithKeys(function ($value, $key) use ($model) { - if ($key === 'ip' && $model->actor && !$model->actor->is($this->request->user())) { + if ($key === 'ip' && !$model->actor->is($this->request->user())) { return [$key => '[hidden]']; } diff --git a/composer.json b/composer.json index 399b42278..833cef865 100644 --- a/composer.json +++ b/composer.json @@ -70,6 +70,7 @@ "scripts": { "cs:fix": "php-cs-fixer fix", "cs:check": "php-cs-fixer fix --dry-run --diff --verbose", + "phpstan": "phpstan --memory-limit=-1", "post-autoload-dump": [ "Illuminate\\Foundation\\ComposerScripts::postAutoloadDump" ],