fix(api): prevent partial server updates on invalid disk schedule
This commit is contained in:
parent
b3f3ddf0ce
commit
09d8ba0d89
2 changed files with 37 additions and 9 deletions
|
|
@ -705,9 +705,7 @@ public function update_server(Request $request)
|
||||||
$validProxyTypes = collect(ProxyTypes::cases())->map(function ($proxyType) {
|
$validProxyTypes = collect(ProxyTypes::cases())->map(function ($proxyType) {
|
||||||
return str($proxyType->value)->lower();
|
return str($proxyType->value)->lower();
|
||||||
});
|
});
|
||||||
if ($validProxyTypes->contains(str($request->proxy_type)->lower())) {
|
if (! $validProxyTypes->contains(str($request->proxy_type)->lower())) {
|
||||||
$server->changeProxy($request->proxy_type, async: true);
|
|
||||||
} else {
|
|
||||||
return response()->json(['message' => 'Invalid proxy type.'], 422);
|
return response()->json(['message' => 'Invalid proxy type.'], 422);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -719,12 +717,6 @@ public function update_server(Request $request)
|
||||||
}
|
}
|
||||||
$updateFields['private_key_id'] = $privateKey->id;
|
$updateFields['private_key_id'] = $privateKey->id;
|
||||||
}
|
}
|
||||||
$server->update($updateFields);
|
|
||||||
if ($request->is_build_server) {
|
|
||||||
$server->settings()->update([
|
|
||||||
'is_build_server' => $request->is_build_server,
|
|
||||||
]);
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($request->has('server_disk_usage_check_frequency') && ! validate_cron_expression($request->server_disk_usage_check_frequency)) {
|
if ($request->has('server_disk_usage_check_frequency') && ! validate_cron_expression($request->server_disk_usage_check_frequency)) {
|
||||||
return response()->json([
|
return response()->json([
|
||||||
|
|
@ -733,11 +725,22 @@ public function update_server(Request $request)
|
||||||
], 422);
|
], 422);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$server->update($updateFields);
|
||||||
|
if ($request->is_build_server) {
|
||||||
|
$server->settings()->update([
|
||||||
|
'is_build_server' => $request->is_build_server,
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
$advancedSettings = $request->only(['concurrent_builds', 'dynamic_timeout', 'deployment_queue_limit', 'server_disk_usage_notification_threshold', 'server_disk_usage_check_frequency', 'connection_timeout']);
|
$advancedSettings = $request->only(['concurrent_builds', 'dynamic_timeout', 'deployment_queue_limit', 'server_disk_usage_notification_threshold', 'server_disk_usage_check_frequency', 'connection_timeout']);
|
||||||
if (! empty($advancedSettings)) {
|
if (! empty($advancedSettings)) {
|
||||||
$server->settings()->update(array_filter($advancedSettings, fn ($value) => ! is_null($value)));
|
$server->settings()->update(array_filter($advancedSettings, fn ($value) => ! is_null($value)));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ($request->proxy_type) {
|
||||||
|
$server->changeProxy($request->proxy_type, async: true);
|
||||||
|
}
|
||||||
|
|
||||||
if ($request->instant_validate) {
|
if ($request->instant_validate) {
|
||||||
ValidateServer::dispatch($server);
|
ValidateServer::dispatch($server);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -92,3 +92,28 @@ function patchServerUpdatePrivateKeyApi(object $test, Server $server, string $be
|
||||||
expect($server->name)->toBe('Renamed Server')
|
expect($server->name)->toBe('Renamed Server')
|
||||||
->and($server->private_key_id)->toBe($this->oldPrivateKey->id);
|
->and($server->private_key_id)->toBe($this->oldPrivateKey->id);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('rejects an invalid disk usage check frequency without partially updating the server', function () {
|
||||||
|
$this->server->proxy->set('type', 'TRAEFIK');
|
||||||
|
$this->server->save();
|
||||||
|
$this->server->settings()->update(['is_build_server' => false]);
|
||||||
|
|
||||||
|
patchServerUpdatePrivateKeyApi($this, $this->server, $this->bearerToken, [
|
||||||
|
'name' => 'Renamed Server',
|
||||||
|
'is_build_server' => true,
|
||||||
|
'proxy_type' => 'none',
|
||||||
|
'server_disk_usage_check_frequency' => 'not a valid schedule',
|
||||||
|
])->assertUnprocessable()
|
||||||
|
->assertJson([
|
||||||
|
'message' => 'Validation failed.',
|
||||||
|
'errors' => [
|
||||||
|
'server_disk_usage_check_frequency' => ['Invalid Cron / Human expression for Disk Usage Check Frequency.'],
|
||||||
|
],
|
||||||
|
]);
|
||||||
|
|
||||||
|
$server = $this->server->fresh();
|
||||||
|
|
||||||
|
expect($server->name)->not->toBe('Renamed Server')
|
||||||
|
->and($server->settings->is_build_server)->toBeFalse()
|
||||||
|
->and($server->proxy->get('type'))->toBe('TRAEFIK');
|
||||||
|
});
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue