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.

DefinitionService.php 5.9KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158
  1. <?php
  2. namespace Tqdev\PhpCrudApi\Column;
  3. use Tqdev\PhpCrudApi\Database\GenericDB;
  4. use Tqdev\PhpCrudApi\Column\Reflection\ReflectedColumn;
  5. use Tqdev\PhpCrudApi\Column\Reflection\ReflectedTable;
  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->get($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->get($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. }