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.

MultiTenancyMiddleware.php 3.6KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. <?php
  2. namespace Tqdev\PhpCrudApi\Middleware;
  3. use Psr\Http\Message\ResponseInterface;
  4. use Psr\Http\Message\ServerRequestInterface;
  5. use Psr\Http\Server\RequestHandlerInterface;
  6. use Tqdev\PhpCrudApi\Column\ReflectionService;
  7. use Tqdev\PhpCrudApi\Controller\Responder;
  8. use Tqdev\PhpCrudApi\Middleware\Base\Middleware;
  9. use Tqdev\PhpCrudApi\Middleware\Communication\VariableStore;
  10. use Tqdev\PhpCrudApi\Middleware\Router\Router;
  11. use Tqdev\PhpCrudApi\Record\Condition\ColumnCondition;
  12. use Tqdev\PhpCrudApi\Record\Condition\Condition;
  13. use Tqdev\PhpCrudApi\Record\Condition\NoCondition;
  14. use Tqdev\PhpCrudApi\RequestUtils;
  15. class MultiTenancyMiddleware extends Middleware
  16. {
  17. private $reflection;
  18. public function __construct(Router $router, Responder $responder, array $properties, ReflectionService $reflection)
  19. {
  20. parent::__construct($router, $responder, $properties);
  21. $this->reflection = $reflection;
  22. }
  23. private function getCondition(string $tableName, array $pairs): Condition
  24. {
  25. $condition = new NoCondition();
  26. $table = $this->reflection->getTable($tableName);
  27. foreach ($pairs as $k => $v) {
  28. $condition = $condition->_and(new ColumnCondition($table->getColumn($k), 'eq', $v));
  29. }
  30. return $condition;
  31. }
  32. private function getPairs($handler, string $operation, string $tableName): array
  33. {
  34. $result = array();
  35. $pairs = call_user_func($handler, $operation, $tableName);
  36. $table = $this->reflection->getTable($tableName);
  37. foreach ($pairs as $k => $v) {
  38. if ($table->hasColumn($k)) {
  39. $result[$k] = $v;
  40. }
  41. }
  42. return $result;
  43. }
  44. private function handleRecord(ServerRequestInterface $request, string $operation, array $pairs): ServerRequestInterface
  45. {
  46. $record = $request->getParsedBody();
  47. if ($record === null) {
  48. return $request;
  49. }
  50. $multi = is_array($record);
  51. $records = $multi ? $record : [$record];
  52. foreach ($records as &$record) {
  53. foreach ($pairs as $column => $value) {
  54. if ($operation == 'create') {
  55. $record->$column = $value;
  56. } else {
  57. if (isset($record->$column)) {
  58. unset($record->$column);
  59. }
  60. }
  61. }
  62. }
  63. return $request->withParsedBody($multi ? $records : $records[0]);
  64. }
  65. public function process(ServerRequestInterface $request, RequestHandlerInterface $next): ResponseInterface
  66. {
  67. $handler = $this->getProperty('handler', '');
  68. if ($handler !== '') {
  69. $path = RequestUtils::getPathSegment($request, 1);
  70. if ($path == 'records') {
  71. $operation = RequestUtils::getOperation($request);
  72. $tableNames = RequestUtils::getTableNames($request, $this->reflection);
  73. foreach ($tableNames as $i => $tableName) {
  74. if (!$this->reflection->hasTable($tableName)) {
  75. continue;
  76. }
  77. $pairs = $this->getPairs($handler, $operation, $tableName);
  78. if ($i == 0) {
  79. if (in_array($operation, ['create', 'update', 'increment'])) {
  80. $request = $this->handleRecord($request, $operation, $pairs);
  81. }
  82. }
  83. $condition = $this->getCondition($tableName, $pairs);
  84. VariableStore::set("multiTenancy.conditions.$tableName", $condition);
  85. }
  86. }
  87. }
  88. return $next->handle($request);
  89. }
  90. }