Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
100.00% covered (success)
100.00%
31 / 31
100.00% covered (success)
100.00%
4 / 4
CRAP
100.00% covered (success)
100.00%
1 / 1
BoundedContext
100.00% covered (success)
100.00%
31 / 31
100.00% covered (success)
100.00%
4 / 4
14
100.00% covered (success)
100.00%
1 / 1
 __construct
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
2
 contains
100.00% covered (success)
100.00%
4 / 4
100.00% covered (success)
100.00%
1 / 1
3
 findRelatedClasses
100.00% covered (success)
100.00%
25 / 25
100.00% covered (success)
100.00%
1 / 1
8
 getId
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
1<?php
2namespace Apie\Core\BoundedContext;
3
4use Apie\Core\ApieLib;
5use Apie\Core\Entities\EntityInterface;
6use Apie\Core\Identifiers\IdentifierInterface;
7use Apie\Core\Lists\ReflectionClassList;
8use Apie\Core\Lists\ReflectionMethodList;
9use Apie\Core\Utils\ConverterUtils;
10use ReflectionClass;
11use ReflectionNamedType;
12
13final class BoundedContext implements EntityInterface
14{
15    public readonly BoundedContextId $id;
16
17    public function __construct(
18        BoundedContextId|string $id,
19        public readonly ReflectionClassList $resources,
20        public readonly ReflectionMethodList $actions,
21    ) {
22        $this->id = $id instanceof BoundedContextId ? $id : new BoundedContextId($id);
23    }
24
25    /**
26     * @param ReflectionClass<EntityInterface>|ReflectionClass<IdentifierInterface<EntityInterface>> $resourceClass
27     */
28    public function contains(ReflectionClass $resourceClass): bool
29    {
30        foreach ($this->resources as $resource) {
31            if ($resource->name === $resourceClass->name) {
32                return true;
33            }
34        }
35
36        return false;
37    }
38
39    public function findRelatedClasses(): ReflectionClassList
40    {
41        $list = [];
42        foreach ($this->resources as $resource) {
43            $list[$resource->name] = true;
44            // TODO: check classes
45        }
46        foreach ($this->actions as $action) {
47            $list[$action->getDeclaringClass()->name] = true;
48            $class = ConverterUtils::toReflectionClass($action->getReturnType());
49            if ($class !== null) {
50                $list[$class->name] = true;
51                if (ApieLib::hasAlias($class->name)) {
52                    $type = ConverterUtils::toReflectionType(
53                        ApieLib::getAlias($class->name)
54                    );
55                    // @phpstan-ignore method.notFound
56                    $types = ($type instanceof ReflectionNamedType) ? [$type] : $type->getTypes();
57                    foreach ($types as $type) {
58                        $class = ConverterUtils::toReflectionClass($type);
59                        if ($class !== null) {
60                            $list[$class->name] = true;
61                        }
62                    }
63                
64                }
65            }
66        }
67        return new ReflectionClassList(
68            array_map(
69                function (string $class) {
70                    return new ReflectionClass($class);
71                },
72                array_keys($list)
73            )
74        );
75    }
76
77    public function getId(): BoundedContextId
78    {
79        return $this->id;
80    }
81}