new :add classes required to send verification email after user registered. #1

This commit is contained in:
weichien00
2021-06-26 00:36:37 +08:00
parent d3fa2170f7
commit 0e1ea69515
8 changed files with 292 additions and 0 deletions
@@ -0,0 +1,42 @@
<?php
namespace App\Classes\Jobs;
use App\Classes\Exceptions\MalformedRequestException;
use App\Classes\Modules\Accounts\Services\ExpiresEmailVerificationAttempt;
use App\Classes\Modules\Accounts\Services\ExpiresPasswordReset;
use App\Models\PasswordReset;
use App\Models\UserEmailVerification;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
class EmailVerificationAttemptExpiration implements ShouldQueue
{
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
/** @var UserEmailVerification */
private $attempt;
/**
* EmailVerificationAttemptExpiration constructor.
* @param UserEmailVerification $attempt
*/
public function __construct(UserEmailVerification $attempt)
{
$this->attempt = $attempt;
}
/**
* @throws MalformedRequestException
*/
public function handle()
{
(new ExpiresEmailVerificationAttempt())->execute($this->attempt);
}
}
@@ -0,0 +1,41 @@
<?php
namespace App\Classes\Jobs;
use App\Classes\Notifications\UserVerificationEmail;
use App\Models\User;
use App\Models\UserEmailVerification;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
class SendUserVerificationEmail implements ShouldQueue
{
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
/** @var User */
private $user;
/** @var UserEmailVerification */
private $attempt;
/**
* SendUserVerificationEmail constructor.
* @param User $user
* @param UserEmailVerification $attempt
*/
public function __construct(User $user, UserEmailVerification $attempt)
{
$this->user = $user;
$this->attempt = $attempt;
}
public function handle()
{
$this->user->notify(new UserVerificationEmail($this->user, $this->attempt));
}
}
@@ -0,0 +1,59 @@
<?php
namespace App\Classes\Modules\Accounts\Processors;
use App\Classes\Jobs\EmailVerificationAttemptExpiration;
use App\Classes\Jobs\SendUserVerificationEmail;
use App\Classes\Modules\Accounts\Services\GeneratesEmailVerificationAttempt;
use App\Classes\Modules\Accounts\Services\InvalidatesActiveEmailVerificationAttempts;
use App\Models\User;
class GenerateEmailVerificationAttemptProcessor
{
/** @var InvalidatesActiveEmailVerificationAttempts */
private $invalidatesActiveEmailVerificationAttempts;
/** @var GeneratesEmailVerificationAttempt */
private $generatesEmailVerificationAttempt;
/** @var EmailVerificationAttemptExpiration */
private $emailVerificationAttemptExpiration;
/** @var SendUserVerificationEmail */
private $sendUserVerificationEmail;
/**
* GenerateEmailVerificationAttemptProcessor constructor.
* @param InvalidatesActiveEmailVerificationAttempts $invalidatesActiveEmailVerificationAttempts
* @param GeneratesEmailVerificationAttempt $generatesEmailVerificationAttempt
* @param EmailVerificationAttemptExpiration $emailVerificationAttemptExpiration
* @param SendUserVerificationEmail $sendUserVerificationEmail
*/
public function __construct(InvalidatesActiveEmailVerificationAttempts $invalidatesActiveEmailVerificationAttempts, GeneratesEmailVerificationAttempt $generatesEmailVerificationAttempt, EmailVerificationAttemptExpiration $emailVerificationAttemptExpiration, SendUserVerificationEmail $sendUserVerificationEmail)
{
$this->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);
}
}
@@ -0,0 +1,29 @@
<?php
namespace App\Classes\Modules\Accounts\Services;
use App\Classes\Exceptions\MalformedRequestException;
use App\Classes\General\Eloquent\AbstractUpdateRecord;
use App\Models\PasswordReset;
use App\Models\UserEmailVerification;
class ExpiresEmailVerificationAttempt extends AbstractUpdateRecord
{
/**
* @param UserEmailVerification $model
* @return \Illuminate\Database\Eloquent\Model
* @throws MalformedRequestException
*/
public function execute(UserEmailVerification $model){
$model->is_active = false;
return $this->handler($model);
}
}
@@ -0,0 +1,32 @@
<?php
namespace App\Classes\Modules\Accounts\Services;
use App\Classes\Exceptions\MalformedRequestException;
use App\Classes\General\Eloquent\AbstractUpdateRelationshipRecord;
use App\Models\User;
use App\Models\UserEmailVerification;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\QueryException;
use Illuminate\Support\Str;
class GeneratesEmailVerificationAttempt extends AbstractUpdateRelationshipRecord
{
/**
* @param User $user
* @return Model
* @throws MalformedRequestException
*/
public function execute(User $user): Model {
$model = new UserEmailVerification();
$model->token = Str::random(25);
$model->is_complete = false;
$model->is_active = true;
$model->is_sent = true;
return $this->handler($user->emailVerification(), $model);
}
}
@@ -0,0 +1,22 @@
<?php
namespace App\Classes\Modules\Accounts\Services;
use App\Models\User;
class InvalidatesActiveEmailVerificationAttempts
{
/**
* @param User $user
* @return void
*/
public function execute(User $user) {
$user->emailVerification()->active()->update([
'is_active' => false
]);
}
}
@@ -0,0 +1,39 @@
<?php
namespace App\Classes\Notifications;
use App\Models\User;
use App\Models\UserEmailVerification;
use Illuminate\Notifications\Messages\MailMessage;
class UserVerificationEmail extends AbstractEmail
{
/** @var User */
private $user;
/** @var UserEmailVerification */
private $attempt;
/**
* UserVerificationEmail constructor.
* @param User $user
* @param UserEmailVerification $attempt
*/
public function __construct(User $user, UserEmailVerification $attempt)
{
$this->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]);
}
}
+28
View File
@@ -0,0 +1,28 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
class UserEmailVerification extends AbstractModel
{
protected $table = 'user_email_verifications';
public $fillable = [
'token', 'is_complete', 'is_active', 'is_sent'
];
/**
* @param $query
* @return mixed
*/
public function scopeActive($query){
return $query->where('is_active', true)->where('is_complete', false);
}
/**
* @return BelongsTo
*/
public function user(): BelongsTo {
return $this->belongsTo(User::class, 'email', 'email');
}
}