From d9d7c078bbfc4e8a416c03aa1766f9e53340f296 Mon Sep 17 00:00:00 2001 From: Amirmahdi Nourkazemi Date: Wed, 10 Sep 2025 17:26:32 +0330 Subject: [PATCH] feat: login v2 --- app/Http/Controllers/UserController.php | 80 ++++++++++++++++++- app/Models/User.php | 3 +- app/Traits/HasUuid.php | 2 +- ...0_102918_add_identifier_to_users_table.php | 28 +++++++ ...10_103403_update_users_table_structure.php | 78 ++++++++++++++++++ routes/api.php | 1 + 6 files changed, 187 insertions(+), 5 deletions(-) create mode 100644 database/migrations/2025_09_10_102918_add_identifier_to_users_table.php create mode 100644 database/migrations/2025_09_10_103403_update_users_table_structure.php diff --git a/app/Http/Controllers/UserController.php b/app/Http/Controllers/UserController.php index 35f74fa..fb6961a 100644 --- a/app/Http/Controllers/UserController.php +++ b/app/Http/Controllers/UserController.php @@ -22,6 +22,82 @@ use App\Models\UserBreathingSession; class UserController extends Controller { + public function loginV2(Request $request) + { + $data = $request->validate([ + 'token' => 'required|string', + 'package_name' => 'required|string', + ]); + + $response = Http::acceptJson()->withToken($data['token'])->get('http://localhost:8000/api/status', [ + 'package_name' => $request['package_name'] + ]); + + if (!$response->successful()) { + return response()->json(['message' => 'invalid token'], 401); + } + + $response = json_decode($response->body(), true); + + // First, try to find user by identifier + $user = null; + if (!empty($response['uuid'])) { + $user = User::where('identifier', $response['uuid'])->first(); + } + + // If not found, try by email + if (!$user) { + $user = User::where('email', $response['email'])->first(); + } + + // If user still doesn't exist, create new + if (!$user) { + $user = User::create([ + 'email' => $response['email'], + 'identifier' => $response['uuid'] ?? null, + 'password' => config('app.default_password'), + 'name' => trim(($response['first_name'] ?? '') . ' ' . ($response['last_name'] ?? '')), + 'mobile' => $response['mobile'] ?? null, + ]); + } else { + // Only update name and mobile for existing user + $user->name = trim(($response['first_name'] ?? '') . ' ' . ($response['last_name'] ?? '')); + $user->mobile = $response['mobile'] ?? $user->mobile; + $user->save(); // Do NOT update identifier! + } + + $access_token = $user->createToken('user')->plainTextToken; + + return [ + 'email' => $user->email, + 'identifier' => $user->identifier, + 'token' => $access_token, + 'user' => $user, + ]; + } + + + + public function loginForeginer(Request $request) + { + $request->validate([ + 'user_token' => ['required'], + 'package_name' => ['required', new PackageNameExist], + ]); + $response = $this->repository->userTokenVerify($request['package_name'], $request['user_token']); + if ($response['ok']) { + $user = User::where('identifier', $response['data']['identifier'])->first(); + if (empty($user)) { + $user = new User(); + $user['identifier'] = $response['data']['identifier']; + $user['name'] = $response['data']['username']; + $user->save(); + } + if (!empty($request['fcm_token'])) FcmToken::firstOrCreate(['token' => $request['fcm_token'], 'user_id' => $user['id']]); + $access_token = $user->createToken('user')->plainTextToken; + return ['identifier' => $user['identifier'], 'token' => $access_token]; + } else abort(500); + } public function login(Request $request) { $data = $request->validate([ @@ -356,8 +432,8 @@ public function profile() return response()->json([ 'email' => $user->email, - 'first_name' => $user->first_name, - 'last_name' => $user->last_name, + 'name' => $user->name, + // 'last_name' => $user->last_name, 'mobile'=> $user->mobile, 'birthday' => $user ->birthday, 'xp' => $user->xp, diff --git a/app/Models/User.php b/app/Models/User.php index 4cccdcd..e292dce 100644 --- a/app/Models/User.php +++ b/app/Models/User.php @@ -2,7 +2,6 @@ namespace App\Models; -use App\Traits\HasUuid; use DateTimeInterface; use EloquentFilter\Filterable; use Illuminate\Database\Eloquent\Factories\HasFactory; @@ -13,7 +12,7 @@ class User extends Authenticatable { - use HasApiTokens, HasFactory, Notifiable, HasUuid, Filterable; + use HasApiTokens, HasFactory, Notifiable, Filterable; const GENDERS = [ 'male' => 1, diff --git a/app/Traits/HasUuid.php b/app/Traits/HasUuid.php index ad25497..6855558 100644 --- a/app/Traits/HasUuid.php +++ b/app/Traits/HasUuid.php @@ -6,7 +6,7 @@ trait HasUuid { - public static function bootHasUUID(): void + public static function bootHasUuid(): void { static::creating(function ($model) { if (!$model->uuid) { diff --git a/database/migrations/2025_09_10_102918_add_identifier_to_users_table.php b/database/migrations/2025_09_10_102918_add_identifier_to_users_table.php new file mode 100644 index 0000000..8f3e6e6 --- /dev/null +++ b/database/migrations/2025_09_10_102918_add_identifier_to_users_table.php @@ -0,0 +1,28 @@ +string('identifier')->nullable()->unique(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::table('users', function (Blueprint $table) { + // + }); + } +}; diff --git a/database/migrations/2025_09_10_103403_update_users_table_structure.php b/database/migrations/2025_09_10_103403_update_users_table_structure.php new file mode 100644 index 0000000..c7d7aee --- /dev/null +++ b/database/migrations/2025_09_10_103403_update_users_table_structure.php @@ -0,0 +1,78 @@ +dropColumn('first_name'); + } + if (Schema::hasColumn('users', 'last_name')) { + $table->dropColumn('last_name'); + } + if (Schema::hasColumn('users', 'avatar')) { + $table->dropColumn('avatar'); + } + if (Schema::hasColumn('users', 'uuid')) { + $table->dropColumn('uuid'); + } + if (Schema::hasColumn('users', 'is_admin')) { + $table->dropColumn('is_admin'); + } + if (Schema::hasColumn('users', 'wallet')) { + $table->dropColumn('wallet'); + } + }); + + Schema::table('users', function (Blueprint $table) { + if (!Schema::hasColumn('users', 'name')) { + $table->string('name')->nullable()->after('id'); + } + if (!Schema::hasColumn('users', 'identifier')) { + $table->string('identifier')->unique()->after('mobile'); + } + if (!Schema::hasColumn('users', 'remember_token')) { + $table->rememberToken(); + } + }); + } + + public function down(): void + { + Schema::table('users', function (Blueprint $table) { + if (Schema::hasColumn('users', 'name')) { + $table->dropColumn('name'); + } + if (Schema::hasColumn('users', 'identifier')) { + $table->dropColumn('identifier'); + } + if (Schema::hasColumn('users', 'remember_token')) { + $table->dropColumn('remember_token'); + } + + if (!Schema::hasColumn('users', 'first_name')) { + $table->string('first_name')->nullable(); + } + if (!Schema::hasColumn('users', 'last_name')) { + $table->string('last_name')->nullable(); + } + if (!Schema::hasColumn('users', 'avatar')) { + $table->string('avatar')->nullable(); + } + if (!Schema::hasColumn('users', 'uuid')) { + $table->uuid('uuid')->unique(); + } + if (!Schema::hasColumn('users', 'is_admin')) { + $table->boolean('is_admin')->default(false); + } + if (!Schema::hasColumn('users', 'wallet')) { + $table->unsignedBigInteger('wallet')->default(0); + } + }); + } +}; diff --git a/routes/api.php b/routes/api.php index b39b9de..db3a3a7 100644 --- a/routes/api.php +++ b/routes/api.php @@ -26,6 +26,7 @@ Route::get('package-names/{name}/products', [ProductController::class, 'index']); Route::prefix('auth')->controller(UserController::class)->group(function () { + Route::post('login-with-approo-v2', [UserController::class, 'loginV2']); Route::middleware(['throttle:3,1'])->post('login-otp', 'loginOTP'); Route::post('check-otp', 'checkOTP'); Route::post('verify-email-code','verifyEmailCode');