Skip to content

Commit

Permalink
compatibility with formularium 0.9
Browse files Browse the repository at this point in the history
  • Loading branch information
brunobg committed Sep 7, 2021
1 parent 04c25a4 commit 2ea9541
Show file tree
Hide file tree
Showing 14 changed files with 184 additions and 115 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
<?php declare(strict_types=1);

namespace Modelarium\CodeGenerator\GraphQL\DatatypeGenerator;

use Formularium\CodeGenerator\GraphQL\GraphQLDatatypeGenerator;

class DatatypeGenerator_integer extends GraphQLDatatypeGenerator
{
public function getBasetype(): string
{
return 'XXXXXXX';
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
<?php declare(strict_types=1);

namespace Formularium\CodeGenerator\LaravelEloquent\DatatypeGenerator;

use Formularium\Field;
use Formularium\CodeGenerator\CodeGenerator;
use Formularium\CodeGenerator\LaravelEloquent\CodeGenerator as LaravelEloquentCodeGenerator;
use Formularium\CodeGenerator\LaravelEloquent\LaravelEloquentDatatypeGenerator as LaravelEloquentLaravelEloquentDatatypeGenerator;
use Formularium\DatabaseEnum;
use Formularium\Datatype;

class DatatypeGenerator_relationship extends LaravelEloquentLaravelEloquentDatatypeGenerator
{
public function field(CodeGenerator $generator, Field $field)
{
/**
* @var LaravelEloquentCodeGenerator $generator
*/
return "unsignedBigInteger('{$field->getName()}_id')" .
($field->getValidatorOption(Datatype::REQUIRED, 'value', false) ? '' : '->nullable()');
// TODO: index
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
<?php declare(strict_types=1);

namespace Modelarium\CodeGenerator\SQL\DatatypeGenerator;

use Formularium\Field;
use Formularium\CodeGenerator\CodeGenerator;
use Formularium\CodeGenerator\DatatypeGenerator;
use Formularium\CodeGenerator\SQL\SQLDatatypeGenerator;
use Formularium\CodeGenerator\SQL\CodeGenerator as SQLCodeGenerator;
use Formularium\Datatype;

class DatatypeGenerator_integer extends SQLDatatypeGenerator
{
public function field(CodeGenerator $generator, Field $field)
{
/**
* @var SQLCodeGenerator $generator
*/
return $this->getSQL(
$field->getName(),
'BIGINT',
$field->getValidatorOption(Datatype::REQUIRED, 'value', false)
);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
<?php declare(strict_types=1);

namespace Modelarium\CodeGenerator\Typescript\DatatypeGenerator;

use Formularium\Field;
use Formularium\CodeGenerator\CodeGenerator;
use Formularium\CodeGenerator\DatatypeGenerator;
use Formularium\CodeGenerator\Typescript\CodeGenerator as TypescriptCodeGenerator;
use Modelarium\Datatypes\Datatype_relationship;

class DatatypeGenerator_relationship implements DatatypeGenerator
{
public function datatypeDeclaration(CodeGenerator $generator)
{
return '';
}

public function field(CodeGenerator $generator, Field $field)
{
/**
* @var Datatype_relationship
*/
$dt = $field->getDatatype();

/**
* @var TypescriptCodeGenerator $generator
*/
return $generator->fieldDeclaration($dt->getTarget(), $field->getName());
}
}
10 changes: 0 additions & 10 deletions Modelarium/Datatypes/Datatype_relationship.php
Original file line number Diff line number Diff line change
Expand Up @@ -73,16 +73,6 @@ public function getDefault()
return 0;
}

public function getSQLType(string $database = '', array $options = []): string
{
return 'BIGINT';
}

public function getLaravelSQLType(string $name, array $options = []): string
{
return "unsignedBigInteger(\"{$name}_id\")";
}

/**
* @return bool
*/
Expand Down
17 changes: 10 additions & 7 deletions Modelarium/Frontend/FrontendGenerator.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

namespace Modelarium\Frontend;

use Formularium\CodeGenerator\GraphQL\CodeGenerator as GraphQLCodeGenerator;
use Formularium\Element;
use Formularium\Field;
use Formularium\Framework;
Expand Down Expand Up @@ -368,6 +369,8 @@ protected function getFilters(): array

protected function makeGraphql(): void
{
$gcg = new GraphQLCodeGenerator();

/*
* card
*/
Expand All @@ -378,10 +381,10 @@ function (Field $field) {
$this->cardFields
);
$graphqlQuery = $this->fModel->mapFields(
function (Field $f) use ($cardFieldNames) {
function (Field $f) use ($cardFieldNames, $gcg) {
if (in_array($f->getName(), $cardFieldNames)) {
// TODO: filter subfields in relationships
return $f->toGraphqlQuery();
return $gcg->field($f);
}
return null;
}
Expand Down Expand Up @@ -450,10 +453,10 @@ function (Field $field) {
);

$graphqlQuery = $this->fModel->mapFields(
function (Field $f) use ($tableFieldNames) {
function (Field $f) use ($tableFieldNames, $gcg) {
if (in_array($f->getName(), $tableFieldNames)) {
// TODO: filter subfields in relationships
return $f->toGraphqlQuery();
return $gcg->field($f);
}
return null;
}
Expand Down Expand Up @@ -490,8 +493,8 @@ function (Field $f) use ($tableFieldNames) {
* item
*/
$graphqlQuery = $this->fModel->mapFields(
function (Field $f) {
return \Modelarium\Frontend\Util::fieldShow($f) ? $f->toGraphqlQuery() : null;
function (Field $f) use ($gcg) {
return \Modelarium\Frontend\Util::fieldShow($f) ? $gcg->field($f) : null;
}
);
$graphqlQuery = join("\n", array_filter($graphqlQuery));
Expand All @@ -501,7 +504,7 @@ function (Field $f) {
if ($this->keyAttribute === 'id') {
$keyAttributeType = 'ID';
} else {
$keyAttributeType = $this->fModel->getField($this->keyAttribute)->getDatatype()->getGraphqlType();
$keyAttributeType = $gcg->datatypeDeclaration($this->fModel->getField($this->keyAttribute)->getDatatype());
}

$itemQuery = <<<EOF
Expand Down
66 changes: 56 additions & 10 deletions Modelarium/Laravel/Targets/MigrationGenerator.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,12 @@

namespace Modelarium\Laravel\Targets;

use Formularium\CodeGenerator\LaravelEloquent\CodeGenerator as LaravelCodeGenerator;
use Formularium\Datatype;
use Formularium\Datatype\Datatype_enum;
use Formularium\Exception\ClassNotFoundException;
use Formularium\Factory\DatatypeFactory;
use Formularium\Field;
use Illuminate\Support\Str;
use GraphQL\Language\AST\DirectiveNode;
use GraphQL\Type\Definition\BooleanType;
Expand Down Expand Up @@ -150,42 +153,81 @@ protected function processBasetype(
): void {
$fieldName = $field->name;

$required = false;
if ($field->getType() instanceof NonNull) {
$required = true;
$type = $field->getType()->getWrappedType();
} else {
$type = $field->getType();
}

$codeFragment = new MigrationCodeFragment();
$lcg = new LaravelCodeGenerator();
$formulariumField = null;

if ($type instanceof IDType) {
$codeFragment->appendBase('$table->bigIncrements("id")');
} elseif ($type instanceof StringType) {
$codeFragment->appendBase('$table->string("' . $fieldName . '")');
$formulariumField = new Field(
$fieldName,
'string',
[],
[ Datatype::REQUIRED => ['value' => $required ] ]
);
} elseif ($type instanceof IntType) {
$codeFragment->appendBase('$table->integer("' . $fieldName . '")');
$formulariumField = new Field(
$fieldName,
'integer',
[],
[ Datatype::REQUIRED => ['value' => $required ] ]
);
} elseif ($type instanceof BooleanType) {
$codeFragment->appendBase('$table->boolean("' . $fieldName . '")');
$formulariumField = new Field(
$fieldName,
'boolean',
[],
[ Datatype::REQUIRED => ['value' => $required ] ]
);
} elseif ($type instanceof FloatType) {
$codeFragment->appendBase('$table->float("' . $fieldName . '")');
$formulariumField = new Field(
$fieldName,
'float',
[],
[ Datatype::REQUIRED => ['value' => $required ] ]
);
} elseif ($type instanceof EnumType) {
$this->processEnum($field, $type, $codeFragment);
} elseif ($type instanceof UnionType) {
return;
} elseif ($type instanceof CustomScalarType) {
$ourType = $this->parser->getScalarType($type->name);
if (!$ourType) {
throw new Exception("Null scalar type: " . get_class($type));
} elseif (!is_a($ourType, FormulariumScalarType::class) &&
!is_a($ourType, \Modelarium\Types\ScalarType::class)
) {
throw new Exception("Invalid extended scalar type: " . get_class($type));
}
$options = []; // TODO: from directives
$codeFragment->appendBase('$table->' . $ourType->getLaravelSQLType($fieldName, $options));
/**
* @var FormulariumScalarType $ourType
*/
$formulariumField = new Field(
$fieldName,
$ourType->getDatatype(),
[],
[ Datatype::REQUIRED => ['value' => $required ] ]
);
} elseif ($type instanceof ListOfType) {
throw new Exception("Invalid field type: " . get_class($type));
} else {
throw new Exception("Invalid field type: " . get_class($type));
}

if (!($field->getType() instanceof NonNull)) {

if ($formulariumField) {
$codeFragment->appendBase(
'$table->' . $lcg->field($formulariumField)
);
} elseif (!($field->getType() instanceof NonNull)) {
$codeFragment->appendBase('->nullable()');
}

Expand Down Expand Up @@ -279,8 +321,12 @@ function (ClassType $enumClass) use ($enumValues) {
$this->warn('Enum had its possible values changed. Please review the datatype class.');
}

$options = []; // TODO: from directives
$codeFragment->appendBase('$table->' . $ourType->getLaravelSQLType($fieldName, $options));
$lcg = new LaravelCodeGenerator();
$codeFragment->appendBase(
'$table->' . $lcg->field(
new Field($fieldName, $ourType->getDatatype())
)
);
}

/**
Expand Down
30 changes: 7 additions & 23 deletions Modelarium/Types/FormulariumScalarType.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,11 @@

namespace Modelarium\Types;

use Formularium\CodeGenerator\SQL\CodeGenerator as SQLCodeGenerator;
use Formularium\Datatype;
use Formularium\Factory\DatatypeFactory;
use Formularium\Exception\ValidatorException;
use Formularium\Field;
use GraphQL\Error\Error;

abstract class FormulariumScalarType extends ScalarType
Expand Down Expand Up @@ -82,7 +84,8 @@ public function parseLiteral($valueNode, array $variables = null)
*/
public function getGraphqlType(): string
{
return $this->datatype->getGraphqlType(); // TODO: studlycase?
$scg = new SQLCodeGenerator();
return $scg->datatypeDeclaration($this->datatype); // TODO: studlycase?
}

/**
Expand All @@ -95,27 +98,8 @@ public function getGraphqlType(): string
*/
public function getGraphqlField(string $name, array $params = []): string
{
return $this->datatype->getGraphqlField($name, $params); // TODO: studlycase?
}

/**
* Returns the suggested SQL type for this datatype, such as 'TEXT'.
*
* @param string $database The database
* @return string
*/
public function getSQLType(string $database = '', array $options = []): string
{
return $this->datatype->getSQLType($database, $options);
}

/**
* Returns the suggested Laravel Database type for this datatype.
*
* @return string
*/
public function getLaravelSQLType(string $name, array $options = []): string
{
return $this->datatype->getLaravelSQLType($name, $options);
$scg = new SQLCodeGenerator();
// TODO fix
return ''; // $scg->field(new Field($name)); // TODO: studlycase?
}
}
16 changes: 2 additions & 14 deletions Modelarium/Types/ScalarType.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,22 +2,10 @@

namespace Modelarium\Types;

use Formularium\Datatype;
use GraphQL\Type\Definition\CustomScalarType as GraphQLScalarType;

abstract class ScalarType extends GraphQLScalarType
{
/**
* Returns the suggested SQL type for this datatype, such as 'TEXT'.
*
* @param string $database The database
* @return string
*/
abstract public function getSQLType(string $database = '', array $options = []): string;

/**
* Returns the suggested Laravel Database type for this datatype.
*
* @return string
*/
abstract public function getLaravelSQLType(string $name, array $options = []): string;
abstract public function getDatatype(): Datatype;
}
2 changes: 0 additions & 2 deletions docs/laravel.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,6 @@ Here's an overview of what scaffolding is done for Laravel.

Migration file is generated for all types. Migration specific directives start with `@migration`. We try to support [most of the migration API](https://laravel.com/docs/7.x/migrations). If you miss anything send a PR or open an issue.

The `Datatype` classes declare a `getLaravelSQLType()` method, which maps it to the SQL migration code.

Any changes in the type will generate a `_patch_` migration. As of now patch files are generated but we do not generate the patch code. This is planned for a later version.

## Factories
Expand Down
3 changes: 0 additions & 3 deletions tests/Unit/FormulariumScalarTypeTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -18,8 +18,5 @@ public function testGet()
$scalarType = $parser->getScalarType('Year');
$this->assertInstanceOf(FormulariumScalarType::class, $scalarType);
$this->assertInstanceOf(Datatype::class, $scalarType->getDatatype());
$this->assertStringContainsString('INT', $scalarType->getSQLType());
$this->assertStringContainsString('year(', $scalarType->getLaravelSQLType('x'));
$this->assertStringContainsString('xxxx', $scalarType->getLaravelSQLType('xxxx'));
}
}
Loading

0 comments on commit 2ea9541

Please sign in to comment.