From d3ad2c4f903b289808082e33bd928f86b48f4f35 Mon Sep 17 00:00:00 2001 From: Antonio Ramirez Date: Sat, 10 Dec 2016 14:28:01 +0100 Subject: [PATCH] added settings controller --- lib/User/Controller/SettingsController.php | 73 ++++++++++++++++++-- lib/User/Event/SocialNetworkConnectEvent.php | 2 + lib/User/Event/UserEvent.php | 2 + lib/User/Query/SocialNetworkAccountQuery.php | 5 ++ 4 files changed, 75 insertions(+), 7 deletions(-) diff --git a/lib/User/Controller/SettingsController.php b/lib/User/Controller/SettingsController.php index 4d57d45..e77cd5a 100644 --- a/lib/User/Controller/SettingsController.php +++ b/lib/User/Controller/SettingsController.php @@ -4,9 +4,12 @@ namespace Da\User\Controller; use Da\User\Contracts\MailChangeStrategyInterface; use Da\User\Event\FormEvent; use Da\User\Event\ProfileEvent; +use Da\User\Event\SocialNetworkConnectEvent; use Da\User\Event\UserEvent; use Da\User\Form\SettingsForm; use Da\User\Model\Profile; +use Da\User\Model\SocialNetworkAccount; +use Da\User\Model\User; use Da\User\Module; use Da\User\Query\ProfileQuery; use Da\User\Query\SocialNetworkAccountQuery; @@ -18,6 +21,7 @@ use yii\filters\AccessControl; use yii\filters\VerbFilter; use yii\web\Controller; use Yii; +use yii\web\ForbiddenHttpException; use yii\web\NotFoundHttpException; @@ -127,9 +131,9 @@ class SettingsController extends Controller $this->make(AjaxRequestModelValidator::class, [$form])->validate(); - if($form->load(Yii::$app->request->post())) { + if ($form->load(Yii::$app->request->post())) { $this->trigger(UserEvent::EVENT_BEFORE_ACCOUNT_UPDATE, $event); - if($form->save()) { + if ($form->save()) { Yii::$app->getSession()->setFlash('success', Yii::t('user', 'Your account details have been updated-')); $this->trigger(UserEvent::EVENT_AFTER_ACCOUNT_UPDATE, $event); @@ -137,12 +141,16 @@ class SettingsController extends Controller } } - return $this->render('account', [ - 'model' => $form, - ]); + return $this->render( + 'account', + [ + 'model' => $form, + ] + ); } - public function actionConfirm($id, $code) { + public function actionConfirm($id, $code) + { $user = $this->userQuery->whereId($id)->one(); if ($user === null || $this->module->emailChangeStrategy == MailChangeStrategyInterface::TYPE_INSECURE) { @@ -151,10 +159,61 @@ class SettingsController extends Controller $event = $this->make(UserEvent::class, [$user]); $this->trigger(UserEvent::EVENT_BEFORE_CONFIRMATION, $event); - if($this->make(EmailChangeService::class, [$code, $user])->run()) { + if ($this->make(EmailChangeService::class, [$code, $user])->run()) { $this->trigger(UserEvent::EVENT_AFTER_CONFIRMATION, $event); } return $this->redirect(['account']); } + + public function actionNetworks() + { + return $this->render( + 'networks', + [ + 'user' => Yii::$app->user->identity, + ] + ); + } + + public function actionDisconnect($id) + { + /** @var SocialNetworkAccount $account */ + $account = $this->socialNetworkAccountQuery->whereId($id)->one(); + + if ($account === null) { + throw new NotFoundHttpException(); + } + if ($account->user_id != Yii::$app->user->id) { + throw new ForbiddenHttpException(); + } + $event = $this->make(SocialNetworkConnectEvent::class, [Yii::$app->user->identity, $account]); + + $this->trigger(SocialNetworkConnectEvent::EVENT_BEFORE_DISCONNECT, $event); + $account->delete(); + $this->trigger(SocialNetworkConnectEvent::EVENT_AFTER_DISCONNECT, $event); + + return $this->redirect(['networks']); + + } + + public function actionDelete() + { + if (!$this->module->enableAccountDelete) { + throw new NotFoundHttpException(\Yii::t('user', 'Not found')); + } + + /** @var User $user */ + $user = Yii::$app->user->identity; + $event = $this->make(UserEvent::class, [$user]); + Yii::$app->user->logout(); + + $this->trigger(UserEvent::EVENT_BEFORE_DELETE, $event); + $user->delete(); + $this->trigger(UserEvent::EVENT_AFTER_DELETE, $event); + + Yii::$app->session->setFlash('info', Yii::t('user', 'Your account has been completely deleted')); + + return $this->goHome(); + } } diff --git a/lib/User/Event/SocialNetworkConnectEvent.php b/lib/User/Event/SocialNetworkConnectEvent.php index 07c2c9b..ccbf38f 100644 --- a/lib/User/Event/SocialNetworkConnectEvent.php +++ b/lib/User/Event/SocialNetworkConnectEvent.php @@ -10,6 +10,8 @@ class SocialNetworkConnectEvent extends Event { const EVENT_BEFORE_CONNECT = 'beforeConnect'; const EVENT_AFTER_CONNECT = 'afterConnect'; + const EVENT_BEFORE_DISCONNECT = 'beforeDisconnect'; + const EVENT_AFTER_DISCONNECT = 'afterDisconnect'; protected $user; protected $account; diff --git a/lib/User/Event/UserEvent.php b/lib/User/Event/UserEvent.php index 73a5e8c..a56ae8c 100644 --- a/lib/User/Event/UserEvent.php +++ b/lib/User/Event/UserEvent.php @@ -8,6 +8,8 @@ class UserEvent extends Event { const EVENT_BEFORE_CREATE = 'beforeCreate'; const EVENT_AFTER_CREATE = 'afterCreate'; + const EVENT_BEFORE_DELETE = 'beforeDelete'; + const EVENT_AFTER_DELETE = 'afterDelete'; const EVENT_BEFORE_REGISTER = 'beforeRegister'; const EVENT_AFTER_REGISTER = 'afterRegister'; const EVENT_BEFORE_ACCOUNT_UPDATE = 'beforeAccountUpdate'; diff --git a/lib/User/Query/SocialNetworkAccountQuery.php b/lib/User/Query/SocialNetworkAccountQuery.php index f36f9a5..f660956 100644 --- a/lib/User/Query/SocialNetworkAccountQuery.php +++ b/lib/User/Query/SocialNetworkAccountQuery.php @@ -6,6 +6,11 @@ use yii\db\ActiveQuery; class SocialNetworkAccountQuery extends ActiveQuery { + public function whereId($id) + { + return $this->andWhere(['id' => $id]); + } + public function whereClient(AuthClientInterface $client) { return $this->andWhere(