<?php
namespace Nellapp\Bundle\SDKBundle\Permission\Routing\Loader;
use Nellapp\Bundle\SDKBundle\Permission\ChannelUserPermissionManager;
use Nellapp\Bundle\SDKBundle\Permission\Controller\Crud\DeleteAction;
use Nellapp\Bundle\SDKBundle\Permission\Controller\Crud\EditAction;
use Nellapp\Bundle\SDKBundle\Permission\Controller\Crud\IndexAction;
use Nellapp\Bundle\SDKBundle\Permission\Controller\Crud\NewAction;
use Nellapp\Bundle\SDKBundle\Permission\Entity\ChannelResourceInterface;
use Symfony\Component\Config\Loader\Loader;
use Symfony\Component\Routing\Route;
use Symfony\Component\Routing\RouteCollection;
class ChannelUserPermissionResourceCrudLoader extends Loader
{
public function __construct(
private ChannelUserPermissionManager $channelUserPermissionManager,
string $env = null,
) {
parent::__construct($env);
}
public function load($resource, string $type = null): RouteCollection
{
if (!class_exists($resource)) {
throw new \LogicException(sprintf(
'The given resource "%s" for "channel_user_permission_resource_crud" must be an existing class.',
$resource,
));
}
if (!is_subclass_of($resource, ChannelResourceInterface::class)) {
throw new \LogicException(sprintf(
'The given resource "%s" for "channel_user_permission_resource_crud" must implements %s',
$resource,
ChannelResourceInterface::class
));
}
if (null === $resource::getPermissionResourceClass()) {
throw new \LogicException(sprintf(
'No permission class defined for resource "%s".',
$resource::class,
));
}
// Throw exception if cannot find valid repositories.
$repository = $this->channelUserPermissionManager->getChannelPermissionResourceRepository($resource::getPermissionResourceClass());
if (!$repository) {
throw new \LogicException(sprintf(
'Cannot find any repository for permission "%s".',
$resource::getPermissionResourceClass(),
));
}
$routes = new RouteCollection();
$permissionClass = $resource::getPermissionResourceClass();
// Index route.
$routes->add('index', new Route('', [
'_controller' => IndexAction::class,
'_permission_class' => $permissionClass,
], methods: ['GET', 'POST']));
// New route.
$routes->add('new', new Route('/new/{channelUserDataId}', [
'_controller' => NewAction::class,
'_permission_class' => $permissionClass,
], methods: ['GET', 'POST']));
// Edit route.
$routes->add('edit', new Route('/edit/{channelUserDataId}', [
'_controller' => EditAction::class,
'_permission_class' => $permissionClass,
], methods: ['GET', 'POST']));
// Delete route.
$routes->add('delete', new Route('/delete/{channelUserDataId}', [
'_controller' => DeleteAction::class,
'_permission_class' => $permissionClass,
], methods: ['GET']));
$routes->addPrefix('/{resourceId}/permissions');
return $routes;
}
public function supports($resource, string $type = null): bool
{
return 'channel_user_permission_resource_crud' === $type;
}
}