You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
445 lines
18 KiB
445 lines
18 KiB
2 years ago
|
<?php
|
||
|
|
||
|
namespace App\Http\Controllers\Api\V1\Auth;
|
||
|
|
||
|
use App\Models\User;
|
||
|
use Carbon\CarbonInterval;
|
||
|
use Illuminate\Http\Request;
|
||
|
use App\CentralLogics\Helpers;
|
||
|
use Illuminate\Support\Carbon;
|
||
|
use App\Mail\EmailVerification;
|
||
|
use App\Models\BusinessSetting;
|
||
|
use App\CentralLogics\SMS_module;
|
||
|
use App\Models\WalletTransaction;
|
||
|
use App\Models\EmailVerifications;
|
||
|
use App\Models\PhoneVerifications;
|
||
|
use Illuminate\Support\Facades\DB;
|
||
|
use App\CentralLogics\CustomerLogic;
|
||
|
use App\Http\Controllers\Controller;
|
||
|
use Illuminate\Support\Facades\Mail;
|
||
|
use Illuminate\Support\Facades\Validator;
|
||
|
|
||
|
class CustomerAuthController extends Controller
|
||
|
{
|
||
|
public function verify_phone(Request $request)
|
||
|
{
|
||
|
$validator = Validator::make($request->all(), [
|
||
|
'phone' => 'required|min:11|max:14',
|
||
|
'otp'=>'required',
|
||
|
]);
|
||
|
|
||
|
if ($validator->fails()) {
|
||
|
return response()->json(['errors' => Helpers::error_processor($validator)], 403);
|
||
|
}
|
||
|
$user = User::where('phone', $request->phone)->first();
|
||
|
if($user)
|
||
|
{
|
||
|
if($user->is_phone_verified)
|
||
|
{
|
||
|
return response()->json([
|
||
|
'message' => translate('messages.phone_number_is_already_varified')
|
||
|
], 200);
|
||
|
|
||
|
}
|
||
|
|
||
|
if(env('APP_MODE')=='demo')
|
||
|
{
|
||
|
if($request['otp']=="1234")
|
||
|
{
|
||
|
$user->is_phone_verified = 1;
|
||
|
$user->save();
|
||
|
|
||
|
return response()->json([
|
||
|
'message' => translate('messages.phone_number_varified_successfully'),
|
||
|
'otp' => 'inactive'
|
||
|
], 200);
|
||
|
}
|
||
|
return response()->json([
|
||
|
'message' => translate('messages.phone_number_and_otp_not_matched')
|
||
|
], 404);
|
||
|
}
|
||
|
|
||
|
$data = DB::table('phone_verifications')->where([
|
||
|
'phone' => $request['phone'],
|
||
|
'token' => $request['otp'],
|
||
|
])->first();
|
||
|
|
||
|
if($data)
|
||
|
{
|
||
|
DB::table('phone_verifications')->where([
|
||
|
'phone' => $request['phone'],
|
||
|
'token' => $request['otp'],
|
||
|
])->delete();
|
||
|
|
||
|
$user->is_phone_verified = 1;
|
||
|
$user->save();
|
||
|
return response()->json([
|
||
|
'message' => translate('messages.phone_number_varified_successfully'),
|
||
|
'otp' => 'inactive'
|
||
|
], 200);
|
||
|
}
|
||
|
else{
|
||
|
// $otp_hit = BusinessSetting::where('key', 'max_otp_hit')->first();
|
||
|
// $max_otp_hit =isset($otp_hit) ? $otp_hit->value : 5 ;
|
||
|
$max_otp_hit = 5;
|
||
|
|
||
|
// $otp_hit_time = BusinessSetting::where('key', 'max_otp_hit_time')->first();
|
||
|
// $max_otp_hit_time =isset($otp_hit_time) ? $otp_hit_time->value : 30 ;
|
||
|
|
||
|
$max_otp_hit_time = 60; // seconds
|
||
|
$temp_block_time = 600; // seconds
|
||
|
|
||
|
$verification_data= DB::table('phone_verifications')->where('phone', $request['phone'])->first();
|
||
|
|
||
|
if(isset($verification_data)){
|
||
|
|
||
|
|
||
|
// if($verification_data->is_blocked == 1){
|
||
|
// $errors = [];
|
||
|
// array_push($errors, ['code' => 'otp', 'message' => translate('messages.your_account_is_blocked')]);
|
||
|
// return response()->json(['errors' => $errors ], 403);
|
||
|
// }
|
||
|
|
||
|
|
||
|
|
||
|
if(isset($verification_data->temp_block_time ) && Carbon::parse($verification_data->temp_block_time)->DiffInSeconds() <= $temp_block_time){
|
||
|
$time= $temp_block_time - Carbon::parse($verification_data->temp_block_time)->DiffInSeconds();
|
||
|
|
||
|
$errors = [];
|
||
|
array_push($errors, ['code' => 'otp_block_time',
|
||
|
'message' => translate('messages.please_try_again_after_').CarbonInterval::seconds($time)->cascade()->forHumans()
|
||
|
]);
|
||
|
return response()->json([
|
||
|
'errors' => $errors
|
||
|
], 405);
|
||
|
}
|
||
|
|
||
|
if($verification_data->is_temp_blocked == 1 && Carbon::parse($verification_data->updated_at)->DiffInSeconds() >= $max_otp_hit_time){
|
||
|
DB::table('phone_verifications')->updateOrInsert(['phone' => $request['phone']],
|
||
|
[
|
||
|
'otp_hit_count' => 0,
|
||
|
'is_temp_blocked' => 0,
|
||
|
'temp_block_time' => null,
|
||
|
'created_at' => now(),
|
||
|
'updated_at' => now(),
|
||
|
]);
|
||
|
}
|
||
|
|
||
|
// if($verification_data->is_temp_blocked == 1 && Carbon::parse($verification_data->updated_at)->DiffInSeconds() < $max_otp_hit_time){
|
||
|
// $errors = [];
|
||
|
// array_push($errors, ['code' => 'otp', 'message' => translate('messages.please_try_again_after_').$time.' '.translate('messages.seconds') ]);
|
||
|
// return response()->json([
|
||
|
// 'errors' => $errors
|
||
|
// ], 405);
|
||
|
// }
|
||
|
|
||
|
if($verification_data->otp_hit_count >= $max_otp_hit && Carbon::parse($verification_data->updated_at)->DiffInSeconds() < $max_otp_hit_time && $verification_data->is_temp_blocked == 0){
|
||
|
|
||
|
DB::table('phone_verifications')->updateOrInsert(['phone' => $request['phone']],
|
||
|
[
|
||
|
'is_temp_blocked' => 1,
|
||
|
'temp_block_time' => now(),
|
||
|
'created_at' => now(),
|
||
|
'updated_at' => now(),
|
||
|
]);
|
||
|
$errors = [];
|
||
|
array_push($errors, ['code' => 'otp_temp_blocked', 'message' => translate('messages.Too_many_attemps') ]);
|
||
|
return response()->json([
|
||
|
'errors' => $errors
|
||
|
], 405);
|
||
|
}
|
||
|
|
||
|
|
||
|
// if($verification_data->otp_hit_count >= $max_otp_hit && Carbon::parse($verification_data->updated_at)->DiffInSeconds() < $max_otp_hit_time){
|
||
|
|
||
|
// DB::table('phone_verifications')->updateOrInsert(['phone' => $request['phone']],
|
||
|
// [
|
||
|
// // 'is_temp_blocked' => 1,
|
||
|
// 'created_at' => now(),
|
||
|
// 'updated_at' => now(),
|
||
|
// ]);
|
||
|
// // $errors = [];
|
||
|
// array_push($errors, ['code' => 'otp_warning', 'message' =>translate('messages.Too_many_attemps') ]);
|
||
|
// return response()->json([
|
||
|
// 'errors' => $errors
|
||
|
// ], 405);
|
||
|
// }
|
||
|
}
|
||
|
|
||
|
|
||
|
DB::table('phone_verifications')->updateOrInsert(['phone' => $request['phone']],
|
||
|
[
|
||
|
'otp_hit_count' => DB::raw('otp_hit_count + 1'),
|
||
|
'updated_at' => now(),
|
||
|
'temp_block_time' => null,
|
||
|
]);
|
||
|
|
||
|
return response()->json([
|
||
|
'message' => translate('messages.phone_number_and_otp_not_matched')
|
||
|
], 404);
|
||
|
}
|
||
|
}
|
||
|
return response()->json([
|
||
|
'message' => translate('messages.not_found')
|
||
|
], 404);
|
||
|
|
||
|
}
|
||
|
|
||
|
public function check_email(Request $request)
|
||
|
{
|
||
|
$validator = Validator::make($request->all(), [
|
||
|
'email' => 'required|unique:users'
|
||
|
]);
|
||
|
|
||
|
if ($validator->fails()) {
|
||
|
return response()->json(['errors' => Helpers::error_processor($validator)], 403);
|
||
|
}
|
||
|
|
||
|
|
||
|
if (BusinessSetting::where(['key'=>'email_verification'])->first()->value){
|
||
|
$token = rand(1000, 9999);
|
||
|
DB::table('email_verifications')->insert([
|
||
|
'email' => $request['email'],
|
||
|
'token' => $token,
|
||
|
'created_at' => now(),
|
||
|
'updated_at' => now(),
|
||
|
]);
|
||
|
try{
|
||
|
if(config('mail.status')) {
|
||
|
Mail::to($request['email'])->send(new EmailVerification($token));
|
||
|
}
|
||
|
|
||
|
}catch(\Exception $ex){
|
||
|
info($ex);
|
||
|
}
|
||
|
|
||
|
|
||
|
return response()->json([
|
||
|
'message' => 'Email is ready to register',
|
||
|
'token' => 'active'
|
||
|
], 200);
|
||
|
}else{
|
||
|
return response()->json([
|
||
|
'message' => 'Email is ready to register',
|
||
|
'token' => 'inactive'
|
||
|
], 200);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public function verify_email(Request $request)
|
||
|
{
|
||
|
$validator = Validator::make($request->all(), [
|
||
|
'email' => 'required'
|
||
|
]);
|
||
|
|
||
|
if ($validator->fails()) {
|
||
|
return response()->json(['errors' => Helpers::error_processor($validator)], 403);
|
||
|
}
|
||
|
|
||
|
$verify = EmailVerifications::where(['email' => $request['email'], 'token' => $request['token']])->first();
|
||
|
|
||
|
if (isset($verify)) {
|
||
|
$verify->delete();
|
||
|
return response()->json([
|
||
|
'message' => translate('messages.token_varified'),
|
||
|
], 200);
|
||
|
}
|
||
|
|
||
|
$errors = [];
|
||
|
array_push($errors, ['code' => 'token', 'message' => translate('messages.token_not_found')]);
|
||
|
return response()->json(['errors' => $errors ]
|
||
|
, 404);
|
||
|
}
|
||
|
|
||
|
public function register(Request $request)
|
||
|
{
|
||
|
$validator = Validator::make($request->all(), [
|
||
|
'f_name' => 'required',
|
||
|
'l_name' => 'required',
|
||
|
'email' => 'required|unique:users',
|
||
|
'phone' => 'required|unique:users',
|
||
|
'password' => 'required|min:6',
|
||
|
], [
|
||
|
'f_name.required' => 'The first name field is required.',
|
||
|
'l_name.required' => 'The last name field is required.',
|
||
|
]);
|
||
|
|
||
|
if ($validator->fails()) {
|
||
|
return response()->json(['errors' => Helpers::error_processor($validator)], 403);
|
||
|
}
|
||
|
$ref_by= null ;
|
||
|
$customer_verification = BusinessSetting::where('key','customer_verification')->first()->value;
|
||
|
//Save point to refeer
|
||
|
if($request->ref_code) {
|
||
|
$ref_status = BusinessSetting::where('key','ref_earning_status')->first()->value;
|
||
|
if ($ref_status != '1') {
|
||
|
return response()->json(['errors'=>Helpers::error_formater('ref_code', translate('messages.referer_disable'))], 403);
|
||
|
}
|
||
|
|
||
|
$referar_user = User::where('ref_code', '=', $request->ref_code)->first();
|
||
|
if (!$referar_user || !$referar_user->status) {
|
||
|
return response()->json(['errors'=>Helpers::error_formater('ref_code',translate('messages.referer_code_not_found'))], 405);
|
||
|
}
|
||
|
|
||
|
if(WalletTransaction::where('reference', $request->phone)->first()) {
|
||
|
return response()->json(['errors'=>Helpers::error_formater('phone',translate('Referrer code already used'))], 203);
|
||
|
}
|
||
|
|
||
|
// $ref_code_exchange_amt = BusinessSetting::where('key','ref_earning_exchange_rate')->first()->value;
|
||
|
|
||
|
// $refer_wallet_transaction = CustomerLogic::create_wallet_transaction($referar_user->id, $ref_code_exchange_amt, 'referrer',$request->phone);
|
||
|
//dd($refer_wallet_transaction);
|
||
|
// try{
|
||
|
// if(config('mail.status')) {
|
||
|
// Mail::to($referar_user->email)->send(new \App\Mail\AddFundToWallet($refer_wallet_transaction));
|
||
|
// }
|
||
|
// }catch(\Exception $ex)
|
||
|
// {
|
||
|
// info($ex->getMessage());
|
||
|
// }
|
||
|
|
||
|
$ref_by= $referar_user->id;
|
||
|
}
|
||
|
|
||
|
$user = User::create([
|
||
|
'f_name' => $request->f_name,
|
||
|
'l_name' => $request->l_name,
|
||
|
'email' => $request->email,
|
||
|
'phone' => $request->phone,
|
||
|
'ref_by' => $ref_by,
|
||
|
'password' => bcrypt($request->password),
|
||
|
]);
|
||
|
$user->ref_code = Helpers::generate_referer_code($user);
|
||
|
$user->save();
|
||
|
|
||
|
$token = $user->createToken('RestaurantCustomerAuth')->accessToken;
|
||
|
|
||
|
if($customer_verification && env('APP_MODE') !='demo')
|
||
|
{
|
||
|
|
||
|
// $interval_time = BusinessSetting::where('key', 'otp_interval_time')->first();
|
||
|
// $otp_interval_time= isset($interval_time) ? $interval_time->value : 20;
|
||
|
$otp_interval_time= 60; //seconds
|
||
|
$verification_data= DB::table('phone_verifications')->where('phone', $request['phone'])->first();
|
||
|
|
||
|
if(isset($verification_data) && Carbon::parse($verification_data->updated_at)->DiffInSeconds() < $otp_interval_time){
|
||
|
$time= $otp_interval_time - Carbon::parse($verification_data->updated_at)->DiffInSeconds();
|
||
|
$errors = [];
|
||
|
array_push($errors, ['code' => 'otp', 'message' => translate('messages.please_try_again_after_').$time.' '.translate('messages.seconds')]);
|
||
|
return response()->json([
|
||
|
'errors' => $errors
|
||
|
], 405);
|
||
|
}
|
||
|
|
||
|
$otp = rand(1000, 9999);
|
||
|
DB::table('phone_verifications')->updateOrInsert(['phone' => $request['phone']],
|
||
|
[
|
||
|
'token' => $otp,
|
||
|
'otp_hit_count' => 0,
|
||
|
'created_at' => now(),
|
||
|
'updated_at' => now(),
|
||
|
]);
|
||
|
// Mail::to($request['email'])->send(new EmailVerification($otp));
|
||
|
$response = SMS_module::send($request['phone'],$otp);
|
||
|
if($response != 'success')
|
||
|
{
|
||
|
$errors = [];
|
||
|
array_push($errors, ['code' => 'otp', 'message' => translate('messages.faield_to_send_sms')]);
|
||
|
return response()->json([
|
||
|
'errors' => $errors
|
||
|
], 405);
|
||
|
}
|
||
|
}
|
||
|
try
|
||
|
{
|
||
|
Mail::to($request->email)->send(new \App\Mail\CustomerRegistration($request->f_name.' '.$request->l_name));
|
||
|
}
|
||
|
catch(\Exception $ex)
|
||
|
{
|
||
|
info($ex);
|
||
|
}
|
||
|
|
||
|
return response()->json(['token' => $token,'is_phone_verified' => 0, 'phone_verify_end_url'=>"api/v1/auth/verify-phone" ], 200);
|
||
|
}
|
||
|
|
||
|
public function login(Request $request)
|
||
|
{
|
||
|
$validator = Validator::make($request->all(), [
|
||
|
'phone' => 'required',
|
||
|
'password' => 'required|min:6'
|
||
|
]);
|
||
|
|
||
|
if ($validator->fails()) {
|
||
|
return response()->json(['errors' => Helpers::error_processor($validator)], 403);
|
||
|
}
|
||
|
$data = [
|
||
|
'phone' => $request->phone,
|
||
|
'password' => $request->password
|
||
|
];
|
||
|
|
||
|
$customer_verification = BusinessSetting::where('key','customer_verification')->first()->value;
|
||
|
//dd($customer_verification);
|
||
|
if (auth()->attempt($data)) {
|
||
|
$token = auth()->user()->createToken('RestaurantCustomerAuth')->accessToken;
|
||
|
if(!auth()->user()->status)
|
||
|
{
|
||
|
$errors = [];
|
||
|
array_push($errors, ['code' => 'auth-003', 'message' => translate('messages.your_account_is_blocked')]);
|
||
|
return response()->json([
|
||
|
'errors' => $errors
|
||
|
], 403);
|
||
|
}
|
||
|
if($customer_verification && !auth()->user()->is_phone_verified && env('APP_MODE') != 'demo')
|
||
|
{
|
||
|
|
||
|
// $interval_time = BusinessSetting::where('key', 'otp_interval_time')->first();
|
||
|
// $otp_interval_time= isset($interval_time) ? $interval_time->value : 60;
|
||
|
$otp_interval_time= 60; //seconds
|
||
|
|
||
|
$verification_data= DB::table('phone_verifications')->where('phone', $request['phone'])->first();
|
||
|
|
||
|
if(isset($verification_data) && Carbon::parse($verification_data->updated_at)->DiffInSeconds() < $otp_interval_time){
|
||
|
|
||
|
$time= $otp_interval_time - Carbon::parse($verification_data->updated_at)->DiffInSeconds();
|
||
|
$errors = [];
|
||
|
array_push($errors, ['code' => 'otp', 'message' => translate('messages.please_try_again_after_').$time.' '.translate('messages.seconds')]);
|
||
|
return response()->json([
|
||
|
'errors' => $errors
|
||
|
], 405);
|
||
|
}
|
||
|
|
||
|
$otp = rand(1000, 9999);
|
||
|
DB::table('phone_verifications')->updateOrInsert(['phone' => $request['phone']],
|
||
|
[
|
||
|
'token' => $otp,
|
||
|
'otp_hit_count' => 0,
|
||
|
'created_at' => now(),
|
||
|
'updated_at' => now(),
|
||
|
]);
|
||
|
$response = SMS_module::send($request['phone'],$otp);
|
||
|
// $response = 'qq';
|
||
|
if($response != 'success')
|
||
|
{
|
||
|
$errors = [];
|
||
|
array_push($errors, ['code' => 'otp', 'message' => translate('messages.faield_to_send_sms')]);
|
||
|
return response()->json([
|
||
|
'errors' => $errors
|
||
|
], 405);
|
||
|
}
|
||
|
}
|
||
|
$user = auth()->user();
|
||
|
if($user->ref_code == null && isset($user->id)){
|
||
|
$ref_code = Helpers::generate_referer_code($user);
|
||
|
DB::table('users')->where('phone', $user->phone)->update(['ref_code' => $ref_code]);
|
||
|
}
|
||
|
return response()->json(['token' => $token, 'is_phone_verified'=>auth()->user()->is_phone_verified], 200);
|
||
|
} else {
|
||
|
$errors = [];
|
||
|
array_push($errors, ['code' => 'auth-001', 'message' => translate('messages.Unauthorized')]);
|
||
|
return response()->json([
|
||
|
'errors' => $errors
|
||
|
], 401);
|
||
|
}
|
||
|
}
|
||
|
}
|