mirror of
https://github.com/tiennm99/coolify.git
synced 2026-04-17 19:21:36 +00:00
fix: prevent duplicate services on image change and enable real-time UI refresh
This commit addresses two critical issues with Docker Compose service management: ## Issue 1: Duplicate Services Created on Image Change When changing the image in a docker-compose file, the parser was creating new ServiceApplication/ServiceDatabase records instead of updating existing ones. **Root Cause**: The parsers used `firstOrCreate()` with `['name', 'image', 'service_id']`, meaning any image change would create a new record. **Fix**: Remove `image` from `firstOrCreate()` queries and update it separately after finding or creating the service record. **Changes**: - `bootstrap/helpers/parsers.php` (serviceParser v3): Fixed in presave loop (lines 1188-1203) and main parsing loop (lines 1519-1539) - `bootstrap/helpers/shared.php` (parseDockerComposeFile v2): Fixed null check logic (lines 1308-1348) ## Issue 2: UI Not Refreshing After Changes When compose file or domain was modified, the Configuration component wasn't receiving events to refresh its data, requiring manual page refresh to see updates. **Root Cause**: The Configuration component wasn't listening for refresh events dispatched by child components (StackForm, EditDomain). **Fix**: Add event listeners and dispatchers to enable real-time UI updates. **Changes**: - `app/Livewire/Project/Service/Configuration.php`: Added listeners for `refreshServices` and `refresh` events (lines 36-37) - `app/Livewire/Project/Service/EditDomain.php`: Added `refreshServices` dispatch (line 76) - Note: `app/Livewire/Project/Service/StackForm.php` already had the dispatch ## Tests Added - `tests/Unit/ServiceParserImageUpdateTest.php`: 4 tests verifying no duplicates created - `tests/Unit/ServiceConfigurationRefreshTest.php`: 4 tests verifying event dispatching All 8 new tests pass, and all existing unit tests continue to pass. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
44
tests/Unit/ServiceConfigurationRefreshTest.php
Normal file
44
tests/Unit/ServiceConfigurationRefreshTest.php
Normal file
@@ -0,0 +1,44 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* Unit tests to verify that Configuration component properly listens to
|
||||
* refresh events dispatched when compose file or domain changes.
|
||||
*
|
||||
* These tests verify the fix for the issue where changes to compose or domain
|
||||
* were not visible until manual page refresh.
|
||||
*/
|
||||
it('ensures Configuration component listens to refreshServices event', function () {
|
||||
$configurationFile = file_get_contents(__DIR__.'/../../app/Livewire/Project/Service/Configuration.php');
|
||||
|
||||
// Check that the Configuration component has refreshServices listener
|
||||
expect($configurationFile)
|
||||
->toContain("'refreshServices' => 'refreshServices'")
|
||||
->toContain("'refresh' => 'refreshServices'");
|
||||
});
|
||||
|
||||
it('ensures Configuration component has refreshServices method', function () {
|
||||
$configurationFile = file_get_contents(__DIR__.'/../../app/Livewire/Project/Service/Configuration.php');
|
||||
|
||||
// Check that the refreshServices method exists
|
||||
expect($configurationFile)
|
||||
->toContain('public function refreshServices()')
|
||||
->toContain('$this->service->refresh()')
|
||||
->toContain('$this->applications = $this->service->applications->sort()')
|
||||
->toContain('$this->databases = $this->service->databases->sort()');
|
||||
});
|
||||
|
||||
it('ensures StackForm dispatches refreshServices event on submit', function () {
|
||||
$stackFormFile = file_get_contents(__DIR__.'/../../app/Livewire/Project/Service/StackForm.php');
|
||||
|
||||
// Check that StackForm dispatches refreshServices event
|
||||
expect($stackFormFile)
|
||||
->toContain("->dispatch('refreshServices')");
|
||||
});
|
||||
|
||||
it('ensures EditDomain dispatches refreshServices event on submit', function () {
|
||||
$editDomainFile = file_get_contents(__DIR__.'/../../app/Livewire/Project/Service/EditDomain.php');
|
||||
|
||||
// Check that EditDomain dispatches refreshServices event
|
||||
expect($editDomainFile)
|
||||
->toContain("->dispatch('refreshServices')");
|
||||
});
|
||||
Reference in New Issue
Block a user