From 0e1ea6951528a6208d094eb342d276e74175a8d7 Mon Sep 17 00:00:00 2001 From: weichien00 Date: Sat, 26 Jun 2021 00:36:37 +0800 Subject: [PATCH] new :add classes required to send verification email after user registered. #1 --- .../EmailVerificationAttemptExpiration.php | 42 +++++++++++++ .../Jobs/SendUserVerificationEmail.php | 41 +++++++++++++ ...erateEmailVerificationAttemptProcessor.php | 59 +++++++++++++++++++ .../ExpiresEmailVerificationAttempt.php | 29 +++++++++ .../GeneratesEmailVerificationAttempt.php | 32 ++++++++++ ...lidatesActiveEmailVerificationAttempts.php | 22 +++++++ .../Notifications/UserVerificationEmail.php | 39 ++++++++++++ app/Models/UserEmailVerification.php | 28 +++++++++ 8 files changed, 292 insertions(+) create mode 100644 app/Classes/Jobs/EmailVerificationAttemptExpiration.php create mode 100644 app/Classes/Jobs/SendUserVerificationEmail.php create mode 100644 app/Classes/Modules/Accounts/Processors/GenerateEmailVerificationAttemptProcessor.php create mode 100644 app/Classes/Modules/Accounts/Services/ExpiresEmailVerificationAttempt.php create mode 100644 app/Classes/Modules/Accounts/Services/GeneratesEmailVerificationAttempt.php create mode 100644 app/Classes/Modules/Accounts/Services/InvalidatesActiveEmailVerificationAttempts.php create mode 100644 app/Classes/Notifications/UserVerificationEmail.php create mode 100644 app/Models/UserEmailVerification.php diff --git a/app/Classes/Jobs/EmailVerificationAttemptExpiration.php b/app/Classes/Jobs/EmailVerificationAttemptExpiration.php new file mode 100644 index 00000000..e327a941 --- /dev/null +++ b/app/Classes/Jobs/EmailVerificationAttemptExpiration.php @@ -0,0 +1,42 @@ +attempt = $attempt; + } + + + /** + * @throws MalformedRequestException + */ + public function handle() + { + (new ExpiresEmailVerificationAttempt())->execute($this->attempt); + + } +} diff --git a/app/Classes/Jobs/SendUserVerificationEmail.php b/app/Classes/Jobs/SendUserVerificationEmail.php new file mode 100644 index 00000000..2bb54f47 --- /dev/null +++ b/app/Classes/Jobs/SendUserVerificationEmail.php @@ -0,0 +1,41 @@ +user = $user; + $this->attempt = $attempt; + } + + + public function handle() + { + $this->user->notify(new UserVerificationEmail($this->user, $this->attempt)); + } +} diff --git a/app/Classes/Modules/Accounts/Processors/GenerateEmailVerificationAttemptProcessor.php b/app/Classes/Modules/Accounts/Processors/GenerateEmailVerificationAttemptProcessor.php new file mode 100644 index 00000000..23853f27 --- /dev/null +++ b/app/Classes/Modules/Accounts/Processors/GenerateEmailVerificationAttemptProcessor.php @@ -0,0 +1,59 @@ +invalidatesActiveEmailVerificationAttempts = $invalidatesActiveEmailVerificationAttempts; + $this->generatesEmailVerificationAttempt = $generatesEmailVerificationAttempt; + $this->emailVerificationAttemptExpiration = $emailVerificationAttemptExpiration; + $this->sendUserVerificationEmail = $sendUserVerificationEmail; + } + + + /** + * @param User $user + * @return void + * @throws \App\Classes\Exceptions\MalformedRequestException + */ + public function execute(User $user) { + + $this->invalidatesActiveEmailVerificationAttempts->execute($user); + + $attempt = $this->generatesEmailVerificationAttempt->execute($user); + + $this->emailVerificationAttemptExpiration::dispatch($attempt)->delay(now()->addHours(48)); + + $this->sendUserVerificationEmail::dispatch($user, $attempt); + + } + +} \ No newline at end of file diff --git a/app/Classes/Modules/Accounts/Services/ExpiresEmailVerificationAttempt.php b/app/Classes/Modules/Accounts/Services/ExpiresEmailVerificationAttempt.php new file mode 100644 index 00000000..ebce5271 --- /dev/null +++ b/app/Classes/Modules/Accounts/Services/ExpiresEmailVerificationAttempt.php @@ -0,0 +1,29 @@ +is_active = false; + return $this->handler($model); + + + } + + +} \ No newline at end of file diff --git a/app/Classes/Modules/Accounts/Services/GeneratesEmailVerificationAttempt.php b/app/Classes/Modules/Accounts/Services/GeneratesEmailVerificationAttempt.php new file mode 100644 index 00000000..215bc7ac --- /dev/null +++ b/app/Classes/Modules/Accounts/Services/GeneratesEmailVerificationAttempt.php @@ -0,0 +1,32 @@ +token = Str::random(25); + $model->is_complete = false; + $model->is_active = true; + $model->is_sent = true; + + return $this->handler($user->emailVerification(), $model); + } + +} diff --git a/app/Classes/Modules/Accounts/Services/InvalidatesActiveEmailVerificationAttempts.php b/app/Classes/Modules/Accounts/Services/InvalidatesActiveEmailVerificationAttempts.php new file mode 100644 index 00000000..21605bb9 --- /dev/null +++ b/app/Classes/Modules/Accounts/Services/InvalidatesActiveEmailVerificationAttempts.php @@ -0,0 +1,22 @@ +emailVerification()->active()->update([ + 'is_active' => false + ]); + + } + +} \ No newline at end of file diff --git a/app/Classes/Notifications/UserVerificationEmail.php b/app/Classes/Notifications/UserVerificationEmail.php new file mode 100644 index 00000000..c718d5da --- /dev/null +++ b/app/Classes/Notifications/UserVerificationEmail.php @@ -0,0 +1,39 @@ +user = $user; + $this->attempt = $attempt; + } + + + public function toMail() + { + return (new MailMessage) + ->subject('Email Verification') + ->view('emails.accounts.user_verification', ['user' => $this->user, 'attempt' => $this->attempt]); + } + + +} diff --git a/app/Models/UserEmailVerification.php b/app/Models/UserEmailVerification.php new file mode 100644 index 00000000..278c8cd6 --- /dev/null +++ b/app/Models/UserEmailVerification.php @@ -0,0 +1,28 @@ +where('is_active', true)->where('is_complete', false); + } + + /** + * @return BelongsTo + */ + public function user(): BelongsTo { + return $this->belongsTo(User::class, 'email', 'email'); + } +}