Archived
1
0
Fork 0

Merge branch '38-admin-send-activation-password-resets-to-email' into dev

This commit is contained in:
Henrik Hautakoski 2022-08-28 17:49:22 +02:00
commit 8c9455a2d5
8 changed files with 79 additions and 3 deletions

View file

@ -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

View file

@ -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

View file

@ -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');
}
}

View file

@ -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;
}

View file

@ -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);

View file

@ -0,0 +1,25 @@
<?php
namespace App\Listener;
use App\Model\Data\User,
App\Model\Data\UserActivation;
use Phalcon\Di\Injectable,
Phalcon\Events\Event;
class AuthEmailListener extends Injectable
{
public function onSentActivation(Event $event, User $user)
{
$activation = new UserActivation();
$activation->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);
}
}

View file

@ -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
*/

View file

@ -56,6 +56,13 @@
{% if (user.getId()) %}
{% set actions = [ 'Activate': 'Active', 'Suspend': 'Suspended', 'Delete': 'Deleted' ] %}
<div class="float-end">
{% if user.isSuspended() %}
<a class="button button-info" href="{{ url(['for': 'backend-user-activation-email', 'id': user.getId() ]) }}">
Send activation email
</a>
{% endif %}
{% for label, status in actions %}
{% if (user.status != status) %}