organisation_id === (int) $organisation->id && (int) $service->server_id === (int) $server->id, 404); abort_unless(in_array($service->type, [ServiceType::POSTGRES, ServiceType::VALKEY], true), 404); return inertia('services/updates/Create', [ 'server' => $server, 'service' => $service, 'backupAvailable' => (bool) ($service->config['backup_enabled'] ?? false), ]); } public function store( StoreServiceUpdateRequest $request, Organisation $organisation, Server $server, Service $service, CreateStatefulServiceUpdateOperation $createStatefulServiceUpdateOperation, ): RedirectResponse { abort_unless((int) $server->organisation_id === (int) $organisation->id && (int) $service->server_id === (int) $server->id, 404); abort_unless($request->string('confirmation')->toString() === $service->name, 422); $createStatefulServiceUpdateOperation->execute( service: $service, imageDigest: $request->string('image_digest')->toString(), backupRequested: $request->boolean('backup_requested'), ); return redirect()->route('servers.show', [ 'organisation' => $organisation->id, 'server' => $server->id, ]); } public function resolve( Organisation $organisation, Server $server, Service $service, ResolveServiceImageDigest $resolveServiceImageDigest, ): RedirectResponse { abort_unless((int) $server->organisation_id === (int) $organisation->id && (int) $service->server_id === (int) $server->id, 404); abort_unless(in_array($service->type, [ServiceType::POSTGRES, ServiceType::VALKEY], true), 404); $service->update([ 'available_image_digest' => $resolveServiceImageDigest->execute($service), ]); return redirect() ->route('service-updates.create', [ 'organisation' => $organisation->id, 'server' => $server->id, 'service' => $service->id, ]) ->with('success', 'Latest image digest resolved.'); } }