sure
<?php
namespace App\Http\Controllers\Api\V1;
use App\Http\Controllers\Controller;
use Carbon\Carbon;
use App\Models\User;
use Illuminate\Http\Request;
use Illuminate\Http\Response;
use Illuminate\Validation\ValidationException;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Mail;
use App\Mail\EmailVerification;
use App\Mail\ForgottenPasswordVerification;
use App\Http\Resources\Admin\UserResource;
/**
*
* @group V1
* @subgroup Auth
* @subgroupDescription Actions for authenicating the user.
*
*/
class AuthController extends Controller
{
/**
*
* @unauthenticated
* API Login Method
*
* @response {
* "data": {
* "id": 22,
* "name": "Aaron T Harker",
* "email": "[email protected]",
* "locale": "en",
* "email_verified_at": "2022-09-26 05:59:43",
* "created_at": "2022-09-26 05:59:43",
* "updated_at": "2022-09-26 05:59:43",
* "deleted_at": null,
* "address": "16 Somewhere St",
* "city_id": 25,
* "state_id": 11,
* "country_id": 66,
* "membership_id": 2,
* "membership_expiry": "2025-09-26 05:59:43",
* "referrer_id": 1,
* "token": "3|GbwQj6eQQZX2FGSGbgHGMyDkLEi9LzOG3FQRIYHr"
* }
* }
*
*
*/
public function login(Request $request)
{
$request->validate([
'email' => 'required|email',
'password' => 'required',
'device_name' => 'required',
]);
$user = User::where('email', $request->email)->first();
if (! $user || ! Hash::check($request->password, $user->password)) {
throw ValidationException::withMessages([
'email' => ['The provided credentials are incorrect.'],
]);
}
if (! $user->email_verified_at) {
throw ValidationException::withMessages([
'email' => ['Your email address has not been verified, please check your email(include spam folders).'],
]);
}
$user->token = $user->createToken($request->device_name)->plainTextToken;
return (new UserResource($user))
->response()
->setStatusCode(Response::HTTP_OK);
}
/**
*
* @unauthenticated
* API Register Method
*
* @response {
* "data": {
* "name": "Aaron T Harker",
* "email": "[email protected]",
* "updated_at": "2022-09-26 05:59:43",
* "created_at": "2022-09-26 05:59:43",
* "id": 22
* }
*}
*
* @bodyParam name required string The name of the user. Example John Doe
* @bodyParam email required string The user email must be unique. Example [email protected]
* @bodyParam password required string The password must be between 8 and 16 characters, containing at least 1 number, 1 uppercase letter, 1 lowercase letter, and 1 special character with no spaces. Example P@ssw0rd!
*
*/
public function register(Request $request)
{
$validated = $request->validate([
'name' => ['required', 'string', 'max:255'],
'email' => ['required', 'string', 'email', 'max:255', 'unique:users'],
'password' => ['required', 'string', 'min:8', 'regex:/^(?=.*\d)(?=.*[A-Z])(?=.*[a-z])(?=.*[^\w\d\s:])([^\s]){8,16}$/'],
]);
$message = [
'regex' => 'The :attribute must be between 8 and 16 characters, containing at least 1 number, 1 uppercase letter, 1 lowercase letter, and 1 special character with no spaces.',
];
$code = rand(1111,9999);
$user = User::create([
'name' => $validated['name'],
'email' => $validated['email'],
'password' => Hash::make($validated['password']),
'verification_code' => $code,
]);
$user->roles()->sync(2);
dd($user);
Mail::to($user)->send(new EmailVerification($user));
return (new UserResource($user))
->response()
->setStatusCode(Response::HTTP_CREATED);
}
/**
*
* @unauthenticated
* API Verify Email Method
*
* @response {
* "data": {
* "email_verified_at": "25-09-2022 12:19:56",
* "updated_at": "2022-09-25 12:19:56",
* "id": 21,
* "token": "2|Cu54MdCPRsPwtLny17UicB7WN4Me83TeW02Gth1W"
* }
*}
*
*
*/
public function verifyEmail (Request $request)
{
$validated = $request->validate([
'id' => ['required', 'integer'],
'code' => ['required', 'integer'],
'device_name' => ['required', 'string'],
]);
$user = User::find($validated['id']);
if (! $user) {
throw ValidationException::withMessages([
'id' => ['Unknown user id.'],
]);
} elseif ($user->verification_code != $validated['code']) {
throw ValidationException::withMessages([
'code' => ['Incorrect code entered.'],
]);
}
$user->email_verified_at = Carbon::now()->toDateTimeString();
$user->verification_code = null;
$user->save();
$user->token = $user->createToken($request->device_name)->plainTextToken;
return (new UserResource($user))
->response()
->setStatusCode(Response::HTTP_OK);
}
/**
*
* @unauthenticated
* Forgotten Password Method
*
*
*
*/
public function forgotPassword (Request $request)
{
$validated = $request->validate([
'email' => ['required', 'email'],
]);
try {
$user = User::find(13);
$code = rand(1111,9999);
$user->verification_code = $code;
$user->save();
dd($user);
Mail::to($user)->send(new ForgottenPasswordVerification($user));
return response('Email sent', 200);
} catch(e) {
return response('Unknown email', 400);
}
}
}