256 lines
		
	
	
		
			7.9 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			256 lines
		
	
	
		
			7.9 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
<?php
 | 
						|
 | 
						|
namespace App\Livewire\Project\New;
 | 
						|
 | 
						|
use App\Models\Project;
 | 
						|
use App\Models\Server;
 | 
						|
use Illuminate\Support\Collection;
 | 
						|
use Livewire\Component;
 | 
						|
 | 
						|
class Select extends Component
 | 
						|
{
 | 
						|
    public $current_step = 'type';
 | 
						|
 | 
						|
    public ?Server $server = null;
 | 
						|
 | 
						|
    public string $type;
 | 
						|
 | 
						|
    public string $server_id;
 | 
						|
 | 
						|
    public string $destination_uuid;
 | 
						|
 | 
						|
    public Collection|null|Server $allServers;
 | 
						|
 | 
						|
    public Collection|null|Server $servers;
 | 
						|
 | 
						|
    public ?Collection $standaloneDockers;
 | 
						|
 | 
						|
    public ?Collection $swarmDockers;
 | 
						|
 | 
						|
    public array $parameters;
 | 
						|
 | 
						|
    public Collection|array $services = [];
 | 
						|
 | 
						|
    public Collection|array $allServices = [];
 | 
						|
 | 
						|
    public bool $isDatabase = false;
 | 
						|
 | 
						|
    public bool $includeSwarm = true;
 | 
						|
 | 
						|
    public bool $loadingServices = true;
 | 
						|
 | 
						|
    public bool $loading = false;
 | 
						|
 | 
						|
    public $environments = [];
 | 
						|
 | 
						|
    public ?string $selectedEnvironment = null;
 | 
						|
 | 
						|
    public string $postgresql_type = 'postgres:16-alpine';
 | 
						|
 | 
						|
    public ?string $existingPostgresqlUrl = null;
 | 
						|
 | 
						|
    public ?string $search = null;
 | 
						|
 | 
						|
    protected $queryString = [
 | 
						|
        'server_id',
 | 
						|
        'search',
 | 
						|
    ];
 | 
						|
 | 
						|
    public function mount()
 | 
						|
    {
 | 
						|
        $this->parameters = get_route_parameters();
 | 
						|
        if (isDev()) {
 | 
						|
            $this->existingPostgresqlUrl = 'postgres://coolify:password@coolify-db:5432';
 | 
						|
        }
 | 
						|
        $projectUuid = data_get($this->parameters, 'project_uuid');
 | 
						|
        $this->environments = Project::whereUuid($projectUuid)->first()->environments;
 | 
						|
        $this->selectedEnvironment = data_get($this->parameters, 'environment_name');
 | 
						|
    }
 | 
						|
 | 
						|
    public function render()
 | 
						|
    {
 | 
						|
        return view('livewire.project.new.select');
 | 
						|
    }
 | 
						|
 | 
						|
    public function updatedSelectedEnvironment()
 | 
						|
    {
 | 
						|
        return redirect()->route('project.resource.create', [
 | 
						|
            'project_uuid' => $this->parameters['project_uuid'],
 | 
						|
            'environment_name' => $this->selectedEnvironment,
 | 
						|
        ]);
 | 
						|
    }
 | 
						|
 | 
						|
    // public function addExistingPostgresql()
 | 
						|
    // {
 | 
						|
    //     try {
 | 
						|
    //         instantCommand("psql {$this->existingPostgresqlUrl} -c 'SELECT 1'");
 | 
						|
    //         $this->dispatch('success', 'Successfully connected to the database.');
 | 
						|
    //     } catch (\Throwable $e) {
 | 
						|
    //         return handleError($e, $this);
 | 
						|
    //     }
 | 
						|
    // }
 | 
						|
 | 
						|
    public function updatedSearch()
 | 
						|
    {
 | 
						|
        $this->loadServices();
 | 
						|
    }
 | 
						|
 | 
						|
    public function loadServices(bool $force = false)
 | 
						|
    {
 | 
						|
        try {
 | 
						|
            $this->loadingServices = true;
 | 
						|
            if (count($this->allServices) > 0 && ! $force) {
 | 
						|
                if (! $this->search) {
 | 
						|
                    $this->services = $this->allServices;
 | 
						|
 | 
						|
                    return;
 | 
						|
                }
 | 
						|
                $this->services = $this->allServices->filter(function ($service, $key) {
 | 
						|
                    $tags = collect(data_get($service, 'tags', []));
 | 
						|
 | 
						|
                    return str_contains(strtolower($key), strtolower($this->search)) || $tags->contains(function ($tag) {
 | 
						|
                        return str_contains(strtolower($tag), strtolower($this->search));
 | 
						|
                    });
 | 
						|
                });
 | 
						|
            } else {
 | 
						|
                $this->search = null;
 | 
						|
                $this->allServices = get_service_templates($force);
 | 
						|
                $this->services = $this->allServices->filter(function ($service, $key) {
 | 
						|
                    return str_contains(strtolower($key), strtolower($this->search));
 | 
						|
                });
 | 
						|
            }
 | 
						|
        } catch (\Throwable $e) {
 | 
						|
            return handleError($e, $this);
 | 
						|
        } finally {
 | 
						|
            $this->loadingServices = false;
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    public function instantSave()
 | 
						|
    {
 | 
						|
        if ($this->includeSwarm) {
 | 
						|
            $this->servers = $this->allServers;
 | 
						|
        } else {
 | 
						|
            if ($this->allServers instanceof Collection) {
 | 
						|
                $this->servers = $this->allServers->where('settings.is_swarm_worker', false)->where('settings.is_swarm_manager', false)->where('settings.is_build_server', false);
 | 
						|
            } else {
 | 
						|
                $this->servers = $this->allServers;
 | 
						|
            }
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    public function setType(string $type)
 | 
						|
    {
 | 
						|
        if ($this->loading) {
 | 
						|
            return;
 | 
						|
        }
 | 
						|
        $this->loading = true;
 | 
						|
        $this->type = $type;
 | 
						|
        switch ($type) {
 | 
						|
            case 'postgresql':
 | 
						|
            case 'mysql':
 | 
						|
            case 'mariadb':
 | 
						|
            case 'redis':
 | 
						|
            case 'keydb':
 | 
						|
            case 'dragonfly':
 | 
						|
            case 'clickhouse':
 | 
						|
            case 'mongodb':
 | 
						|
                $this->isDatabase = true;
 | 
						|
                $this->includeSwarm = false;
 | 
						|
                if ($this->allServers instanceof Collection) {
 | 
						|
                    $this->servers = $this->allServers->where('settings.is_swarm_worker', false)->where('settings.is_swarm_manager', false)->where('settings.is_build_server', false);
 | 
						|
                } else {
 | 
						|
                    $this->servers = $this->allServers;
 | 
						|
                }
 | 
						|
                break;
 | 
						|
        }
 | 
						|
        if (str($type)->startsWith('one-click-service') || str($type)->startsWith('docker-compose-empty')) {
 | 
						|
            $this->isDatabase = true;
 | 
						|
            $this->includeSwarm = false;
 | 
						|
            if ($this->allServers instanceof Collection) {
 | 
						|
                $this->servers = $this->allServers->where('settings.is_swarm_worker', false)->where('settings.is_swarm_manager', false)->where('settings.is_build_server', false);
 | 
						|
            } else {
 | 
						|
                $this->servers = $this->allServers;
 | 
						|
            }
 | 
						|
        }
 | 
						|
        if ($type === 'existing-postgresql') {
 | 
						|
            $this->current_step = $type;
 | 
						|
 | 
						|
            return;
 | 
						|
        }
 | 
						|
        if (count($this->servers) === 1) {
 | 
						|
            $server = $this->servers->first();
 | 
						|
            if ($server instanceof Server) {
 | 
						|
                $this->setServer($server);
 | 
						|
            }
 | 
						|
        }
 | 
						|
        if (! is_null($this->server)) {
 | 
						|
            $foundServer = $this->servers->where('id', $this->server->id)->first();
 | 
						|
            if ($foundServer) {
 | 
						|
                return $this->setServer($foundServer);
 | 
						|
            }
 | 
						|
        }
 | 
						|
        $this->current_step = 'servers';
 | 
						|
    }
 | 
						|
 | 
						|
    public function setServer(Server $server)
 | 
						|
    {
 | 
						|
        $this->server_id = $server->id;
 | 
						|
        $this->server = $server;
 | 
						|
        $this->standaloneDockers = $server->standaloneDockers;
 | 
						|
        $this->swarmDockers = $server->swarmDockers;
 | 
						|
        $count = count($this->standaloneDockers) + count($this->swarmDockers);
 | 
						|
        if ($count === 1) {
 | 
						|
            $docker = $this->standaloneDockers->first() ?? $this->swarmDockers->first();
 | 
						|
            if ($docker) {
 | 
						|
                $this->setDestination($docker->uuid);
 | 
						|
 | 
						|
                return $this->whatToDoNext();
 | 
						|
            }
 | 
						|
        }
 | 
						|
        $this->current_step = 'destinations';
 | 
						|
    }
 | 
						|
 | 
						|
    public function setDestination(string $destination_uuid)
 | 
						|
    {
 | 
						|
        $this->destination_uuid = $destination_uuid;
 | 
						|
 | 
						|
        return $this->whatToDoNext();
 | 
						|
    }
 | 
						|
 | 
						|
    public function setPostgresqlType(string $type)
 | 
						|
    {
 | 
						|
        $this->postgresql_type = $type;
 | 
						|
 | 
						|
        return redirect()->route('project.resource.create', [
 | 
						|
            'project_uuid' => $this->parameters['project_uuid'],
 | 
						|
            'environment_name' => $this->parameters['environment_name'],
 | 
						|
            'type' => $this->type,
 | 
						|
            'destination' => $this->destination_uuid,
 | 
						|
            'server_id' => $this->server_id,
 | 
						|
            'database_image' => $this->postgresql_type,
 | 
						|
        ]);
 | 
						|
    }
 | 
						|
 | 
						|
    public function whatToDoNext()
 | 
						|
    {
 | 
						|
        if ($this->type === 'postgresql') {
 | 
						|
            $this->current_step = 'select-postgresql-type';
 | 
						|
        } else {
 | 
						|
            return redirect()->route('project.resource.create', [
 | 
						|
                'project_uuid' => $this->parameters['project_uuid'],
 | 
						|
                'environment_name' => $this->parameters['environment_name'],
 | 
						|
                'type' => $this->type,
 | 
						|
                'destination' => $this->destination_uuid,
 | 
						|
                'server_id' => $this->server_id,
 | 
						|
            ]);
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    public function loadServers()
 | 
						|
    {
 | 
						|
        $this->servers = Server::isUsable()->get();
 | 
						|
        $this->allServers = $this->servers;
 | 
						|
    }
 | 
						|
}
 |