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