From 9186d111f606b2064bbae1a833365a6f59089baa Mon Sep 17 00:00:00 2001 From: Amrouche Hamza Date: Wed, 22 Nov 2017 07:54:07 +0100 Subject: [PATCH] [User] add the user generator --- src/Command/MakeUserCommand.php | 76 +++++++++++++++++ src/Resources/help/MakeUser.txt | 5 ++ src/Resources/skeleton/user/User.php.txt | 72 +++++++++++++++++ .../skeleton/user/UserProvider.php.txt | 81 +++++++++++++++++++ .../skeleton/user/UserRepository.php.txt | 34 ++++++++ 5 files changed, 268 insertions(+) create mode 100644 src/Command/MakeUserCommand.php create mode 100644 src/Resources/help/MakeUser.txt create mode 100644 src/Resources/skeleton/user/User.php.txt create mode 100644 src/Resources/skeleton/user/UserProvider.php.txt create mode 100644 src/Resources/skeleton/user/UserRepository.php.txt diff --git a/src/Command/MakeUserCommand.php b/src/Command/MakeUserCommand.php new file mode 100644 index 000000000..9a362fbec --- /dev/null +++ b/src/Command/MakeUserCommand.php @@ -0,0 +1,76 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Bundle\MakerBundle\Command; + +use Doctrine\ORM\Mapping\Column; +use Symfony\Bundle\MakerBundle\ConsoleStyle; +use Symfony\Bundle\MakerBundle\DependencyBuilder; +use Symfony\Bundle\MakerBundle\Str; +use Symfony\Bundle\MakerBundle\Validator; +use Symfony\Component\Console\Input\InputArgument; + +/** + * @author Javier Eguiluz + * @author Ryan Weaver + * @author Amrouche Hamza + */ +final class MakeUserCommand extends AbstractCommand +{ + protected static $defaultName = 'make:user'; + + public function configure() + { + $this + ->setDescription('Creates a the user doctrine class, the user provider and the user repository') + ->setHelp(file_get_contents(__DIR__.'/../Resources/help/MakeUser.txt')) + ; + } + + protected function getParameters(): array + { + return []; + } + + protected function getFiles(array $params): array + { + return [ + __DIR__.'/../Resources/skeleton/user/User.php.txt' => 'src/Entity/User.php', + __DIR__.'/../Resources/skeleton/user/UserRepository.php.txt' => 'src/Repository/UserRepository.php', + __DIR__.'/../Resources/skeleton/user/UserProvider.php.txt' => 'src/Security/UserProvider.php', + ]; + } + + protected function getResultMessage(array $params): string + { + return 'User entity, User provider and user repository has been created successfully.'; + } + + protected function writeNextStepsMessage(array $params, ConsoleStyle $io) + { + $io->text([ + 'Next: Add more fields to your entity and start using it.', + 'Find the documentation at https://symfony.com/doc/current/doctrine.html#creating-an-entity-class' + ]); + } + + protected function configureDependencies(DependencyBuilder $dependencies) + { + $dependencies->addClassDependency( + Column::class, + 'orm' + ); + $dependencies->addClassDependency( + UserProviderInterface::class, + 'security' + ); + } +} diff --git a/src/Resources/help/MakeUser.txt b/src/Resources/help/MakeUser.txt new file mode 100644 index 000000000..f53be3e07 --- /dev/null +++ b/src/Resources/help/MakeUser.txt @@ -0,0 +1,5 @@ +The %command.name% command generates the whole suites to create users and to have roles. + +php %command.full_name% + +If the argument is missing, the command will ask for the entity class name interactively. diff --git a/src/Resources/skeleton/user/User.php.txt b/src/Resources/skeleton/user/User.php.txt new file mode 100644 index 000000000..3e5ff6086 --- /dev/null +++ b/src/Resources/skeleton/user/User.php.txt @@ -0,0 +1,72 @@ +roles; + } + + public function setRoles(array $roles) + { + $this->roles = $roles; + + return $this; + } + + /** + * {@inheritdoc} + */ + public function eraseCredentials() + { + } + + /** + * {@inheritdoc} + */ + public function getUsername(): string + { + return $this->email; + } + + /** + * {@inheritdoc} + */ + public function getSalt() + { + return null; + } + + /** + * {@inheritdoc} + */ + public function serialize() + { + return serialize([ + $this->id, + ]); + } + + /** + * {@inheritdoc} + */ + public function unserialize($serialized) + { + [$this->id] = unserialize($serialized); + } +} diff --git a/src/Resources/skeleton/user/UserProvider.php.txt b/src/Resources/skeleton/user/UserProvider.php.txt new file mode 100644 index 000000000..d288a3187 --- /dev/null +++ b/src/Resources/skeleton/user/UserProvider.php.txt @@ -0,0 +1,81 @@ +userRepository = $userRepository; + } + + /** + * {@inheritdoc} + */ + public function loadUserByUsername($username): User + { + try { + $user = $this->userRepository->findOneByUsername($username); + } catch (NoResultException $exception) { + throw new UsernameNotFoundException(sprintf('The user "%s" does not exist.', $username)); + } + + return $user; + } + + /** + * @throws UsernameNotFoundException if the user is not found + */ + public function loadUserByResourceOwner($resourceOwner, string $provider): UserInterface + { + try { + $user = $this->userRepository->findOneByResourceOwnerId($resourceOwner->getId(), $provider); + } catch (NoResultException $exception) { + return $this->updateUserWithResourceOwnerId($resourceOwner, $provider); + } + + return $user; + } + + /** + * @throws UnsupportedUserException + */ + public function refreshUser(UserInterface $user) + { + throw new UnsupportedUserException(); + } + + /** + * {@inheritdoc} + */ + public function supportsClass($class): bool + { + return User::class === $class; + } + + /** + * @throws UsernameNotFoundException + */ + private function updateUserWithResourceOwnerId($resourceOwner, string $provider): UserInterface + { + try { + $user = $this->loadUserByUsername($resourceOwner->getEmail()); + } catch (UsernameNotFoundException $exception) { + throw new UsernameNotFoundException(sprintf('The user "%s" does not exist.', $resourceOwner->getId())); + } + + $this->userRepository->updateResourceOwnerId($user, $resourceOwner->getId(), $provider); + + return $user; + } +} diff --git a/src/Resources/skeleton/user/UserRepository.php.txt b/src/Resources/skeleton/user/UserRepository.php.txt new file mode 100644 index 000000000..1d9fca5e0 --- /dev/null +++ b/src/Resources/skeleton/user/UserRepository.php.txt @@ -0,0 +1,34 @@ +createQueryBuilder('u') + ->where('u.email = :username') + ->setParameter('username', mb_strtolower($username)) + ->getQuery() + ->getSingleResult(); + } + + public function findOneByResourceOwnerId(string $resourceOwnerId, string $provider): User + { + return $this->createQueryBuilder('u') + ->where('u.'.$provider.'Id = :resourceOwnerId') + ->setParameter('resourceOwnerId', $resourceOwnerId) + ->getQuery() + ->getSingleResult(); + } + + public function updateResourceOwnerId(User $user, string $resourceOwnerId, string $provider) + { + $user->{'set'.ucfirst($provider).'Id'}($resourceOwnerId); + + $this->add($user, true); + } +}