Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
97.22% covered (success)
97.22%
35 / 36
50.00% covered (danger)
50.00%
1 / 2
CRAP
0.00% covered (danger)
0.00%
0 / 1
CmsRouteDefinitionProvider
97.22% covered (success)
97.22%
35 / 36
50.00% covered (danger)
50.00%
1 / 2
13
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
 getActionsForBoundedContext
97.14% covered (success)
97.14%
34 / 35
0.00% covered (danger)
0.00%
0 / 1
12
1<?php
2namespace Apie\Cms\RouteDefinitions;
3
4use Apie\CmsApiDropdownOption\RouteDefinitions\DropdownOptionsForExistingObjectRouteDefinition;
5use Apie\CmsApiDropdownOption\RouteDefinitions\DropdownOptionsForGlobalMethodRouteDefinition;
6use Apie\CmsApiDropdownOption\RouteDefinitions\DropdownOptionsForNewObjectRouteDefinition;
7use Apie\Common\ActionDefinitionProvider;
8use Apie\Common\ActionDefinitions\CreateResourceActionDefinition;
9use Apie\Common\ActionDefinitions\ModifyResourceActionDefinition;
10use Apie\Common\ActionDefinitions\ReplaceResourceActionDefinition;
11use Apie\Common\ActionDefinitions\RunGlobalMethodDefinition;
12use Apie\Common\Interfaces\RouteDefinitionProviderInterface;
13use Apie\Common\RouteDefinitions\ActionHashmap;
14use Apie\Core\BoundedContext\BoundedContext;
15use Apie\Core\Context\ApieContext;
16use Psr\Log\LoggerInterface;
17
18class CmsRouteDefinitionProvider implements RouteDefinitionProviderInterface
19{
20    private const CLASSES = [
21        CreateResourceFormRouteDefinition::class,
22        CreateResourceCommitRouteDefinition::class,
23        DisplayResourceRouteDefinition::class,
24        DisplayResourceOverviewRouteDefinition::class,
25        ModifyResourceFormRouteDefinition::class,
26        ModifyResourceCommitRouteDefinition::class,
27        RemoveResourceFormRouteDefinition::class,
28        RemoveResourceFormCommitRouteDefinition::class,
29        RunGlobalMethodCommitRouteDefinition::class,
30        RunGlobalMethodFormRouteDefinition::class,
31        RunMethodCallOnSingleResourceCommitRouteDefinition::class,
32        RunMethodCallOnSingleResourceFormRouteDefinition::class,
33        StreamMethodCallOnSingleResourceRouteDefinition::class,
34    ];
35
36    public function __construct(
37        private ActionDefinitionProvider $actionDefinitionProvider,
38        private LoggerInterface $logger,
39    ) {
40    }
41
42    public function getActionsForBoundedContext(BoundedContext $boundedContext, ApieContext $apieContext): ActionHashmap
43    {
44        $routes = [];
45        $definition = new DashboardRouteDefinition($boundedContext->getId());
46        $routes[$definition->getOperationId()] = $definition;
47        $definition = new LastActionResultRouteDefinition($boundedContext->getId());
48        $routes[$definition->getOperationId()] = $definition;
49
50        foreach ($this->actionDefinitionProvider->provideActionDefinitions($boundedContext, $apieContext) as $actionDefinition) {
51            $found = false;
52            foreach (self::CLASSES as $routeDefinitionClass) {
53                $routeDefinition = $routeDefinitionClass::createFrom($actionDefinition);
54                if ($routeDefinition) {
55                    $routes[$routeDefinition->getOperationId()] = $routeDefinition;
56                    $found = true;
57                }
58            }
59            if (class_exists(DropdownOptionsForNewObjectRouteDefinition::class) &&
60                ($actionDefinition instanceof CreateResourceActionDefinition || $actionDefinition instanceof ReplaceResourceActionDefinition)) {
61                $routeDefinition = new DropdownOptionsForNewObjectRouteDefinition(
62                    $actionDefinition->getResourceName(),
63                    $actionDefinition->getBoundedContextId(),
64                );
65                $routes[$routeDefinition->getOperationId()] = $routeDefinition;
66            }
67            if (class_exists(DropdownOptionsForExistingObjectRouteDefinition::class) && $actionDefinition instanceof ModifyResourceActionDefinition) {
68                $routeDefinition = new DropdownOptionsForExistingObjectRouteDefinition(
69                    $actionDefinition->getResourceName(),
70                    $actionDefinition->getBoundedContextId(),
71                );
72                $routes[$routeDefinition->getOperationId()] = $routeDefinition;
73            }
74            if (class_exists(DropdownOptionsForGlobalMethodRouteDefinition::class) && $actionDefinition instanceof RunGlobalMethodDefinition) {
75                $routeDefinition = new DropdownOptionsForGlobalMethodRouteDefinition(
76                    $actionDefinition->getMethod()->getDeclaringClass(),
77                    $actionDefinition->getBoundedContextId(),
78                    $actionDefinition->getMethod(),
79                );
80                $routes[$routeDefinition->getOperationId()] = $routeDefinition;
81            }
82            if (!$found) {
83                $this->logger->debug('No route definition created for ' . get_debug_type($actionDefinition));
84            }
85        }
86
87        return new ActionHashmap($routes);
88    }
89}