From a2e49f985eb25d4f3d90c86244c816dc0f4d158b Mon Sep 17 00:00:00 2001 From: Amirmahdi Nourkazemi Date: Wed, 10 Sep 2025 00:47:47 +0330 Subject: [PATCH] feat: get status route --- app/Http/Controllers/UserController.php | 6 +- app/Models/User.php | 8 +- app/Services/CafeService.php | 81 +++++++++++++++++++ app/Services/MyketService.php | 37 +++++++++ ...34_rename_column_of_user_product_table.php | 6 +- routes/api.php | 5 +- 6 files changed, 130 insertions(+), 13 deletions(-) create mode 100644 app/Services/CafeService.php create mode 100644 app/Services/MyketService.php diff --git a/app/Http/Controllers/UserController.php b/app/Http/Controllers/UserController.php index 86608a6..35f74fa 100644 --- a/app/Http/Controllers/UserController.php +++ b/app/Http/Controllers/UserController.php @@ -365,7 +365,7 @@ public function profile() 'sessions' => $sessions ]); } - public function status(Request $request) + public function status(Request $request) { $data = $request->validate([ 'package_name' => 'string|required' @@ -378,8 +378,6 @@ public function status(Request $request) } $user = auth()->user(); - $user->load(['response', 'plans']); - if ($user->mobile == config('approo.admin_mobile')) { $user['products'] = Product::where('package_name_id', $packageName->id)->get(); } else { @@ -400,7 +398,7 @@ public function status(Request $request) // } $user['products'] = $user->products() ->where('package_name_id', $packageName->id) - ->where(fn ($q) => $q->where('user_product.expire_at', '>', now()->addHour())->orWhere('user_product.expire_at', null)) + ->where(fn($q) => $q->where('user_product.expire_at', '>', now()->addHour())->orWhere('user_product.expire_at', null)) ->get(); $user['package_name'] = $user->packageNames() diff --git a/app/Models/User.php b/app/Models/User.php index 7d4fe43..4cccdcd 100644 --- a/app/Models/User.php +++ b/app/Models/User.php @@ -93,10 +93,10 @@ public function plans() { return $this->hasMany(Plan::class); } - public function response() - { - return $this->hasOne(UserResponse::class); - } + // public function response() + // { + // return $this->hasOne(UserResponse::class); + // } public function breathingExercises() { diff --git a/app/Services/CafeService.php b/app/Services/CafeService.php new file mode 100644 index 0000000..172d5ca --- /dev/null +++ b/app/Services/CafeService.php @@ -0,0 +1,81 @@ +cafeConfig->token_refreshed_at > now()->subMinute(50)) { + return $this->cafeConfig->access_token; + } + $response = Http::asForm()->post('https://pardakht.cafebazaar.ir/devapi/v2/auth/token/', [ + 'grant_type' => 'refresh_token', + 'client_id' => $this->cafeConfig->client_id, + 'client_secret' => $this->cafeConfig->client_secret, + 'refresh_token' => $this->cafeConfig->refresh_token, + ]); + $response = json_decode($response, true); + if (isset($response['access_token'])) { + $this->cafeConfig->access_token = $response['access_token']; + $this->cafeConfig->token_refreshed_at = now(); + $this->cafeConfig->save(); + } + + return $response['access_token'] ?? null; + } + + private function sendRequest($url, $method, $params = []) + { + $response = Http::connectTimeout(2)->timeout(5)->retry(3, 500, throw: false)->send($method, $url, [ + 'headers' => [ + 'Authorization' => $this->getToken() + ], + 'form_params' => $params + ]); + + return json_decode($response, true); + } + + public function checkPurchase($product, $token) + { + $response = $this->sendRequest("https://pardakht.cafebazaar.ir/devapi/v2/api/validate/{$product->packageName->name}/inapp/{$product->uuid}/purchases/$token/", 'GET'); + // if ($response['consumptionState']) { + // return [ + // 'status' => false, + // 'message' => 'already consumed', + // ]; + // } + + if ($response['purchaseState']) { + return [ + 'status' => false, + 'message' => 'refunded', + ]; + } + + return [ + 'status' => true + ]; + } + + public function consumePurchase($product, $token) + { + if ($product->type == Product::TYPES['permanent']) { + $response = $this->sendRequest("https://pardakht.cafebazaar.ir/devapi/v2/api/consume/{$product->packageName->name}/purchases/", 'POST', ['token' => $token]); + } + } + + public function checkSubscription($product, $token) + { + $response = $this->sendRequest("https://pardakht.cafebazaar.ir/devapi/v2/api/applications/{$product->packageName->name}/active-subscriptions/$token/", 'GET'); + return $response['subscriptions'] ?? false; + } +} diff --git a/app/Services/MyketService.php b/app/Services/MyketService.php new file mode 100644 index 0000000..d7f44e2 --- /dev/null +++ b/app/Services/MyketService.php @@ -0,0 +1,37 @@ + [ + 'X-Access-Token' => $packageName->myket_access_token + ], + 'form_params' => $params + ]); + + return json_decode($response, true); + } + + public function checkPurchase($product, $token) + { + $response = $this->sendRequest("https://developer.myket.ir/api/applications/{$product->packageName->name}/purchases/products/{$product->uuid}/tokens/$token", 'GET', [], $product->packageName); + + if ($response['purchaseState']) { + return [ + 'status' => false, + 'message' => 'refunded', + ]; + } + + return [ + 'status' => true + ]; + } +} diff --git a/database/migrations/2023_12_20_154534_rename_column_of_user_product_table.php b/database/migrations/2023_12_20_154534_rename_column_of_user_product_table.php index b67e050..c7b82f0 100644 --- a/database/migrations/2023_12_20_154534_rename_column_of_user_product_table.php +++ b/database/migrations/2023_12_20_154534_rename_column_of_user_product_table.php @@ -11,9 +11,9 @@ */ public function up(): void { - // Schema::table('user_product', function (Blueprint $table) { - // $table->renameColumn('subscription_token' ,'gateway'); - // }); + Schema::table('user_product', function (Blueprint $table) { + $table->renameColumn('subscription_token' ,'gateway'); + }); } /** diff --git a/routes/api.php b/routes/api.php index 1f68ad3..b39b9de 100644 --- a/routes/api.php +++ b/routes/api.php @@ -40,8 +40,9 @@ }); }); Route::middleware('auth:sanctum')->group(function () { - - Route::prefix('package-names')->controller(PackageNameController::class)->group(function () { + Route::apiResource('reminders', ReminderController::class); + Route::get('status', [UserController::class, 'status']); + Route::prefix('package-names')->controller(PackageNameController::class)->group(function () { Route::get('/', 'index'); Route::middleware('abilities:admin')->post('/', 'store'); Route::middleware('abilities:admin')->post('/{name}', 'update');