From cc916c30cc30cdcedec20495b087f2291157280c Mon Sep 17 00:00:00 2001 From: Amirmahdi Nourkazemi Date: Sat, 27 Sep 2025 15:37:33 +0330 Subject: [PATCH] feat: identifier for admin cotroller --- app/Http/Controllers/AdminController.php | 91 ++++++++++++++++++------ 1 file changed, 71 insertions(+), 20 deletions(-) diff --git a/app/Http/Controllers/AdminController.php b/app/Http/Controllers/AdminController.php index 36695c7..5164a0b 100644 --- a/app/Http/Controllers/AdminController.php +++ b/app/Http/Controllers/AdminController.php @@ -18,23 +18,25 @@ public function users(Request $request) $data = $request->validate([ 'per_page' => 'integer', 'mobile' => 'string', + 'email' => 'string', 'package_name' => 'string', ]); $users = User::when(isset($data['package_name']), fn ($q) => $q->whereHas('packageNames', fn ($q2) => $q2->where('name', $data['package_name']))) ->when(isset($data['mobile']), fn ($q) => $q->where('mobile', $data['mobile'])) + ->when(isset($data['email']), fn ($q) => $q->where('email', $data['email'])) ->paginate($data['per_page'] ?? 30); return $users; } - public function getUserTransactions(Request $request, $mobile) + public function getUserTransactions(Request $request, $identifier) { $data = $request->validate([ 'per_page' => 'integer' ]); - if (!$user = User::where('mobile', $mobile)->first()) { + if (!$user = $this->findUserByIdentifier($identifier)) { return response()->json([ 'message' => 'user not found' ], 404); @@ -45,7 +47,7 @@ public function getUserTransactions(Request $request, $mobile) return $transactions; } - public function getUserStatus(Request $request, $mobile) + public function getUserStatus(Request $request, $identifier) { $data = $request->validate([ 'package_name' => 'string' @@ -60,7 +62,9 @@ public function getUserStatus(Request $request, $mobile) if (!$user = User::with([ 'products' => fn ($q) => $q->when(isset($data['package_name']), fn ($q1) => $q1->where('package_name_id', $packageName->id)), 'products.packageName' - ])->where('mobile', $mobile)->first()) { + ])->where(function($query) use ($identifier) { + $this->applyIdentifierCondition($query, $identifier); + })->first()) { return response()->json([ 'message' => 'user not found' ], 404); @@ -69,13 +73,14 @@ public function getUserStatus(Request $request, $mobile) return $user; } - public function getUserStatusV1(Request $request, $mobile) + public function getUserStatusV1(Request $request, $identifier) { $data = $request->validate([ 'package_name' => 'string' ]); - $userMobile = $mobile; + $userIdentifier = $identifier; + if (isset($data['package_name']) && !$packageName = PackageName::with('products') ->where('name', $data['package_name'])->first()) { return response()->json([ @@ -83,8 +88,23 @@ public function getUserStatusV1(Request $request, $mobile) ], 404); } - if (!OldPurchase::when(isset($data['package_name']), fn ($q) => $q->where('package_name', $data['package_name'])) - ->where('mobile', preg_replace('/09/', '989', $userMobile, 1))->first()) { + // For OldPurchase, we need to determine if identifier is mobile or email + if ($this->isMobileNumber($identifier)) { + $mobile = preg_replace('/09/', '989', $identifier, 1); + $query = OldPurchase::when(isset($data['package_name']), fn ($q) => $q->where('package_name', $data['package_name'])) + ->where('mobile', $mobile); + } else { + // Assuming OldPurchase might have email field or we need to find user first + if (!$user = $this->findUserByIdentifier($identifier)) { + return response()->json([ + 'message' => 'user not found' + ], 404); + } + $query = OldPurchase::when(isset($data['package_name']), fn ($q) => $q->where('package_name', $data['package_name'])) + ->where('mobile', preg_replace('/09/', '989', $user->mobile, 1)); + } + + if (!$query->first()) { return response()->json([ 'message' => 'user is not paid' ], 400); @@ -95,13 +115,13 @@ public function getUserStatusV1(Request $request, $mobile) ]); } - public function subscribeUser(Request $request, $mobile) + public function subscribeUser(Request $request, $identifier) { $data = $request->validate([ 'product_id' => 'integer|required' ]); - if (!$user = User::where('mobile', $mobile)->first()) { + if (!$user = $this->findUserByIdentifier($identifier)) { return response()->json([ 'message' => 'user not found' ], 404); @@ -120,13 +140,13 @@ public function subscribeUser(Request $request, $mobile) ]); } - public function unsubscribeUser(Request $request, $mobile) + public function unsubscribeUser(Request $request, $identifier) { $data = $request->validate([ 'product_id' => 'integer|required' ]); - if (!$user = User::where('mobile', $mobile)->first()) { + if (!$user = $this->findUserByIdentifier($identifier)) { return response()->json([ 'message' => 'user not found' ], 404); @@ -145,9 +165,9 @@ public function unsubscribeUser(Request $request, $mobile) ]); } - public function deleteUser(Request $request, $mobile) + public function deleteUser(Request $request, $identifier) { - if (!$user = User::where('mobile', $mobile)->first()) { + if (!$user = $this->findUserByIdentifier($identifier)) { return response()->json([ 'message' => 'user not found' ], 404); @@ -160,7 +180,7 @@ public function deleteUser(Request $request, $mobile) ]); } - public function updateUserProfile(Request $request, $mobile) + public function updateUserProfile(Request $request, $identifier) { $data = $request->validate([ 'first_name' => 'string', @@ -170,7 +190,7 @@ public function updateUserProfile(Request $request, $mobile) 'avatar' => 'image' ]); - if (!$subjectUser = User::where('mobile', $mobile)->first()) { + if (!$subjectUser = $this->findUserByIdentifier($identifier)) { return response()->json([ 'message' => 'user not found' ], 404); @@ -189,14 +209,14 @@ public function updateUserProfile(Request $request, $mobile) $user = User::where('mobile', $data['mobile'])->first(); if ($user && $data['mobile'] != $subjectUser->mobile) { return response()->json([ - 'message' => 'user with given email exists' + 'message' => 'user with given mobile exists' ], 400); } } if (isset($data['avatar'])) { - Storage::disk('public')->put("avatars/$user->uuid.png", file_get_contents($data['avatar']->path())); - $data['avatar'] = "storage/avatars/$user->uuid.png"; + Storage::disk('public')->put("avatars/$subjectUser->uuid.png", file_get_contents($data['avatar']->path())); + $data['avatar'] = "storage/avatars/$subjectUser->uuid.png"; } $subjectUser->update($data); @@ -205,4 +225,35 @@ public function updateUserProfile(Request $request, $mobile) 'message' => 'user updated' ]); } -} + + /** + * Helper method to find user by mobile or email + */ + private function findUserByIdentifier($identifier) + { + return User::where(function($query) use ($identifier) { + $this->applyIdentifierCondition($query, $identifier); + })->first(); + } + + /** + * Helper method to apply condition for mobile or email + */ + private function applyIdentifierCondition($query, $identifier) + { + if ($this->isMobileNumber($identifier)) { + $query->where('mobile', $identifier); + } else { + $query->where('email', $identifier); + } + } + + /** + * Helper method to check if identifier is a mobile number + */ + private function isMobileNumber($identifier) + { + // Simple check for mobile number pattern (starts with 09 or +98 or 989) + return preg_match('/^(09|\+98|989)\d{9}$/', $identifier); + } +} \ No newline at end of file