Lines 96.15% 25 / 26
Methods 75.00% 3 / 4
Classes 0.00% 0 / 1
Covered by tests of size
Name Lines Methods CRAP
 __construct 100.00% 1 / 1 100.00% 1 / 1 1
 build 100.00% 1 / 1 100.00% 1 / 1 1
 loadAttributeRoutes 87.50% 7 / 8 0.00% 0 / 1 3.02
 getControllerDirectories 100.00% 16 / 16 100.00% 1 / 1 6
31class RouteCollectionBuilder
32{
33    private AttributeRouteLoader $attributeLoader;
34
35    public function __construct(
36        private readonly ?Configuration $configuration = null,
37    ) {
38        $this->attributeLoader = new AttributeRouteLoader();
39    }
40
41    /**
42     * Build a RouteCollection for the specified context.
43     *
44     * @param string $context The routing context ('public', 'admin', 'admin-api', 'api')
45     * @param bool $attributesOnly Deprecated parameter kept for backward compatibility (always true now)
46     * @return RouteCollection The route collection loaded from controller attributes
47     */
48    public function build(string $context, bool $attributesOnly = true): RouteCollection
49    {
50        // Load routes from controller attributes
51        return $this->loadAttributeRoutes($context);
52    }
53
54    /**
55     * Load routes from controller attributes.
56     *
57     * @param string $context The routing context
58     * @return RouteCollection The attribute-based routes
59     */
60    private function loadAttributeRoutes(string $context): RouteCollection
61    {
62        $controllerDirs = $this->getControllerDirectories($context);
63        $routes = new RouteCollection();
64
65        foreach ($controllerDirs as $dir) {
66            if (!is_dir($dir)) {
67                continue;
68            }
69
70            $dirRoutes = $this->attributeLoader->load($dir, $context);
71            $routes->addCollection($dirRoutes);
72        }
73
74        return $routes;
75    }
76
77    /**
78     * Get controller directories for the specified context.
79     *
80     * @param string $context The routing context
81     * @return array<string> Array of controller directory paths
82     */
83    private function getControllerDirectories(string $context): array
84    {
85        $baseDir = PMF_SRC_DIR . '/phpMyFAQ/Controller';
86
87        return match ($context) {
88            'public' => [
89                $baseDir . '/Frontend',
90            ],
91            'admin' => [
92                $baseDir . '/Administration',
93            ],
94            'admin-api' => [
95                $baseDir . '/Administration/Api',
96            ],
97            'api' => [
98                $baseDir . '/Api',
99                $baseDir . '/Frontend/Api',
100            ],
101            default => [$baseDir],
102        };
103    }
104}