mirror of
https://github.com/tiennm99/coolify.git
synced 2026-04-23 02:19:43 +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:
@@ -1181,23 +1181,26 @@ function serviceParser(Service $resource): Collection
|
||||
$image = data_get_str($service, 'image');
|
||||
$isDatabase = isDatabaseImage($image, $service);
|
||||
if ($isDatabase) {
|
||||
$applicationFound = ServiceApplication::where('name', $serviceName)->where('image', $image)->where('service_id', $resource->id)->first();
|
||||
$applicationFound = ServiceApplication::where('name', $serviceName)->where('service_id', $resource->id)->first();
|
||||
if ($applicationFound) {
|
||||
$savedService = $applicationFound;
|
||||
} else {
|
||||
$savedService = ServiceDatabase::firstOrCreate([
|
||||
'name' => $serviceName,
|
||||
'image' => $image,
|
||||
'service_id' => $resource->id,
|
||||
]);
|
||||
}
|
||||
} else {
|
||||
$savedService = ServiceApplication::firstOrCreate([
|
||||
'name' => $serviceName,
|
||||
'image' => $image,
|
||||
'service_id' => $resource->id,
|
||||
]);
|
||||
}
|
||||
// Update image if it changed
|
||||
if ($savedService->image !== $image) {
|
||||
$savedService->image = $image;
|
||||
$savedService->save();
|
||||
}
|
||||
}
|
||||
foreach ($services as $serviceName => $service) {
|
||||
$predefinedPort = null;
|
||||
@@ -1514,20 +1517,18 @@ function serviceParser(Service $resource): Collection
|
||||
}
|
||||
|
||||
if ($isDatabase) {
|
||||
$applicationFound = ServiceApplication::where('name', $serviceName)->where('image', $image)->where('service_id', $resource->id)->first();
|
||||
$applicationFound = ServiceApplication::where('name', $serviceName)->where('service_id', $resource->id)->first();
|
||||
if ($applicationFound) {
|
||||
$savedService = $applicationFound;
|
||||
} else {
|
||||
$savedService = ServiceDatabase::firstOrCreate([
|
||||
'name' => $serviceName,
|
||||
'image' => $image,
|
||||
'service_id' => $resource->id,
|
||||
]);
|
||||
}
|
||||
} else {
|
||||
$savedService = ServiceApplication::firstOrCreate([
|
||||
'name' => $serviceName,
|
||||
'image' => $image,
|
||||
'service_id' => $resource->id,
|
||||
]);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user