From 85a1483356c3fa193504999df40f5fa3d8507414 Mon Sep 17 00:00:00 2001 From: Aditya Tripathi Date: Sun, 2 Nov 2025 22:27:24 +0000 Subject: [PATCH 1/4] feat: developer view for shared env variables --- .../SharedVariables/Environment/Show.php | 117 +++++++++++++++++- app/Livewire/SharedVariables/Project/Show.php | 117 +++++++++++++++++- app/Livewire/SharedVariables/Team/Index.php | 117 +++++++++++++++++- .../environment/show.blade.php | 32 +++-- .../shared-variables/project/show.blade.php | 32 +++-- .../shared-variables/team/index.blade.php | 32 +++-- 6 files changed, 420 insertions(+), 27 deletions(-) diff --git a/app/Livewire/SharedVariables/Environment/Show.php b/app/Livewire/SharedVariables/Environment/Show.php index bee757a64..6c8342c41 100644 --- a/app/Livewire/SharedVariables/Environment/Show.php +++ b/app/Livewire/SharedVariables/Environment/Show.php @@ -19,7 +19,11 @@ class Show extends Component public array $parameters; - protected $listeners = ['refreshEnvs' => '$refresh', 'saveKey', 'environmentVariableDeleted' => '$refresh']; + public string $view = 'normal'; + + public ?string $variables = null; + + protected $listeners = ['refreshEnvs' => 'refreshEnvs', 'saveKey', 'environmentVariableDeleted' => 'refreshEnvs']; public function saveKey($data) { @@ -39,6 +43,7 @@ public function saveKey($data) 'team_id' => currentTeam()->id, ]); $this->environment->refresh(); + $this->getDevView(); } catch (\Throwable $e) { return handleError($e, $this); } @@ -49,6 +54,116 @@ public function mount() $this->parameters = get_route_parameters(); $this->project = Project::ownedByCurrentTeam()->where('uuid', request()->route('project_uuid'))->firstOrFail(); $this->environment = $this->project->environments()->where('uuid', request()->route('environment_uuid'))->firstOrFail(); + $this->getDevView(); + } + + public function switch() + { + $this->view = $this->view === 'normal' ? 'dev' : 'normal'; + $this->getDevView(); + } + + public function getDevView() + { + $this->variables = $this->formatEnvironmentVariables($this->environment->environment_variables->sortBy('key')); + } + + private function formatEnvironmentVariables($variables) + { + return $variables->map(function ($item) { + if ($item->is_shown_once) { + return "$item->key=(Locked Secret, delete and add again to change)"; + } + if ($item->is_multiline) { + return "$item->key=(Multiline environment variable, edit in normal view)"; + } + + return "$item->key=$item->value"; + })->join("\n"); + } + + public function submit() + { + try { + $this->authorize('update', $this->environment); + $this->handleBulkSubmit(); + $this->getDevView(); + } catch (\Throwable $e) { + return handleError($e, $this); + } finally { + $this->refreshEnvs(); + } + } + + private function handleBulkSubmit() + { + $variables = parseEnvFormatToArray($this->variables); + $changesMade = false; + + // Delete removed variables + $deletedCount = $this->deleteRemovedVariables($variables); + if ($deletedCount > 0) { + $changesMade = true; + } + + // Update or create variables + $updatedCount = $this->updateOrCreateVariables($variables); + if ($updatedCount > 0) { + $changesMade = true; + } + + if ($changesMade) { + $this->dispatch('success', 'Environment variables updated.'); + } + } + + private function deleteRemovedVariables($variables) + { + $variablesToDelete = $this->environment->environment_variables()->whereNotIn('key', array_keys($variables))->get(); + + if ($variablesToDelete->isEmpty()) { + return 0; + } + + $this->environment->environment_variables()->whereNotIn('key', array_keys($variables))->delete(); + + return $variablesToDelete->count(); + } + + private function updateOrCreateVariables($variables) + { + $count = 0; + foreach ($variables as $key => $value) { + $found = $this->environment->environment_variables()->where('key', $key)->first(); + + if ($found) { + if (! $found->is_shown_once && ! $found->is_multiline) { + if ($found->value !== $value) { + $found->value = $value; + $found->save(); + $count++; + } + } + } else { + $this->environment->environment_variables()->create([ + 'key' => $key, + 'value' => $value, + 'is_multiline' => false, + 'is_literal' => false, + 'type' => 'environment', + 'team_id' => currentTeam()->id, + ]); + $count++; + } + } + + return $count; + } + + public function refreshEnvs() + { + $this->environment->refresh(); + $this->getDevView(); } public function render() diff --git a/app/Livewire/SharedVariables/Project/Show.php b/app/Livewire/SharedVariables/Project/Show.php index 712a9960b..a3abe5df2 100644 --- a/app/Livewire/SharedVariables/Project/Show.php +++ b/app/Livewire/SharedVariables/Project/Show.php @@ -12,7 +12,11 @@ class Show extends Component public Project $project; - protected $listeners = ['refreshEnvs' => '$refresh', 'saveKey' => 'saveKey', 'environmentVariableDeleted' => '$refresh']; + public string $view = 'normal'; + + public ?string $variables = null; + + protected $listeners = ['refreshEnvs' => 'refreshEnvs', 'saveKey' => 'saveKey', 'environmentVariableDeleted' => 'refreshEnvs']; public function saveKey($data) { @@ -32,6 +36,7 @@ public function saveKey($data) 'team_id' => currentTeam()->id, ]); $this->project->refresh(); + $this->getDevView(); } catch (\Throwable $e) { return handleError($e, $this); } @@ -46,6 +51,116 @@ public function mount() return redirect()->route('dashboard'); } $this->project = $project; + $this->getDevView(); + } + + public function switch() + { + $this->view = $this->view === 'normal' ? 'dev' : 'normal'; + $this->getDevView(); + } + + public function getDevView() + { + $this->variables = $this->formatEnvironmentVariables($this->project->environment_variables->sortBy('key')); + } + + private function formatEnvironmentVariables($variables) + { + return $variables->map(function ($item) { + if ($item->is_shown_once) { + return "$item->key=(Locked Secret, delete and add again to change)"; + } + if ($item->is_multiline) { + return "$item->key=(Multiline environment variable, edit in normal view)"; + } + + return "$item->key=$item->value"; + })->join("\n"); + } + + public function submit() + { + try { + $this->authorize('update', $this->project); + $this->handleBulkSubmit(); + $this->getDevView(); + } catch (\Throwable $e) { + return handleError($e, $this); + } finally { + $this->refreshEnvs(); + } + } + + private function handleBulkSubmit() + { + $variables = parseEnvFormatToArray($this->variables); + $changesMade = false; + + // Delete removed variables + $deletedCount = $this->deleteRemovedVariables($variables); + if ($deletedCount > 0) { + $changesMade = true; + } + + // Update or create variables + $updatedCount = $this->updateOrCreateVariables($variables); + if ($updatedCount > 0) { + $changesMade = true; + } + + if ($changesMade) { + $this->dispatch('success', 'Environment variables updated.'); + } + } + + private function deleteRemovedVariables($variables) + { + $variablesToDelete = $this->project->environment_variables()->whereNotIn('key', array_keys($variables))->get(); + + if ($variablesToDelete->isEmpty()) { + return 0; + } + + $this->project->environment_variables()->whereNotIn('key', array_keys($variables))->delete(); + + return $variablesToDelete->count(); + } + + private function updateOrCreateVariables($variables) + { + $count = 0; + foreach ($variables as $key => $value) { + $found = $this->project->environment_variables()->where('key', $key)->first(); + + if ($found) { + if (! $found->is_shown_once && ! $found->is_multiline) { + if ($found->value !== $value) { + $found->value = $value; + $found->save(); + $count++; + } + } + } else { + $this->project->environment_variables()->create([ + 'key' => $key, + 'value' => $value, + 'is_multiline' => false, + 'is_literal' => false, + 'type' => 'project', + 'team_id' => currentTeam()->id, + ]); + $count++; + } + } + + return $count; + } + + public function refreshEnvs() + { + $this->project->refresh(); + $this->getDevView(); } public function render() diff --git a/app/Livewire/SharedVariables/Team/Index.php b/app/Livewire/SharedVariables/Team/Index.php index 82473528c..6311d9a87 100644 --- a/app/Livewire/SharedVariables/Team/Index.php +++ b/app/Livewire/SharedVariables/Team/Index.php @@ -12,7 +12,11 @@ class Index extends Component public Team $team; - protected $listeners = ['refreshEnvs' => '$refresh', 'saveKey' => 'saveKey', 'environmentVariableDeleted' => '$refresh']; + public string $view = 'normal'; + + public ?string $variables = null; + + protected $listeners = ['refreshEnvs' => 'refreshEnvs', 'saveKey' => 'saveKey', 'environmentVariableDeleted' => 'refreshEnvs']; public function saveKey($data) { @@ -32,6 +36,7 @@ public function saveKey($data) 'team_id' => currentTeam()->id, ]); $this->team->refresh(); + $this->getDevView(); } catch (\Throwable $e) { return handleError($e, $this); } @@ -40,6 +45,116 @@ public function saveKey($data) public function mount() { $this->team = currentTeam(); + $this->getDevView(); + } + + public function switch() + { + $this->view = $this->view === 'normal' ? 'dev' : 'normal'; + $this->getDevView(); + } + + public function getDevView() + { + $this->variables = $this->formatEnvironmentVariables($this->team->environment_variables->sortBy('key')); + } + + private function formatEnvironmentVariables($variables) + { + return $variables->map(function ($item) { + if ($item->is_shown_once) { + return "$item->key=(Locked Secret, delete and add again to change)"; + } + if ($item->is_multiline) { + return "$item->key=(Multiline environment variable, edit in normal view)"; + } + + return "$item->key=$item->value"; + })->join("\n"); + } + + public function submit() + { + try { + $this->authorize('update', $this->team); + $this->handleBulkSubmit(); + $this->getDevView(); + } catch (\Throwable $e) { + return handleError($e, $this); + } finally { + $this->refreshEnvs(); + } + } + + private function handleBulkSubmit() + { + $variables = parseEnvFormatToArray($this->variables); + $changesMade = false; + + // Delete removed variables + $deletedCount = $this->deleteRemovedVariables($variables); + if ($deletedCount > 0) { + $changesMade = true; + } + + // Update or create variables + $updatedCount = $this->updateOrCreateVariables($variables); + if ($updatedCount > 0) { + $changesMade = true; + } + + if ($changesMade) { + $this->dispatch('success', 'Environment variables updated.'); + } + } + + private function deleteRemovedVariables($variables) + { + $variablesToDelete = $this->team->environment_variables()->whereNotIn('key', array_keys($variables))->get(); + + if ($variablesToDelete->isEmpty()) { + return 0; + } + + $this->team->environment_variables()->whereNotIn('key', array_keys($variables))->delete(); + + return $variablesToDelete->count(); + } + + private function updateOrCreateVariables($variables) + { + $count = 0; + foreach ($variables as $key => $value) { + $found = $this->team->environment_variables()->where('key', $key)->first(); + + if ($found) { + if (! $found->is_shown_once && ! $found->is_multiline) { + if ($found->value !== $value) { + $found->value = $value; + $found->save(); + $count++; + } + } + } else { + $this->team->environment_variables()->create([ + 'key' => $key, + 'value' => $value, + 'is_multiline' => false, + 'is_literal' => false, + 'type' => 'team', + 'team_id' => currentTeam()->id, + ]); + $count++; + } + } + + return $count; + } + + public function refreshEnvs() + { + $this->team->refresh(); + $this->getDevView(); } public function render() diff --git a/resources/views/livewire/shared-variables/environment/show.blade.php b/resources/views/livewire/shared-variables/environment/show.blade.php index 0799a7422..41c824904 100644 --- a/resources/views/livewire/shared-variables/environment/show.blade.php +++ b/resources/views/livewire/shared-variables/environment/show.blade.php @@ -9,17 +9,33 @@ @endcan + @can('update', $environment) + {{ $view === 'normal' ? 'Developer view' : 'Normal view' }} + @endcan
You can use these variables anywhere with @{{ environment.VARIABLENAME }}
-
- @forelse ($environment->environment_variables->sort()->sortBy('key') as $env) - - @empty -
No environment variables found.
- @endforelse -
+ @if ($view === 'normal') +
+ @forelse ($environment->environment_variables->sort()->sortBy('key') as $env) + + @empty +
No environment variables found.
+ @endforelse +
+ @else +
+ @can('update', $environment) + + Save All Environment Variables + @else + + @endcan +
+ @endif diff --git a/resources/views/livewire/shared-variables/project/show.blade.php b/resources/views/livewire/shared-variables/project/show.blade.php index 7db3b61a2..cb99824a0 100644 --- a/resources/views/livewire/shared-variables/project/show.blade.php +++ b/resources/views/livewire/shared-variables/project/show.blade.php @@ -9,6 +9,9 @@ @endcan + @can('update', $project) + {{ $view === 'normal' ? 'Developer view' : 'Normal view' }} + @endcan
You can use these variables anywhere with
@@ -16,12 +19,25 @@
-
- @forelse ($project->environment_variables->sort()->sortBy('key') as $env) - - @empty -
No environment variables found.
- @endforelse -
+ @if ($view === 'normal') +
+ @forelse ($project->environment_variables->sort()->sortBy('key') as $env) + + @empty +
No environment variables found.
+ @endforelse +
+ @else +
+ @can('update', $project) + + Save All Environment Variables + @else + + @endcan +
+ @endif diff --git a/resources/views/livewire/shared-variables/team/index.blade.php b/resources/views/livewire/shared-variables/team/index.blade.php index 1fbdfc2c5..b043bcc0e 100644 --- a/resources/views/livewire/shared-variables/team/index.blade.php +++ b/resources/views/livewire/shared-variables/team/index.blade.php @@ -9,18 +9,34 @@ @endcan + @can('update', $team) + {{ $view === 'normal' ? 'Developer view' : 'Normal view' }} + @endcan
You can use these variables anywhere with @{{ team.VARIABLENAME }}
-
- @forelse ($team->environment_variables->sort()->sortBy('key') as $env) - - @empty -
No environment variables found.
- @endforelse -
+ @if ($view === 'normal') +
+ @forelse ($team->environment_variables->sort()->sortBy('key') as $env) + + @empty +
No environment variables found.
+ @endforelse +
+ @else +
+ @can('update', $team) + + Save All Environment Variables + @else + + @endcan +
+ @endif From 2e6b8a69f89af419a385a840707d2cb2bde23321 Mon Sep 17 00:00:00 2001 From: Aditya Tripathi Date: Sun, 2 Nov 2025 22:30:59 +0000 Subject: [PATCH 2/4] feat: make text area larger since its full page --- .../livewire/shared-variables/environment/show.blade.php | 4 ++-- .../views/livewire/shared-variables/project/show.blade.php | 4 ++-- .../views/livewire/shared-variables/team/index.blade.php | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/resources/views/livewire/shared-variables/environment/show.blade.php b/resources/views/livewire/shared-variables/environment/show.blade.php index 41c824904..02cc07b28 100644 --- a/resources/views/livewire/shared-variables/environment/show.blade.php +++ b/resources/views/livewire/shared-variables/environment/show.blade.php @@ -29,11 +29,11 @@ class="dark:text-warning text-coollabs">@{{ environment.VARIABLENAME }} @can('update', $environment) - Save All Environment Variables @else - @endcan diff --git a/resources/views/livewire/shared-variables/project/show.blade.php b/resources/views/livewire/shared-variables/project/show.blade.php index cb99824a0..99d95059a 100644 --- a/resources/views/livewire/shared-variables/project/show.blade.php +++ b/resources/views/livewire/shared-variables/project/show.blade.php @@ -31,11 +31,11 @@ @else
@can('update', $project) - Save All Environment Variables @else - @endcan
diff --git a/resources/views/livewire/shared-variables/team/index.blade.php b/resources/views/livewire/shared-variables/team/index.blade.php index b043bcc0e..44399dcda 100644 --- a/resources/views/livewire/shared-variables/team/index.blade.php +++ b/resources/views/livewire/shared-variables/team/index.blade.php @@ -30,11 +30,11 @@ class="dark:text-warning text-coollabs">@{{ team.VARIABLENAME }} @can('update', $team) - Save All Environment Variables @else - @endcan From 28cb561c042864840ce9333550a4ee46931fc713 Mon Sep 17 00:00:00 2001 From: Aditya Tripathi Date: Mon, 3 Nov 2025 20:54:34 +0000 Subject: [PATCH 3/4] feat: add database transactions and component-level authorization to shared variables --- .../SharedVariables/Environment/Show.php | 32 +++++++++++-------- app/Livewire/SharedVariables/Project/Show.php | 32 +++++++++++-------- app/Livewire/SharedVariables/Team/Index.php | 32 +++++++++++-------- .../environment/show.blade.php | 15 +++------ .../shared-variables/project/show.blade.php | 15 +++------ .../shared-variables/team/index.blade.php | 15 +++------ 6 files changed, 66 insertions(+), 75 deletions(-) diff --git a/app/Livewire/SharedVariables/Environment/Show.php b/app/Livewire/SharedVariables/Environment/Show.php index 6c8342c41..6b1d35d14 100644 --- a/app/Livewire/SharedVariables/Environment/Show.php +++ b/app/Livewire/SharedVariables/Environment/Show.php @@ -5,6 +5,7 @@ use App\Models\Application; use App\Models\Project; use Illuminate\Foundation\Auth\Access\AuthorizesRequests; +use Illuminate\Support\Facades\DB; use Livewire\Component; class Show extends Component @@ -98,23 +99,26 @@ public function submit() private function handleBulkSubmit() { $variables = parseEnvFormatToArray($this->variables); - $changesMade = false; - // Delete removed variables - $deletedCount = $this->deleteRemovedVariables($variables); - if ($deletedCount > 0) { - $changesMade = true; - } + DB::transaction(function () use ($variables) { + $changesMade = false; - // Update or create variables - $updatedCount = $this->updateOrCreateVariables($variables); - if ($updatedCount > 0) { - $changesMade = true; - } + // Delete removed variables + $deletedCount = $this->deleteRemovedVariables($variables); + if ($deletedCount > 0) { + $changesMade = true; + } - if ($changesMade) { - $this->dispatch('success', 'Environment variables updated.'); - } + // Update or create variables + $updatedCount = $this->updateOrCreateVariables($variables); + if ($updatedCount > 0) { + $changesMade = true; + } + + if ($changesMade) { + $this->dispatch('success', 'Environment variables updated.'); + } + }); } private function deleteRemovedVariables($variables) diff --git a/app/Livewire/SharedVariables/Project/Show.php b/app/Livewire/SharedVariables/Project/Show.php index a3abe5df2..93ead33a3 100644 --- a/app/Livewire/SharedVariables/Project/Show.php +++ b/app/Livewire/SharedVariables/Project/Show.php @@ -4,6 +4,7 @@ use App\Models\Project; use Illuminate\Foundation\Auth\Access\AuthorizesRequests; +use Illuminate\Support\Facades\DB; use Livewire\Component; class Show extends Component @@ -95,23 +96,26 @@ public function submit() private function handleBulkSubmit() { $variables = parseEnvFormatToArray($this->variables); - $changesMade = false; - // Delete removed variables - $deletedCount = $this->deleteRemovedVariables($variables); - if ($deletedCount > 0) { - $changesMade = true; - } + DB::transaction(function () use ($variables) { + $changesMade = false; - // Update or create variables - $updatedCount = $this->updateOrCreateVariables($variables); - if ($updatedCount > 0) { - $changesMade = true; - } + // Delete removed variables + $deletedCount = $this->deleteRemovedVariables($variables); + if ($deletedCount > 0) { + $changesMade = true; + } - if ($changesMade) { - $this->dispatch('success', 'Environment variables updated.'); - } + // Update or create variables + $updatedCount = $this->updateOrCreateVariables($variables); + if ($updatedCount > 0) { + $changesMade = true; + } + + if ($changesMade) { + $this->dispatch('success', 'Environment variables updated.'); + } + }); } private function deleteRemovedVariables($variables) diff --git a/app/Livewire/SharedVariables/Team/Index.php b/app/Livewire/SharedVariables/Team/Index.php index 6311d9a87..bd23bca82 100644 --- a/app/Livewire/SharedVariables/Team/Index.php +++ b/app/Livewire/SharedVariables/Team/Index.php @@ -4,6 +4,7 @@ use App\Models\Team; use Illuminate\Foundation\Auth\Access\AuthorizesRequests; +use Illuminate\Support\Facades\DB; use Livewire\Component; class Index extends Component @@ -89,23 +90,26 @@ public function submit() private function handleBulkSubmit() { $variables = parseEnvFormatToArray($this->variables); - $changesMade = false; - // Delete removed variables - $deletedCount = $this->deleteRemovedVariables($variables); - if ($deletedCount > 0) { - $changesMade = true; - } + DB::transaction(function () use ($variables) { + $changesMade = false; - // Update or create variables - $updatedCount = $this->updateOrCreateVariables($variables); - if ($updatedCount > 0) { - $changesMade = true; - } + // Delete removed variables + $deletedCount = $this->deleteRemovedVariables($variables); + if ($deletedCount > 0) { + $changesMade = true; + } - if ($changesMade) { - $this->dispatch('success', 'Environment variables updated.'); - } + // Update or create variables + $updatedCount = $this->updateOrCreateVariables($variables); + if ($updatedCount > 0) { + $changesMade = true; + } + + if ($changesMade) { + $this->dispatch('success', 'Environment variables updated.'); + } + }); } private function deleteRemovedVariables($variables) diff --git a/resources/views/livewire/shared-variables/environment/show.blade.php b/resources/views/livewire/shared-variables/environment/show.blade.php index 02cc07b28..fde2d0ae8 100644 --- a/resources/views/livewire/shared-variables/environment/show.blade.php +++ b/resources/views/livewire/shared-variables/environment/show.blade.php @@ -9,9 +9,7 @@ @endcan - @can('update', $environment) - {{ $view === 'normal' ? 'Developer view' : 'Normal view' }} - @endcan + {{ $view === 'normal' ? 'Developer view' : 'Normal view' }}
You can use these variables anywhere with @{{ environment.VARIABLENAME }}@{{ environment.VARIABLENAME }} @else
- @can('update', $environment) - - Save All Environment Variables - @else - - @endcan + + Save All Environment Variables
@endif
diff --git a/resources/views/livewire/shared-variables/project/show.blade.php b/resources/views/livewire/shared-variables/project/show.blade.php index 99d95059a..f89ad9ce7 100644 --- a/resources/views/livewire/shared-variables/project/show.blade.php +++ b/resources/views/livewire/shared-variables/project/show.blade.php @@ -9,9 +9,7 @@ @endcan - @can('update', $project) - {{ $view === 'normal' ? 'Developer view' : 'Normal view' }} - @endcan + {{ $view === 'normal' ? 'Developer view' : 'Normal view' }}
You can use these variables anywhere with
@@ -30,14 +28,9 @@
@else
- @can('update', $project) - - Save All Environment Variables - @else - - @endcan + + Save All Environment Variables
@endif diff --git a/resources/views/livewire/shared-variables/team/index.blade.php b/resources/views/livewire/shared-variables/team/index.blade.php index 44399dcda..fcfca35fb 100644 --- a/resources/views/livewire/shared-variables/team/index.blade.php +++ b/resources/views/livewire/shared-variables/team/index.blade.php @@ -9,9 +9,7 @@ @endcan - @can('update', $team) - {{ $view === 'normal' ? 'Developer view' : 'Normal view' }} - @endcan + {{ $view === 'normal' ? 'Developer view' : 'Normal view' }}
You can use these variables anywhere with @{{ team.VARIABLENAME }} @{{ team.VARIABLENAME }} @else
- @can('update', $team) - - Save All Environment Variables - @else - - @endcan + + Save All Environment Variables
@endif
From ac14a327233a0b519ccbfb7bf8a21f19097f05ea Mon Sep 17 00:00:00 2001 From: Andras Bacsai <5845193+andrasbacsai@users.noreply.github.com> Date: Wed, 26 Nov 2025 09:37:18 +0100 Subject: [PATCH 4/4] fix: dispatch success message after transaction commits Move the success dispatch outside the DB transaction closure to ensure it only fires after the transaction has successfully committed. Use reference variable to track changes across the closure boundary. --- app/Livewire/SharedVariables/Environment/Show.php | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/app/Livewire/SharedVariables/Environment/Show.php b/app/Livewire/SharedVariables/Environment/Show.php index 6b1d35d14..328986cea 100644 --- a/app/Livewire/SharedVariables/Environment/Show.php +++ b/app/Livewire/SharedVariables/Environment/Show.php @@ -99,10 +99,9 @@ public function submit() private function handleBulkSubmit() { $variables = parseEnvFormatToArray($this->variables); + $changesMade = false; - DB::transaction(function () use ($variables) { - $changesMade = false; - + DB::transaction(function () use ($variables, &$changesMade) { // Delete removed variables $deletedCount = $this->deleteRemovedVariables($variables); if ($deletedCount > 0) { @@ -114,11 +113,12 @@ private function handleBulkSubmit() if ($updatedCount > 0) { $changesMade = true; } - - if ($changesMade) { - $this->dispatch('success', 'Environment variables updated.'); - } }); + + // Only dispatch success after transaction has committed + if ($changesMade) { + $this->dispatch('success', 'Environment variables updated.'); + } } private function deleteRemovedVariables($variables)