<?php
declare(strict_types=1);
use Dotenv\Dotenv;
use React\EventLoop\Factory;
use React\Http\Server;
use Sapphire\App\Core\ErrorHandler;
use Sapphire\App\Core\JsonRequestDecoder;
use Sapphire\App\Core\Router;
use Sapphire\App\Orders\Controller\CreateOrder\Controller;
use Sapphire\App\Orders\Controller\DeleteOrder;
use Sapphire\App\Orders\Controller\GetAllOrders;
use Sapphire\App\Orders\Controller\GetOrderById;
use Sapphire\App\Orders\Storage as Orders;
use Sapphire\App\Products\Controller\CreateProduct;
use Sapphire\App\Products\Controller\DeleteProduct;
use Sapphire\App\Products\Controller\GetAllProducts;
use Sapphire\App\Products\Controller\GetProductById;
use Sapphire\App\Products\Controller\UpdateProduct;
use Sapphire\App\Products\Storage as Products;
require __DIR__ . '/vendor/autoload.php';
$requiredEnvFields = [
'JWT_KEY',
'DB_HOST',
'DB_USER',
'DB_PWD',
'DB_NAME',
];
$env = Dotenv::createImmutable(__DIR__);
$env->load();
$env->required($requiredEnvFields)->notEmpty();
$loop = Factory::create();
$factory = new \React\MySQL\Factory($loop);
$uri = getenv('DB_USER') . ':' . getenv('DB_PWD') . '@' . getenv('DB_HOST') . '/' . getenv('DB_NAME');
$connection = $factory->createLazyConnection($uri);
$products = new Products($connection);
$orders = new Orders($connection);
$dispatcher = require __DIR__ . '/src/routes.php';
$middlewares = [
new ErrorHandler,
new JsonRequestDecoder,
new Router($dispatcher),
];
$server = new Server($middlewares);
$socket = new \React\Socket\Server(getenv('SERVER_URI'), $loop);
$server->listen($socket);
$server->on('error', static function (Throwable $error) {
echo 'Error: ' . $error->getMessage() . PHP_EOL;
});
printf('Listening on %s', str_replace('tcp', 'http', $socket->getAddress()) . PHP_EOL);
$loop->run();
|