Add configuration classes for database and Redis setup

This commit is contained in:
netkas 2025-05-29 15:55:43 -04:00
parent 13c0fa51ef
commit d28d4d06f2
Signed by: netkas
GPG key ID: 4D8629441B76E4CC
7 changed files with 341 additions and 0 deletions

8
.idea/php.xml generated
View file

@ -10,6 +10,14 @@
<option name="highlightLevel" value="WARNING" />
<option name="transferred" value="true" />
</component>
<component name="PhpIncludePathManager">
<include_path>
<path value="/var/ncc/packages/net.nosial.configlib=1.2.0" />
<path value="/var/ncc/packages/net.nosial.loglib2=1.0.3" />
<path value="/var/ncc/packages/net.nosial.optslib=1.1.3" />
</include_path>
</component>
<component name="PhpProjectSharedConfiguration" php_language_level="8.3" />
<component name="PhpStanOptionsConfiguration">
<option name="transferred" value="true" />
</component>

View file

@ -38,6 +38,23 @@
"DEBUG": "1"
}
}
],
"dependencies": [
{
"name": "net.nosial.configlib",
"version": "latest",
"source": "nosial/configlib=latest@github"
},
{
"name": "net.nosial.loglib2",
"version": "latest",
"source": "nosial/loglib2=latest@github"
},
{
"name": "net.nosial.optslib",
"version": "latest",
"source": "nosial/optslib=latest@github"
}
]
},
"execution_policies": [

View file

@ -0,0 +1,77 @@
<?php
namespace FederationServer\Classes;
use FederationServer\Classes\Configuration\DatabaseConfiguration;
use FederationServer\Classes\Configuration\RedisConfiguration;
class Configuration
{
private static ?\ConfigLib\Configuration $configuration = null;
private static ?DatabaseConfiguration $databaseConfiguration = null;
private static ?RedisConfiguration $redisConfiguration = null;
public static function initialize(): void
{
self::$configuration = new \ConfigLib\Configuration('federation_server');
self::$configuration->setDefault('database.host', '127.0.0.1');
self::$configuration->setDefault('database.port', 3306);
self::$configuration->setDefault('database.username', 'root');
self::$configuration->setDefault('database.password', 'root');
self::$configuration->setDefault('database.name', 'federation');
self::$configuration->setDefault('database.charset', 'utf8mb4');
self::$configuration->setDefault('database.collation', 'utf8mb4_unicode_ci');
self::$configuration->setDefault('redis.enabled', true);
self::$configuration->setDefault('redis.host', '127.0.1');
self::$configuration->setDefault('redis.port', 6379);
self::$configuration->setDefault('redis.password', null);
self::$configuration->setDefault('redis.database', 0);
self::$configuration->save();
self::$databaseConfiguration = new DatabaseConfiguration(self::$configuration->get('database'));
self::$redisConfiguration = new RedisConfiguration(self::$configuration->get('redis'));
}
public static function getConfiguration(): array
{
if(self::$configuration === null)
{
self::initialize();
}
return self::$configuration->getConfiguration();
}
public static function getConfigurationLib(): \ConfigLib\Configuration
{
if(self::$configuration === null)
{
self::initialize();
}
return self::$configuration;
}
public static function getDatabaseConfiguration(): DatabaseConfiguration
{
if(self::$databaseConfiguration === null)
{
self::initialize();
}
return self::$databaseConfiguration;
}
public static function getRedisConfiguration(): RedisConfiguration
{
if(self::$redisConfiguration === null)
{
self::initialize();
}
return self::$redisConfiguration;
}
}

View file

@ -0,0 +1,118 @@
<?php
namespace FederationServer\Classes\Configuration;
/**
* Class DatabaseConfiguration
*
* Handles the configuration for database connection.
*/
class DatabaseConfiguration
{
private string $host;
private int $port;
private string $username;
private string $password;
private string $name;
private string $charset;
private string $collation;
/**
* DatabaseConfiguration constructor.
*
* @param array $configuration Array with database configuration values.
*/
public function __construct(array $configuration)
{
$this->host = $configuration['host'] ?? '127.0.0.1';
$this->port = $configuration['port'] ?? 3306;
$this->username = $configuration['username'] ?? 'root';
$this->password = $configuration['password'] ?? 'root';
$this->name = $configuration['name'] ?? 'federation';
$this->charset = $configuration['charset'] ?? 'utf8mb4';
$this->collation = $configuration['collation'] ?? 'utf8mb4_unicode_ci';
}
/**
* Get the database host.
*
* @return string
*/
public function getHost(): string
{
return $this->host;
}
/**
* Get the database port.
*
* @return int
*/
public function getPort(): int
{
return $this->port;
}
/**
* Get the database username.
*
* @return string
*/
public function getUsername(): string
{
return $this->username;
}
/**
* Get the database password.
*
* @return string
*/
public function getPassword(): string
{
return $this->password;
}
/**
* Get the database name.
*
* @return string
*/
public function getName(): string
{
return $this->name;
}
/**
* Get the database charset.
*
* @return string
*/
public function getCharset(): string
{
return $this->charset;
}
/**
* Get the database collation.
*
* @return string
*/
public function getCollation(): string
{
return $this->collation;
}
/**
* Get the Data Source Name (DSN) for the database connection.
*
* @return string
*/
public function getDsn(): string
{
return sprintf('mysql:host=%s;port=%d;dbname=%s;charset=%s',
$this->host, $this->port, $this->name, $this->charset
);
}
}

View file

@ -0,0 +1,76 @@
<?php
namespace FederationServer\Classes\Configuration;
class RedisConfiguration
{
private bool $enabled;
private string $host;
private int $port;
private ?string $password;
private int $database;
/**
* RedisConfiguration constructor.
*
* @param array $configuration Array with Redis configuration values.
*/
public function __construct(array $configuration)
{
$this->enabled = $configuration['enabled'] ?? true;
$this->host = $configuration['host'] ?? '127.0.0.1';
$this->port = $configuration['port'] ?? 6379;
$this->password = $configuration['password'] ?? null;
$this->database = $configuration['database'] ?? 0;
}
/**
* Check if Redis is enabled.
*
* @return bool
*/
public function isEnabled(): bool
{
return $this->enabled;
}
/**
* Get the Redis host.
*
* @return string
*/
public function getHost(): string
{
return $this->host;
}
/**
* Get the Redis port.
*
* @return int
*/
public function getPort(): int
{
return $this->port;
}
/**
* Get the Redis password.
*
* @return string|null
*/
public function getPassword(): ?string
{
return $this->password;
}
/**
* Get the Redis database index.
*
* @return int
*/
public function getDatabase(): int
{
return $this->database;
}
}

View file

@ -0,0 +1,37 @@
<?php
namespace FederationServer\Classes;
use PDO;
use PDOException;
class DatabaseConnection
{
private static ?PDO $pdo = null;
/**
* Get the PDO connection instance. If it does not exist, create it using the configuration.
*
* @return PDO
* @throws PDOException
*/
public static function getConnection(): PDO
{
// If the connection is not already established, create a new PDO instance.
if (self::$pdo === null)
{
self::$pdo = new PDO(
Configuration::getDatabaseConfiguration()->getDsn(),
Configuration::getDatabaseConfiguration()->getUsername(),
Configuration::getDatabaseConfiguration()->getPassword(),
[
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES ' . Configuration::getDatabaseConfiguration()->getCharset() . ' COLLATE ' . Configuration::getDatabaseConfiguration()->getCollation(),
]
);
}
return self::$pdo;
}
}

View file

@ -0,0 +1,8 @@
<?php
namespace FederationServer;
class FederationServer
{
}