diff --git a/meta/definitions/software.php b/meta/definitions/software.php index c42c4e6..6939785 100644 --- a/meta/definitions/software.php +++ b/meta/definitions/software.php @@ -39,6 +39,10 @@ return [ ] ], + 'cli' => [ + 'Lean\\Console\\Cli' => implode(DIRECTORY_SEPARATOR, [ $path, "src", "Cli", "" ]), + ], + 'routes' => ! getenv('DEBUG') ? [] : [ 'Lean\\Console\\Controller' => implode(DIRECTORY_SEPARATOR, [ $path, "src", "Controller", "" ]), ], diff --git a/src/Cli/Console.php b/src/Cli/Console.php new file mode 100644 index 0000000..c5d8bff --- /dev/null +++ b/src/Cli/Console.php @@ -0,0 +1,31 @@ +renderCLI($request, ":)"); + } +} \ No newline at end of file diff --git a/src/Controller/Storage.php b/src/Controller/Storage.php index ceaa14f..dfd7951 100644 --- a/src/Controller/Storage.php +++ b/src/Controller/Storage.php @@ -27,7 +27,7 @@ class Storage extends Console { $migrations = $this->container->has(Lib\DatabaseMigrations::class) ? $this->container->get(Lib\DatabaseMigrations::class) : false; $migrations->getEntities(); - $context = (new FormHandler($request, new Form\Storage\DatabaseMigration($migrations)))->context; + $context = (new FormHandler($request, new Form\Storage\Database\Migrate($migrations)))->context; return $this->renderView("lean-console/page/storage/database", get_defined_vars()); } @@ -39,7 +39,7 @@ class Storage extends Console { $migrations = $this->container->has(Lib\DatabaseMigrations::class) ? $this->container->get(Lib\DatabaseMigrations::class) : false; $migrations->getEntities(); - $form = new Form\Storage\DatabaseImport($migrations, $connections); + $form = new Form\Storage\Database\Import($migrations, $connections); $context = (new FormHandler($request, $form, $this->pushContext(new Lib\FormContext($request, "database.import"))))->context; @@ -74,12 +74,4 @@ class Storage extends Console { { return rtrim(ini_get("session.save_path"), DIRECTORY_SEPARATOR) . DIRECTORY_SEPARATOR; } - - public function createTable() : void - { - foreach($migrations->entities as $table) { -// $repository = $table - // $entity::repository()->createTable(); - } - } } \ No newline at end of file diff --git a/src/Form/Storage/Database/GenerateEntity.php b/src/Form/Storage/Database/GenerateEntity.php new file mode 100644 index 0000000..cde99a4 --- /dev/null +++ b/src/Form/Storage/Database/GenerateEntity.php @@ -0,0 +1,34 @@ +valid(); + } + + public function execute(FormContextInterface $context) : void + { + } +} diff --git a/src/Form/Storage/DatabaseImport.php b/src/Form/Storage/Database/Import.php similarity index 95% rename from src/Form/Storage/DatabaseImport.php rename to src/Form/Storage/Database/Import.php index e052871..94102d8 100644 --- a/src/Form/Storage/DatabaseImport.php +++ b/src/Form/Storage/Database/Import.php @@ -1,6 +1,6 @@ definition ??= new Lib\Database\DefinitionCollection(); + } + + public function initialize(FormContextInterface $context) : void + { + foreach($this->migration->entities as $entity => $table) { + $previous = null; + + $connection = $entity::resolveEntity()->sqlAdapter(); + $adapter = $connection->adapter(); + $tableName = $table->tableName(); + $databaseName = $table->databaseName(); + + if ( ! $tableName || ! $databaseName ) { + continue; + } + + # 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 = $tableEntity->columns->filtersOne(fn($e) => strtolower($e->name) === $field); + + # Column do not exists + if ( $column === null ) { + $def->action = "add"; + + $def->modifier = new Lib\Database\Modifier( + type: Lib\Database\ModifierTypeEnum::Alter, + query: $entity::repository() + ->alterSqlQuery([ $def->toArray() ]) + ->getSqlQuery(true) + ); + } + elseif ( ! $column->matchFieldDefinition($definition) ) { + $def->action = "change"; + + $def->modifier = new Lib\Database\Modifier( + type: Lib\Database\ModifierTypeEnum::Alter, + query: $entity::repository() + ->alterSqlQuery([ $def->toArray() ]) + ->getSqlQuery(true) + ); + } + } + + # ALTER TABLE `ajustements` CHANGE `annee` `annee` INT(11) NULL; + $alter = $this->definition[$entity]['columns']->filterAlter(); + + if ( $alter->count() ) { + if ( $adapter->splitAlterQuery() ) { + $query = $alter->map(fn(Lib\Database\Definition $map) => $entity::repository() + ->alterSqlQuery([ $map->toArray() ]) + ->getSqlQuery(true)); + } + else { + $query = $entity::repository() + ->alterSqlQuery($alter->map(fn(Lib\Database\Definition $map) => $map->toArray())) + ->getSqlQuery(true); + } + + $tableDefinition->modifier = new Lib\Database\Modifier( + type: Lib\Database\ModifierTypeEnum::Alter, + query: $query, + ); + } + } + else { + $tableDefinition->modifier = new Lib\Database\Modifier( + type: Lib\Database\ModifierTypeEnum::Create, + query: $entity::repository() + ->createSqlQuery() + ->getSqlQuery(true) + ); + } + } + + $context->definition = $this->definition; + } + + public function validate(FormContextInterface $context) : bool + { + return $context->valid(); + } + + public function execute(FormContextInterface $context) : void + { + $create = $context->createAll ? explode(',', $context->createAll) : [ $context->create ]; + + foreach(array_filter($create) as $entity) { + 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) { + if ($this->definition[$entity]['table']->modifier->type === Lib\Database\ModifierTypeEnum::Alter) { + $adapter = $entity::resolveEntity()->sqlAdapter()->adapter(); + + $def = $this->definition[$entity]['columns']->filterAlter(); + + if ( $adapter->splitAlterQuery() ) { + $def->walk(fn(Lib\Database\Definition $definition) => + $entity::repository()->alterTable([ $definition->toArray() ]) + ); + } + else { + $entity::repository()->alterTable($def->map( fn(Lib\Database\Definition $e) => $e->toArray() )); + } + } + } + + $this->initialize($context); + } + + public static function getContext(ServerRequestInterface $request, ? string $formName = null) : FormContextInterface + { + return new class($request, $formName) extends FormContext { + + public array $status = []; + + public array $actions = []; + }; + } +}