'nullable', 'database.description' => 'nullable', 'database.image' => 'required', 'database.exclude_from_status' => 'required|boolean', 'database.public_port' => 'nullable|integer', 'database.is_public' => 'required|boolean', 'database.is_log_drain_enabled' => 'required|boolean', ]; public function render() { return view('livewire.project.service.database'); } public function mount() { try { $this->parameters = get_route_parameters(); $this->authorize('view', $this->database); if ($this->database->is_public) { $this->db_url_public = $this->database->getServiceDatabaseUrl(); } $this->refreshFileStorages(); } catch (\Throwable $e) { return handleError($e, $this); } } public function delete($password) { try { $this->authorize('delete', $this->database); if (! data_get(InstanceSettings::get(), 'disable_two_step_confirmation')) { if (! Hash::check($password, Auth::user()->password)) { $this->addError('password', 'The provided password is incorrect.'); return; } } $this->database->delete(); $this->dispatch('success', 'Database deleted.'); return redirect()->route('project.service.configuration', $this->parameters); } catch (\Throwable $e) { return handleError($e, $this); } } public function instantSaveExclude() { try { $this->authorize('update', $this->database); $this->submit(); } catch (\Throwable $e) { return handleError($e, $this); } } public function instantSaveLogDrain() { try { $this->authorize('update', $this->database); if (! $this->database->service->destination->server->isLogDrainEnabled()) { $this->database->is_log_drain_enabled = false; $this->dispatch('error', 'Log drain is not enabled on the server. Please enable it first.'); return; } $this->submit(); $this->dispatch('success', 'You need to restart the service for the changes to take effect.'); } catch (\Throwable $e) { return handleError($e, $this); } } public function convertToApplication() { try { $this->authorize('update', $this->database); $service = $this->database->service; $serviceDatabase = $this->database; // Check if application with same name already exists if ($service->applications()->where('name', $serviceDatabase->name)->exists()) { throw new \Exception('An application with this name already exists.'); } // Create new parameters removing database_uuid $redirectParams = collect($this->parameters) ->except('database_uuid') ->all(); DB::transaction(function () use ($service, $serviceDatabase) { $service->applications()->create([ 'name' => $serviceDatabase->name, 'human_name' => $serviceDatabase->human_name, 'description' => $serviceDatabase->description, 'exclude_from_status' => $serviceDatabase->exclude_from_status, 'is_log_drain_enabled' => $serviceDatabase->is_log_drain_enabled, 'image' => $serviceDatabase->image, 'service_id' => $service->id, 'is_migrated' => true, ]); $serviceDatabase->delete(); }); return redirect()->route('project.service.configuration', $redirectParams); } catch (\Throwable $e) { return handleError($e, $this); } } public function instantSave() { try { $this->authorize('update', $this->database); if ($this->database->is_public && ! $this->database->public_port) { $this->dispatch('error', 'Public port is required.'); $this->database->is_public = false; return; } if ($this->database->is_public) { if (! str($this->database->status)->startsWith('running')) { $this->dispatch('error', 'Database must be started to be publicly accessible.'); $this->database->is_public = false; return; } StartDatabaseProxy::run($this->database); $this->db_url_public = $this->database->getServiceDatabaseUrl(); $this->dispatch('success', 'Database is now publicly accessible.'); } else { StopDatabaseProxy::run($this->database); $this->db_url_public = null; $this->dispatch('success', 'Database is no longer publicly accessible.'); } $this->submit(); } catch (\Throwable $e) { return handleError($e, $this); } } public function refreshFileStorages() { $this->fileStorages = $this->database->fileStorages()->get(); } public function submit() { try { $this->authorize('update', $this->database); $this->validate(); $this->database->save(); updateCompose($this->database); $this->dispatch('success', 'Database saved.'); } catch (\Throwable $e) { return handleError($e, $this); } finally { $this->dispatch('generateDockerCompose'); } } }