email verification backend

This commit is contained in:
obenny
2020-09-08 11:26:50 +08:00
parent 383794b2ff
commit 502b10879f
6 changed files with 163 additions and 2 deletions
@@ -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));
}
}
@@ -4,8 +4,10 @@ namespace App\Classes\Modules\Accounts\ControllersLogic;
use App\Classes\General\Abstracts\AbstractControllerLogic;
use App\Classes\Jobs\SendUserVerificationEmail;
use App\Classes\Modules\Accounts\DataTransferObjects\RegistrationObject;
use App\Classes\Modules\Accounts\Services\CreatesUser;
use App\Classes\Modules\Accounts\Services\GeneratesEmailVerificationAttempt;
use App\Classes\Modules\Accounts\Standards\Rules\CanCreateUser;
use App\Classes\Modules\Companies\DataTransferObjects\ConnectionObject;
use App\Classes\Modules\Companies\DataTransferObjects\EmployeeObject;
@@ -60,6 +62,12 @@ class CreateUserLogic extends AbstractControllerLogic
/** @var AuthenticateUserLogic */
private $authenticateUserLogic;
/** @var GeneratesEmailVerificationAttempt */
private $generatesEmailVerificationAttempt;
/** @var SendUserVerificationEmail */
private $sendUserVerificationEmail;
/**
* CreateUserLogic constructor.
* @param GeneratesUniqueAccountNumber $generatesUniqueAccountNumber
@@ -71,8 +79,10 @@ class CreateUserLogic extends AbstractControllerLogic
* @param CreatesCompanyConnection $createsCompanyConnection
* @param CreateContactProcessor $createContactProcessor
* @param AuthenticateUserLogic $authenticateUserLogic
* @param GeneratesEmailVerificationAttempt $generatesEmailVerificationAttempt
* @param SendUserVerificationEmail $sendUserVerificationEmail
*/
public function __construct(GeneratesUniqueAccountNumber $generatesUniqueAccountNumber, CanCreateUser $canCreateUser, CreatesUser $createsUser, CreateCompanyProcessor $createCompanyProcessor, CreatesCompanyModule $createsCompanyModule, CreatesCompanyEmployee $createsCompanyEmployee, CreatesCompanyConnection $createsCompanyConnection, CreateContactProcessor $createContactProcessor, AuthenticateUserLogic $authenticateUserLogic)
public function __construct(GeneratesUniqueAccountNumber $generatesUniqueAccountNumber, CanCreateUser $canCreateUser, CreatesUser $createsUser, CreateCompanyProcessor $createCompanyProcessor, CreatesCompanyModule $createsCompanyModule, CreatesCompanyEmployee $createsCompanyEmployee, CreatesCompanyConnection $createsCompanyConnection, CreateContactProcessor $createContactProcessor, AuthenticateUserLogic $authenticateUserLogic, GeneratesEmailVerificationAttempt $generatesEmailVerificationAttempt, SendUserVerificationEmail $sendUserVerificationEmail)
{
$this->generatesUniqueAccountNumber = $generatesUniqueAccountNumber;
$this->canCreateUser = $canCreateUser;
@@ -83,6 +93,8 @@ class CreateUserLogic extends AbstractControllerLogic
$this->createsCompanyConnection = $createsCompanyConnection;
$this->createContactProcessor = $createContactProcessor;
$this->authenticateUserLogic = $authenticateUserLogic;
$this->generatesEmailVerificationAttempt = $generatesEmailVerificationAttempt;
$this->sendUserVerificationEmail = $sendUserVerificationEmail;
}
@@ -103,7 +115,9 @@ class CreateUserLogic extends AbstractControllerLogic
/** @var User $user */
$user = $this->createsUser->execute($registrationObject);
/** send email verification */
$attempt = $this->generatesEmailVerificationAttempt->execute($user);
$this->sendUserVerificationEmail::dispatch($user, $attempt);
$request->request->set('name', $request->input('company_name'));
@@ -0,0 +1,35 @@
<?php
namespace App\Classes\Modules\Accounts\Services;
use App\Classes\Exceptions\MalformedRequestException;
use App\Models\User;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\QueryException;
use Illuminate\Support\Str;
class GeneratesEmailVerificationAttempt
{
/**
* @param User $user
* @return Model
* @throws MalformedRequestException
*/
public function execute(User $user): Model {
try {
return $user->emailVerification()->create([
'token' => Str::random(25),
'is_complete' => false,
'is_active' => true,
'is_sent' => true
]);
} catch (QueryException $exception){
throw new MalformedRequestException($exception->getMessage());
}
}
}
@@ -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.account.user_verification', ['user' => $this->user, 'attempt' => $this->attempt]);
}
}
+4
View File
@@ -43,6 +43,10 @@ class User extends AbstractModel implements
return [];
}
public function emailVerification(): HasMany {
return $this->hasMany(UserEmailVerification::class, 'email', 'email');
}
/**
* @return HasMany
*/
+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');
}
}