Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
100.00% covered (success)
100.00%
23 / 23
100.00% covered (success)
100.00%
1 / 1
CRAP
100.00% covered (success)
100.00%
1 / 1
AddAutoIdGenerator
100.00% covered (success)
100.00%
23 / 23
100.00% covered (success)
100.00%
1 / 1
6
100.00% covered (success)
100.00%
1 / 1
 run
100.00% covered (success)
100.00%
23 / 23
100.00% covered (success)
100.00%
1 / 1
6
1<?php
2namespace Apie\StorageMetadataBuilder\CodeGenerators;
3
4use Apie\Core\Identifiers\AutoIncrementInteger;
5use Apie\Core\Identifiers\KebabCaseSlug;
6use Apie\Core\Utils\ConverterUtils;
7use Apie\StorageMetadata\Attributes\OneToOneAttribute;
8use Apie\StorageMetadata\Interfaces\AutoIncrementTableInterface;
9use Apie\StorageMetadataBuilder\Interfaces\RunGeneratedCodeContextInterface;
10use Apie\StorageMetadataBuilder\Mediators\GeneratedCodeContext;
11use Nette\PhpGenerator\ClassType;
12
13/**
14 * Maps auto increment value objects. This is done with an additional table that just contains id's.
15 */
16class AddAutoIdGenerator implements RunGeneratedCodeContextInterface
17{
18    public function run(GeneratedCodeContext $generatedCodeContext): void
19    {
20        $property = $generatedCodeContext->getCurrentProperty();
21        $currentTable = $generatedCodeContext->getCurrentTable();
22        if ($property === null || $currentTable === null) {
23            return;
24        }
25        $class = ConverterUtils::toReflectionClass($property);
26        if ($class === null) {
27            return;
28        }
29        if ($class->isSubclassOf(AutoIncrementInteger::class) || $class->name === AutoIncrementInteger::class) {
30            $propertyName = 'apie_'
31                . str_replace('-', '_', (string) KebabCaseSlug::fromClass($property->getDeclaringClass()))
32                . '_'
33                . str_replace('-', '_', (string) KebabCaseSlug::fromClass($property));
34            $type = $generatedCodeContext->getPrefix('apie_increment_');
35            $autoIncrementData = new ClassType($type);
36            $autoIncrementData->addImplement(AutoIncrementTableInterface::class);
37            $autoIncrementData->addMethod('getKey')
38                ->setReturnType('?int')
39                ->setBody('return $this->id;');
40
41            $autoIncrementData->addProperty('id')->setType('?int');
42            $generatedCodeContext->generatedCode->generatedCodeHashmap[$type] = $autoIncrementData;
43            $currentTable->addProperty($propertyName)
44                ->setType($type)
45                ->addAttribute(OneToOneAttribute::class, [$property->name]);
46        }
47    }
48}