Skip to content

Commit

Permalink
Merge pull request #8798 from GSadee/installation
Browse files Browse the repository at this point in the history
[Installation] Add setting a username during installation
  • Loading branch information
pamil committed Oct 11, 2017
2 parents 90fa2ca + 965410d commit b55ca84
Show file tree
Hide file tree
Showing 4 changed files with 78 additions and 19 deletions.
4 changes: 2 additions & 2 deletions features/installer/install_command.feature
Original file line number Diff line number Diff line change
Expand Up @@ -12,9 +12,9 @@ Feature: Sylius Install Feature
Scenario: Trying to register administrator account without email
Given I do not provide an email
When I run Sylius CLI installer
Then I should see output "E-mail: This value should not be blank"
Then I should see output "This value should not be blank"

Scenario: Trying to register administrator account with an incorrect email
Given I do not provide a correct email
When I run Sylius CLI installer
Then I should see output "E-mail: This value is not a valid email address."
Then I should see output "This value is not a valid email address."
2 changes: 1 addition & 1 deletion features/installer/load_sample_data_command.feature
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,6 @@ Feature: Load sample data feature
I want to run a command that loads sample data

Scenario: Running install sample data command
Given I run Sylius Install Load Sample Data command
When I run Sylius Install Load Sample Data command
And I confirm loading sample data
Then the command should finish successfully
2 changes: 2 additions & 0 deletions src/Sylius/Behat/Context/Cli/InstallerContext.php
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,7 @@ final class InstallerContext implements Context
private $inputChoices = [
'currency' => 'USD',
'e-mail' => 'test@email.com',
'username' => 'test',
'password' => 'pswd',
'confirmation' => 'pswd',
];
Expand Down Expand Up @@ -141,6 +142,7 @@ public function iDoNotProvideCorrectEmail()
public function iProvideFullAdministratorData()
{
$this->inputChoices['e-mail'] = 'test@admin.com';
$this->inputChoices['username'] = 'test';
$this->inputChoices['password'] = 'pswd1$';
$this->inputChoices['confirmation'] = $this->inputChoices['password'];
}
Expand Down
89 changes: 73 additions & 16 deletions src/Sylius/Bundle/CoreBundle/Command/SetupCommand.php
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
namespace Sylius\Bundle\CoreBundle\Command;

use Sylius\Component\Core\Model\AdminUserInterface;
use Sylius\Component\User\Repository\UserRepositoryInterface;
use Symfony\Component\Console\Helper\QuestionHelper;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
Expand Down Expand Up @@ -91,32 +92,27 @@ protected function setupAdministratorUser(InputInterface $input, OutputInterface
*
* @return AdminUserInterface
*/
private function configureNewUser(AdminUserInterface $user, InputInterface $input, OutputInterface $output): AdminUserInterface
{
$userRepository = $this->get('sylius.repository.admin_user');
private function configureNewUser(
AdminUserInterface $user,
InputInterface $input,
OutputInterface $output
): AdminUserInterface {
/** @var UserRepositoryInterface $userRepository */
$userRepository = $this->getAdminUserRepository();

if ($input->getOption('no-interaction')) {
Assert::null($userRepository->findOneByEmail('sylius@example.com'));

$user->setEmail('sylius@example.com');
$user->setUsername('sylius');
$user->setPlainPassword('sylius');

return $user;
}

$questionHelper = $this->getHelper('question');

do {
$question = $this->createEmailQuestion($output);
$email = $questionHelper->ask($input, $output, $question);
$exists = null !== $userRepository->findOneByEmail($email);

if ($exists) {
$output->writeln('<error>E-Mail is already in use!</error>');
}
} while ($exists);

$email = $this->getAdministratorEmail($input, $output);
$user->setEmail($email);
$user->setUsername($this->getAdministratorUsername($input, $output, $email));
$user->setPlainPassword($this->getAdministratorPassword($input, $output));

return $user;
Expand All @@ -129,7 +125,7 @@ private function configureNewUser(AdminUserInterface $user, InputInterface $inpu
*/
private function createEmailQuestion(OutputInterface $output): Question
{
return (new Question('E-mail:'))
return (new Question('E-mail: '))
->setValidator(function ($value) use ($output) {
/** @var ConstraintViolationListInterface $errors */
$errors = $this->get('validator')->validate((string) $value, [new Email(), new NotBlank()]);
Expand All @@ -143,6 +139,59 @@ private function createEmailQuestion(OutputInterface $output): Question
;
}

/**
* @param InputInterface $input
* @param OutputInterface $output
*
* @return string
*/
private function getAdministratorEmail(InputInterface $input, OutputInterface $output): string
{
/** @var QuestionHelper $questionHelper */
$questionHelper = $this->getHelper('question');
/** @var UserRepositoryInterface $userRepository */
$userRepository = $this->getAdminUserRepository();

do {
$question = $this->createEmailQuestion($output);
$email = $questionHelper->ask($input, $output, $question);
$exists = null !== $userRepository->findOneByEmail($email);

if ($exists) {
$output->writeln('<error>E-Mail is already in use!</error>');
}
} while ($exists);

return $email;
}

/**
* @param InputInterface $input
* @param OutputInterface $output
* @param string $email
*
* @return string
*/
private function getAdministratorUsername(InputInterface $input, OutputInterface $output, string $email): string
{
/** @var QuestionHelper $questionHelper */
$questionHelper = $this->getHelper('question');
/** @var UserRepositoryInterface $userRepository */
$userRepository = $this->getAdminUserRepository();

do {
$question = new Question('Username (press enter to use email): ', $email);
$username = $questionHelper->ask($input, $output, $question);
$exists = null !== $userRepository->findOneBy(['username' => $username]);

if ($exists) {
$output->writeln('<error>Username is already in use!</error>');
}
} while ($exists);

return $username;
}

/**
* @param InputInterface $input
* @param OutputInterface $output
Expand Down Expand Up @@ -205,4 +254,12 @@ private function createPasswordQuestion(string $message, \Closure $validator): Q
->setHiddenFallback(false)
;
}

/**
* @return UserRepositoryInterface
*/
private function getAdminUserRepository(): UserRepositoryInterface
{
return $this->get('sylius.repository.admin_user');
}
}

0 comments on commit b55ca84

Please sign in to comment.