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
Du kannst nicht mehr als 25 Themen auswählen Themen müssen mit entweder einem Buchstaben oder einer Ziffer beginnen. Sie können Bindestriche („-“) enthalten und bis zu 35 Zeichen lang sein.

DefinitionService.php 5.9KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158
  1. <?php
  2. namespace Tqdev\PhpCrudApi\Column;
  3. use Tqdev\PhpCrudApi\Column\Reflection\ReflectedColumn;
  4. use Tqdev\PhpCrudApi\Column\Reflection\ReflectedTable;
  5. use Tqdev\PhpCrudApi\Database\GenericDB;
  6. class DefinitionService
  7. {
  8. private $db;
  9. private $reflection;
  10. public function __construct(GenericDB $db, ReflectionService $reflection)
  11. {
  12. $this->db = $db;
  13. $this->reflection = $reflection;
  14. }
  15. public function updateTable(string $tableName, /* object */ $changes): bool
  16. {
  17. $table = $this->reflection->getTable($tableName);
  18. $newTable = ReflectedTable::fromJson((object) array_merge((array) $table->jsonSerialize(), (array) $changes));
  19. if ($table->getName() != $newTable->getName()) {
  20. if (!$this->db->definition()->renameTable($table->getName(), $newTable->getName())) {
  21. return false;
  22. }
  23. }
  24. return true;
  25. }
  26. public function updateColumn(string $tableName, string $columnName, /* object */ $changes): bool
  27. {
  28. $table = $this->reflection->getTable($tableName);
  29. $column = $table->getColumn($columnName);
  30. // remove constraints on other column
  31. $newColumn = ReflectedColumn::fromJson((object) array_merge((array) $column->jsonSerialize(), (array) $changes));
  32. if ($newColumn->getPk() != $column->getPk() && $table->hasPk()) {
  33. $oldColumn = $table->getPk();
  34. if ($oldColumn->getName() != $columnName) {
  35. $oldColumn->setPk(false);
  36. if (!$this->db->definition()->removeColumnPrimaryKey($table->getName(), $oldColumn->getName(), $oldColumn)) {
  37. return false;
  38. }
  39. }
  40. }
  41. // remove constraints
  42. $newColumn = ReflectedColumn::fromJson((object) array_merge((array) $column->jsonSerialize(), ['pk' => false, 'fk' => false]));
  43. if ($newColumn->getPk() != $column->getPk() && !$newColumn->getPk()) {
  44. if (!$this->db->definition()->removeColumnPrimaryKey($table->getName(), $column->getName(), $newColumn)) {
  45. return false;
  46. }
  47. }
  48. if ($newColumn->getFk() != $column->getFk() && !$newColumn->getFk()) {
  49. if (!$this->db->definition()->removeColumnForeignKey($table->getName(), $column->getName(), $newColumn)) {
  50. return false;
  51. }
  52. }
  53. // name and type
  54. $newColumn = ReflectedColumn::fromJson((object) array_merge((array) $column->jsonSerialize(), (array) $changes));
  55. $newColumn->setPk(false);
  56. $newColumn->setFk('');
  57. if ($newColumn->getName() != $column->getName()) {
  58. if (!$this->db->definition()->renameColumn($table->getName(), $column->getName(), $newColumn)) {
  59. return false;
  60. }
  61. }
  62. if ($newColumn->getType() != $column->getType() ||
  63. $newColumn->getLength() != $column->getLength() ||
  64. $newColumn->getPrecision() != $column->getPrecision() ||
  65. $newColumn->getScale() != $column->getScale()
  66. ) {
  67. if (!$this->db->definition()->retypeColumn($table->getName(), $newColumn->getName(), $newColumn)) {
  68. return false;
  69. }
  70. }
  71. if ($newColumn->getNullable() != $column->getNullable()) {
  72. if (!$this->db->definition()->setColumnNullable($table->getName(), $newColumn->getName(), $newColumn)) {
  73. return false;
  74. }
  75. }
  76. // add constraints
  77. $newColumn = ReflectedColumn::fromJson((object) array_merge((array) $column->jsonSerialize(), (array) $changes));
  78. if ($newColumn->getFk()) {
  79. if (!$this->db->definition()->addColumnForeignKey($table->getName(), $newColumn->getName(), $newColumn)) {
  80. return false;
  81. }
  82. }
  83. if ($newColumn->getPk()) {
  84. if (!$this->db->definition()->addColumnPrimaryKey($table->getName(), $newColumn->getName(), $newColumn)) {
  85. return false;
  86. }
  87. }
  88. return true;
  89. }
  90. public function addTable(/* object */$definition)
  91. {
  92. $newTable = ReflectedTable::fromJson($definition);
  93. if (!$this->db->definition()->addTable($newTable)) {
  94. return false;
  95. }
  96. return true;
  97. }
  98. public function addColumn(string $tableName, /* object */ $definition)
  99. {
  100. $newColumn = ReflectedColumn::fromJson($definition);
  101. if (!$this->db->definition()->addColumn($tableName, $newColumn)) {
  102. return false;
  103. }
  104. if ($newColumn->getFk()) {
  105. if (!$this->db->definition()->addColumnForeignKey($tableName, $newColumn->getName(), $newColumn)) {
  106. return false;
  107. }
  108. }
  109. if ($newColumn->getPk()) {
  110. if (!$this->db->definition()->addColumnPrimaryKey($tableName, $newColumn->getName(), $newColumn)) {
  111. return false;
  112. }
  113. }
  114. return true;
  115. }
  116. public function removeTable(string $tableName)
  117. {
  118. if (!$this->db->definition()->removeTable($tableName)) {
  119. return false;
  120. }
  121. return true;
  122. }
  123. public function removeColumn(string $tableName, string $columnName)
  124. {
  125. $table = $this->reflection->getTable($tableName);
  126. $newColumn = $table->getColumn($columnName);
  127. if ($newColumn->getPk()) {
  128. $newColumn->setPk(false);
  129. if (!$this->db->definition()->removeColumnPrimaryKey($table->getName(), $newColumn->getName(), $newColumn)) {
  130. return false;
  131. }
  132. }
  133. if ($newColumn->getFk()) {
  134. $newColumn->setFk("");
  135. if (!$this->db->definition()->removeColumnForeignKey($tableName, $columnName, $newColumn)) {
  136. return false;
  137. }
  138. }
  139. if (!$this->db->definition()->removeColumn($tableName, $columnName)) {
  140. return false;
  141. }
  142. return true;
  143. }
  144. }