validate([ 'per_page' => 'integer', 'mobile' => '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'])) ->paginate($data['per_page'] ?? 30); return $users; } public function getUserTransactions(Request $request, $mobile) { $data = $request->validate([ 'per_page' => 'integer' ]); if (!$user = User::where('mobile', $mobile)->first()) { return response()->json([ 'message' => 'user not found' ], 404); } $transactions = $user->transactions()->paginate($data['per_page'] ?? 30); return $transactions; } public function getUserStatus(Request $request, $mobile) { $data = $request->validate([ 'package_name' => 'string' ]); if (isset($data['package_name']) && !$packageName = PackageName::with('products')->where('name', $data['package_name'])->first()) { return response()->json([ 'message' => 'package name not found' ], 404); } 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()) { return response()->json([ 'message' => 'user not found' ], 404); } return $user; } public function getUserStatusV1(Request $request, $mobile) { $data = $request->validate([ 'package_name' => 'string' ]); $userMobile = $mobile; if (isset($data['package_name']) && !$packageName = PackageName::with('products') ->where('name', $data['package_name'])->first()) { return response()->json([ 'message' => 'package name not found' ], 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()) { return response()->json([ 'message' => 'user is not paid' ], 400); } return response()->json([ 'message' => 'user is paid' ]); } public function subscribeUser(Request $request, $mobile) { $data = $request->validate([ 'product_id' => 'integer|required' ]); if (!$user = User::where('mobile', $mobile)->first()) { return response()->json([ 'message' => 'user not found' ], 404); } if (!$product = Product::where('id', $data['product_id'])->first()) { return response()->json([ 'message' => 'product not found' ], 404); } $product->buy($user); return response()->json([ 'message' => 'subscribed successfuly' ]); } public function unsubscribeUser(Request $request, $mobile) { $data = $request->validate([ 'product_id' => 'integer|required' ]); if (!$user = User::where('mobile', $mobile)->first()) { return response()->json([ 'message' => 'user not found' ], 404); } if (!$product = Product::where('id', $data['product_id'])->first()) { return response()->json([ 'message' => 'product not found' ], 404); } $user->products()->updateExistingPivot($product, ['expire_at' => now()->format('Y-m-d H:i:s')]); return response()->json([ 'message' => 'unsubscribed successfuly' ]); } public function deleteUser(Request $request, $mobile) { if (!$user = User::where('mobile', $mobile)->first()) { return response()->json([ 'message' => 'user not found' ], 404); } $user->delete(); return response()->json([ 'message' => 'user deleted' ]); } public function updateUserProfile(Request $request, $mobile) { $data = $request->validate([ 'first_name' => 'string', 'last_name' => 'string', 'email' => 'email', 'mobile' => [new MobileNumber, 'string'], 'avatar' => 'image' ]); if (!$subjectUser = User::where('mobile', $mobile)->first()) { return response()->json([ 'message' => 'user not found' ], 404); } if (isset($data['email'])) { $user = User::where('email', $data['email'])->first(); if ($user && $data['email'] != $subjectUser->email) { return response()->json([ 'message' => 'user with given email exists' ], 400); } } if (isset($data['mobile'])) { $user = User::where('mobile', $data['mobile'])->first(); if ($user && $data['mobile'] != $subjectUser->mobile) { return response()->json([ 'message' => 'user with given email 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"; } $subjectUser->update($data); return response()->json([ 'message' => 'user updated' ]); } }