|
|
|
@ -56,6 +56,14 @@ class RouteConfig { |
|
|
|
|
/** @var string[] */ |
|
|
|
|
private $controllerNameCache = []; |
|
|
|
|
|
|
|
|
|
public const ROOT_URL_APPS = [ |
|
|
|
|
'cloud_federation_api', |
|
|
|
|
'core', |
|
|
|
|
'files_sharing', |
|
|
|
|
'files', |
|
|
|
|
'spreed', |
|
|
|
|
]; |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* @param \OC\AppFramework\DependencyInjection\DIContainer $container |
|
|
|
|
* @param \OCP\Route\IRouter $router |
|
|
|
@ -98,42 +106,7 @@ class RouteConfig { |
|
|
|
|
private function processOCS(array $routes): void { |
|
|
|
|
$ocsRoutes = $routes['ocs'] ?? []; |
|
|
|
|
foreach ($ocsRoutes as $ocsRoute) { |
|
|
|
|
$name = $ocsRoute['name']; |
|
|
|
|
$postfix = $ocsRoute['postfix'] ?? ''; |
|
|
|
|
$root = $ocsRoute['root'] ?? '/apps/' . $this->appName; |
|
|
|
|
|
|
|
|
|
$url = $root . $ocsRoute['url']; |
|
|
|
|
$verb = strtoupper($ocsRoute['verb'] ?? 'GET'); |
|
|
|
|
|
|
|
|
|
$split = explode('#', $name, 2); |
|
|
|
|
if (count($split) !== 2) { |
|
|
|
|
throw new \UnexpectedValueException('Invalid route name'); |
|
|
|
|
} |
|
|
|
|
list($controller, $action) = $split; |
|
|
|
|
|
|
|
|
|
$controllerName = $this->buildControllerName($controller); |
|
|
|
|
$actionName = $this->buildActionName($action); |
|
|
|
|
|
|
|
|
|
$routeName = 'ocs.' . $this->appName . '.' . $controller . '.' . $action . $postfix; |
|
|
|
|
|
|
|
|
|
// register the route |
|
|
|
|
$handler = new RouteActionHandler($this->container, $controllerName, $actionName); |
|
|
|
|
|
|
|
|
|
$router = $this->router->create($routeName, $url) |
|
|
|
|
->method($verb) |
|
|
|
|
->action($handler); |
|
|
|
|
|
|
|
|
|
// optionally register requirements for route. This is used to |
|
|
|
|
// tell the route parser how url parameters should be matched |
|
|
|
|
if (array_key_exists('requirements', $ocsRoute)) { |
|
|
|
|
$router->requirements($ocsRoute['requirements']); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// optionally register defaults for route. This is used to |
|
|
|
|
// tell the route parser how url parameters should be default valued |
|
|
|
|
if (array_key_exists('defaults', $ocsRoute)) { |
|
|
|
|
$router->defaults($ocsRoute['defaults']); |
|
|
|
|
} |
|
|
|
|
$this->processRoute($ocsRoute, 'ocs.'); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -145,53 +118,51 @@ class RouteConfig { |
|
|
|
|
private function processSimpleRoutes(array $routes): void { |
|
|
|
|
$simpleRoutes = $routes['routes'] ?? []; |
|
|
|
|
foreach ($simpleRoutes as $simpleRoute) { |
|
|
|
|
$name = $simpleRoute['name']; |
|
|
|
|
$postfix = $simpleRoute['postfix'] ?? ''; |
|
|
|
|
$this->processRoute($simpleRoute); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
$url = $simpleRoute['url']; |
|
|
|
|
$verb = strtoupper($simpleRoute['verb'] ?? 'GET'); |
|
|
|
|
protected function processRoute(array $route, string $routeNamePrefix = ''): void { |
|
|
|
|
$name = $route['name']; |
|
|
|
|
$postfix = $route['postfix'] ?? ''; |
|
|
|
|
$defaultRoot = $this->appName === 'core' ? '' : '/apps/' . $this->appName; |
|
|
|
|
$root = $route['root'] ?? $defaultRoot; |
|
|
|
|
if ($routeNamePrefix === '' && !\in_array($this->appName, self::ROOT_URL_APPS, true)) { |
|
|
|
|
// Only allow root URLS for some apps |
|
|
|
|
$root = $defaultRoot; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
$split = explode('#', $name, 2); |
|
|
|
|
if (count($split) !== 2) { |
|
|
|
|
throw new \UnexpectedValueException('Invalid route name'); |
|
|
|
|
} |
|
|
|
|
list($controller, $action) = $split; |
|
|
|
|
|
|
|
|
|
$controllerName = $this->buildControllerName($controller); |
|
|
|
|
$actionName = $this->buildActionName($action); |
|
|
|
|
$appName = $simpleRoute['app'] ?? $this->appName; |
|
|
|
|
|
|
|
|
|
if (isset($simpleRoute['app'])) { |
|
|
|
|
// Legacy routes that need to be globally available while they are handled by an app |
|
|
|
|
// E.g. '/f/{id}', '/s/{token}', '/call/{token}', … |
|
|
|
|
$controllerName = str_replace('controllerController', 'Controller', $controllerName); |
|
|
|
|
if ($controllerName === 'PublicpreviewController') { |
|
|
|
|
$controllerName = 'PublicPreviewController'; |
|
|
|
|
} elseif ($controllerName === 'RequesthandlerController') { |
|
|
|
|
$controllerName = 'RequestHandlerController'; |
|
|
|
|
} |
|
|
|
|
$controllerName = App::buildAppNamespace($appName) . '\\Controller\\' . $controllerName; |
|
|
|
|
} |
|
|
|
|
$url = $root . $route['url']; |
|
|
|
|
$verb = strtoupper($route['verb'] ?? 'GET'); |
|
|
|
|
|
|
|
|
|
$split = explode('#', $name, 2); |
|
|
|
|
if (count($split) !== 2) { |
|
|
|
|
throw new \UnexpectedValueException('Invalid route name'); |
|
|
|
|
} |
|
|
|
|
list($controller, $action) = $split; |
|
|
|
|
|
|
|
|
|
$routeName = $appName . '.' . $controller . '.' . $action . $postfix; |
|
|
|
|
$controllerName = $this->buildControllerName($controller); |
|
|
|
|
$actionName = $this->buildActionName($action); |
|
|
|
|
|
|
|
|
|
// register the route |
|
|
|
|
$handler = new RouteActionHandler($this->container, $controllerName, $actionName); |
|
|
|
|
$router = $this->router->create($routeName, $url) |
|
|
|
|
->method($verb) |
|
|
|
|
->action($handler); |
|
|
|
|
$routeName = $routeNamePrefix . $this->appName . '.' . $controller . '.' . $action . $postfix; |
|
|
|
|
|
|
|
|
|
// optionally register requirements for route. This is used to |
|
|
|
|
// tell the route parser how url parameters should be matched |
|
|
|
|
if (array_key_exists('requirements', $simpleRoute)) { |
|
|
|
|
$router->requirements($simpleRoute['requirements']); |
|
|
|
|
} |
|
|
|
|
// register the route |
|
|
|
|
$handler = new RouteActionHandler($this->container, $controllerName, $actionName); |
|
|
|
|
|
|
|
|
|
// optionally register defaults for route. This is used to |
|
|
|
|
// tell the route parser how url parameters should be default valued |
|
|
|
|
if (array_key_exists('defaults', $simpleRoute)) { |
|
|
|
|
$router->defaults($simpleRoute['defaults']); |
|
|
|
|
} |
|
|
|
|
$router = $this->router->create($routeName, $url) |
|
|
|
|
->method($verb) |
|
|
|
|
->action($handler); |
|
|
|
|
|
|
|
|
|
// optionally register requirements for route. This is used to |
|
|
|
|
// tell the route parser how url parameters should be matched |
|
|
|
|
if(array_key_exists('requirements', $route)) { |
|
|
|
|
$router->requirements($route['requirements']); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// optionally register defaults for route. This is used to |
|
|
|
|
// tell the route parser how url parameters should be default valued |
|
|
|
|
if(array_key_exists('defaults', $route)) { |
|
|
|
|
$router->defaults($route['defaults']); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|