From b3f400198aaabaf2b9c15c939c0a070e84a20ffd Mon Sep 17 00:00:00 2001 From: Daniel Kurowski <daniel.kurowski@grifart.cz> Date: Fri, 28 May 2021 14:21:43 +0200 Subject: [PATCH] Scaffolding: added buildersForPgTable() as well --- src/Scaffolding/Builders.php | 58 ++++++++++++++++++++++ src/Scaffolding/Scaffolding.php | 87 +++++++++++++++++++++------------ 2 files changed, 113 insertions(+), 32 deletions(-) create mode 100644 src/Scaffolding/Builders.php diff --git a/src/Scaffolding/Builders.php b/src/Scaffolding/Builders.php new file mode 100644 index 0000000..7dcc034 --- /dev/null +++ b/src/Scaffolding/Builders.php @@ -0,0 +1,58 @@ +<?php declare(strict_types = 1); + +namespace Grifart\Tables\Scaffolding; + +use Grifart\ClassScaffolder\Definition\ClassDefinition; +use Grifart\ClassScaffolder\Definition\ClassDefinitionBuilder; + + +final class Builders +{ + private function __construct( + private ClassDefinitionBuilder $rowClass, + private ClassDefinitionBuilder $modificationsClass, + private ClassDefinitionBuilder $tableClass, + ) {} + + public static function from( + ClassDefinitionBuilder $rowClass, + ClassDefinitionBuilder $modificationsClass, + ClassDefinitionBuilder $tableClass, + ): self + { + return new self( + $rowClass, + $modificationsClass, + $tableClass, + ); + } + + public function row(): ClassDefinitionBuilder + { + return $this->rowClass; + } + + public function modifications(): ClassDefinitionBuilder + { + return $this->modificationsClass; + } + + public function table(): ClassDefinitionBuilder + { + return $this->tableClass; + } + + + /** + * @return ClassDefinition[] + */ + public function buildAll(): array + { + return [ + $this->rowClass->build(), + $this->modificationsClass->build(), + $this->tableClass->build(), + ]; + } + +} diff --git a/src/Scaffolding/Scaffolding.php b/src/Scaffolding/Scaffolding.php index d97ef28..1d44e4c 100644 --- a/src/Scaffolding/Scaffolding.php +++ b/src/Scaffolding/Scaffolding.php @@ -16,10 +16,12 @@ use function Grifart\ClassScaffolder\Definition\Types\resolve; final class Scaffolding { - private static function location(string $schema, string $table, string $column): string { + private static function location(string $schema, string $table, string $column): string + { return "$schema.$table.$column"; } + /** * @return ClassDefinition[] */ @@ -32,8 +34,32 @@ final class Scaffolding string $modificationClass, string $tableClass, string $primaryKeyClass - ): array { + ): array + { + return self::buildersForPgTable( + $pgReflector, + $mapper, + $schema, + $table, + $rowClass, + $modificationClass, + $tableClass, + $primaryKeyClass, + )->buildAll(); + } + + public static function buildersForPgTable( + PostgresReflector $pgReflector, + TypeMapper $mapper, + string $schema, + string $table, + string $rowClass, + string $modificationClass, + string $tableClass, + string $primaryKeyClass + ): Builders + { $columnsNativeTypes = $pgReflector->retrieveColumnInfo($schema, $table); if (\count($columnsNativeTypes) === 0) { throw new \LogicException('No columns found for given configuration. Does referenced table exist?'); @@ -56,36 +82,33 @@ final class Scaffolding return $builder; }; - return [ - // row class - $addTableFields(new ClassDefinitionBuilder($rowClass)) - ->implement(Row::class) - ->decorate(new PropertiesDecorator()) - ->decorate(new InitializingConstructorDecorator()) - ->decorate(new GettersDecorator()) - ->decorate(new PrivateConstructorDecorator()) - ->decorate(new ReconstituteConstructorDecorator()) - ->build(), - - // row modification class - $addTableFields(new ClassDefinitionBuilder($modificationClass)) - ->decorate(new ModificationsDecorator($tableClass, $primaryKeyClass)) - ->build(), - - // table class - (new ClassDefinitionBuilder($tableClass)) - ->decorate(new TableDecorator( - $schema, - $table, - $primaryKeyClass, - $rowClass, - $modificationClass, - $columnsNativeTypes, - $columnsPhpTypes, - )) - ->build(), - - ]; + + // row class + $row = $addTableFields(new ClassDefinitionBuilder($rowClass)) + ->implement(Row::class) + ->decorate(new PropertiesDecorator()) + ->decorate(new InitializingConstructorDecorator()) + ->decorate(new GettersDecorator()) + ->decorate(new PrivateConstructorDecorator()) + ->decorate(new ReconstituteConstructorDecorator()); + + // row modification class + $modifications = $addTableFields(new ClassDefinitionBuilder($modificationClass)) + ->decorate(new ModificationsDecorator($tableClass, $primaryKeyClass)); + + // table class + $table = (new ClassDefinitionBuilder($tableClass)) + ->decorate(new TableDecorator( + $schema, + $table, + $primaryKeyClass, + $rowClass, + $modificationClass, + $columnsNativeTypes, + $columnsPhpTypes, + )); + + return Builders::from($row, $modifications, $table); } } -- GitLab