feat: developer view for env variables
This commit is contained in:
parent
e4a51cc116
commit
f6737f21dd
@ -5,21 +5,84 @@ namespace App\Http\Livewire\Project\Shared\EnvironmentVariable;
|
|||||||
use App\Models\EnvironmentVariable;
|
use App\Models\EnvironmentVariable;
|
||||||
use Livewire\Component;
|
use Livewire\Component;
|
||||||
use Visus\Cuid2\Cuid2;
|
use Visus\Cuid2\Cuid2;
|
||||||
|
use Str;
|
||||||
|
|
||||||
class All extends Component
|
class All extends Component
|
||||||
{
|
{
|
||||||
public $resource;
|
public $resource;
|
||||||
|
public bool $showPreview = false;
|
||||||
public string|null $modalId = null;
|
public string|null $modalId = null;
|
||||||
|
public ?string $variables = null;
|
||||||
|
public ?string $variablesPreview = null;
|
||||||
|
public string $view = 'normal';
|
||||||
protected $listeners = ['refreshEnvs', 'submit'];
|
protected $listeners = ['refreshEnvs', 'submit'];
|
||||||
|
|
||||||
public function mount()
|
public function mount()
|
||||||
{
|
{
|
||||||
$this->modalId = new Cuid2(7);
|
$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()
|
public function refreshEnvs()
|
||||||
{
|
{
|
||||||
$this->resource->refresh();
|
$this->resource->refresh();
|
||||||
|
$this->getDevView();
|
||||||
}
|
}
|
||||||
|
|
||||||
public function submit($data)
|
public function submit($data)
|
||||||
@ -43,7 +106,7 @@ class All extends Component
|
|||||||
$environment->standalone_postgresql_id = $this->resource->id;
|
$environment->standalone_postgresql_id = $this->resource->id;
|
||||||
}
|
}
|
||||||
$environment->save();
|
$environment->save();
|
||||||
$this->resource->refresh();
|
$this->refreshEnvs();
|
||||||
$this->emit('success', 'Environment variable added successfully.');
|
$this->emit('success', 'Environment variable added successfully.');
|
||||||
} catch (\Exception $e) {
|
} catch (\Exception $e) {
|
||||||
return general_error_handler(err: $e, that: $this);
|
return general_error_handler(err: $e, that: $this);
|
||||||
|
@ -15,7 +15,7 @@ class IsBoardingFlow
|
|||||||
*/
|
*/
|
||||||
public function handle(Request $request, Closure $next): Response
|
public function handle(Request $request, Closure $next): Response
|
||||||
{
|
{
|
||||||
ray()->showQueries()->color('orange');
|
// ray()->showQueries()->color('orange');
|
||||||
if (showBoarding() && !in_array($request->path(), allowedPathsForBoardingAccounts())) {
|
if (showBoarding() && !in_array($request->path(), allowedPathsForBoardingAccounts())) {
|
||||||
return redirect('boarding');
|
return redirect('boarding');
|
||||||
}
|
}
|
||||||
|
@ -105,7 +105,7 @@ class Application extends BaseModel
|
|||||||
|
|
||||||
public function environment_variables(): HasMany
|
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
|
public function runtime_environment_variables(): HasMany
|
||||||
@ -127,7 +127,7 @@ class Application extends BaseModel
|
|||||||
|
|
||||||
public function environment_variables_preview(): HasMany
|
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
|
public function runtime_environment_variables_preview(): HasMany
|
||||||
|
@ -20,6 +20,8 @@ class EnvironmentVariable extends Model
|
|||||||
{
|
{
|
||||||
static::created(function ($environment_variable) {
|
static::created(function ($environment_variable) {
|
||||||
if ($environment_variable->application_id && !$environment_variable->is_preview) {
|
if ($environment_variable->application_id && !$environment_variable->is_preview) {
|
||||||
|
$found = ModelsEnvironmentVariable::where('key', $environment_variable->key)->where('application_id', $environment_variable->application_id)->where('is_preview',true)->first();
|
||||||
|
if (!$found) {
|
||||||
ModelsEnvironmentVariable::create([
|
ModelsEnvironmentVariable::create([
|
||||||
'key' => $environment_variable->key,
|
'key' => $environment_variable->key,
|
||||||
'value' => $environment_variable->value,
|
'value' => $environment_variable->value,
|
||||||
@ -28,6 +30,7 @@ class EnvironmentVariable extends Model
|
|||||||
'is_preview' => true,
|
'is_preview' => true,
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -296,3 +296,25 @@ function setNotificationChannels($notifiable, $event)
|
|||||||
}
|
}
|
||||||
return $channels;
|
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;
|
||||||
|
}
|
||||||
|
@ -4,16 +4,19 @@
|
|||||||
<h2>Environment Variables</h2>
|
<h2>Environment Variables</h2>
|
||||||
<x-forms.button class="btn" onclick="newVariable.showModal()">+ Add</x-forms.button>
|
<x-forms.button class="btn" onclick="newVariable.showModal()">+ Add</x-forms.button>
|
||||||
<livewire:project.shared.environment-variable.add />
|
<livewire:project.shared.environment-variable.add />
|
||||||
|
<x-forms.button
|
||||||
|
wire:click='switch'>{{ $view === 'normal' ? 'Developer view' : 'Normal view' }}</x-forms.button>
|
||||||
</div>
|
</div>
|
||||||
<div>Environment (secrets) variables for this resource.</div>
|
<div>Environment variables (secrets) for this resource.</div>
|
||||||
</div>
|
</div>
|
||||||
|
@if ($view === 'normal')
|
||||||
@forelse ($resource->environment_variables as $env)
|
@forelse ($resource->environment_variables as $env)
|
||||||
<livewire:project.shared.environment-variable.show wire:key="environment-{{ $env->id }}"
|
<livewire:project.shared.environment-variable.show wire:key="environment-{{ $env->id }}"
|
||||||
:env="$env" />
|
:env="$env" />
|
||||||
@empty
|
@empty
|
||||||
<div class="text-neutral-500">No environment variables found.</div>
|
<div class="text-neutral-500">No environment variables found.</div>
|
||||||
@endforelse
|
@endforelse
|
||||||
@if ($resource->type() === 'application' && $resource->environment_variables_preview->count() > 0)
|
@if ($resource->type() === 'application' && $resource->environment_variables_preview->count() > 0 && $showPreview)
|
||||||
<div>
|
<div>
|
||||||
<h3>Preview Deployments</h3>
|
<h3>Preview Deployments</h3>
|
||||||
<div>Environment (secrets) variables for Preview Deployments.</div>
|
<div>Environment (secrets) variables for Preview Deployments.</div>
|
||||||
@ -23,4 +26,18 @@
|
|||||||
:env="$env" />
|
:env="$env" />
|
||||||
@endforeach
|
@endforeach
|
||||||
@endif
|
@endif
|
||||||
|
@else
|
||||||
|
<form wire:submit.prevent='saveVariables(false)' class="flex flex-col gap-2">
|
||||||
|
<x-forms.textarea rows=5 class="whitespace-pre-wrap" label="Environment Variables"
|
||||||
|
id="variables"></x-forms.textarea>
|
||||||
|
<x-forms.button type="submit" class="btn btn-primary">Save</x-forms.button>
|
||||||
|
</form>
|
||||||
|
@if ($showPreview)
|
||||||
|
<form wire:submit.prevent='saveVariables(true)' class="flex flex-col gap-2">
|
||||||
|
<x-forms.textarea rows=5 class="whitespace-pre-wrap" label="Preview Environment Variables"
|
||||||
|
id="variablesPreview"></x-forms.textarea>
|
||||||
|
<x-forms.button type="submit" class="btn btn-primary">Save</x-forms.button>
|
||||||
|
</form>
|
||||||
|
@endif
|
||||||
|
@endif
|
||||||
</div>
|
</div>
|
||||||
|
Loading…
x
Reference in New Issue
Block a user