<?php namespace App\Http\Controllers; use App\Http\Requests\Admin\ForgotPasswordRequest; use App\Http\Requests\Admin\RegisterRequest; use App\Http\Requests\Admin\ResetPasswordRequest; use App\Http\Requests\Admin\UpdatePasswordRequest; use App\Http\Requests\Admin\UpdateProfileRequest; use App\Models\User; use App\Notifications\ForgotPasswordNotification; use App\Notifications\RegisterNotification; use App\Notifications\VerifyEmail; use Illuminate\Http\Request; use Illuminate\Support\Facades\Log; use Illuminate\Support\Facades\Validator; use Symfony\Component\HttpFoundation\Response; class APIController extends Controller { public function login(Request $request) { $credentials = $request->only('email', 'password'); //Validate credential $validator = Validator::make($credentials, [ 'email' => 'required|email', 'password' => 'required' ]); //Send failed response if request is not valid if ($validator->fails()) { return response() ->json(['errors' => $validator->messages()], 422); } if (!auth()->attempt($credentials)) { return response()->json([ 'message' => 'The given data was invalid.', 'errors' => [ 'password' => [ 'Invalid credentials' ], ] ], 422); } $user = User::where('email', $request->email)->first(); if (auth()->user()->status == 0) { return response()->json([ 'message' => 'Account disabled.', 'errors' => [ 'email' => [ 'Your account is disabled, please contact administrator.' ], ] ], 422); } if (!auth()->user()->hasVerifiedEmail()) { return response()->json([ 'message' => 'Email not verified.', 'errors' => [ 'email_verification' => [ 'Your email is not verified.' ], ] ], 422); } $authToken = $user->createToken('auth-token')->plainTextToken; return response()->json([ 'user' => [ 'id' => $user->id, 'user_type' => $user->user_type, 'name' => $user->name, 'email' => $user->email, 'phone_number' => $user->phone_number, 'company' => $user->company, 'secondary_email' => $user->secondary_email, 'secondary_phone' => $user->secondary_phone, 'secondary_name' => $user->secondary_name, 'email_verified' => $user->hasVerifiedEmail(), 'status' => $user->status, 'sms_notification' => $user->sms_notification, 'profile_image' => $user->profile_image->original_url ?? "", 'role' => isset($user->roles[0]) ? [ 'role_id' => $user->roles[0]->id, 'role_name' => $user->roles[0]->title, ]: [], ], 'access_token' => $authToken, ]); } public function register(RegisterRequest $request) { $token = md5(uniqid(rand(), true)); $user = User::create([ 'name' => $request->name, 'email' => $request->email, 'phone_number' => $request->phone_number, 'status' => 1, 'sms_notification' => (int)$request->sms_notification === 1 ? 1 : 0, 'user_type' => 3, 'password' => $request->password, 'email_token' => $token ]); if ($request->file('profile_image', false)) { $user->addMediaFromRequest('profile_image')->toMediaCollection('profile_image', 'user'); } // Assign user role $user->roles()->attach(3); try { //$user->notify((new RegisterNotification())->delay(now()->addSeconds(5))); $user->notify((new VerifyEmail($token))); //->delay(now()->addSeconds(5))); } catch (\Exception $e) { \Log::info($e->getMessage()); } return response()->json([ 'message' => 'User created successfully. Kindly check your inbox to verify email.', ], Response::HTTP_OK); } public function update_profile(UpdateProfileRequest $request) { $user = auth()->user(); $user->update( $request->all(), ); if ($request->file('profile_image', false)) { if (!empty($user->profile_image)) { $user->profile_image->delete(); } $user->addMediaFromRequest('profile_image')->toMediaCollection('profile_image', 'user'); } return response()->json([ 'message' => 'Profile updated successfully', ], Response::HTTP_OK); } public function get_user() { $user = auth()->user(); return response()->json(['user' => [ 'id' => $user->id, 'user_type' => $user->user_type, 'name' => $user->name, 'email' => $user->email, 'phone_number' => $user->phone_number, 'company' => $user->company, 'fax_number' => $user->fax_number, 'server_timezone' => date_default_timezone_get(), 'status' => $user->status, 'sms_notification' => $user->sms_notification, 'profile_image' => $user->profile_image ? [ "url" => $user->profile_image->url, "thumbnail" => $user->profile_image->thumbnail, "preview" => $user->profile_image->preview, ] : null, ]]); } function logout(Request $request) { $request->user()->tokens()->delete(); return response()->json(['message' => "User has been logged out successfully."]); } public function forgot_password(ForgotPasswordRequest $request) { $resetCode = substr(number_format(time() * rand(), 0, '', ''), 0, 6); $user = User::whereEmail($request->input("email"))->first(); if (!$user) return response()->json([ 'message' => "This user does not exists.", 'errors' => ["error" => ["This user does not exists."]] ], 422); $user->password_reset_code = $resetCode; $user->save(); try { $user->notify(new ForgotPasswordNotification($resetCode)); } catch (\Exception $e) { Log::info($e->getMessage()); } return response()->json(['message' => "A Password reset code has been sent to your email address."]); } public function reset_password(ResetPasswordRequest $request) { $user = User::whereEmail($request->input("email")) ->wherePasswordResetCode($request->input("password_reset_code")) ->first(); if (empty($user)) { return response()->json([ 'message' => "The given data was invalid.", 'errors' => ["password_reset_code" => ["The Password Reset Code is invalid or user does not exists."]] ], 422); } $user->password = \Hash::make($request->input("new_password")); $user->password_last_changed = new \DateTime; $user->password_reset_code = null; $user->save(); return response()->json(['message' => "Password has been changed successfully."]); } public function verifyEmail(Request $request) { $request->validate([ 'token' => 'required', ]); $user = User::where('email_token', $request->get('token'))->first(); if (empty($user)) { return response()->json([ 'message' => "Invalid token.", 'errors' => ["token" => ["The given token is invalid."]] ], 422); } $user->email_verified_at = now(); $user->email_token = null; $user->save(); return response()->json([ 'message' => "Email verified successfully.", ], Response::HTTP_OK); } public function resendVerificationEmail(Request $request) { $request->validate([ 'email' => 'required|exists:users,email', ]); $user = User::where('email', $request->get('email'))->first(); if (empty($user)) { return response()->json([ 'message' => "Invalid email.", 'errors' => ["token" => ["This email does not exists in our records."]] ], 422); } if($user->hasVerifiedEmail()){ return \response()->json([ 'message' => 'Email already verified.', 'errors' => ["email" => ["You have already verified your email."]] ])->setStatusCode(Response::HTTP_UNPROCESSABLE_ENTITY); }else{ try { $token = md5(uniqid(rand(), true)); $user->notify((new VerifyEmail($token))); $user->email_token = $token; $user->save(); return \response()->json([ 'message' => 'Verification link sent to your email address.', ])->setStatusCode(Response::HTTP_OK); } catch (\Exception $e) { Log::info($e->getMessage()); return \response()->json([ 'message' => 'Email not sent.', 'errors' => ["email" => ["Something went wrong."]] ])->setStatusCode(Response::HTTP_UNPROCESSABLE_ENTITY); } } } public function update_password(UpdatePasswordRequest $request) { auth()->user()->update($request->validated()); return response()->json(['message' => "Password updated successfully."]); } }