<?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(); 
 
 |