sms integration

This commit is contained in:
Devit
2026-03-29 14:27:45 +05:00
parent c02f5d5bf8
commit 08c3acfc60
16 changed files with 15804 additions and 14306 deletions

View File

@@ -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'),