diff --git a/api/aop/AspectKernel.php b/api/aop/AspectKernel.php index c003331..79cc8ed 100644 --- a/api/aop/AspectKernel.php +++ b/api/aop/AspectKernel.php @@ -8,6 +8,7 @@ use Go\Core\AspectKernel as BaseAspectKernel; class AspectKernel extends BaseAspectKernel { protected function configureAop(AspectContainer $container): void { + $container->registerAspect(new aspects\MockDataAspect()); } } diff --git a/api/aop/aspects/MockDataAspect.php b/api/aop/aspects/MockDataAspect.php new file mode 100644 index 0000000..976de32 --- /dev/null +++ b/api/aop/aspects/MockDataAspect.php @@ -0,0 +1,177 @@ +actionIndex(*))") + */ + public function beforeSignup(MethodInvocation $invocation) { + $email = $this->getRequest()->post('email'); + if ($email === 'let-me-register@ely.by') { + return ['success' => true]; + } + + return $invocation->proceed(); + } + + /** + * @param MethodInvocation $invocation + * @Around("execution(public api\controllers\SignupController->actionRepeatMessage(*))") + */ + public function beforeRepeatMessage(MethodInvocation $invocation) { + $email = $this->getRequest()->post('email'); + if ($email === 'let-me-register@ely.by' || $email === 'let-me-repeat@ely.by') { + return ['success' => true]; + } + + return $invocation->proceed(); + } + + /** + * @param MethodInvocation $invocation + * @Around("execution(public api\controllers\SignupController->actionConfirm(*))") + */ + public function beforeSignupConfirm(MethodInvocation $invocation) { + $email = $this->getRequest()->post('key'); + if ($email === 'LETMEIN') { + return [ + 'success' => true, + 'access_token' => 'dummy_token', + 'expires_in' => time() + 60, + ]; + } + + return $invocation->proceed(); + } + + /** + * @param MethodInvocation $invocation + * @Around("execution(public api\controllers\AuthenticationController->actionForgotPassword(*))") + */ + public function beforeForgotPassword(MethodInvocation $invocation) { + $login = $this->getRequest()->post('login'); + if ($login === 'let-me-recover@ely.by') { + return [ + 'success' => true, + 'data' => [ + 'canRepeatIn' => time() + 60, + 'repeatFrequency' => 60, + ], + ]; + } + + return $invocation->proceed(); + } + + /** + * @param MethodInvocation $invocation + * @Around("execution(public api\controllers\AuthenticationController->actionRecoverPassword(*))") + */ + public function beforeRecoverPassword(MethodInvocation $invocation) { + $key = $this->getRequest()->post('key'); + if ($key === 'LETMEIN') { + return [ + 'success' => true, + 'access_token' => 'dummy_token', + 'expires_in' => time() + 60, + ]; + } + + return $invocation->proceed(); + } + + /** + * @param MethodInvocation $invocation + * @Around("execution(public api\modules\accounts\controllers\DefaultController->actionGet(*))") + */ + public function beforeAccountGet(MethodInvocation $invocation) { + $httpAuth = $this->getRequest()->getHeaders()->get('authorization'); + if ($httpAuth === 'Bearer dummy_token') { + return [ + 'id' => 1, + 'uuid' => 'f63cd5e1-680f-4c2d-baa2-cc7bb174b71a', + 'username' => 'dummy', + 'isOtpEnabled' => false, + 'registeredAt' => time(), + 'lang' => 'en', + 'elyProfileLink' => 'http://ely.by/u1', + 'email' => 'let-me-register@ely.by', + 'isActive' => true, + 'passwordChangedAt' => time(), + 'hasMojangUsernameCollision' => false, + 'shouldAcceptRules' => false, + ]; + } + + return $invocation->proceed(); + } + + /** + * @param MethodInvocation $invocation + * @Around("execution(public api\modules\accounts\actions\EmailVerificationAction->run(*))") + */ + public function beforeAccountEmailVerification(MethodInvocation $invocation) { + $httpAuth = $this->getRequest()->getHeaders()->get('authorization'); + if ($httpAuth === 'Bearer dummy_token') { + $password = $this->getRequest()->post('password'); + if (empty($password)) { + return [ + 'success' => false, + 'errors' => [ + 'password' => 'error.password_required', + ], + ]; + } + + return [ + 'success' => true, + ]; + } + + return $invocation->proceed(); + } + + /** + * @param MethodInvocation $invocation + * @Around("execution(public api\modules\accounts\actions\NewEmailVerificationAction->run(*))") + */ + public function beforeAccountNewEmailVerification(MethodInvocation $invocation) { + $key = $this->getRequest()->post('key'); + if ($key === 'LETMEIN') { + return [ + 'success' => true, + ]; + } + + return $invocation->proceed(); + } + + /** + * @param MethodInvocation $invocation + * @Around("execution(public api\modules\accounts\actions\ChangeEmailAction->run(*))") + */ + public function beforeAccountChangeEmail(MethodInvocation $invocation) { + $key = $this->getRequest()->post('key'); + if ($key === 'LETMEIN') { + return [ + 'success' => true, + 'email' => 'brand-new-email@ely.by', + ]; + } + + return $invocation->proceed(); + } + + private function getRequest(): Request { + return Yii::$app->getRequest(); + } + +} diff --git a/api/components/TestData.php b/api/components/TestData.php deleted file mode 100644 index ac4b417..0000000 --- a/api/components/TestData.php +++ /dev/null @@ -1,174 +0,0 @@ - 'beforeSignup', - 'signup/repeat-message' => 'beforeRepeatMessage', - 'signup/confirm' => 'beforeSignupConfirm', - 'authentication/forgot-password' => 'beforeForgotPassword', - 'authentication/recover-password' => 'beforeRecoverPassword', - 'default/get' => 'beforeAccountGet', - 'default/email-verification' => 'beforeAccountEmailVerification', - 'default/new-email-verification' => 'beforeAccountNewEmailVerification', - 'default/email' => 'beforeAccountChangeEmail', - ]; - - public static function getInstance(): callable { - return Closure::fromCallable([new static(), 'beforeAction']); - } - - public function beforeAction(ActionEvent $event): void { - $id = $event->action->controller->id . '/' . $event->action->id; - if (!isset(self::MAP[$id])) { - return; - } - - $handler = self::MAP[$id]; - $request = Yii::$app->request; - $response = Yii::$app->response; - $result = $this->$handler($request, $response); - if ($result === null) { - return; - } - - $response->content = Json::encode($result); - - // Prevent request execution - $event->isValid = false; - $event->handled = true; - } - - public function beforeSignup(Request $request): ?array { - $email = $request->post('email'); - if ($email === 'let-me-register@ely.by') { - return ['success' => true]; - } - - return null; - } - - public function beforeRepeatMessage(Request $request): ?array { - $email = $request->post('email'); - if ($email === 'let-me-register@ely.by' || $email === 'let-me-repeat@ely.by') { - return ['success' => true]; - } - - return null; - } - - public function beforeSignupConfirm(Request $request): ?array { - $email = $request->post('key'); - if ($email === 'LETMEIN') { - return [ - 'success' => true, - 'access_token' => 'dummy_token', - 'expires_in' => time() + 60, - ]; - } - - return null; - } - - public function beforeForgotPassword(Request $request): ?array { - $login = $request->post('login'); - if ($login === 'let-me-recover@ely.by') { - return [ - 'success' => true, - 'data' => [ - 'canRepeatIn' => time() + 60, - 'repeatFrequency' => 60, - ], - ]; - } - - return null; - } - - public function beforeRecoverPassword(Request $request): ?array { - $key = $request->post('key'); - if ($key === 'LETMEIN') { - return [ - 'success' => true, - 'access_token' => 'dummy_token', - 'expires_in' => time() + 60, - ]; - } - - return null; - } - - public function beforeAccountGet(Request $request): ?array { - $httpAuth = $request->getHeaders()->get('authorization'); - if ($httpAuth === 'Bearer dummy_token') { - return [ - 'id' => 1, - 'uuid' => 'f63cd5e1-680f-4c2d-baa2-cc7bb174b71a', - 'username' => 'dummy', - 'isOtpEnabled' => false, - 'registeredAt' => time(), - 'lang' => 'en', - 'elyProfileLink' => 'http://ely.by/u1', - 'email' => 'let-me-register@ely.by', - 'isActive' => true, - 'passwordChangedAt' => time(), - 'hasMojangUsernameCollision' => false, - 'shouldAcceptRules' => false, - ]; - } - - return null; - } - - public function beforeAccountEmailVerification(Request $request): ?array { - $httpAuth = $request->getHeaders()->get('authorization'); - if ($httpAuth === 'Bearer dummy_token') { - $password = $request->post('password'); - if (empty($password)) { - return [ - 'success' => false, - 'errors' => [ - 'password' => 'error.password_required', - ], - ]; - } - - return [ - 'success' => true, - ]; - } - - return null; - } - - public function beforeAccountNewEmailVerification(Request $request): ?array { - $key = $request->post('key'); - if ($key === 'LETMEIN') { - return [ - 'success' => true, - ]; - } - - return null; - } - - public function beforeAccountChangeEmail(Request $request): ?array { - $key = $request->post('key'); - if ($key === 'LETMEIN') { - return [ - 'success' => true, - 'email' => 'brand-new-email@ely.by', - ]; - } - - return null; - } - -} diff --git a/api/config/config.php b/api/config/config.php index c38ea0c..8969ef5 100644 --- a/api/config/config.php +++ b/api/config/config.php @@ -87,5 +87,4 @@ return [ 'internal' => api\modules\internal\Module::class, 'accounts' => api\modules\accounts\Module::class, ], - 'on beforeAction' => api\components\TestData::getInstance(), ]; diff --git a/api/modules/accounts/actions/BaseAccountAction.php b/api/modules/accounts/actions/BaseAccountAction.php index b91ca2b..874602d 100644 --- a/api/modules/accounts/actions/BaseAccountAction.php +++ b/api/modules/accounts/actions/BaseAccountAction.php @@ -9,7 +9,8 @@ use yii\web\NotFoundHttpException; abstract class BaseAccountAction extends Action { - final public function run(int $id): array { + // TODO: вернуть final модификатор метода после того, как в GoAOP добавят поддержку аспектов для final методов + public function run(int $id): array { $className = $this->getFormClassName(); /** @var AccountActionForm $model */ $model = new $className($this->findAccount($id));