CaiWuXiTong/modules/EcommerceFinance/Services/UpstreamStoredConfiguration.php

77 lines
2.4 KiB
PHP

<?php
namespace Modules\EcommerceFinance\Services;
use App\Models\Settings\DatabaseConnection;
use Illuminate\Support\Facades\Schema;
/**
* 从系统数据库读取经 Laravel APP_KEY 加密保存的上游连接配置。
*
* 本地、开发和测试环境保持可用;生产环境必须通过私有环境变量显式开启。
*/
class UpstreamStoredConfiguration
{
public const SYSTEM_COMPANY_ID = 0;
/** @var array<string, DatabaseConnection|null> */
private array $connections = [];
public function editable(): bool
{
return app()->environment(['local', 'development', 'testing'])
|| (bool) config('upstreams.stored_configuration.enabled', false);
}
public function find(string $source): ?DatabaseConnection
{
if (! $this->editable()) {
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.host' => $connection->host,
'connection.port' => $connection->port,
'connection.database' => $connection->database_name,
'connection.username' => $connection->username,
'connection.password' => $connection->password,
'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,
};
}
}