laravel-websockets/src/Apps/MysqlAppManager.php

172 lines
4.9 KiB
PHP
Raw Normal View History

<?php
2025-01-16 07:54:02 +00:00
namespace BlaxSoftware\LaravelWebSockets\Apps;
2025-01-16 07:54:02 +00:00
use BlaxSoftware\LaravelWebSockets\Contracts\AppManager;
use React\MySQL\ConnectionInterface;
use React\MySQL\QueryResult;
use React\Promise\Deferred;
use React\Promise\PromiseInterface;
class MysqlAppManager implements AppManager
{
/**
* The database connection.
*
* @var ConnectionInterface
*/
protected $database;
/**
* Initialize the class.
*
* @param ConnectionInterface $database
*/
public function __construct(ConnectionInterface $database)
{
$this->database = $database;
}
protected function getTableName(): string
{
return config('websockets.managers.mysql.table');
}
/**
* Get all apps.
*
* @return PromiseInterface
*/
public function all(): PromiseInterface
{
$deferred = new Deferred();
$this->database->query('SELECT * FROM `'.$this->getTableName().'`')
->then(function (QueryResult $result) use ($deferred) {
$deferred->resolve($result->resultRows);
}, function ($error) use ($deferred) {
$deferred->reject($error);
});
return $deferred->promise();
}
/**
* Get app by id.
*
* @param string|int $appId
* @return PromiseInterface
*/
public function findById($appId): PromiseInterface
{
$deferred = new Deferred();
$this->database->query('SELECT * from `'.$this->getTableName().'` WHERE `id` = ?', [$appId])
->then(function (QueryResult $result) use ($deferred) {
$deferred->resolve($this->convertIntoApp($result->resultRows[0]));
}, function ($error) use ($deferred) {
$deferred->reject($error);
});
return $deferred->promise();
}
/**
* Get app by app key.
*
* @param string $appKey
* @return PromiseInterface
*/
public function findByKey($appKey): PromiseInterface
{
$deferred = new Deferred();
$this->database->query('SELECT * from `'.$this->getTableName().'` WHERE `key` = ?', [$appKey])
->then(function (QueryResult $result) use ($deferred) {
$deferred->resolve($this->convertIntoApp($result->resultRows[0]));
}, function ($error) use ($deferred) {
$deferred->reject($error);
});
return $deferred->promise();
}
/**
* Get app by secret.
*
* @param string $appSecret
* @return PromiseInterface
*/
public function findBySecret($appSecret): PromiseInterface
{
$deferred = new Deferred();
$this->database->query('SELECT * from `'.$this->getTableName().'` WHERE `secret` = ?', [$appSecret])
->then(function (QueryResult $result) use ($deferred) {
$deferred->resolve($this->convertIntoApp($result->resultRows[0]));
}, function ($error) use ($deferred) {
$deferred->reject($error);
});
return $deferred->promise();
}
/**
* Map the app into an App instance.
*
* @param array|null $app
2025-01-16 07:54:02 +00:00
* @return \BlaxSoftware\LaravelWebSockets\Apps\App|null
*/
protected function convertIntoApp(?array $appAttributes): ?App
{
if (! $appAttributes) {
return null;
}
$app = new App(
$appAttributes['id'],
$appAttributes['key'],
$appAttributes['secret']
);
if (isset($appAttributes['name'])) {
$app->setName($appAttributes['name']);
}
if (isset($appAttributes['host'])) {
$app->setHost($appAttributes['host']);
}
if (isset($appAttributes['path'])) {
$app->setPath($appAttributes['path']);
}
$app
->enableClientMessages((bool) $appAttributes['enable_client_messages'])
->enableStatistics((bool) $appAttributes['enable_statistics'])
->setCapacity($appAttributes['capacity'] ?? null)
->setAllowedOrigins(array_filter(explode(',', $appAttributes['allowed_origins'])));
return $app;
}
/**
* @inheritDoc
*/
public function createApp($appData): PromiseInterface
{
$deferred = new Deferred();
$this->database->query(
'INSERT INTO `'.$this->getTableName().'` (`id`, `key`, `secret`, `name`, `enable_client_messages`, `enable_statistics`, `allowed_origins`, `capacity`) VALUES (?, ?, ?, ?, ?, ?, ?, ?)',
[$appData['id'], $appData['key'], $appData['secret'], $appData['name'], $appData['enable_client_messages'], $appData['enable_statistics'], $appData['allowed_origins'] ?? '', $appData['capacity'] ?? null])
->then(function () use ($deferred) {
$deferred->resolve();
}, function ($error) use ($deferred) {
$deferred->reject($error);
});
return $deferred->promise();
}
}