Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
91.89% covered (success)
91.89%
34 / 37
77.78% covered (warning)
77.78%
7 / 9
CRAP
0.00% covered (danger)
0.00%
0 / 1
GetListAction
91.89% covered (success)
91.89%
34 / 37
77.78% covered (warning)
77.78%
7 / 9
14.10
0.00% covered (danger)
0.00%
0 / 1
 __construct
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 isAuthorized
71.43% covered (warning)
71.43%
5 / 7
0.00% covered (danger)
0.00%
0 / 1
4.37
 __invoke
92.86% covered (success)
92.86%
13 / 14
0.00% covered (danger)
0.00%
0 / 1
2.00
 getInputType
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 getOutputType
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 getPossibleActionResponseStatuses
100.00% covered (success)
100.00%
3 / 3
100.00% covered (success)
100.00%
1 / 1
1
 getDescription
100.00% covered (success)
100.00%
4 / 4
100.00% covered (success)
100.00%
1 / 1
2
 getTags
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 getRouteAttributes
100.00% covered (success)
100.00%
5 / 5
100.00% covered (success)
100.00%
1 / 1
1
1<?php
2namespace Apie\Common\Actions;
3
4use Apie\Common\Events\ApieResourceReadList;
5use Apie\Core\Actions\ActionInterface;
6use Apie\Core\Actions\ActionResponse;
7use Apie\Core\Actions\ActionResponseStatus;
8use Apie\Core\Actions\ActionResponseStatusList;
9use Apie\Core\Actions\ApieFacadeInterface;
10use Apie\Core\Attributes\Description;
11use Apie\Core\BoundedContext\BoundedContextId;
12use Apie\Core\Context\ApieContext;
13use Apie\Core\ContextConstants;
14use Apie\Core\Datalayers\Search\QuerySearch;
15use Apie\Core\Dto\ListOf;
16use Apie\Core\Entities\EntityInterface;
17use Apie\Core\Exceptions\InvalidTypeException;
18use Apie\Core\Lists\StringList;
19use LogicException;
20use ReflectionClass;
21
22/**
23 * Action to get a list of resources.
24 */
25final class GetListAction implements ActionInterface
26{
27    public function __construct(private readonly ApieFacadeInterface $apieFacade)
28    {
29    }
30
31    public static function isAuthorized(ApieContext $context, bool $runtimeChecks, bool $throwError = false): bool
32    {
33        $resourceName = $context->getContext(ContextConstants::RESOURCE_NAME, $throwError);
34        if (!$resourceName) {
35            return false;
36        }
37        try {
38            $refl = new ReflectionClass($resourceName);
39        } catch (\ReflectionException) {
40            return false;
41        }
42        return $context->appliesToContext($refl, $runtimeChecks, $throwError ? new LogicException("Class can not be accessed") : null);
43    }
44
45    /**
46     * @param array<string|int, mixed> $rawContents
47     */
48    public function __invoke(ApieContext $context, array $rawContents): ActionResponse
49    {
50        $context->withContext(ContextConstants::APIE_ACTION, __CLASS__)->checkAuthorization();
51        $resourceClass = $context->getContext(ContextConstants::RESOURCE_NAME);
52        if (!is_a($resourceClass, EntityInterface::class, true)) {
53            throw new InvalidTypeException($resourceClass, 'EntityInterface');
54        }
55        $resource =  $this->apieFacade->all(
56            $resourceClass,
57            new BoundedContextId($context->getContext(ContextConstants::BOUNDED_CONTEXT_ID))
58        );
59        $result = $resource->toPaginatedResult(QuerySearch::fromArray($rawContents, $context));
60        $context->dispatchEvent(new ApieResourceReadList(
61            $result,
62            $context
63        ));
64        return ActionResponse::createRunSuccess($this->apieFacade, $context, $result, $resource);
65    }
66
67    public static function getInputType(ReflectionClass $class): ReflectionClass
68    {
69        return $class;
70    }
71
72    public static function getOutputType(ReflectionClass $class): ListOf
73    {
74        return new ListOf($class);
75    }
76
77    public static function getPossibleActionResponseStatuses(): ActionResponseStatusList
78    {
79        return new ActionResponseStatusList([
80            ActionResponseStatus::SUCCESS
81        ]);
82    }
83
84    public static function getDescription(ReflectionClass $class): string
85    {
86        $description = 'Gets a list of resource that are an instance of ' . $class->getShortName();
87
88        foreach ($class->getAttributes(Description::class) as $attribute) {
89            $description .= '. ' . $attribute->newInstance()->description;
90        }
91
92        return $description;
93    }
94    
95    public static function getTags(ReflectionClass $class): StringList
96    {
97        return new StringList([$class->getShortName(), 'resource']);
98    }
99
100    public static function getRouteAttributes(ReflectionClass $class): array
101    {
102        return [
103            ContextConstants::GET_ALL_OBJECTS => true,
104            ContextConstants::GET_OBJECT => true,
105            ContextConstants::RESOURCE_NAME => $class->name,
106        ];
107    }
108}