diff --git a/app/Console/Commands/Migration.php b/app/Console/Commands/Migration.php index 58b94fd55..44c17203b 100644 --- a/app/Console/Commands/Migration.php +++ b/app/Console/Commands/Migration.php @@ -14,7 +14,7 @@ class Migration extends Command { if (config('constants.migration.is_migration_enabled')) { $this->info('Migration is enabled on this server.'); - $this->call('migrate --force --isolated'); + $this->call('migrate', ['--force' => true, '--isolated' => true]); exit(0); } else { $this->info('Migration is disabled on this server.'); diff --git a/app/Livewire/Project/Resource/Index.php b/app/Livewire/Project/Resource/Index.php index 283496887..0c2ea802a 100644 --- a/app/Livewire/Project/Resource/Index.php +++ b/app/Livewire/Project/Resource/Index.php @@ -46,125 +46,84 @@ class Index extends Component return redirect()->route('dashboard'); } $this->project = $project; - $this->environment = $environment; - $this->applications = $this->environment->applications->load(['tags']); + $this->environment = $environment->loadCount([ + 'applications', + 'redis', + 'postgresqls', + 'mysqls', + 'keydbs', + 'dragonflies', + 'clickhouses', + 'mariadbs', + 'mongodbs', + 'services', + ]); + + // Eager load all relationships for applications including nested ones + $this->applications = $this->environment->applications()->with([ + 'tags', + 'additional_servers.settings', + 'additional_networks', + 'destination.server.settings', + 'settings', + ])->get()->sortBy('name'); $this->applications = $this->applications->map(function ($application) { - if (data_get($application, 'environment.project.uuid')) { - $application->hrefLink = route('project.application.configuration', [ - 'project_uuid' => data_get($application, 'environment.project.uuid'), - 'environment_name' => data_get($application, 'environment.name'), - 'application_uuid' => data_get($application, 'uuid'), - ]); - } + $application->hrefLink = route('project.application.configuration', [ + 'project_uuid' => $this->project->uuid, + 'application_uuid' => $application->uuid, + 'environment_name' => $this->environment->name, + ]); return $application; }); - $this->postgresqls = $this->environment->postgresqls->load(['tags'])->sortBy('name'); - $this->postgresqls = $this->postgresqls->map(function ($postgresql) { - if (data_get($postgresql, 'environment.project.uuid')) { - $postgresql->hrefLink = route('project.database.configuration', [ - 'project_uuid' => data_get($postgresql, 'environment.project.uuid'), - 'environment_name' => data_get($postgresql, 'environment.name'), - 'database_uuid' => data_get($postgresql, 'uuid'), - ]); - } - return $postgresql; - }); - $this->redis = $this->environment->redis->load(['tags'])->sortBy('name'); - $this->redis = $this->redis->map(function ($redis) { - if (data_get($redis, 'environment.project.uuid')) { - $redis->hrefLink = route('project.database.configuration', [ - 'project_uuid' => data_get($redis, 'environment.project.uuid'), - 'environment_name' => data_get($redis, 'environment.name'), - 'database_uuid' => data_get($redis, 'uuid'), - ]); - } + // Load all database resources in a single query per type + $databaseTypes = [ + 'postgresqls' => 'postgresqls', + 'redis' => 'redis', + 'mongodbs' => 'mongodbs', + 'mysqls' => 'mysqls', + 'mariadbs' => 'mariadbs', + 'keydbs' => 'keydbs', + 'dragonflies' => 'dragonflies', + 'clickhouses' => 'clickhouses', + ]; - return $redis; - }); - $this->mongodbs = $this->environment->mongodbs->load(['tags'])->sortBy('name'); - $this->mongodbs = $this->mongodbs->map(function ($mongodb) { - if (data_get($mongodb, 'environment.project.uuid')) { - $mongodb->hrefLink = route('project.database.configuration', [ - 'project_uuid' => data_get($mongodb, 'environment.project.uuid'), - 'environment_name' => data_get($mongodb, 'environment.name'), - 'database_uuid' => data_get($mongodb, 'uuid'), - ]); - } + // Load all server-related data first to prevent duplicate queries + $serverData = $this->environment->applications() + ->with(['destination.server.settings']) + ->get() + ->pluck('destination.server') + ->filter() + ->unique('id'); - return $mongodb; - }); - $this->mysqls = $this->environment->mysqls->load(['tags'])->sortBy('name'); - $this->mysqls = $this->mysqls->map(function ($mysql) { - if (data_get($mysql, 'environment.project.uuid')) { - $mysql->hrefLink = route('project.database.configuration', [ - 'project_uuid' => data_get($mysql, 'environment.project.uuid'), - 'environment_name' => data_get($mysql, 'environment.name'), - 'database_uuid' => data_get($mysql, 'uuid'), + foreach ($databaseTypes as $property => $relation) { + $this->{$property} = $this->environment->{$relation}()->with([ + 'tags', + 'destination.server.settings', + ])->get()->sortBy('name'); + $this->{$property} = $this->{$property}->map(function ($db) { + $db->hrefLink = route('project.database.configuration', [ + 'project_uuid' => $this->project->uuid, + 'database_uuid' => $db->uuid, + 'environment_name' => $this->environment->name, ]); - } - return $mysql; - }); - $this->mariadbs = $this->environment->mariadbs->load(['tags'])->sortBy('name'); - $this->mariadbs = $this->mariadbs->map(function ($mariadb) { - if (data_get($mariadb, 'environment.project.uuid')) { - $mariadb->hrefLink = route('project.database.configuration', [ - 'project_uuid' => data_get($mariadb, 'environment.project.uuid'), - 'environment_name' => data_get($mariadb, 'environment.name'), - 'database_uuid' => data_get($mariadb, 'uuid'), - ]); - } + return $db; + }); + } - return $mariadb; - }); - $this->keydbs = $this->environment->keydbs->load(['tags'])->sortBy('name'); - $this->keydbs = $this->keydbs->map(function ($keydb) { - if (data_get($keydb, 'environment.project.uuid')) { - $keydb->hrefLink = route('project.database.configuration', [ - 'project_uuid' => data_get($keydb, 'environment.project.uuid'), - 'environment_name' => data_get($keydb, 'environment.name'), - 'database_uuid' => data_get($keydb, 'uuid'), - ]); - } - - return $keydb; - }); - $this->dragonflies = $this->environment->dragonflies->load(['tags'])->sortBy('name'); - $this->dragonflies = $this->dragonflies->map(function ($dragonfly) { - if (data_get($dragonfly, 'environment.project.uuid')) { - $dragonfly->hrefLink = route('project.database.configuration', [ - 'project_uuid' => data_get($dragonfly, 'environment.project.uuid'), - 'environment_name' => data_get($dragonfly, 'environment.name'), - 'database_uuid' => data_get($dragonfly, 'uuid'), - ]); - } - - return $dragonfly; - }); - $this->clickhouses = $this->environment->clickhouses->load(['tags'])->sortBy('name'); - $this->clickhouses = $this->clickhouses->map(function ($clickhouse) { - if (data_get($clickhouse, 'environment.project.uuid')) { - $clickhouse->hrefLink = route('project.database.configuration', [ - 'project_uuid' => data_get($clickhouse, 'environment.project.uuid'), - 'environment_name' => data_get($clickhouse, 'environment.name'), - 'database_uuid' => data_get($clickhouse, 'uuid'), - ]); - } - - return $clickhouse; - }); - $this->services = $this->environment->services->load(['tags'])->sortBy('name'); + // Load services with their tags and server + $this->services = $this->environment->services()->with([ + 'tags', + 'destination.server.settings', + ])->get()->sortBy('name'); $this->services = $this->services->map(function ($service) { - if (data_get($service, 'environment.project.uuid')) { - $service->hrefLink = route('project.service.configuration', [ - 'project_uuid' => data_get($service, 'environment.project.uuid'), - 'environment_name' => data_get($service, 'environment.name'), - 'service_uuid' => data_get($service, 'uuid'), - ]); - $service->status = $service->status(); - } + $service->hrefLink = route('project.service.configuration', [ + 'project_uuid' => $this->project->uuid, + 'service_uuid' => $service->uuid, + 'environment_name' => $this->environment->name, + ]); return $service; }); diff --git a/app/Models/Application.php b/app/Models/Application.php index 7fc114094..bfb2a1041 100644 --- a/app/Models/Application.php +++ b/app/Models/Application.php @@ -115,6 +115,12 @@ class Application extends BaseModel protected static function booted() { + static::addGlobalScope('withRelations', function ($builder) { + $builder->withCount([ + 'additional_servers', + 'additional_networks', + ]); + }); static::saving(function ($application) { $payload = []; if ($application->isDirty('fqdn')) { @@ -551,20 +557,21 @@ class Application extends BaseModel { return Attribute::make( get: function () { - if ($this->additional_servers->count() === 0) { - return $this->destination->server->isFunctional(); - } else { - $additional_servers_status = $this->additional_servers->pluck('pivot.status'); - $main_server_status = $this->destination->server->isFunctional(); - foreach ($additional_servers_status as $status) { - $server_status = str($status)->before(':')->value(); - if ($server_status !== 'running') { - return false; - } - } - - return $main_server_status; + if (! $this->relationLoaded('additional_servers') || $this->additional_servers->count() === 0) { + return $this->destination?->server?->isFunctional() ?? false; } + + $additional_servers_status = $this->additional_servers->pluck('pivot.status'); + $main_server_status = $this->destination?->server?->isFunctional() ?? false; + + foreach ($additional_servers_status as $status) { + $server_status = str($status)->before(':')->value(); + if ($server_status !== 'running') { + return false; + } + } + + return $main_server_status; } ); }