123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112 |
- <?php
- namespace Tqdev\PhpCrudApi;
-
- use Tqdev\PhpCrudApi\Cache\CacheFactory;
- use Tqdev\PhpCrudApi\Column\DefinitionService;
- use Tqdev\PhpCrudApi\Column\ReflectionService;
- use Tqdev\PhpCrudApi\Controller\CacheController;
- use Tqdev\PhpCrudApi\Controller\ColumnController;
- use Tqdev\PhpCrudApi\Controller\OpenApiController;
- use Tqdev\PhpCrudApi\Controller\RecordController;
- use Tqdev\PhpCrudApi\Controller\Responder;
- use Tqdev\PhpCrudApi\Database\GenericDB;
- use Tqdev\PhpCrudApi\Middleware\CorsMiddleware;
- use Tqdev\PhpCrudApi\Middleware\FirewallMiddleware;
- use Tqdev\PhpCrudApi\Middleware\Router\SimpleRouter;
- use Tqdev\PhpCrudApi\Middleware\SanitationMiddleware;
- use Tqdev\PhpCrudApi\Middleware\ValidationMiddleware;
- use Tqdev\PhpCrudApi\OpenApi\OpenApiService;
- use Tqdev\PhpCrudApi\Record\ErrorCode;
- use Tqdev\PhpCrudApi\Record\RecordService;
-
- class Api
- {
- private $router;
- private $responder;
- private $debug;
-
- public function __construct(Config $config)
- {
- $db = new GenericDB(
- $config->getDriver(),
- $config->getAddress(),
- $config->getPort(),
- $config->getDatabase(),
- $config->getUsername(),
- $config->getPassword()
- );
- $cache = CacheFactory::create($config);
- $reflection = new ReflectionService($db, $cache, $config->getCacheTime());
- $definition = new DefinitionService($db, $reflection);
- $responder = new Responder();
- $router = new SimpleRouter($responder);
- foreach ($config->getMiddlewares() as $middleware => $properties) {
- switch ($middleware) {
- case 'cors':
- new CorsMiddleware($router, $responder, $properties);
- break;
- case 'firewall':
- new FirewallMiddleware($router, $responder, $properties);
- break;
- case 'basicAuth':
- new BasicAuthMiddleware($router, $responder, $properties);
- break;
- case 'validation':
- new ValidationMiddleware($router, $responder, $properties, $reflection);
- break;
- case 'sanitation':
- new SanitationMiddleware($router, $responder, $properties, $reflection);
- break;
- }
- }
- $data = new RecordService($db, $reflection);
- $openApi = new OpenApiService($reflection);
- foreach ($config->getControllers() as $controller) {
- switch ($controller) {
- case 'records':
- new RecordController($router, $responder, $data);
- break;
- case 'columns':
- new ColumnController($router, $responder, $reflection, $definition);
- break;
- case 'cache':
- new CacheController($router, $responder, $cache);
- break;
- case 'openapi':
- new OpenApiController($router, $responder, $openApi);
- break;
- }
- }
- $this->router = $router;
- $this->responder = $responder;
- $this->debug = $config->getDebug();
- }
-
- public function handle(Request $request): Response
- {
- $response = null;
- try {
- $response = $this->router->route($request);
- } catch (\Throwable $e) {
- if ($e instanceof \PDOException) {
- if (strpos(strtolower($e->getMessage()), 'duplicate') !== false) {
- return $this->responder->error(ErrorCode::DUPLICATE_KEY_EXCEPTION, '');
- }
- if (strpos(strtolower($e->getMessage()), 'default value') !== false) {
- return $this->responder->error(ErrorCode::DATA_INTEGRITY_VIOLATION, '');
- }
- if (strpos(strtolower($e->getMessage()), 'allow nulls') !== false) {
- return $this->responder->error(ErrorCode::DATA_INTEGRITY_VIOLATION, '');
- }
- if (strpos(strtolower($e->getMessage()), 'constraint') !== false) {
- return $this->responder->error(ErrorCode::DATA_INTEGRITY_VIOLATION, '');
- }
- }
- $response = $this->responder->error(ErrorCode::ERROR_NOT_FOUND, $e->getMessage());
- if ($this->debug) {
- $response->addHeader('X-Debug-Info', 'Exception in ' . $e->getFile() . ' on line ' . $e->getLine());
- }
- }
- return $response;
- }
- }
|