diff --git a/src/Command/Member/AbstractMemberCommand.php b/src/Command/Member/AbstractMemberCommand.php new file mode 100644 index 0000000..53cda5c --- /dev/null +++ b/src/Command/Member/AbstractMemberCommand.php @@ -0,0 +1,43 @@ + + */ +abstract class AbstractMemberCommand extends SilverStripeCommand +{ + /** + * Get a member by the provided email address, output an error message if not found + * + * @param InputInterface $input + * @param OutputInterface $output + * @return Member|false + */ + protected function getMember(InputInterface $input, OutputInterface $output) + { + $email = $this->getOrAskForArgument($input, $output, 'email', 'Enter email address: '); + if (empty($email)) { + $output->writeln('Please enter an email address.'); + return false; + } + + /** @var Member $member */ + $member = Member::get()->filter('email', $email)->first(); + if (!$member) { + $output->writeln('Member with email "' . $email . '" was not found.'); + return false; + } + + return $member; + } +} + diff --git a/src/Command/Member/ChangeGroupsCommand.php b/src/Command/Member/ChangeGroupsCommand.php index ce27435..0f5812d 100644 --- a/src/Command/Member/ChangeGroupsCommand.php +++ b/src/Command/Member/ChangeGroupsCommand.php @@ -2,9 +2,7 @@ namespace SilverLeague\Console\Command\Member; -use SilverLeague\Console\Command\SilverStripeCommand; use SilverStripe\Security\Group; -use SilverStripe\Security\Member; use Symfony\Component\Console\Input\InputArgument; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Output\OutputInterface; @@ -16,7 +14,7 @@ * @package silverstripe-console * @author Robbie Averill */ -class ChangeGroupsCommand extends SilverStripeCommand +class ChangeGroupsCommand extends AbstractMemberCommand { /** * {@inheritDoc} @@ -34,16 +32,14 @@ protected function configure() */ protected function execute(InputInterface $input, OutputInterface $output) { - $email = $this->getOrAskForArgument($input, $output, 'email', 'Enter email address: '); - $member = Member::get()->filter('email', $email)->first(); + $member = $this->getMember($input, $output); if (!$member) { - $output->writeln('Member with email "' . $email . '" was not found.'); return; } if ($member->Groups()->count()) { $output->writeln( - 'Member ' . $email . ' is already in the following groups (will be overwritten):' + 'Member ' . $member->Email . ' is already in the following groups (will be overwritten):' ); $output->writeln(' ' . implode(', ', $member->Groups()->column('Code'))); $output->writeln(''); @@ -55,7 +51,7 @@ protected function execute(InputInterface $input, OutputInterface $output) $newGroups = $this->getHelper('question')->ask($input, $output, $question); - $output->writeln('Adding ' . $email . ' to groups: ' . implode(', ', $newGroups)); + $output->writeln('Adding ' . $member->Email . ' to groups: ' . implode(', ', $newGroups)); // $member->Groups()->removeAll(); foreach ($newGroups as $group) { $member->addToGroupByCode($group); diff --git a/src/Command/Member/ChangePasswordCommand.php b/src/Command/Member/ChangePasswordCommand.php index dbca444..7acfd00 100644 --- a/src/Command/Member/ChangePasswordCommand.php +++ b/src/Command/Member/ChangePasswordCommand.php @@ -2,9 +2,7 @@ namespace SilverLeague\Console\Command\Member; -use SilverLeague\Console\Command\SilverStripeCommand; use SilverStripe\ORM\ValidationResult; -use SilverStripe\Security\Member; use Symfony\Component\Console\Input\InputArgument; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Output\OutputInterface; @@ -15,7 +13,7 @@ * @package silverstripe-console * @author Robbie Averill */ -class ChangePasswordCommand extends SilverStripeCommand +class ChangePasswordCommand extends AbstractMemberCommand { /** * {@inheritDoc} @@ -41,10 +39,8 @@ protected function execute(InputInterface $input, OutputInterface $output) return; } - /** @var Member $member */ - $member = Member::get()->filter('email', $email)->first(); + $member = $this->getMember($input, $output); if (!$member) { - $output->writeln('Member with email "' . $email . '" was not found.'); return; } diff --git a/src/Command/Member/CreateCommand.php b/src/Command/Member/CreateCommand.php index e23fd30..ff61b2d 100644 --- a/src/Command/Member/CreateCommand.php +++ b/src/Command/Member/CreateCommand.php @@ -49,6 +49,13 @@ protected function execute(InputInterface $input, OutputInterface $output) return; } + // Check for existing member + $member = Member::get()->filter(['Email' => $data['Email']])->first(); + if ($member) { + $output->writeln('Member already exists with email address: ' . $data['Email']); + return; + } + $member = Member::create(); foreach ($data as $key => $value) { $member->setField($key, $value); diff --git a/src/Command/Member/LockCommand.php b/src/Command/Member/LockCommand.php index eb65e9d..dffd64c 100644 --- a/src/Command/Member/LockCommand.php +++ b/src/Command/Member/LockCommand.php @@ -2,7 +2,6 @@ namespace SilverLeague\Console\Command\Member; -use SilverLeague\Console\Command\SilverStripeCommand; use SilverStripe\ORM\FieldType\DBDatetime; use SilverStripe\Security\Member; use Symfony\Component\Console\Input\InputArgument; @@ -15,7 +14,7 @@ * @package silverstripe-console * @author Robbie Averill */ -class LockCommand extends SilverStripeCommand +class LockCommand extends AbstractMemberCommand { protected function configure() { @@ -27,16 +26,8 @@ protected function configure() protected function execute(InputInterface $input, OutputInterface $output) { - $email = $this->getOrAskForArgument($input, $output, 'email', 'Enter email address: '); - if (empty($email)) { - $output->writeln('Please enter an email address.'); - return; - } - - /** @var Member $member */ - $member = Member::get()->filter('email', $email)->first(); + $member = $this->getMember($input, $output); if (!$member) { - $output->writeln('Member with email "' . $email . '" was not found.'); return; } @@ -45,7 +36,7 @@ protected function execute(InputInterface $input, OutputInterface $output) $member->FailedLoginCount = 0; $member->write(); - $output->writeln('Member ' . $email . ' locked for ' . $lockoutMins . ' mins.'); + $output->writeln('Member ' . $member->Email . ' locked for ' . $lockoutMins . ' mins.'); } } diff --git a/src/Command/Member/UnlockCommand.php b/src/Command/Member/UnlockCommand.php index 47fbe47..ca55102 100644 --- a/src/Command/Member/UnlockCommand.php +++ b/src/Command/Member/UnlockCommand.php @@ -2,9 +2,6 @@ namespace SilverLeague\Console\Command\Member; -use SilverLeague\Console\Command\SilverStripeCommand; -use SilverStripe\ORM\FieldType\DBDatetime; -use SilverStripe\Security\Member; use Symfony\Component\Console\Input\InputArgument; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Output\OutputInterface; @@ -15,7 +12,7 @@ * @package silverstripe-console * @author Robbie Averill */ -class UnlockCommand extends SilverStripeCommand +class UnlockCommand extends AbstractMemberCommand { protected function configure() { @@ -27,16 +24,8 @@ protected function configure() protected function execute(InputInterface $input, OutputInterface $output) { - $email = $this->getOrAskForArgument($input, $output, 'email', 'Enter email address: '); - if (empty($email)) { - $output->writeln('Please enter an email address.'); - return; - } - - /** @var Member $member */ - $member = Member::get()->filter('email', $email)->first(); + $member = $this->getMember($input, $output); if (!$member) { - $output->writeln('Member with email "' . $email . '" was not found.'); return; } @@ -44,7 +33,7 @@ protected function execute(InputInterface $input, OutputInterface $output) $member->FailedLoginCount = 0; $member->write(); - $output->writeln('Member ' . $email . ' unlocked.'); + $output->writeln('Member ' . $member->Email . ' unlocked.'); } } diff --git a/tests/Command/Member/CreateCommandTest.php b/tests/Command/Member/CreateCommandTest.php index 1445900..0eedf6e 100644 --- a/tests/Command/Member/CreateCommandTest.php +++ b/tests/Command/Member/CreateCommandTest.php @@ -50,14 +50,19 @@ public function testExecute() $this->command->getApplication()->getHelperSet()->set($questionHelper, 'question'); - $tester = $this->executeTest( - [ - 'email' => 'unittest@example.com', - 'password' => 'OpenSe$am3!' - ] - ); + $tester = $this->executeTest([ + 'email' => 'unittest@example.com', + 'password' => 'OpenSe$am3!', + ]); $output = $tester->getDisplay(); $this->assertContains('Member created', $output); + + $tester = $this->executeTest([ + 'email' => 'unittest@example.com', + 'password' => 'OpenSe$am3!', + ]); + $output = $tester->getDisplay(); + $this->assertContains('Member already exists', $output); } /**