new:[authentication apis]add classes required for email verification API #2

This commit is contained in:
weichien00
2021-06-26 18:30:35 +08:00
parent 116248b346
commit ce4b45708d
7 changed files with 228 additions and 0 deletions
@@ -0,0 +1,76 @@
<?php
namespace App\Classes\Modules\Accounts\ControllersLogic;
use App\Classes\Exceptions\MalformedRequestException;
use App\Classes\Exceptions\ResourceNotFoundException;
use App\Classes\General\Abstracts\AbstractControllerLogic;
use App\Classes\Modules\Accounts\Services\CompletesEmailVerificationAttempt;
use App\Classes\Modules\Accounts\Services\FetchesEmailVerificationAttempt;
use App\Classes\Modules\Accounts\Services\VerifiesUser;
use App\Classes\Modules\Accounts\Standards\Criteria\EmailVerificationActiveAttemptExists;
use App\Models\UserEmailVerification;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
class UserEmailVerificationLogic extends AbstractControllerLogic
{
public function notification(): array
{
return [
'title' => 'Email Verification',
'message' => 'You have successfully verified your email address'
];
}
/** @var emailVerificationActiveAttemptExists */
private $emailVerificationActiveAttemptExists;
/** @var CompletesEmailVerificationAttempt */
private $completesEmailVerificationAttempt;
/** @var FetchesEmailVerificationAttempt */
private $fetchesEmailVerificationAttempt;
/** @var VerifiesUser */
private $verifiesUser;
/**
* UserEmailVerificationLogic constructor.
* @param EmailVerificationActiveAttemptExists $emailVerificationActiveAttemptExists
* @param CompletesEmailVerificationAttempt $completesEmailVerificationAttempt
* @param FetchesEmailVerificationAttempt $fetchesEmailVerificationAttempt
* @param VerifiesUser $verifiesUser
*/
public function __construct(EmailVerificationActiveAttemptExists $emailVerificationActiveAttemptExists, CompletesEmailVerificationAttempt $completesEmailVerificationAttempt, FetchesEmailVerificationAttempt $fetchesEmailVerificationAttempt, VerifiesUser $verifiesUser)
{
$this->emailVerificationActiveAttemptExists = $emailVerificationActiveAttemptExists;
$this->completesEmailVerificationAttempt = $completesEmailVerificationAttempt;
$this->fetchesEmailVerificationAttempt = $fetchesEmailVerificationAttempt;
$this->verifiesUser = $verifiesUser;
}
/**
* @param Request $request
* @return JsonResponse
* @throws MalformedRequestException
* @throws ResourceNotFoundException
*/
public function logic(Request $request) : JsonResponse {
$token = $request->input('token');
$this->emailVerificationActiveAttemptExists->execute($token);
/** @var UserEmailVerification $attempt */
$attempt = $this->fetchesEmailVerificationAttempt->execute(['token' => $token]);
$this->completesEmailVerificationAttempt->execute($attempt);
$this->verifiesUser->execute($attempt->user);
return $this->response([]);
}
}
@@ -0,0 +1,24 @@
<?php
namespace App\Classes\Modules\Accounts\Services;
use App\Classes\Exceptions\MalformedRequestException;
use App\Classes\General\Eloquent\AbstractUpdateRecord;
use App\Models\UserEmailVerification;
use Illuminate\Database\Eloquent\Model;
class CompletesEmailVerificationAttempt extends AbstractUpdateRecord
{
/**
* @param UserEmailVerification $model
* @return Model
* @throws MalformedRequestException
*/
public function execute(UserEmailVerification $model): Model {
$model->is_complete = true;
return $this->handler($model);
}
}
@@ -0,0 +1,35 @@
<?php
namespace App\Classes\Modules\Accounts\Services;
use App\Classes\General\Eloquent\AbstractFetchRecord;
use App\Models\PasswordReset;
use App\Models\UserEmailVerification;
use Illuminate\Database\Eloquent\Builder;
class FetchesEmailVerificationAttempt extends AbstractFetchRecord
{
/** @var UserEmailVerification */
private $repository;
/**
* FetchesResetPasswordToken constructor.
* @param UserEmailVerification $repository
*/
public function __construct(UserEmailVerification $repository)
{
$this->repository = $repository;
}
/**
* @return Builder
*/
public function getRepository(): Builder
{
return $this->repository->newQuery();
}
}
@@ -0,0 +1,29 @@
<?php
namespace App\Classes\Modules\Accounts\Services;
use App\Classes\Exceptions\MalformedRequestException;
use App\Classes\General\Eloquent\AbstractUpdateRecord;
use App\Classes\ValueObjects\Constants\ApprovalStatus;
use App\Models\User;
use App\Models\UserEmailVerification;
use Illuminate\Database\Eloquent\Model;
class VerifiesUser extends AbstractUpdateRecord
{
/**
* @param User $model
* @return Model
* @throws MalformedRequestException
*/
public function execute(User $model): Model {
$model->status = ApprovalStatus::APPROVED;
return $this->handler($model);
}
}
@@ -0,0 +1,40 @@
<?php
namespace App\Classes\Modules\Accounts\Standards\Criteria;
use App\Classes\Exceptions\ResourceNotFoundException;
use App\Models\UserEmailVerification;
class EmailVerificationActiveAttemptExists
{
/** @var UserEmailVerification */
private $repository;
/**
* TokenExistsValidation constructor.
* @param UserEmailVerification $repository
*/
public function __construct(UserEmailVerification $repository)
{
$this->repository = $repository;
}
/**
* @param string $token
* @return bool
* @throws ResourceNotFoundException
*/
public function execute(string $token){
if(!$this->repository->active()->where('token', $token)->first()){
throw new ResourceNotFoundException('The email verification token has expired or doesn\'t exist');
}
return true;
}
}
@@ -0,0 +1,20 @@
<?php
namespace App\Http\Controllers\Accounts;
use App\Classes\Modules\Accounts\ControllersLogic\UserEmailVerificationLogic;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
class UserEmailVerificationController
{
/**
* @param Request $request
* @param UserEmailVerificationLogic $logic
* @return JsonResponse
*/
public function verify(Request $request, UserEmailVerificationLogic $logic): JsonResponse {
return $logic->execute($request);
}
}
+4
View File
@@ -24,4 +24,8 @@ Route::group(['prefix' => 'account', 'namespace' => 'Accounts', 'as' => 'account
Route::post('/reset', 'ResetPasswordController@reset')->name('reset');
});
});
Route::group(['prefix' => 'email', 'as' => 'email.'], function () {
Route::post('/verify', 'UserEmailVerificationController@verify')->name('verify');
});
});