feat: identifier for admin cotroller

This commit is contained in:
2025-09-27 15:37:33 +03:30
parent b2935702cc
commit cc916c30cc
+70 -19
View File
@@ -18,23 +18,25 @@ public function users(Request $request)
$data = $request->validate([ $data = $request->validate([
'per_page' => 'integer', 'per_page' => 'integer',
'mobile' => 'string', 'mobile' => 'string',
'email' => 'string',
'package_name' => 'string', 'package_name' => 'string',
]); ]);
$users = User::when(isset($data['package_name']), fn ($q) => $q->whereHas('packageNames', fn ($q2) => $q2->where('name', $data['package_name']))) $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['mobile']), fn ($q) => $q->where('mobile', $data['mobile']))
->when(isset($data['email']), fn ($q) => $q->where('email', $data['email']))
->paginate($data['per_page'] ?? 30); ->paginate($data['per_page'] ?? 30);
return $users; return $users;
} }
public function getUserTransactions(Request $request, $mobile) public function getUserTransactions(Request $request, $identifier)
{ {
$data = $request->validate([ $data = $request->validate([
'per_page' => 'integer' 'per_page' => 'integer'
]); ]);
if (!$user = User::where('mobile', $mobile)->first()) { if (!$user = $this->findUserByIdentifier($identifier)) {
return response()->json([ return response()->json([
'message' => 'user not found' 'message' => 'user not found'
], 404); ], 404);
@@ -45,7 +47,7 @@ public function getUserTransactions(Request $request, $mobile)
return $transactions; return $transactions;
} }
public function getUserStatus(Request $request, $mobile) public function getUserStatus(Request $request, $identifier)
{ {
$data = $request->validate([ $data = $request->validate([
'package_name' => 'string' 'package_name' => 'string'
@@ -60,7 +62,9 @@ public function getUserStatus(Request $request, $mobile)
if (!$user = User::with([ if (!$user = User::with([
'products' => fn ($q) => $q->when(isset($data['package_name']), fn ($q1) => $q1->where('package_name_id', $packageName->id)), 'products' => fn ($q) => $q->when(isset($data['package_name']), fn ($q1) => $q1->where('package_name_id', $packageName->id)),
'products.packageName' 'products.packageName'
])->where('mobile', $mobile)->first()) { ])->where(function($query) use ($identifier) {
$this->applyIdentifierCondition($query, $identifier);
})->first()) {
return response()->json([ return response()->json([
'message' => 'user not found' 'message' => 'user not found'
], 404); ], 404);
@@ -69,13 +73,14 @@ public function getUserStatus(Request $request, $mobile)
return $user; return $user;
} }
public function getUserStatusV1(Request $request, $mobile) public function getUserStatusV1(Request $request, $identifier)
{ {
$data = $request->validate([ $data = $request->validate([
'package_name' => 'string' 'package_name' => 'string'
]); ]);
$userMobile = $mobile; $userIdentifier = $identifier;
if (isset($data['package_name']) && !$packageName = PackageName::with('products') if (isset($data['package_name']) && !$packageName = PackageName::with('products')
->where('name', $data['package_name'])->first()) { ->where('name', $data['package_name'])->first()) {
return response()->json([ return response()->json([
@@ -83,8 +88,23 @@ public function getUserStatusV1(Request $request, $mobile)
], 404); ], 404);
} }
if (!OldPurchase::when(isset($data['package_name']), fn ($q) => $q->where('package_name', $data['package_name'])) // For OldPurchase, we need to determine if identifier is mobile or email
->where('mobile', preg_replace('/09/', '989', $userMobile, 1))->first()) { 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([ return response()->json([
'message' => 'user is not paid' 'message' => 'user is not paid'
], 400); ], 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([ $data = $request->validate([
'product_id' => 'integer|required' 'product_id' => 'integer|required'
]); ]);
if (!$user = User::where('mobile', $mobile)->first()) { if (!$user = $this->findUserByIdentifier($identifier)) {
return response()->json([ return response()->json([
'message' => 'user not found' 'message' => 'user not found'
], 404); ], 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([ $data = $request->validate([
'product_id' => 'integer|required' 'product_id' => 'integer|required'
]); ]);
if (!$user = User::where('mobile', $mobile)->first()) { if (!$user = $this->findUserByIdentifier($identifier)) {
return response()->json([ return response()->json([
'message' => 'user not found' 'message' => 'user not found'
], 404); ], 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([ return response()->json([
'message' => 'user not found' 'message' => 'user not found'
], 404); ], 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([ $data = $request->validate([
'first_name' => 'string', 'first_name' => 'string',
@@ -170,7 +190,7 @@ public function updateUserProfile(Request $request, $mobile)
'avatar' => 'image' 'avatar' => 'image'
]); ]);
if (!$subjectUser = User::where('mobile', $mobile)->first()) { if (!$subjectUser = $this->findUserByIdentifier($identifier)) {
return response()->json([ return response()->json([
'message' => 'user not found' 'message' => 'user not found'
], 404); ], 404);
@@ -189,14 +209,14 @@ public function updateUserProfile(Request $request, $mobile)
$user = User::where('mobile', $data['mobile'])->first(); $user = User::where('mobile', $data['mobile'])->first();
if ($user && $data['mobile'] != $subjectUser->mobile) { if ($user && $data['mobile'] != $subjectUser->mobile) {
return response()->json([ return response()->json([
'message' => 'user with given email exists' 'message' => 'user with given mobile exists'
], 400); ], 400);
} }
} }
if (isset($data['avatar'])) { if (isset($data['avatar'])) {
Storage::disk('public')->put("avatars/$user->uuid.png", file_get_contents($data['avatar']->path())); Storage::disk('public')->put("avatars/$subjectUser->uuid.png", file_get_contents($data['avatar']->path()));
$data['avatar'] = "storage/avatars/$user->uuid.png"; $data['avatar'] = "storage/avatars/$subjectUser->uuid.png";
} }
$subjectUser->update($data); $subjectUser->update($data);
@@ -205,4 +225,35 @@ public function updateUserProfile(Request $request, $mobile)
'message' => 'user updated' '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);
}
} }