diff --git a/app/Http/Livewire/Project/Shared/EnvironmentVariable/All.php b/app/Http/Livewire/Project/Shared/EnvironmentVariable/All.php index 70bfd42a1..899060085 100644 --- a/app/Http/Livewire/Project/Shared/EnvironmentVariable/All.php +++ b/app/Http/Livewire/Project/Shared/EnvironmentVariable/All.php @@ -5,21 +5,84 @@ namespace App\Http\Livewire\Project\Shared\EnvironmentVariable; use App\Models\EnvironmentVariable; use Livewire\Component; use Visus\Cuid2\Cuid2; +use Str; class All extends Component { public $resource; + public bool $showPreview = false; public string|null $modalId = null; + public ?string $variables = null; + public ?string $variablesPreview = null; + public string $view = 'normal'; protected $listeners = ['refreshEnvs', 'submit']; public function mount() { + $resourceClass = get_class($this->resource); + $resourceWithPreviews = ['App\Models\Application']; + $simpleDockerfile = !is_null(data_get($this->resource, 'dockerfile')); + if (Str::of($resourceClass)->contains($resourceWithPreviews) && !$simpleDockerfile) { + $this->showPreview = true; + } $this->modalId = new Cuid2(7); + $this->getDevView(); + } + public function getDevView() + { + $this->variables = $this->resource->environment_variables->map(function ($item) { + return "$item->key=$item->value"; + })->sort()->join(' +'); + if ($this->showPreview) { + $this->variablesPreview = $this->resource->environment_variables_preview->map(function ($item) { + return "$item->key=$item->value"; + })->sort()->join(' +'); + } + } + public function switch() + { + $this->view = $this->view === 'normal' ? 'dev' : 'normal'; + } + public function saveVariables($isPreview) + { + if ($isPreview) { + $variables = parseEnvFormatToArray($this->variablesPreview); + $existingVariables = $this->resource->environment_variables_preview(); + $this->resource->environment_variables_preview()->delete(); + } else { + $variables = parseEnvFormatToArray($this->variables); + $existingVariables = $this->resource->environment_variables(); + $this->resource->environment_variables()->delete(); + } + foreach ($variables as $key => $variable) { + $found = $existingVariables->where('key', $key)->first(); + if ($found) { + $found->value = $variable; + $found->save(); + continue; + } else { + $environment = new EnvironmentVariable(); + $environment->key = $key; + $environment->value = $variable; + $environment->is_build_time = false; + $environment->is_preview = $isPreview ? true : false; + if ($this->resource->type() === 'application') { + $environment->application_id = $this->resource->id; + } + if ($this->resource->type() === 'standalone-postgresql') { + $environment->standalone_postgresql_id = $this->resource->id; + } + $environment->save(); + } + } + $this->refreshEnvs(); } - public function refreshEnvs() { $this->resource->refresh(); + $this->getDevView(); } public function submit($data) @@ -43,7 +106,7 @@ class All extends Component $environment->standalone_postgresql_id = $this->resource->id; } $environment->save(); - $this->resource->refresh(); + $this->refreshEnvs(); $this->emit('success', 'Environment variable added successfully.'); } catch (\Exception $e) { return general_error_handler(err: $e, that: $this); diff --git a/app/Http/Middleware/IsBoardingFlow.php b/app/Http/Middleware/IsBoardingFlow.php index e0542a57a..5858fe191 100644 --- a/app/Http/Middleware/IsBoardingFlow.php +++ b/app/Http/Middleware/IsBoardingFlow.php @@ -15,7 +15,7 @@ class IsBoardingFlow */ public function handle(Request $request, Closure $next): Response { - ray()->showQueries()->color('orange'); + // ray()->showQueries()->color('orange'); if (showBoarding() && !in_array($request->path(), allowedPathsForBoardingAccounts())) { return redirect('boarding'); } diff --git a/app/Models/Application.php b/app/Models/Application.php index 6b730edee..72d2be60f 100644 --- a/app/Models/Application.php +++ b/app/Models/Application.php @@ -105,7 +105,7 @@ class Application extends BaseModel public function environment_variables(): HasMany { - return $this->hasMany(EnvironmentVariable::class)->where('is_preview', false); + return $this->hasMany(EnvironmentVariable::class)->where('is_preview', false)->orderBy('key', 'asc'); } public function runtime_environment_variables(): HasMany @@ -127,7 +127,7 @@ class Application extends BaseModel public function environment_variables_preview(): HasMany { - return $this->hasMany(EnvironmentVariable::class)->where('is_preview', true); + return $this->hasMany(EnvironmentVariable::class)->where('is_preview', true)->orderBy('key', 'asc'); } public function runtime_environment_variables_preview(): HasMany diff --git a/app/Models/EnvironmentVariable.php b/app/Models/EnvironmentVariable.php index 62a08c87f..3f348c42e 100644 --- a/app/Models/EnvironmentVariable.php +++ b/app/Models/EnvironmentVariable.php @@ -20,13 +20,16 @@ class EnvironmentVariable extends Model { static::created(function ($environment_variable) { if ($environment_variable->application_id && !$environment_variable->is_preview) { - ModelsEnvironmentVariable::create([ - 'key' => $environment_variable->key, - 'value' => $environment_variable->value, - 'is_build_time' => $environment_variable->is_build_time, - 'application_id' => $environment_variable->application_id, - 'is_preview' => true, - ]); + $found = ModelsEnvironmentVariable::where('key', $environment_variable->key)->where('application_id', $environment_variable->application_id)->where('is_preview',true)->first(); + if (!$found) { + ModelsEnvironmentVariable::create([ + 'key' => $environment_variable->key, + 'value' => $environment_variable->value, + 'is_build_time' => $environment_variable->is_build_time, + 'application_id' => $environment_variable->application_id, + 'is_preview' => true, + ]); + } } }); } diff --git a/bootstrap/helpers/shared.php b/bootstrap/helpers/shared.php index 15f8fc0db..161675301 100644 --- a/bootstrap/helpers/shared.php +++ b/bootstrap/helpers/shared.php @@ -296,3 +296,25 @@ function setNotificationChannels($notifiable, $event) } return $channels; } +function parseEnvFormatToArray($env_file_contents) { + $env_array = array(); + $lines = explode("\n", $env_file_contents); + foreach ($lines as $line) { + if ($line === '' || substr($line, 0, 1) === '#') { + continue; + } + $equals_pos = strpos($line, '='); + if ($equals_pos !== false) { + $key = substr($line, 0, $equals_pos); + $value = substr($line, $equals_pos + 1); + if (substr($value, 0, 1) === '"' && substr($value, -1) === '"') { + $value = substr($value, 1, -1); + } + elseif (substr($value, 0, 1) === "'" && substr($value, -1) === "'") { + $value = substr($value, 1, -1); + } + $env_array[$key] = $value; + } + } + return $env_array; +} diff --git a/resources/views/livewire/project/shared/environment-variable/all.blade.php b/resources/views/livewire/project/shared/environment-variable/all.blade.php index b7b6b8340..9ffb6b217 100644 --- a/resources/views/livewire/project/shared/environment-variable/all.blade.php +++ b/resources/views/livewire/project/shared/environment-variable/all.blade.php @@ -4,23 +4,40 @@