diff --git a/src/Form/Storage/DatabaseMigration.php b/src/Form/Storage/DatabaseMigration.php index 1361100..255c84e 100644 --- a/src/Form/Storage/DatabaseMigration.php +++ b/src/Form/Storage/DatabaseMigration.php @@ -13,25 +13,21 @@ use \Ulmus\Entity\InformationSchema\Table; class DatabaseMigration implements FormInterface { - protected ? Lib\DatabaseMigrations $migration; - - protected array $alter = []; - - public function __construct(Lib\DatabaseMigrations $migration) + public function __construct( + protected ? Lib\DatabaseMigrations $migration, + protected null|Lib\Database\DefinitionCollection $definition = null, + ) { - $this->migration = $migration; + $this->definition ??= new Lib\Database\DefinitionCollection(); } public function initialize(FormContextInterface $context) : void { - $context->tableExist = []; - foreach($this->migration->entities as $entity => $table) { $previous = null; - $this->alter[$entity] = []; + $connection = $entity::resolveEntity()->sqlAdapter(); $adapter = $connection->adapter(); - $tableName = $table->tableName(); $databaseName = $table->databaseName(); @@ -42,51 +38,58 @@ class DatabaseMigration implements FormInterface # Query current table's columns $tableEntity = $adapter->schemaTable($connection, $databaseName, $tableName); + $this->definition[$entity]['table'] = $tableDefinition = new Lib\Database\Definition( + entity: $entity, + modifier: new Lib\Database\Modifier( type: Lib\Database\ModifierTypeEnum::None, ), + ); + if ( $tableEntity ) { + $this->definition[$entity]['columns'] = new Lib\Database\DefinitionCollection(); + foreach($table->fieldList(EntityResolver::KEY_COLUMN_NAME, true) as $field => $definition) { + $this->definition[$entity]['columns'][$field] = $def = new Lib\Database\Definition( + entity: $entity, + field: $field, + definition: $definition, + modifier: new Lib\Database\Modifier( type: Lib\Database\ModifierTypeEnum::None, ), + previous: $def ?? null, + ); + + # Column do not exists if ( $tableEntity->columns->filtersCollection(fn($e) => $e->name === $field)->count() === 0 ) { - $this->alter[$entity][$field] = [ - 'previous' => $previous, - 'action' => 'add', - 'definition' => $definition, - ]; + $def->action = "add"; + + $def->modifier = new Lib\Database\Modifier( + type: Lib\Database\ModifierTypeEnum::Alter, + query: $entity::repository() + ->alterSqlQuery([ $def->toArray() ]) + ->getSqlQuery(true) + ); } - - $previous = [ - 'field' => $field, - 'definition' => $definition - ]; } - if ( $this->alter[$entity] ) { - $context->status[$entity] = [ - 'msg' => "altering", - "query" => $entity::repository() - ->alterSqlQuery($this->alter[$entity]) + $alter = $this->definition[$entity]['columns']->filterAlter(); + + if ( $alter->count() ) { + $tableDefinition->modifier = new Lib\Database\Modifier( + type: Lib\Database\ModifierTypeEnum::Alter, + query: $entity::repository() + ->alterSqlQuery($alter->map(fn(Lib\Database\Definition $e) => $e->toArray())) ->getSqlQuery(true), - ]; - } - else { - # if columns are different - $context->status[$entity] = [ - 'msg' => "up-to-date", - 'query' => "", - ]; + ); } } else { - $context->status[$entity] = [ - 'msg' => "unexisting", - 'query' => $entity::repository() + $tableDefinition->modifier = new Lib\Database\Modifier( + type: Lib\Database\ModifierTypeEnum::Create, + query: $entity::repository() ->createSqlQuery() - ->getSqlQuery(true), - ]; + ->getSqlQuery(true) + ); } } - if ( $context->formSent() ) { - - } + $context->definition = $this->definition; } public function validate(FormContextInterface $context) : bool @@ -99,13 +102,19 @@ class DatabaseMigration implements FormInterface $create = $context->createAll ? explode(',', $context->createAll) : [ $context->create ]; foreach(array_filter($create) as $entity) { - $entity::repository()->createTable(); + if ($this->definition[$entity]['table']->modifier->type === Lib\Database\ModifierTypeEnum::Create) { + $entity::repository()->createTable(); + } } $alter = $context->alterAll ? explode(',', $context->alterAll) : [ $context->alter ]; foreach(array_filter($alter) as $entity) { - $entity::repository()->alterTable($this->alter[$entity]); + + + if ($this->definition[$entity]['table']->modifier->type === Lib\Database\ModifierTypeEnum::Alter) { + $entity::repository()->alterTable($this->definition[$entity]['columns']->filterAlter ()->map( fn($e) => $e->toArray() )); + } } $this->initialize($context); diff --git a/src/Lib/Database/Definition.php b/src/Lib/Database/Definition.php new file mode 100644 index 0000000..6622fa2 --- /dev/null +++ b/src/Lib/Database/Definition.php @@ -0,0 +1,20 @@ +filtersCollection(fn(Definition $e) => $e->modifier->type === $type); + } + + public function filterCreate() : self + { + return $this->filterType(ModifierTypeEnum::Create); + } + + public function filterAlter() : self + { + return $this->filterType(ModifierTypeEnum::Alter); + } + + public function filterDelete() : self + { + return $this->filterType(ModifierTypeEnum::Delete); + } +} \ No newline at end of file diff --git a/src/Lib/Database/Modifier.php b/src/Lib/Database/Modifier.php new file mode 100644 index 0000000..aaaaa2f --- /dev/null +++ b/src/Lib/Database/Modifier.php @@ -0,0 +1,11 @@ +📄 {{ $item->tableName() }}
{{ $context->status[$entity]['query'] }}
+ {% if $context->definition[$entity]['table']->modifier->query %}
+ {{ $context->definition[$entity]['table']->modifier->query }}
{% else %}