api de gestion de ticket, basé sur php-crud-api. Le but est de décorrélé les outils de gestion des données, afin
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

Api.php 4.5KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. <?php
  2. namespace Tqdev\PhpCrudApi;
  3. use Tqdev\PhpCrudApi\Cache\CacheFactory;
  4. use Tqdev\PhpCrudApi\Column\DefinitionService;
  5. use Tqdev\PhpCrudApi\Column\ReflectionService;
  6. use Tqdev\PhpCrudApi\Controller\CacheController;
  7. use Tqdev\PhpCrudApi\Controller\ColumnController;
  8. use Tqdev\PhpCrudApi\Controller\OpenApiController;
  9. use Tqdev\PhpCrudApi\Controller\RecordController;
  10. use Tqdev\PhpCrudApi\Controller\Responder;
  11. use Tqdev\PhpCrudApi\Database\GenericDB;
  12. use Tqdev\PhpCrudApi\Middleware\CorsMiddleware;
  13. use Tqdev\PhpCrudApi\Middleware\FirewallMiddleware;
  14. use Tqdev\PhpCrudApi\Middleware\Router\SimpleRouter;
  15. use Tqdev\PhpCrudApi\Middleware\SanitationMiddleware;
  16. use Tqdev\PhpCrudApi\Middleware\ValidationMiddleware;
  17. use Tqdev\PhpCrudApi\OpenApi\OpenApiService;
  18. use Tqdev\PhpCrudApi\Record\ErrorCode;
  19. use Tqdev\PhpCrudApi\Record\RecordService;
  20. class Api
  21. {
  22. private $router;
  23. private $responder;
  24. private $debug;
  25. public function __construct(Config $config)
  26. {
  27. $db = new GenericDB(
  28. $config->getDriver(),
  29. $config->getAddress(),
  30. $config->getPort(),
  31. $config->getDatabase(),
  32. $config->getUsername(),
  33. $config->getPassword()
  34. );
  35. $cache = CacheFactory::create($config);
  36. $reflection = new ReflectionService($db, $cache, $config->getCacheTime());
  37. $definition = new DefinitionService($db, $reflection);
  38. $responder = new Responder();
  39. $router = new SimpleRouter($responder);
  40. foreach ($config->getMiddlewares() as $middleware => $properties) {
  41. switch ($middleware) {
  42. case 'cors':
  43. new CorsMiddleware($router, $responder, $properties);
  44. break;
  45. case 'firewall':
  46. new FirewallMiddleware($router, $responder, $properties);
  47. break;
  48. case 'basicAuth':
  49. new BasicAuthMiddleware($router, $responder, $properties);
  50. break;
  51. case 'validation':
  52. new ValidationMiddleware($router, $responder, $properties, $reflection);
  53. break;
  54. case 'sanitation':
  55. new SanitationMiddleware($router, $responder, $properties, $reflection);
  56. break;
  57. }
  58. }
  59. $data = new RecordService($db, $reflection);
  60. $openApi = new OpenApiService($reflection);
  61. foreach ($config->getControllers() as $controller) {
  62. switch ($controller) {
  63. case 'records':
  64. new RecordController($router, $responder, $data);
  65. break;
  66. case 'columns':
  67. new ColumnController($router, $responder, $reflection, $definition);
  68. break;
  69. case 'cache':
  70. new CacheController($router, $responder, $cache);
  71. break;
  72. case 'openapi':
  73. new OpenApiController($router, $responder, $openApi);
  74. break;
  75. }
  76. }
  77. $this->router = $router;
  78. $this->responder = $responder;
  79. $this->debug = $config->getDebug();
  80. }
  81. public function handle(Request $request): Response
  82. {
  83. $response = null;
  84. try {
  85. $response = $this->router->route($request);
  86. } catch (\Throwable $e) {
  87. if ($e instanceof \PDOException) {
  88. if (strpos(strtolower($e->getMessage()), 'duplicate') !== false) {
  89. return $this->responder->error(ErrorCode::DUPLICATE_KEY_EXCEPTION, '');
  90. }
  91. if (strpos(strtolower($e->getMessage()), 'default value') !== false) {
  92. return $this->responder->error(ErrorCode::DATA_INTEGRITY_VIOLATION, '');
  93. }
  94. if (strpos(strtolower($e->getMessage()), 'allow nulls') !== false) {
  95. return $this->responder->error(ErrorCode::DATA_INTEGRITY_VIOLATION, '');
  96. }
  97. if (strpos(strtolower($e->getMessage()), 'constraint') !== false) {
  98. return $this->responder->error(ErrorCode::DATA_INTEGRITY_VIOLATION, '');
  99. }
  100. }
  101. $response = $this->responder->error(ErrorCode::ERROR_NOT_FOUND, $e->getMessage());
  102. if ($this->debug) {
  103. $response->addHeader('X-Debug-Info', 'Exception in ' . $e->getFile() . ' on line ' . $e->getLine());
  104. }
  105. }
  106. return $response;
  107. }
  108. }