diff --git a/app/config/routes.yml b/app/config/routes.yml index 71b1d67..610ed71 100644 --- a/app/config/routes.yml +++ b/app/config/routes.yml @@ -70,8 +70,11 @@ router: backend-user-edit: pattern: '/admin/user/{id:([0-9]+)}' path: backend::user::edit + backend-user-activation-email: + pattern: '/admin/user/{id:([0-9]+)}/activation' + path: backend::user::activation-email backend-user-status: - pattern: '/admin/user/{id:([0-9]+)}/{type}' + pattern: '/admin/user/{id:([0-9]+)}/status/{type}' path: module: backend controller: user diff --git a/app/controllers/ApiController.php b/app/controllers/ApiController.php index 50a79a8..b5642f3 100644 --- a/app/controllers/ApiController.php +++ b/app/controllers/ApiController.php @@ -6,6 +6,7 @@ use App\Controller\ControllerBase, App\Model\Data\Callback as CallbackModel, App\Model\Data\Request as RequestModel, App\Model\Data\RequestMeta as RequestMetaModel, + App\Model\Data\User, App\Model\Data\UserActivation; class ApiController extends ControllerBase diff --git a/app/controllers/backend/UserController.php b/app/controllers/backend/UserController.php index c1f8206..61206e6 100644 --- a/app/controllers/backend/UserController.php +++ b/app/controllers/backend/UserController.php @@ -97,4 +97,20 @@ class UserController extends \Phalcon\Mvc\Controller $this->flash->success('The account was: ' . $status); $this->response->redirect('/admin'); } + + public function activationEmailAction($id) + { + $user = User::findFirstById($id); + if ($user) { + if ($user->isSuspended()) { + $this->eventsManager->fire('auth:onSentActivation', $user); + $this->flash->success('Activation email sent to: ' . $user->email); + } else { + $this->flash->error('Only suspended users can be sent activation emails.'); + } + } else { + $this->flash->error('Invalid user: ' . $id); + } + $this->response->redirect('/admin'); + } } diff --git a/app/library/Services.php b/app/library/Services.php index 56aa404..b3d9cab 100644 --- a/app/library/Services.php +++ b/app/library/Services.php @@ -32,7 +32,8 @@ use Httpcb\Auth, use App\Listener\AccessListener, App\Listener\DispatchListener, - App\Listener\ActivityLog; + App\Listener\ActivityLog, + App\Listener\AuthEmailListener; class Services extends DiDefault { @@ -345,6 +346,7 @@ class Services extends DiDefault $eventsManager = new \Phalcon\Events\Manager(); $eventsManager->attach('user', $activityLog); $eventsManager->attach('auth', $activityLog); + $eventsManager->attach('auth', new AuthEmailListener); return $eventsManager; } diff --git a/app/listeners/ActivityLog.php b/app/listeners/ActivityLog.php index b12190a..2af1481 100644 --- a/app/listeners/ActivityLog.php +++ b/app/listeners/ActivityLog.php @@ -65,6 +65,18 @@ class ActivityLog extends Injectable $this->_log($user, sprintf("OAuth disconnected (%s)", $providerName)); } + /** + * Fired when a activation email is sent. + * + * @param Event $event + * @param User $user + * @param string $providerName + */ + public function onSentActivation(Event $event, User $user) + { + $this->_log($user, sprintf("Activation email sent")); + } + protected function _log(User $user, $message) { $ip = (new \Phalcon\Http\Request())->getClientAddress(true); diff --git a/app/listeners/AuthEmailListener.php b/app/listeners/AuthEmailListener.php new file mode 100644 index 0000000..73908a0 --- /dev/null +++ b/app/listeners/AuthEmailListener.php @@ -0,0 +1,25 @@ +setUserId($user->getId()) + ->save(); + + $content = $this->di->getShared('template')->render('mail/account_activation', [ + 'link' => $activation->getActivationKey() + ]); + + $this->di->getMail()->send('Httpcb account activation', $user->getEmail(), $content); + } +} diff --git a/app/models/Data/User.php b/app/models/Data/User.php index 1fe205c..7bb2cbb 100644 --- a/app/models/Data/User.php +++ b/app/models/Data/User.php @@ -265,6 +265,16 @@ class User extends Base return $this->status == self::STATUS_ACTIVE; } + /** + * Returns true if this user is suspended. + * + * @return bool + */ + public function isSuspended() + { + return $this->status == self::STATUS_SUSPENDED; + } + /** * @return mixed */ @@ -282,7 +292,7 @@ class User extends Base $this->password = $password; return $this; } - + /** * @return mixed */ diff --git a/app/views/backend/user/form.volt b/app/views/backend/user/form.volt index 43d0542..1878dd1 100644 --- a/app/views/backend/user/form.volt +++ b/app/views/backend/user/form.volt @@ -56,6 +56,13 @@ {% if (user.getId()) %} {% set actions = [ 'Activate': 'Active', 'Suspend': 'Suspended', 'Delete': 'Deleted' ] %}