*/ private array $connections = []; public function editable(): bool { return app()->environment(['local', 'development', 'testing']) || (bool) config('upstreams.stored_configuration.enabled', false); } public function enabled(): bool { return (bool) config('upstreams.stored_configuration.enabled', false); } public function find(string $source): ?DatabaseConnection { if (! $this->enabled()) { return null; } if (array_key_exists($source, $this->connections)) { return $this->connections[$source]; } if (! Schema::hasTable('system_database_connections')) { return $this->connections[$source] = null; } $this->connections[$source] = DatabaseConnection::query() ->where('company_id', self::SYSTEM_COMPANY_ID) ->where('source_key', $source) ->first(); return $this->connections[$source]; } public function forget(string $source): void { unset($this->connections[$source]); } public function value(string $source, string $path, mixed $default = null): mixed { $connection = $this->find($source); if (! $connection) { return $default; } return match (trim($path, '.')) { 'enabled' => $connection->enabled, 'allowed_scopes' => $connection->allowed_scopes ?? [], 'connection' => $this->connection($connection, $default), 'connection.host' => $connection->host, 'connection.port' => $connection->port, 'connection.database' => $connection->database_name, 'connection.username' => $connection->username, 'connection.password' => $this->password($connection, $default), 'connection.odbc_driver' => $connection->odbc_driver, 'connection.tds_version' => $connection->tds_version, 'connection.connect_timeout' => $connection->connect_timeout, 'connection.query_timeout' => $connection->query_timeout, default => $default, }; } private function connection(DatabaseConnection $connection, mixed $default): array { $configured = is_array($default) ? $default : []; return array_replace($configured, [ 'host' => $connection->host, 'port' => $connection->port, 'database' => $connection->database_name, 'username' => $connection->username, 'password' => $this->password($connection, $configured['password'] ?? null), 'odbc_driver' => $connection->odbc_driver, 'tds_version' => $connection->tds_version, 'connect_timeout' => $connection->connect_timeout, 'query_timeout' => $connection->query_timeout, ]); } private function password(DatabaseConnection $connection, mixed $_localPassword): mixed { return $connection->resolvedPassword(); } }