fix(ServiceParser): prioritize manually migrated services over image detection for database identification
This commit is contained in:
parent
4055c1790b
commit
033433f553
2 changed files with 123 additions and 44 deletions
|
|
@ -1433,22 +1433,40 @@ function serviceParser(Service $resource): Collection
|
||||||
}
|
}
|
||||||
|
|
||||||
$image = data_get_str($service, 'image');
|
$image = data_get_str($service, 'image');
|
||||||
$isDatabase = isDatabaseImage($image, $service);
|
|
||||||
if ($isDatabase) {
|
// Check for manually migrated services first (respects user's conversion choice)
|
||||||
$applicationFound = ServiceApplication::where('name', $serviceName)->where('service_id', $resource->id)->first();
|
$migratedApp = ServiceApplication::where('name', $serviceName)
|
||||||
if ($applicationFound) {
|
->where('service_id', $resource->id)
|
||||||
$savedService = $applicationFound;
|
->where('is_migrated', true)
|
||||||
|
->first();
|
||||||
|
$migratedDb = ServiceDatabase::where('name', $serviceName)
|
||||||
|
->where('service_id', $resource->id)
|
||||||
|
->where('is_migrated', true)
|
||||||
|
->first();
|
||||||
|
|
||||||
|
if ($migratedApp || $migratedDb) {
|
||||||
|
// Use the migrated service type, ignoring image detection
|
||||||
|
$isDatabase = (bool) $migratedDb;
|
||||||
|
$savedService = $migratedApp ?: $migratedDb;
|
||||||
|
} else {
|
||||||
|
// Use image detection for non-migrated services
|
||||||
|
$isDatabase = isDatabaseImage($image, $service);
|
||||||
|
if ($isDatabase) {
|
||||||
|
$applicationFound = ServiceApplication::where('name', $serviceName)->where('service_id', $resource->id)->first();
|
||||||
|
if ($applicationFound) {
|
||||||
|
$savedService = $applicationFound;
|
||||||
|
} else {
|
||||||
|
$savedService = ServiceDatabase::firstOrCreate([
|
||||||
|
'name' => $serviceName,
|
||||||
|
'service_id' => $resource->id,
|
||||||
|
]);
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
$savedService = ServiceDatabase::firstOrCreate([
|
$savedService = ServiceApplication::firstOrCreate([
|
||||||
'name' => $serviceName,
|
'name' => $serviceName,
|
||||||
'service_id' => $resource->id,
|
'service_id' => $resource->id,
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
$savedService = ServiceApplication::firstOrCreate([
|
|
||||||
'name' => $serviceName,
|
|
||||||
'service_id' => $resource->id,
|
|
||||||
]);
|
|
||||||
}
|
}
|
||||||
// Update image if it changed
|
// Update image if it changed
|
||||||
if ($savedService->image !== $image) {
|
if ($savedService->image !== $image) {
|
||||||
|
|
@ -1463,7 +1481,24 @@ function serviceParser(Service $resource): Collection
|
||||||
$environment = collect(data_get($service, 'environment', []));
|
$environment = collect(data_get($service, 'environment', []));
|
||||||
$buildArgs = collect(data_get($service, 'build.args', []));
|
$buildArgs = collect(data_get($service, 'build.args', []));
|
||||||
$environment = $environment->merge($buildArgs);
|
$environment = $environment->merge($buildArgs);
|
||||||
$isDatabase = isDatabaseImage($image, $service);
|
|
||||||
|
// Check for manually migrated services first (respects user's conversion choice)
|
||||||
|
$migratedApp = ServiceApplication::where('name', $serviceName)
|
||||||
|
->where('service_id', $resource->id)
|
||||||
|
->where('is_migrated', true)
|
||||||
|
->first();
|
||||||
|
$migratedDb = ServiceDatabase::where('name', $serviceName)
|
||||||
|
->where('service_id', $resource->id)
|
||||||
|
->where('is_migrated', true)
|
||||||
|
->first();
|
||||||
|
|
||||||
|
if ($migratedApp || $migratedDb) {
|
||||||
|
// Use the migrated service type, ignoring image detection
|
||||||
|
$isDatabase = (bool) $migratedDb;
|
||||||
|
} else {
|
||||||
|
// Use image detection for non-migrated services
|
||||||
|
$isDatabase = isDatabaseImage($image, $service);
|
||||||
|
}
|
||||||
|
|
||||||
$containerName = "$serviceName-{$resource->uuid}";
|
$containerName = "$serviceName-{$resource->uuid}";
|
||||||
|
|
||||||
|
|
@ -1483,7 +1518,11 @@ function serviceParser(Service $resource): Collection
|
||||||
if ($serviceName === 'plausible') {
|
if ($serviceName === 'plausible') {
|
||||||
$predefinedPort = '8000';
|
$predefinedPort = '8000';
|
||||||
}
|
}
|
||||||
if ($isDatabase) {
|
|
||||||
|
if ($migratedApp || $migratedDb) {
|
||||||
|
// Use the already determined migrated service
|
||||||
|
$savedService = $migratedApp ?: $migratedDb;
|
||||||
|
} elseif ($isDatabase) {
|
||||||
$applicationFound = ServiceApplication::where('name', $serviceName)->where('service_id', $resource->id)->first();
|
$applicationFound = ServiceApplication::where('name', $serviceName)->where('service_id', $resource->id)->first();
|
||||||
if ($applicationFound) {
|
if ($applicationFound) {
|
||||||
$savedService = $applicationFound;
|
$savedService = $applicationFound;
|
||||||
|
|
@ -1756,7 +1795,25 @@ function serviceParser(Service $resource): Collection
|
||||||
$environment = convertToKeyValueCollection($environment);
|
$environment = convertToKeyValueCollection($environment);
|
||||||
$coolifyEnvironments = collect([]);
|
$coolifyEnvironments = collect([]);
|
||||||
|
|
||||||
$isDatabase = isDatabaseImage($image, $service);
|
// Check for manually migrated services first (respects user's conversion choice)
|
||||||
|
$migratedApp = ServiceApplication::where('name', $serviceName)
|
||||||
|
->where('service_id', $resource->id)
|
||||||
|
->where('is_migrated', true)
|
||||||
|
->first();
|
||||||
|
$migratedDb = ServiceDatabase::where('name', $serviceName)
|
||||||
|
->where('service_id', $resource->id)
|
||||||
|
->where('is_migrated', true)
|
||||||
|
->first();
|
||||||
|
|
||||||
|
if ($migratedApp || $migratedDb) {
|
||||||
|
// Use the migrated service type, ignoring image detection
|
||||||
|
$isDatabase = (bool) $migratedDb;
|
||||||
|
$savedService = $migratedApp ?: $migratedDb;
|
||||||
|
} else {
|
||||||
|
// Use image detection for non-migrated services
|
||||||
|
$isDatabase = isDatabaseImage($image, $service);
|
||||||
|
}
|
||||||
|
|
||||||
$volumesParsed = collect([]);
|
$volumesParsed = collect([]);
|
||||||
|
|
||||||
$containerName = "$serviceName-{$resource->uuid}";
|
$containerName = "$serviceName-{$resource->uuid}";
|
||||||
|
|
@ -1778,7 +1835,10 @@ function serviceParser(Service $resource): Collection
|
||||||
$predefinedPort = '8000';
|
$predefinedPort = '8000';
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($isDatabase) {
|
if ($migratedApp || $migratedDb) {
|
||||||
|
// Use the already determined migrated service
|
||||||
|
$savedService = $migratedApp ?: $migratedDb;
|
||||||
|
} elseif ($isDatabase) {
|
||||||
$applicationFound = ServiceApplication::where('name', $serviceName)->where('service_id', $resource->id)->first();
|
$applicationFound = ServiceApplication::where('name', $serviceName)->where('service_id', $resource->id)->first();
|
||||||
if ($applicationFound) {
|
if ($applicationFound) {
|
||||||
$savedService = $applicationFound;
|
$savedService = $applicationFound;
|
||||||
|
|
|
||||||
|
|
@ -1353,52 +1353,71 @@ function parseDockerComposeFile(Service|Application $resource, bool $isNew = fal
|
||||||
|
|
||||||
// Decide if the service is a database
|
// Decide if the service is a database
|
||||||
$image = data_get_str($service, 'image');
|
$image = data_get_str($service, 'image');
|
||||||
$isDatabase = isDatabaseImage($image, $service);
|
|
||||||
data_set($service, 'is_database', $isDatabase);
|
|
||||||
|
|
||||||
// Create new serviceApplication or serviceDatabase
|
// Check for manually migrated services first (respects user's conversion choice)
|
||||||
if ($isDatabase) {
|
$migratedApp = ServiceApplication::where('name', $serviceName)
|
||||||
if ($isNew) {
|
->where('service_id', $resource->id)
|
||||||
$savedService = ServiceDatabase::create([
|
->where('is_migrated', true)
|
||||||
'name' => $serviceName,
|
->first();
|
||||||
'image' => $image,
|
$migratedDb = ServiceDatabase::where('name', $serviceName)
|
||||||
'service_id' => $resource->id,
|
->where('service_id', $resource->id)
|
||||||
]);
|
->where('is_migrated', true)
|
||||||
} else {
|
->first();
|
||||||
$savedService = ServiceDatabase::where([
|
|
||||||
'name' => $serviceName,
|
if ($migratedApp || $migratedDb) {
|
||||||
'service_id' => $resource->id,
|
// Use the migrated service type, ignoring image detection
|
||||||
])->first();
|
$isDatabase = (bool) $migratedDb;
|
||||||
if (is_null($savedService)) {
|
$savedService = $migratedApp ?: $migratedDb;
|
||||||
|
} else {
|
||||||
|
// Use image detection for non-migrated services
|
||||||
|
$isDatabase = isDatabaseImage($image, $service);
|
||||||
|
|
||||||
|
// Create new serviceApplication or serviceDatabase
|
||||||
|
if ($isDatabase) {
|
||||||
|
if ($isNew) {
|
||||||
$savedService = ServiceDatabase::create([
|
$savedService = ServiceDatabase::create([
|
||||||
'name' => $serviceName,
|
'name' => $serviceName,
|
||||||
'image' => $image,
|
'image' => $image,
|
||||||
'service_id' => $resource->id,
|
'service_id' => $resource->id,
|
||||||
]);
|
]);
|
||||||
|
} else {
|
||||||
|
$savedService = ServiceDatabase::where([
|
||||||
|
'name' => $serviceName,
|
||||||
|
'service_id' => $resource->id,
|
||||||
|
])->first();
|
||||||
|
if (is_null($savedService)) {
|
||||||
|
$savedService = ServiceDatabase::create([
|
||||||
|
'name' => $serviceName,
|
||||||
|
'image' => $image,
|
||||||
|
'service_id' => $resource->id,
|
||||||
|
]);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if ($isNew) {
|
|
||||||
$savedService = ServiceApplication::create([
|
|
||||||
'name' => $serviceName,
|
|
||||||
'image' => $image,
|
|
||||||
'service_id' => $resource->id,
|
|
||||||
]);
|
|
||||||
} else {
|
} else {
|
||||||
$savedService = ServiceApplication::where([
|
if ($isNew) {
|
||||||
'name' => $serviceName,
|
|
||||||
'service_id' => $resource->id,
|
|
||||||
])->first();
|
|
||||||
if (is_null($savedService)) {
|
|
||||||
$savedService = ServiceApplication::create([
|
$savedService = ServiceApplication::create([
|
||||||
'name' => $serviceName,
|
'name' => $serviceName,
|
||||||
'image' => $image,
|
'image' => $image,
|
||||||
'service_id' => $resource->id,
|
'service_id' => $resource->id,
|
||||||
]);
|
]);
|
||||||
|
} else {
|
||||||
|
$savedService = ServiceApplication::where([
|
||||||
|
'name' => $serviceName,
|
||||||
|
'service_id' => $resource->id,
|
||||||
|
])->first();
|
||||||
|
if (is_null($savedService)) {
|
||||||
|
$savedService = ServiceApplication::create([
|
||||||
|
'name' => $serviceName,
|
||||||
|
'image' => $image,
|
||||||
|
'service_id' => $resource->id,
|
||||||
|
]);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
data_set($service, 'is_database', $isDatabase);
|
||||||
|
|
||||||
// Check if image changed
|
// Check if image changed
|
||||||
if ($savedService->image !== $image) {
|
if ($savedService->image !== $image) {
|
||||||
$savedService->image = $image;
|
$savedService->image = $image;
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue