diff --git a/config/app.yaml b/config/app.yaml index e8bcbad..1888eff 100644 --- a/config/app.yaml +++ b/config/app.yaml @@ -31,20 +31,11 @@ knpu_oauth2_client: redirect_route: 'connect_admin_microsoft_check' redirect_params: {} -#TODO: a faire dans le plugin -sylius_resource: - resources: - app.authorized_domain: - classes: - model: Synolia\SyliusAdminOauthPlugin\Entity\Domain\AuthorizedDomain - repository: Synolia\SyliusAdminOauthPlugin\Repository\AuthorizedDomainRepository - form: Synolia\SyliusAdminOauthPlugin\Form\Type\AuthorizedDomainType - winzou_state_machine: - app_authorized_domain: - class: "%app.model.authorized_domain.class%" + synolia_admin_oauth_authorized_domain: + class: "%synolia_admin_oauth.model.authorized_domain.class%" property_path: isEnabled - graph: app_authorized_domain + graph: synolia_admin_oauth_authorized_domain state_machine_class: "%sylius.state_machine.class%" states: new: ~ @@ -55,10 +46,10 @@ winzou_state_machine: to: enabled sylius_grid: grids: - app_admin_authorized_domain: + synolia_admin_oauth_authorized_domain: driver: options: - class: Synolia\SyliusAdminOauthPlugin\Entity\Domain\AuthorizedDomain + class: "%synolia_admin_oauth.model.authorized_domain.class%" sorting: name: asc isEnabled: asc diff --git a/config/routes.yaml b/config/routes.yaml index 5c40b4b..b0bde93 100644 --- a/config/routes.yaml +++ b/config/routes.yaml @@ -4,17 +4,18 @@ controllers: namespace: Synolia\SyliusAdminOauthPlugin\Controller type: attribute -app_admin_authorized_domain: +synolia_admin_oauth_authorized_domain: resource: | - alias: app.authorized_domain + alias: synolia_admin_oauth.authorized_domain section: admin templates: "@SyliusAdmin\\Crud" redirect: index - grid: app_admin_authorized_domain + grid: synolia_admin_oauth_authorized_domain vars: all: - header: app.ui.authorized_domains_title - subheader: app.ui.authorized_domains_subheader + header: synolia.sylius_admin_oauth.ui.authorized_domains.title + subheader: synolia.sylius_admin_oauth.ui.authorized_domains.subheader + breadcrumb: synolia.sylius_admin_oauth.ui.authorized_domains.menu_label index: icon: 'file image outline' type: sylius.resource diff --git a/dev/phpstan.neon b/dev/phpstan.neon index 785ab19..36aae90 100644 --- a/dev/phpstan.neon +++ b/dev/phpstan.neon @@ -9,6 +9,7 @@ parameters: - ../vendor/autoload.php excludePaths: - '../src/DependencyInjection/Configuration.php' + - '../src/DependencyInjection/SynoliaSyliusAdminOauthExtension.php' - '../src/Factory/AdminUserFactory.php' ignoreErrors: - identifier: missingType.iterableValue diff --git a/src/DependencyInjection/Configuration.php b/src/DependencyInjection/Configuration.php index 2d400e1..4835473 100644 --- a/src/DependencyInjection/Configuration.php +++ b/src/DependencyInjection/Configuration.php @@ -4,13 +4,63 @@ namespace Synolia\SyliusAdminOauthPlugin\DependencyInjection; +use Sylius\Bundle\ResourceBundle\Controller\ResourceController; +use Sylius\Bundle\ResourceBundle\SyliusResourceBundle; +use Sylius\Component\Resource\Factory\Factory; +use Symfony\Component\Config\Definition\Builder\ArrayNodeDefinition; use Symfony\Component\Config\Definition\Builder\TreeBuilder; use Symfony\Component\Config\Definition\ConfigurationInterface; +use Synolia\SyliusAdminOauthPlugin\Entity\Domain\AuthorizedDomain; +use Synolia\SyliusAdminOauthPlugin\Entity\Domain\AuthorizedDomainInterface; +use Synolia\SyliusAdminOauthPlugin\Form\Type\AuthorizedDomainType; +use Synolia\SyliusAdminOauthPlugin\Repository\AuthorizedDomainRepository; final class Configuration implements ConfigurationInterface { public function getConfigTreeBuilder(): TreeBuilder { - return new TreeBuilder('synolia_sylius_admin_oauth_plugin'); + $treeBuilder = new TreeBuilder('synolia_sylius_admin_oauth_plugin'); + $rootNode = $treeBuilder->getRootNode(); + $rootNode + ->addDefaultsIfNotSet() + ->children() + ->scalarNode('driver') + ->defaultValue(SyliusResourceBundle::DRIVER_DOCTRINE_ORM) + ->end() + ->end() + ; + + $this->addResourceSection($rootNode); + + return $treeBuilder; + } + + private function addResourceSection(ArrayNodeDefinition $node): void + { + $node + ->children() + ->arrayNode('resources') + ->addDefaultsIfNotSet() + ->children() + ->arrayNode('authorized_domain') + ->addDefaultsIfNotSet() + ->children() + ->arrayNode('classes') + ->addDefaultsIfNotSet() + ->children() + ->scalarNode('model')->defaultValue(AuthorizedDomain::class)->cannotBeEmpty()->end() + ->scalarNode('interface')->defaultValue(AuthorizedDomainInterface::class)->cannotBeEmpty()->end() + ->scalarNode('controller')->defaultValue(ResourceController::class)->end() + ->scalarNode('repository')->defaultValue(AuthorizedDomainRepository::class)->cannotBeEmpty()->end() + ->scalarNode('factory')->defaultValue(Factory::class)->end() + ->scalarNode('form')->defaultValue(AuthorizedDomainType::class)->end() + ->end() + ->end() + ->end() + ->end() + ->end() + ->end() + ->end() + ; } } diff --git a/src/DependencyInjection/SynoliaSyliusAdminOauthExtension.php b/src/DependencyInjection/SynoliaSyliusAdminOauthExtension.php index 641f684..f7d48b4 100644 --- a/src/DependencyInjection/SynoliaSyliusAdminOauthExtension.php +++ b/src/DependencyInjection/SynoliaSyliusAdminOauthExtension.php @@ -10,6 +10,7 @@ use Symfony\Component\DependencyInjection\ContainerBuilder; use Symfony\Component\DependencyInjection\Extension\PrependExtensionInterface; use Symfony\Component\DependencyInjection\Loader\YamlFileLoader; +use Synolia\SyliusAdminOauthPlugin\Entity\Domain\AuthorizedDomain; final class SynoliaSyliusAdminOauthExtension extends AbstractResourceExtension implements PrependExtensionInterface { @@ -20,12 +21,20 @@ final class SynoliaSyliusAdminOauthExtension extends AbstractResourceExtension i */ public function load(array $configs, ContainerBuilder $container): void { + $config = $this->processConfiguration(new Configuration(), $configs); + $this->registerResources( + 'synolia_admin_oauth', + $config['driver'], + $config['resources'], + $container + ); $loader = new YamlFileLoader($container, new FileLocator(\dirname(__DIR__, 2) . '/config')); $loader->load('services.yaml'); } public function prepend(ContainerBuilder $container): void { + $container->setParameter('synolia_admin_oauth.model.authorized_domain.class', AuthorizedDomain::class); $this->prependDoctrineMigrations($container); } diff --git a/src/Entity/Domain/AuthorizedDomain.php b/src/Entity/Domain/AuthorizedDomain.php index 59c1cdd..6ca1a7c 100644 --- a/src/Entity/Domain/AuthorizedDomain.php +++ b/src/Entity/Domain/AuthorizedDomain.php @@ -16,7 +16,7 @@ class AuthorizedDomain implements ResourceInterface #[ORM\Id] #[ORM\GeneratedValue] #[ORM\Column(type: Types::INTEGER)] - private int $id; + private ?int $id = null; #[ORM\Column(type: Types::STRING, nullable: false)] private string $name; @@ -24,7 +24,7 @@ class AuthorizedDomain implements ResourceInterface #[ORM\Column(name: 'is_enabled', type: Types::BOOLEAN)] private bool $isEnabled = false; - public function getId(): int + public function getId(): ?int { return $this->id; } @@ -51,7 +51,7 @@ public function setName(string $name): self return $this; } - public function setIsEnabled(bool $isEnabled): self + public function setEnabled(bool $isEnabled): self { $this->isEnabled = $isEnabled; diff --git a/src/Entity/Domain/AuthorizedDomainInterface.php b/src/Entity/Domain/AuthorizedDomainInterface.php new file mode 100644 index 0000000..20c6ac7 --- /dev/null +++ b/src/Entity/Domain/AuthorizedDomainInterface.php @@ -0,0 +1,19 @@ +add('name', TextType::class, [ - 'label' => 'app.form.authorized_domains.name', + 'label' => 'synolia.sylius_admin_oauth.form.authorized_domains.name', ]) - ->add('isEnabled', CheckboxType::class, [ - 'label' => 'app.form.authorized_domains.authorize', + ->add('enabled', CheckboxType::class, [ + 'label' => 'synolia.sylius_admin_oauth.form.authorized_domains.authorize', ]) ; } public function getBlockPrefix(): string { - return 'authorized_domain'; + return 'synolia_admin_oauth_authorized_domain'; } } diff --git a/src/Listener/Menu/AdminMenuListener.php b/src/Listener/Menu/AdminMenuListener.php index 9af982b..650ed56 100644 --- a/src/Listener/Menu/AdminMenuListener.php +++ b/src/Listener/Menu/AdminMenuListener.php @@ -17,8 +17,8 @@ public function addAdminMenuItems(MenuBuilderEvent $event): void $newSubmenu = $menu->getChild('configuration'); $newSubmenu - ?->addChild('authorized_domain', ['route' => 'app_admin_authorized_domain_index']) - ->setLabel('sylius.ui.admin.menu.oauth_submenu_label') + ?->addChild('authorized_domain', ['route' => 'synolia_admin_oauth_admin_authorized_domain_index']) + ->setLabel('synolia.sylius_admin_oauth.ui.admin.menu.oauth_submenu_label') ->setLabelAttribute('icon', 'cube') ; } diff --git a/src/Repository/AuthorizedDomainRepository.php b/src/Repository/AuthorizedDomainRepository.php index 691d924..17ebe1f 100644 --- a/src/Repository/AuthorizedDomainRepository.php +++ b/src/Repository/AuthorizedDomainRepository.php @@ -4,6 +4,7 @@ namespace Synolia\SyliusAdminOauthPlugin\Repository; +use Doctrine\ORM\EntityManagerInterface; use Sylius\Bundle\ResourceBundle\Doctrine\ORM\EntityRepository; use Synolia\SyliusAdminOauthPlugin\Entity\Domain\AuthorizedDomain; @@ -15,6 +16,11 @@ */ final class AuthorizedDomainRepository extends EntityRepository { + public function __construct(EntityManagerInterface $entityManager) + { + parent::__construct($entityManager, $entityManager->getClassMetadata(AuthorizedDomain::class)); + } + public function save(AuthorizedDomain $entity, bool $flush = false): void { $this->getEntityManager()->persist($entity); diff --git a/src/Security/Authenticator/OauthAuthenticator.php b/src/Security/Authenticator/OauthAuthenticator.php index 2971d3f..fed0c8f 100644 --- a/src/Security/Authenticator/OauthAuthenticator.php +++ b/src/Security/Authenticator/OauthAuthenticator.php @@ -80,9 +80,9 @@ public function authenticate(Request $request): Passport new UserBadge($accessToken->getToken(), function () use ($user) { Assert::isInstanceOf($this->oauthClient, OauthClient::class); $domains = $this->authorizedDomainRepository->findBy(['isEnabled' => true]); - // If there's no domains, login with plugin is disabled... + // If there are no domains, login with plugin is disabled... if (0 === \count($domains)) { - $translatedMessage = $this->translator->trans('sylius.oauth_authentication.no_configured_domain'); + $translatedMessage = $this->translator->trans('synolia.sylius_admin_oauth.oauth_authentication.no_configured_domain'); throw new AuthenticationException($translatedMessage); } // ...else connect compared to authorized domains @@ -91,7 +91,7 @@ public function authenticate(Request $request): Passport return $this->createOauthUserIfDomainCorrespond($user, $domain); } } - $translatedMessage = $this->translator->trans('sylius.oauth_authentication.domain_error'); + $translatedMessage = $this->translator->trans('synolia.sylius_admin_oauth.oauth_authentication.domain_error'); throw new AuthenticationException($translatedMessage); }) ); diff --git a/templates/state.html.twig b/templates/state.html.twig index 2a489d8..61698cc 100644 --- a/templates/state.html.twig +++ b/templates/state.html.twig @@ -1,10 +1,4 @@ -{% if data == 1 %} - {% set data = 'true_label' %} -{% else %} - {% set data = 'false_label' %} -{% endif %} - -{% set value = 'sylius.ui.' ~ data %} +{% set value = 'synolia.sylius_admin_oauth.ui.' ~ (data is same as true ? 'yes' : 'no') %} {% if options.vars.labels is defined %} {% include [(options.vars.labels ~ '/' ~ data ~ '.html.twig'), '@SyliusUi/Label/_default.html.twig'] with {'value': value} %} diff --git a/tests/PHPUnit/AccessToAdminAreaTest.php b/tests/PHPUnit/AccessToAdminAreaTest.php index 0015b77..2bd130b 100644 --- a/tests/PHPUnit/AccessToAdminAreaTest.php +++ b/tests/PHPUnit/AccessToAdminAreaTest.php @@ -41,7 +41,7 @@ public function testAccessOAuthConfigPageInAdmin(): void { /** @var UrlGeneratorInterface $urlGenerator */ $urlGenerator = self::getContainer()->get(UrlGeneratorInterface::class); - $url = $urlGenerator->generate('app_admin_authorized_domain_index'); + $url = $urlGenerator->generate('synolia_admin_oauth_admin_authorized_domain_index'); $this->adminLogin(); $this->client->request('GET', $url); diff --git a/translations/flashes.en.yaml b/translations/flashes.en.yaml deleted file mode 100644 index e69de29..0000000 diff --git a/translations/flashes.fr.yaml b/translations/flashes.fr.yaml deleted file mode 100644 index e69de29..0000000 diff --git a/translations/messages.en.yaml b/translations/messages.en.yaml index 87abeac..554ca45 100644 --- a/translations/messages.en.yaml +++ b/translations/messages.en.yaml @@ -1,27 +1,29 @@ -sylius: - oauth_authentication: - no_configured_domain: There is no configured domain to connect with - domain_error: Impossible to connect, try again - google_authentication: - login_button: Sign in with google account. - domain_error: Impossible to connect, try again. - authentication_failure: Impossible to connect, try again. - ui: - true_label: yes - false_label: no - is_enabled: Enabled - admin: - menu: - oauth_submenu_label: Oauth authorized domains - authentication: - admin: - microsoft_login_button_label: Sign in with Microsoft - -app.ui.authorized_domains_title: Oauth authorized domains -app.ui.authorized_domains.menu_label: Oauth Domain -app.ui.authorized_domains_subheader: Oauth domain connexion management -app.ui.new_authorized_domain: New Oauth domain connexion - -app.form.authorized_domains: - name: Name - authorize: Authorized +synolia: + sylius_admin_oauth: + oauth_authentication: + no_configured_domain: There is no configured domain to connect with + domain_error: Impossible to connect, try again + google_authentication: + login_button: Sign in with google account. + domain_error: Impossible to connect, try again. + authentication_failure: Impossible to login with Google, try again. + microsoft_authentication: + authentication_failure: Impossible to login with Microsoft, try again. + ui: + authorized_domains: + menu_label: Oauth Domain + title: Oauth authorized domains + subheader: Oauth domain connexion management + yes: Yes + no: No + is_enabled: Enabled + admin: + menu: + oauth_submenu_label: Oauth authorized domains + authentication: + admin: + microsoft_login_button_label: Sign in with Microsoft + form: + authorized_domains: + name: Name + authorize: Authorized diff --git a/translations/messages.fr.yaml b/translations/messages.fr.yaml index 69e7ddc..bfac91f 100644 --- a/translations/messages.fr.yaml +++ b/translations/messages.fr.yaml @@ -1,29 +1,29 @@ -sylius: - oauth_authentication: - no_configured_domain: Aucun domaine configuré pour la connexion Oauth - domain_error: Impossible de se connecter, merci de réessayer. - google_authentication: - login_button: Connexion avec votre compte Google - domain_error: Impossible de se connecter, merci de réessayer. - authentication_failure: La connexion a échouée, veuillez réessayer. - ui: - authorized_domains: - menu_label: Domaines Oauth autorisés - true_label: oui - false_label: non - is_enabled: Activé - admin: - menu: - oauth_submenu_label: Domaines Oauth autorisés +synolia: + sylius_admin_oauth: + oauth_authentication: + no_configured_domain: Aucun domaine configuré pour la connexion Oauth + domain_error: Impossible de se connecter, merci de réessayer. + google_authentication: + login_button: Connexion avec votre compte Google + domain_error: Impossible de se connecter, merci de réessayer. + authentication_failure: La connexion Google a échouée, veuillez réessayer. + microsoft_authentication: + authentication_failure: La connexion Microsoft a échouée, veuillez réessayer. + ui: + yes: Oui + no: Non + is_enabled: Activé + admin: + menu: + oauth_submenu_label: Domaines Oauth autorisés + authorized_domains: + menu_label: Domaines Oauth + title: Domaines Oauth autorisés + subheader: Gestion des domaines de connexion Oauth authentication: admin: microsoft_login_button_label: Se connecter avec Microsoft - -app.ui.authorized_domains_title: Domaines Oauth autorisés -app.ui.authorized_domains.menu_label: Domaines Oauth -app.ui.authorized_domains_subheader: Gestion des domaines de connexion Oauth -app.ui.new_authorized_domain: Nouveau domaine de connexion Oauth - -app.form.authorized_domains: - name: Nom - authorize: Autorisé + form: + authorized_domains: + name: Nom + authorize: Autorisé diff --git a/translations/validators.en.yaml b/translations/validators.en.yaml deleted file mode 100644 index e69de29..0000000 diff --git a/translations/validators.fr.yaml b/translations/validators.fr.yaml deleted file mode 100644 index e69de29..0000000