Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Installation] Add setting a username during installation #8798

Merged
merged 2 commits into from
Oct 11, 2017
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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');
}
}