add user email verification

This commit is contained in:
Milos Holba
2021-05-14 11:41:48 +02:00
parent 1ba685c484
commit 32bc3bacc0
5 changed files with 92 additions and 7 deletions
@@ -1,6 +1,7 @@
<?php <?php
namespace App\Http\Controllers\User; namespace App\Http\Controllers\User;
use App\Models\User;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use App\Services\DemoService; use App\Services\DemoService;
use App\Http\Controllers\Controller; use App\Http\Controllers\Controller;
@@ -11,6 +12,7 @@ use Illuminate\Support\Facades\Validator;
use App\Http\Resources\UserStorageResource; use App\Http\Resources\UserStorageResource;
use Illuminate\Contracts\Routing\ResponseFactory; use Illuminate\Contracts\Routing\ResponseFactory;
use App\Http\Requests\User\UpdateUserPasswordRequest; use App\Http\Requests\User\UpdateUserPasswordRequest;
use Laravel\Sanctum\PersonalAccessToken;
class AccountController extends Controller class AccountController extends Controller
{ {
@@ -158,10 +160,50 @@ class AccountController extends Controller
* @param $id * @param $id
* @return ResponseFactory|\Illuminate\Http\Response * @return ResponseFactory|\Illuminate\Http\Response
*/ */
public function revoke_token($id) public function revoke_token(PersonalAccessToken $token)
{ {
Auth::user()->tokens()->whereId($id)->delete(); if(Auth::user()->id !== $token->tokenable_id) {
return response('Unauthorized', 401);
}
$token->delete();
return response('Deleted!', 204); return response('Deleted!', 204);
} }
/**
* Email verification
*
* @param Request $request
* @param User $user
* @return ResponseFactory|\Illuminate\Http\Response
*/
public function email_verify(User $user, Request $request)
{
if (!$request->hasValidSignature()) {
return response("Invalid/Expired url provided.", 401);
}
if (!$user->hasVerifiedEmail()) {
$user->markEmailAsVerified();
}
return redirect()->to('/');
}
/**
* Resend verification email
*
* @return ResponseFactory|\Illuminate\Http\Response
*/
public function resend_verify_email()
{
if (Auth::user()->hasVerifiedEmail()) {
return response("Email already verified.", 204);
}
Auth::user()->sendEmailVerificationNotification();
return response("Email verification link sent on your email", 200);
}
} }
+2 -1
View File
@@ -13,8 +13,9 @@ use Illuminate\Support\Facades\Storage;
use Illuminate\Notifications\Notifiable; use Illuminate\Notifications\Notifiable;
use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Foundation\Auth\User as Authenticatable; use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Contracts\Auth\MustVerifyEmail;
class User extends Authenticatable class User extends Authenticatable implements MustVerifyEmail
{ {
use Notifiable, Billable, Sortable, HasFactory, HasApiTokens; use Notifiable, Billable, Sortable, HasFactory, HasApiTokens;
+5 -1
View File
@@ -7,10 +7,14 @@ use App\Http\Controllers\User\PaymentMethodsController;
Route::post('/check', [AuthController::class, 'check_account']); Route::post('/check', [AuthController::class, 'check_account']);
// Email verification
Route::get('email/verify/{user}', [AccountController::class, 'email_verify'])->name('verification.verify');
Route::group(['middleware' => ['auth:sanctum']], function () { Route::group(['middleware' => ['auth:sanctum']], function () {
// Account // Account
Route::patch('/relationships/settings', [AccountController::class, 'update_user_settings']); Route::patch('/relationships/settings', [AccountController::class, 'update_user_settings']);
Route::delete('/token/revoke/{id}', [AccountController::class, 'revoke_token']); Route::post('/email/resend/verify', [AccountController::class, 'resend_verify_email']);
Route::delete('/token/revoke/{token}', [AccountController::class, 'revoke_token']);
Route::post('/token/create', [AccountController::class, 'create_token']); Route::post('/token/create', [AccountController::class, 'create_token']);
Route::post('/password', [AccountController::class, 'change_password']); Route::post('/password', [AccountController::class, 'change_password']);
Route::get('/subscription', [SubscriptionController::class, 'show']); Route::get('/subscription', [SubscriptionController::class, 'show']);
+5
View File
@@ -5,6 +5,7 @@ namespace Tests\Feature\Accounts;
use App\Models\Setting; use App\Models\Setting;
use App\Models\User; use App\Models\User;
use App\Notifications\ResetPassword; use App\Notifications\ResetPassword;
use Illuminate\Auth\Notifications\VerifyEmail;
use Illuminate\Foundation\Testing\DatabaseMigrations; use Illuminate\Foundation\Testing\DatabaseMigrations;
use Illuminate\Support\Facades\Password; use Illuminate\Support\Facades\Password;
use Laravel\Sanctum\Sanctum; use Laravel\Sanctum\Sanctum;
@@ -42,6 +43,8 @@ class AuthTest extends TestCase
*/ */
public function it_register_user() public function it_register_user()
{ {
Notification::fake();
collect([ collect([
[ [
'name' => 'storage_default', 'name' => 'storage_default',
@@ -76,6 +79,8 @@ class AuthTest extends TestCase
Storage::disk('local') Storage::disk('local')
->assertExists('files/' . User::first()->id); ->assertExists('files/' . User::first()->id);
Notification::assertTimesSent(1, VerifyEmail::class);
} }
/** /**
+36 -3
View File
@@ -6,10 +6,12 @@ use App\Models\User;
use App\Services\SetupService; use App\Services\SetupService;
use Illuminate\Foundation\Testing\DatabaseMigrations; use Illuminate\Foundation\Testing\DatabaseMigrations;
use Illuminate\Foundation\Testing\RefreshDatabase; use Illuminate\Foundation\Testing\RefreshDatabase;
use Illuminate\Auth\Notifications\VerifyEmail;
use Illuminate\Foundation\Testing\WithFaker; use Illuminate\Foundation\Testing\WithFaker;
use Illuminate\Http\UploadedFile; use Illuminate\Http\UploadedFile;
use Laravel\Sanctum\Sanctum; use Laravel\Sanctum\Sanctum;
use Storage; use Storage;
use Notification;
use Tests\TestCase; use Tests\TestCase;
use App\Models\Folder; use App\Models\Folder;
@@ -191,7 +193,6 @@ class UserAccountTest extends TestCase
$this->assertDatabaseMissing('personal_access_tokens', [ $this->assertDatabaseMissing('personal_access_tokens', [
'id' => $token_id 'id' => $token_id
]); ]);
} }
/** /**
@@ -225,7 +226,7 @@ class UserAccountTest extends TestCase
public function it_use_user_token_to_request() public function it_use_user_token_to_request()
{ {
$user = User::factory(User::class) $user = User::factory(User::class)
->create(); ->create();
$folder = Folder::factory(Folder::class) $folder = Folder::factory(Folder::class)
->create([ ->create([
@@ -256,7 +257,39 @@ class UserAccountTest extends TestCase
// 'user_id' => $user->id, // 'user_id' => $user->id,
// ]); // ]);
dd($response); // dd($response);
}
/**
* @test
*/
public function it_user_email_verify()
{
$user = User::factory(User::class)
->create();
$this->getJson("/api/user/email/verify/$user->id");
$this->assertNotNull($user->email_verified_at);
}
/**
* @test
*/
public function it_resend_user_verify_email()
{
Notification::fake();
$user = User::factory(User::class)
->create([
'email_verified_at' => null
]);
Sanctum::actingAs($user);
$this->postJson('/api/user/email/resend/verify')
->assertStatus(200);
Notification::assertTimesSent(1, VerifyEmail::class);
} }
} }