diff --git a/src/Commands/MakeEntityCommand.php b/src/Commands/MakeEntityCommand.php index 6ec5f173..1f713513 100644 --- a/src/Commands/MakeEntityCommand.php +++ b/src/Commands/MakeEntityCommand.php @@ -6,6 +6,7 @@ use Illuminate\Support\Arr; use Illuminate\Support\Facades\Config; use Illuminate\Support\Str; +use RonasIT\Support\DTO\RelationsDTO; use RonasIT\Support\Events\SuccessCreateMessage; use RonasIT\Support\Events\WarningEvent; use RonasIT\Support\Exceptions\ClassNotExistsException; @@ -287,12 +288,12 @@ protected function getCrudOptions() protected function getRelations() { - return [ - 'hasOne' => $this->option('has-one'), - 'hasMany' => $this->option('has-many'), - 'belongsTo' => $this->option('belongs-to'), - 'belongsToMany' => $this->option('belongs-to-many') - ]; + return new RelationsDTO( + hasOne: $this->option('has-one'), + hasMany: $this->option('has-many'), + belongsTo: $this->option('belongs-to'), + belongsToMany: $this->option('belongs-to-many'), + ); } protected function getFields() diff --git a/src/DTO/RelationsDTO.php b/src/DTO/RelationsDTO.php new file mode 100644 index 00000000..b8f8a072 --- /dev/null +++ b/src/DTO/RelationsDTO.php @@ -0,0 +1,19 @@ +relations = $relations; - foreach ($relations['belongsTo'] as $field) { + foreach ($relations->belongsTo as $field) { $name = Str::snake($field) . '_id'; $this->fields['integer-required'][] = $name; diff --git a/src/Generators/MigrationGenerator.php b/src/Generators/MigrationGenerator.php index 64566c49..0a423dc9 100644 --- a/src/Generators/MigrationGenerator.php +++ b/src/Generators/MigrationGenerator.php @@ -21,7 +21,7 @@ public function generate(): void 'class' => $this->getPluralName($this->model), 'entity' => $this->model, 'entities' => $entities, - 'relations' => $this->relations, + 'relations' => $this->relations->toArray(), 'fields' => $this->fields, 'table' => $this->generateTable($this->fields) ]); diff --git a/src/Generators/RequestsGenerator.php b/src/Generators/RequestsGenerator.php index 1c3d30de..0e892435 100644 --- a/src/Generators/RequestsGenerator.php +++ b/src/Generators/RequestsGenerator.php @@ -14,16 +14,7 @@ class RequestsGenerator extends EntityGenerator const DELETE_METHOD = 'Delete'; const GET_METHOD = 'Get'; - public function setRelations($relations) - { - parent::setRelations($relations); - - $this->relations['belongsTo'] = array_map(function ($field) { - return Str::snake($field) . '_id'; - }, $this->relations['belongsTo']); - - return $this; - } + protected array $relationFields = []; public function generate(): void { @@ -31,6 +22,10 @@ public function generate(): void return; } + $this->relationFields = array_map(function ($field) { + return Str::snake($field) . '_id'; + }, $this->relations->belongsTo); + if (in_array('R', $this->crudOptions)) { $this->createRequest( self::GET_METHOD, @@ -177,7 +172,7 @@ protected function getRules($name, $type, $required, $nullable, $present): array Arr::get($replaces, $type, $type) ]; - if (in_array($name, $this->relations['belongsTo'])) { + if (in_array($name, $this->relationFields)) { $tableName = str_replace('_id', '', $name); $rules[] = "exists:{$this->getTableName($tableName)},id"; diff --git a/src/Generators/SeederGenerator.php b/src/Generators/SeederGenerator.php index f64804f9..bbb1027e 100644 --- a/src/Generators/SeederGenerator.php +++ b/src/Generators/SeederGenerator.php @@ -60,7 +60,7 @@ protected function createEntitySeeder(): void { $content = "getStub('seeder', [ 'entity' => $this->model, - 'relations' => $this->relations, + 'relations' => $this->relations->toArray(), 'namespace' => $this->getOrCreateNamespace('seeders'), 'factoryNamespace' => $this->getOrCreateNamespace('factories'), ]); diff --git a/src/Generators/ServiceGenerator.php b/src/Generators/ServiceGenerator.php index 6da60c96..f3ad4fec 100644 --- a/src/Generators/ServiceGenerator.php +++ b/src/Generators/ServiceGenerator.php @@ -4,22 +4,12 @@ use Illuminate\Support\Arr; use Illuminate\Support\Str; +use RonasIT\Support\DTO\RelationsDTO; use RonasIT\Support\Exceptions\ClassNotExistsException; use RonasIT\Support\Events\SuccessCreateMessage; class ServiceGenerator extends EntityGenerator { - public function setRelations($relations) - { - foreach ($relations['belongsTo'] as $field) { - $name = Str::snake($field) . '_id'; - - $this->fields['integer'][] = $name; - } - - return $this; - } - public function generate(): void { if ($this->classExists('repositories', "{$this->model}Repository")) { diff --git a/tests/FactoryGeneratorTest.php b/tests/FactoryGeneratorTest.php index 0bd7bd17..889ec8d3 100644 --- a/tests/FactoryGeneratorTest.php +++ b/tests/FactoryGeneratorTest.php @@ -5,6 +5,7 @@ use Illuminate\Support\Facades\Config; use Illuminate\Support\Facades\Event; use Illuminate\View\ViewException; +use RonasIT\Support\DTO\RelationsDTO; use RonasIT\Support\Events\SuccessCreateMessage; use RonasIT\Support\Events\WarningEvent; use RonasIT\Support\Exceptions\ClassAlreadyExistsException; @@ -65,11 +66,7 @@ className: ViewException::class, ->setFields([ 'another_type' => ['some_field'], ]) - ->setRelations([ - 'hasOne' => [], - 'hasMany' => [], - 'belongsTo' => [], - ]) + ->setRelations(new RelationsDTO()) ->setModel('Post') ->generate(); } @@ -84,11 +81,10 @@ public function testCreateSuccess() 'string' => ['title', 'iban', 'something'], 'json' => ['json_text'], ]) - ->setRelations([ - 'hasOne' => ['user'], - 'hasMany' => [], - 'belongsTo' => ['user'], - ]) + ->setRelations(new RelationsDTO( + hasOne: ['user'], + belongsTo: ['user'], + )) ->setModel('Post') ->generate(); @@ -112,11 +108,10 @@ public function testCreateFactoryWithoutFactoryStub(): void 'string' => ['title', 'iban', 'something'], 'json' => ['json_text'], ]) - ->setRelations([ - 'hasOne' => ['user'], - 'hasMany' => [], - 'belongsTo' => ['user'], - ]) + ->setRelations(new RelationsDTO( + hasOne: ['user'], + belongsTo: ['user'], + )) ->setModel('Post') ->generate(); @@ -144,11 +139,10 @@ public function testConfigFolderWithIncorrectCase(): void 'string' => ['title', 'iban', 'something'], 'json' => ['json_text'], ]) - ->setRelations([ - 'hasOne' => ['user'], - 'hasMany' => [], - 'belongsTo' => ['user'], - ]) + ->setRelations(new RelationsDTO( + hasOne: ['user'], + belongsTo: ['user'], + )) ->setModel('Post') ->generate(); } @@ -165,11 +159,10 @@ public function testConfigFolderWithExtension(): void 'string' => ['title', 'iban', 'something'], 'json' => ['json_text'], ]) - ->setRelations([ - 'hasOne' => ['user'], - 'hasMany' => [], - 'belongsTo' => ['user'], - ]) + ->setRelations(new RelationsDTO( + hasOne: ['user'], + belongsTo: ['user'], + )) ->setModel('Post') ->generate(); diff --git a/tests/MigrationGeneratorTest.php b/tests/MigrationGeneratorTest.php index 9a156aed..d8368135 100644 --- a/tests/MigrationGeneratorTest.php +++ b/tests/MigrationGeneratorTest.php @@ -3,6 +3,7 @@ namespace RonasIT\Support\Tests; use Illuminate\Support\Carbon; +use RonasIT\Support\DTO\RelationsDTO; use RonasIT\Support\Events\WarningEvent; use RonasIT\Support\Exceptions\UnknownFieldTypeException; use RonasIT\Support\Generators\MigrationGenerator; @@ -18,12 +19,7 @@ className: UnknownFieldTypeException::class, app(MigrationGenerator::class) ->setModel('Post') - ->setRelations([ - 'belongsTo' => [], - 'belongsToMany' => [], - 'hasOne' => [], - 'hasMany' => [], - ]) + ->setRelations(new RelationsDTO()) ->setFields([ 'integer-required' => ['media_id', 'user_id'], 'unknown-type' => ['title'], @@ -37,12 +33,7 @@ public function testCreateMigration() app(MigrationGenerator::class) ->setModel('Post') - ->setRelations([ - 'belongsTo' => [], - 'belongsToMany' => [], - 'hasOne' => [], - 'hasMany' => [], - ]) + ->setRelations(new RelationsDTO()) ->setFields([ 'integer-required' => ['media_id', 'user_id'], 'string' => ['title', 'body'], @@ -62,12 +53,7 @@ public function testCreateMigrationMYSQL() app(MigrationGenerator::class) ->setModel('Post') - ->setRelations([ - 'belongsTo' => [], - 'belongsToMany' => [], - 'hasOne' => [], - 'hasMany' => [], - ]) + ->setRelations(new RelationsDTO()) ->setFields([ 'integer-required' => ['media_id', 'user_id'], 'string' => ['title', 'body'], @@ -88,12 +74,7 @@ public function testCreateMigrationWithoutMigrationStub(): void app(MigrationGenerator::class) ->setModel('Post') - ->setRelations([ - 'belongsTo' => [], - 'belongsToMany' => [], - 'hasOne' => [], - 'hasMany' => [], - ]) + ->setRelations(new RelationsDTO()) ->setFields([ 'integer-required' => ['media_id', 'user_id'], 'string' => ['title', 'body'], diff --git a/tests/ModelGeneratorTest.php b/tests/ModelGeneratorTest.php index 73e96af1..b597eca7 100644 --- a/tests/ModelGeneratorTest.php +++ b/tests/ModelGeneratorTest.php @@ -2,6 +2,7 @@ namespace RonasIT\Support\Tests; +use RonasIT\Support\DTO\RelationsDTO; use RonasIT\Support\Events\SuccessCreateMessage; use RonasIT\Support\Events\WarningEvent; use RonasIT\Support\Exceptions\ClassAlreadyExistsException; @@ -39,12 +40,9 @@ className: ClassNotExistsException::class, app(ModelGenerator::class) ->setModel('Post') - ->setRelations([ - 'hasOne' => ['Comment'], - 'hasMany' => [], - 'belongsTo' => [], - 'belongsToMany' => [], - ]) + ->setRelations(new RelationsDTO( + hasOne: ['Comment'] + )) ->generate(); } @@ -58,12 +56,10 @@ public function testCreateModel() 'integer-required' => ['media_id'], 'boolean-required' => ['is_published'], ]) - ->setRelations([ - 'hasOne' => ['Comment'], - 'hasMany' => ['User'], - 'belongsTo' => [], - 'belongsToMany' => [], - ]) + ->setRelations(new RelationsDTO( + hasOne: ['Comment'], + hasMany: ['User'], + )) ->generate(); $this->assertGeneratedFileEquals('new_model.php', 'app/Models/Post.php'); @@ -105,6 +101,7 @@ public function testCreateModelWithoutRelationsRelationStubNotExist() app(ModelGenerator::class) ->setModel('Post') + ->setRelations(new RelationsDTO()) ->setFields([]) ->generate(); @@ -125,12 +122,10 @@ public function testCreateModelWithRelationsRelationStubNotExist() app(ModelGenerator::class) ->setModel('Post') ->setFields([]) - ->setRelations([ - 'hasOne' => ['Comment'], - 'hasMany' => ['User'], - 'belongsTo' => [], - 'belongsToMany' => [], - ]) + ->setRelations(new RelationsDTO( + hasOne: ['Comment'], + hasMany: ['User'], + )) ->generate(); $this->assertFileDoesNotExist('new_model.php', 'app/Models/Post.php'); diff --git a/tests/RequestGeneratorTest.php b/tests/RequestGeneratorTest.php index d99b42b3..b61489fa 100644 --- a/tests/RequestGeneratorTest.php +++ b/tests/RequestGeneratorTest.php @@ -2,6 +2,7 @@ namespace RonasIT\Support\Tests; +use RonasIT\Support\DTO\RelationsDTO; use RonasIT\Support\Events\SuccessCreateMessage; use RonasIT\Support\Events\WarningEvent; use RonasIT\Support\Generators\RequestsGenerator; @@ -12,12 +13,10 @@ public function testCreateRequests() { app(RequestsGenerator::class) ->setModel('Post') - ->setRelations([ - 'belongsTo' => ['User'], - 'hasMany' => ['Comments'], - 'hasOne' => [], - 'belongsToMany' => [] - ]) + ->setRelations(new RelationsDTO( + hasMany: ['Comments'], + belongsTo: ['User'], + )) ->setFields([ 'boolean-required' => ['is_published'], 'integer' => ['user_id'], diff --git a/tests/SeederGeneratorTest.php b/tests/SeederGeneratorTest.php index 96b56bc5..1d8be0e7 100644 --- a/tests/SeederGeneratorTest.php +++ b/tests/SeederGeneratorTest.php @@ -2,6 +2,7 @@ namespace RonasIT\Support\Tests; +use RonasIT\Support\DTO\RelationsDTO; use RonasIT\Support\Events\WarningEvent; use RonasIT\Support\Generators\SeederGenerator; @@ -10,12 +11,10 @@ class SeederGeneratorTest extends TestCase public function testCreateSeeder() { app(SeederGenerator::class) - ->setRelations([ - 'hasOne' => [], - 'belongsTo' => ['User'], - 'hasMany' => ['Comment'], - 'belongsToMany' => [] - ]) + ->setRelations(new RelationsDTO( + hasMany: ['Comment'], + belongsTo: ['User'], + )) ->setModel('Post') ->generate(); @@ -28,12 +27,10 @@ public function testCreateSeederEmptyDatabaseSeederStubNotExist() config(['entity-generator.stubs.database_empty_seeder' => 'entity-generator::database_seed_empty']); app(SeederGenerator::class) - ->setRelations([ - 'hasOne' => [], - 'belongsTo' => ['User'], - 'hasMany' => ['Comment'], - 'belongsToMany' => [] - ]) + ->setRelations(new RelationsDTO( + hasMany: ['Comment'], + belongsTo: ['User'], + )) ->setModel('Post') ->generate(); @@ -51,12 +48,10 @@ public function testCreateSeederEntityDatabaseSeederStubNotExist() config(['entity-generator.stubs.seeder' => 'incorrect_stub']); app(SeederGenerator::class) - ->setRelations([ - 'hasOne' => [], - 'belongsTo' => ['User'], - 'hasMany' => ['Comment'], - 'belongsToMany' => [] - ]) + ->setRelations(new RelationsDTO( + hasMany: ['Comment'], + belongsTo: ['User'], + )) ->setModel('Post') ->generate(); diff --git a/tests/ServiceGeneratorTest.php b/tests/ServiceGeneratorTest.php index 02091594..a75c39aa 100644 --- a/tests/ServiceGeneratorTest.php +++ b/tests/ServiceGeneratorTest.php @@ -3,6 +3,7 @@ namespace RonasIT\Support\Tests; use Illuminate\Support\Facades\Event; +use RonasIT\Support\DTO\RelationsDTO; use RonasIT\Support\Events\SuccessCreateMessage; use RonasIT\Support\Events\WarningEvent; use RonasIT\Support\Exceptions\ClassNotExistsException; @@ -41,12 +42,10 @@ public function testCreateWithTrait() ]); app(ServiceGenerator::class) - ->setRelations([ - 'hasOne' => [], - 'belongsTo' => ['User'], - 'hasMany' => ['Comment'], - 'belongsToMany' => [] - ]) + ->setRelations(new RelationsDTO( + hasMany: ['Comment'], + belongsTo: ['User'], + )) ->setFields([ 'integer-required' => ['media_id'], 'string-required' => ['body'], @@ -92,12 +91,11 @@ public function testCreateWithoutTrait() ]); app(ServiceGenerator::class) - ->setRelations([ - 'hasOne' => [], - 'belongsTo' => ['User'], - 'hasMany' => ['Comment'], - 'belongsToMany' => [] - ]) + ->setRelations( + new RelationsDTO( + hasMany: ['Comment'], + belongsTo: ['User'], + )) ->setFields([ 'integer-required' => ['media_id'], 'string-required' => ['body'],