sms integration
This commit is contained in:
@@ -3,12 +3,15 @@
|
||||
namespace App\Http\Controllers;
|
||||
|
||||
use App\Http\Resources\ItemCollection;
|
||||
use App\Jobs\SendSmsJob;
|
||||
use App\Models\Area;
|
||||
use App\Models\BlockUser;
|
||||
use App\Models\Blog;
|
||||
use App\Models\Category;
|
||||
use App\Models\Chat;
|
||||
use App\Models\City;
|
||||
use App\Models\Client;
|
||||
use App\Models\Clientsreg;
|
||||
use App\Models\ContactUs;
|
||||
use App\Models\Country;
|
||||
use App\Models\Currency;
|
||||
@@ -173,10 +176,10 @@ class ApiController extends Controller
|
||||
|
||||
// First try strict match
|
||||
$user = User::where('type', 'phone')
|
||||
->where('mobile', $mobile)
|
||||
->where('mobile', $mobile)
|
||||
->withTrashed()
|
||||
->first();
|
||||
|
||||
|
||||
if (!$user) {
|
||||
return ResponseService::errorResponse(
|
||||
__('User not found. Please signup first.')
|
||||
@@ -3950,145 +3953,10 @@ class ApiController extends Controller
|
||||
return ResponseService::errorResponse();
|
||||
}
|
||||
}
|
||||
public function getOtp(Request $request)
|
||||
{
|
||||
try {
|
||||
$validator = Validator::make($request->query(), [
|
||||
'country_code' => 'required|string|max:5',
|
||||
'number' => 'required|string|max:15',
|
||||
]);
|
||||
|
||||
if ($validator->fails()) {
|
||||
return ResponseService::validationError($validator->errors()->first());
|
||||
}
|
||||
|
||||
// Normalize inputs
|
||||
$countryCode = ltrim(trim($request->query('country_code')), '+');
|
||||
$number = preg_replace('/\D/', '', $request->query('number'));
|
||||
|
||||
$toNumber = '+' . $countryCode . $number;
|
||||
|
||||
$twilioSettings = Setting::whereIn('name', [
|
||||
'twilio_account_sid',
|
||||
'twilio_auth_token',
|
||||
'twilio_my_phone_number',
|
||||
])->pluck('value', 'name');
|
||||
|
||||
if ($twilioSettings->count() < 3) {
|
||||
return ResponseService::errorResponse(__('Twilio settings are missing.'));
|
||||
}
|
||||
|
||||
$client = new TwilioRestClient(
|
||||
$twilioSettings['twilio_account_sid'],
|
||||
$twilioSettings['twilio_auth_token']
|
||||
);
|
||||
|
||||
try {
|
||||
$client->lookups->v1->phoneNumbers($toNumber)->fetch();
|
||||
} catch (\Throwable $e) {
|
||||
return ResponseService::errorResponse(__('Invalid phone number.'));
|
||||
}
|
||||
|
||||
$otp = rand(100000, 999999);
|
||||
$expireAt = now()->addMinutes(10);
|
||||
|
||||
NumberOtp::updateOrCreate(
|
||||
[
|
||||
'number' => $number,
|
||||
],
|
||||
[
|
||||
'otp' => $otp,
|
||||
'expire_at' => $expireAt,
|
||||
]
|
||||
);
|
||||
|
||||
// Send OTP
|
||||
$client->messages->create($toNumber, [
|
||||
'from' => $twilioSettings['twilio_my_phone_number'],
|
||||
'body' => "Your OTP is: $otp. It expires in 10 minutes.",
|
||||
]);
|
||||
|
||||
return ResponseService::successResponse(__('OTP sent successfully.'));
|
||||
} catch (\Throwable $th) {
|
||||
ResponseService::logErrorResponse($th, 'OTP Controller -> getOtp');
|
||||
|
||||
return ResponseService::errorResponse();
|
||||
}
|
||||
}
|
||||
|
||||
public function verifyOtp(Request $request)
|
||||
{
|
||||
try {
|
||||
$validator = Validator::make($request->all(), [
|
||||
'number' => 'required|string',
|
||||
'country_code' => 'required|string',
|
||||
'otp' => 'required|numeric|digits:6',
|
||||
'password' => 'nullable|string|min:6',
|
||||
]);
|
||||
|
||||
if ($validator->fails()) {
|
||||
return ResponseService::validationError($validator->errors()->first());
|
||||
}
|
||||
|
||||
$number = $request->query('number');
|
||||
$countryCode = $request->query('country_code');
|
||||
|
||||
// Format full phone number
|
||||
// $requestNumber = $countryCode.$number;
|
||||
|
||||
// $trimmedNumber = ltrim($requestNumber, '+');
|
||||
// $toNumber = '+'.$trimmedNumber;
|
||||
|
||||
$otpRecord = NumberOtp::where('number', $number)->first();
|
||||
if (! $otpRecord) {
|
||||
return ResponseService::errorResponse(__('OTP not found.'));
|
||||
}
|
||||
if (now()->isAfter($otpRecord->expire_at)) {
|
||||
return ResponseService::validationError(__('OTP has expired.'));
|
||||
}
|
||||
|
||||
if ($otpRecord->attempts >= 3) {
|
||||
$otpRecord->delete();
|
||||
|
||||
return ResponseService::validationError(__('OTP expired after 3 failed attempts.'));
|
||||
}
|
||||
|
||||
if ($otpRecord->otp != $request->otp) {
|
||||
$otpRecord->increment('attempts');
|
||||
|
||||
return ResponseService::validationError(__('Invalid OTP.'));
|
||||
}
|
||||
$otpRecord->delete();
|
||||
|
||||
$user = User::where('mobile', $request->number)->where('type', 'phone')->first();
|
||||
|
||||
if (! $user) {
|
||||
$user = User::create([
|
||||
'mobile' => $request->number,
|
||||
'type' => 'phone',
|
||||
'country_code' => $countryCode,
|
||||
'password' => ! empty($request->password) ? Hash::make($request->password) : '',
|
||||
]);
|
||||
$user->assignRole('User');
|
||||
}else{
|
||||
if (! empty($countryCode)) {
|
||||
$user->country_code = ltrim($countryCode, '+');
|
||||
}
|
||||
$user->save();
|
||||
}
|
||||
|
||||
Auth::login($user);
|
||||
$auth = User::find(Auth::id());
|
||||
|
||||
$token = $auth->createToken($auth->name ?? '')->plainTextToken;
|
||||
|
||||
return ResponseService::successResponse(__('User logged-in successfully'), $auth, ['token' => $token]);
|
||||
} catch (Throwable $th) {
|
||||
ResponseService::logErrorResponse($th, 'OTP Controller -> verifyOtp');
|
||||
|
||||
return ResponseService::errorResponse();
|
||||
}
|
||||
}
|
||||
public function userExists(Request $request)
|
||||
{
|
||||
$validator = Validator::make($request->all(), [
|
||||
@@ -4109,7 +3977,7 @@ class ApiController extends Controller
|
||||
->where('mobile', $mobile)
|
||||
->withTrashed()
|
||||
->first();
|
||||
|
||||
|
||||
if (! $userExists) {
|
||||
return ResponseService::errorResponse(
|
||||
__('User does not exist'),
|
||||
|
||||
Reference in New Issue
Block a user