Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
85.29% covered (warning)
85.29%
29 / 34
77.78% covered (warning)
77.78%
7 / 9
CRAP
0.00% covered (danger)
0.00%
0 / 1
CodeGeneratedLog
85.29% covered (warning)
85.29%
29 / 34
77.78% covered (warning)
77.78%
7 / 9
14.62
0.00% covered (danger)
0.00%
0 / 1
 __construct
70.00% covered (warning)
70.00%
7 / 10
0.00% covered (danger)
0.00%
0 / 1
3.24
 getId
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 getDate
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 getOverwriteStrategy
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 getErrorMessage
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 getErrorStacktrace
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 getTargetPath
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 getTargetNamespace
60.00% covered (warning)
60.00%
3 / 5
0.00% covered (danger)
0.00%
0 / 1
3.58
 createRandom
100.00% covered (success)
100.00%
13 / 13
100.00% covered (success)
100.00%
1 / 1
2
1<?php
2
3namespace Apie\Maker\BoundedContext\Resources;
4
5use Apie\Core\ApieLib;
6use Apie\Core\Attributes\CmsIcon;
7use Apie\Core\Attributes\Context;
8use Apie\Core\Attributes\FakeCount;
9use Apie\Core\Attributes\FakeMethod;
10use Apie\Core\Attributes\HideIdOnOverview;
11use Apie\Core\Attributes\Internal;
12use Apie\Core\Attributes\Not;
13use Apie\Core\Attributes\Requires;
14use Apie\Core\Attributes\RuntimeCheck;
15use Apie\Core\BoundedContext\BoundedContext;
16use Apie\Core\ContextConstants;
17use Apie\Core\Datalayers\ApieDatalayer;
18use Apie\Core\Entities\EntityInterface;
19use Apie\Maker\BoundedContext\Identifiers\CodeGeneratedLogIdentifier;
20use Apie\Maker\BoundedContext\Interfaces\CodeWriterConfigurationInterface;
21use Apie\Maker\BoundedContext\Services\CodeWriter;
22use Apie\Maker\Enums\OverwriteStrategy;
23use Apie\Maker\Utils;
24use DateTimeImmutable;
25use Exception;
26use Faker\Generator;
27use ReflectionClass;
28use Throwable;
29
30#[FakeCount(0)]
31#[HideIdOnOverview]
32#[CmsIcon('lineicons:code-s')]
33#[FakeMethod('createRandom')]
34class CodeGeneratedLog implements EntityInterface, CodeWriterConfigurationInterface
35{
36    private CodeGeneratedLogIdentifier $id;
37
38    private DateTimeImmutable $date;
39
40    private ?string $errorMessage = null;
41
42    private ?string $errorStacktrace = null;
43
44    public function __construct(
45        private OverwriteStrategy $strategy,
46        #[Context()] ApieDatalayer $apieDatalayer,
47        #[Context()] BoundedContext $boundedContext,
48        #[Context()] CodeWriter $codeWriter,
49        #[Context(Utils::MAKER_CONFIG)] private array $makerConfig
50    ) {
51        $this->id = CodeGeneratedLogIdentifier::createRandom();
52        $this->date = ApieLib::getPsrClock()->now();
53        try {
54            $codeWriter->startWriting($this);
55            foreach ($apieDatalayer->all(new ReflectionClass(ResourceDefinition::class), $boundedContext->getId()) as $resourceDefinition) {
56                $boundedContextDefinition = $apieDatalayer->find($resourceDefinition->boundedContextId, $boundedContext->getId());
57                $codeWriter->writeResource($this, $resourceDefinition, $boundedContextDefinition);
58                $codeWriter->writeIdentifier($this, $resourceDefinition, $boundedContextDefinition);
59            }
60        } catch (Throwable $error) {
61            $this->errorMessage = $error->getMessage();
62            $this->errorStacktrace = $error->getTraceAsString();
63        }
64    }
65
66    public function getId(): CodeGeneratedLogIdentifier
67    {
68        return $this->id;
69    }
70
71    public function getDate(): DateTimeImmutable
72    {
73        return $this->date;
74    }
75
76    public function getOverwriteStrategy(): OverwriteStrategy
77    {
78        return $this->strategy;
79    }
80
81    public function getErrorMessage(): ?string
82    {
83        return $this->errorMessage;
84    }
85
86    #[RuntimeCheck(new Not(new Requires(ContextConstants::GET_ALL_OBJECTS)))]
87    public function getErrorStacktrace(): ?string
88    {
89        return $this->errorStacktrace;
90    }
91
92    #[RuntimeCheck(new Not(new Requires(ContextConstants::GET_ALL_OBJECTS)))]
93    public function getTargetPath(): string|false|null
94    {
95        return $this->makerConfig['target_path'] ?? null;
96    }
97
98    #[RuntimeCheck(new Not(new Requires(ContextConstants::GET_ALL_OBJECTS)))]
99    public function getTargetNamespace(string $sub = ''): ?string
100    {
101        if (!isset($this->makerConfig['target_namespace'])) {
102            return null;
103        }
104        if ($sub === '') {
105            return rtrim($this->makerConfig['target_namespace'], '\\');
106        }
107        return rtrim($this->makerConfig['target_namespace'], '\\') . '\\' . ltrim($sub, '\\');
108    }
109
110    #[Internal]
111    public static function createRandom(Generator $faker): self
112    {
113        $res = (new ReflectionClass(__CLASS__))->newInstanceWithoutConstructor();
114        $res->id = $faker->fakeClass(CodeGeneratedLogIdentifier::class);
115        $res->date = $faker->fakeClass(DateTimeImmutable::class);
116        $res->strategy = $faker->fakeClass(OverwriteStrategy::class);
117        if ($faker->boolean()) {
118            $exception = new Exception($faker->text(30));
119            //$exception = $faker->fakeClass(Exception::class);
120            $res->errorMessage = $exception->getMessage();
121            $res->errorStacktrace = $exception->getTraceAsString();
122        } else {
123            $res->errorMessage = $res->errorStacktrace = null;
124        }
125        $res->makerConfig = [
126            'dummy' => $faker->languageCode()
127        ];
128        return $res;
129    }
130}