From c3f53f08f2d4984c8dd72127e4acba8fdbdaa34a Mon Sep 17 00:00:00 2001 From: "m.razaghi" Date: Fri, 14 Aug 2026 21:12:19 +0330 Subject: [PATCH] fix free subscribe issue --- app/Http/Controllers/api/HomeController.php | 349 ++++++++------------ 1 file changed, 133 insertions(+), 216 deletions(-) diff --git a/app/Http/Controllers/api/HomeController.php b/app/Http/Controllers/api/HomeController.php index 5914d42..7bf5a80 100644 --- a/app/Http/Controllers/api/HomeController.php +++ b/app/Http/Controllers/api/HomeController.php @@ -7,7 +7,7 @@ use App\Models\Law; use App\Models\Notification; use App\Models\Category; use App\Models\RecentArt; -use App\Models\SubscribePlan; +use App\Models\SubscribePlan; // <-- Added this import use App\Models\UserSubscriber; use App\Services\AppMarketPurchaseVerifier; use App\Traits\BaseApiResponse; @@ -21,206 +21,11 @@ class HomeController extends Controller { } - /** - * LEGACY API: Standard Home (No auto-grant) - */ - public function index() - { - $user = auth()->user(); - - $this->refreshMarketSubscriptionAfterResponse($user); - - $recent = RecentArt::query()->where('user_id', $user->id)->get()->map(function ($q) { - return [ - 'id' => $q->law?->id, - 'name' => $q->law?->title, - 'is_locked' => $q->law?->is_locked, - ]; - }); - - $laws = Law::orderBy('created_at')->get()->map(function ($q) { - return [ - 'id' => $q->id, - 'name' => $q->title, - 'is_locked' => $q->is_locked, - ]; - }); - - $categories = ['hagigi', 'kifari']; - $lawsByCategory = []; - - foreach ($categories as $category) { - $lawsByCategory[$category] = Law::whereHas('category', function ($q) use ($category) { - $q->where('type', $category); - })->get()->map(function ($q) { - return [ - 'id' => $q->id, - 'title' => $q->title, - 'is_locked' => $q->is_locked, - 'category_id' => $q->category_id, - 'price' => $q->price, - 'image' => $q->image, - 'type' => 'law', - ]; - }); - } - - $free_law = Law::where('is_locked', false)->orderBy('created_at')->get()->map(function ($q) { - return [ - 'id' => $q->id, - 'name' => $q->title, - 'is_locked' => $q->is_locked, - ]; - }); - - // Fetch Active Subscription & Calculate Remaining Days - $activeSubscribers = $user->userSubscribers() - ->with('subscribe') - ->where('expired_at', '>=', now()) - ->get(); - - $current_plan = null; - - if ($activeSubscribers->isNotEmpty()) { - $latestSubscription = $activeSubscribers->sortByDesc('expired_at')->first(); - $expiredDays = $activeSubscribers->sum(function ($subscriber) { - return $subscriber->expired_at->diffInDays(now()); - }); - - // Accurately check if the active plan is free - $isFree = (bool) ( - $latestSubscription->is_free || - ($latestSubscription->subscribe && $latestSubscription->subscribe->is_free) - ); - - $current_plan = [ - 'id' => $latestSubscription->id, - 'name' => $latestSubscription->subscribe->name ?? 'Subscription', - 'price' => $latestSubscription->subscribe->price ?? 0, - 'expired_day' => $expiredDays, - 'is_free' => $isFree, - ]; - } - - $unread_notifications_count = Notification::unreadForUser($user->id)->count(); - - return $this->success([ - 'recent' => $recent, - 'laws' => $lawsByCategory, - 'last_law' => $laws, - 'free' => $free_law, - 'current_plan' => $current_plan, - 'unread_notifications_count' => $unread_notifications_count, - ]); - } - - /** - * V2 API: Home V2 (No auto-grant) - */ public function homeV2() { $user = auth()->user(); - $this->refreshMarketSubscriptionAfterResponse($user); - - $recent = RecentArt::query()->where('user_id', $user->id)->get()->map(function ($q) { - return [ - 'id' => $q->law?->id, - 'name' => $q->law?->title, - 'is_locked' => $q->law?->is_locked, - ]; - }); - - $laws = Law::orderBy('created_at')->get()->map(function ($q) { - return [ - 'id' => $q->id, - 'name' => $q->title, - 'is_locked' => $q->is_locked, - ]; - }); - - $categories = ['hagigi', 'kifari']; - $lawsByCategory = []; - - foreach ($categories as $category) { - $lawsByCategory[$category] = Law::whereHas('category', function ($q) use ($category) { - $q->where('type', $category); - })->get()->map(function ($q) { - return [ - 'id' => $q->id, - 'title' => $q->title, - 'is_locked' => $q->is_locked, - 'category_id' => $q->category_id, - 'price' => $q->price, - 'image' => $q->image, - 'type' => 'law', - ]; - }); - } - - $free_law = Law::where('is_locked', false)->orderBy('created_at')->get()->map(function ($q) { - return [ - 'id' => $q->id, - 'name' => $q->title, - 'is_locked' => $q->is_locked, - ]; - }); - - // Fetch Active Subscription & Calculate Remaining Days - $activeSubscribers = $user->userSubscribers() - ->with('subscribe') - ->where('expired_at', '>=', now()) - ->get(); - - $current_plan = null; - - if ($activeSubscribers->isNotEmpty()) { - $latestSubscription = $activeSubscribers->sortByDesc('expired_at')->first(); - $expiredDays = $activeSubscribers->sum(function ($subscriber) { - return $subscriber->expired_at->diffInDays(now()); - }); - - // Accurately check if the active plan is free - $isFree = (bool) ( - $latestSubscription->is_free || - ($latestSubscription->subscribe && $latestSubscription->subscribe->is_free) - ); - - $current_plan = [ - 'id' => $latestSubscription->id, - 'name' => $latestSubscription->subscribe->name ?? 'Subscription', - 'price' => $latestSubscription->subscribe->price ?? 0, - 'expired_day' => $expiredDays, - 'is_free' => $isFree, - ]; - } - - $unread_notifications_count = Notification::unreadForUser($user->id)->count(); - - $homeData = [ - 'recent' => $recent, - 'laws' => $lawsByCategory, - 'last_law' => $laws, - 'free' => $free_law, - 'current_plan' => $current_plan, - 'unread_notifications_count' => $unread_notifications_count, - ]; - - return $this->success([ - 'home' => $homeData, - 'hoqoqi_list' => $this->getCategoryList(1), // Category 1 - 'keyfari_list' => $this->getCategoryList(2), // Category 2 - ]); - } - - /** - * V3 API: Home V3 (WITH Auto-Grant Free Subscription Logic) - */ - public function homeV3() - { - $user = auth()->user(); - - // --- NEW IN V3: Check and grant free subscription for existing logged-in users --- + // --- NEW: Check and grant free subscription for existing logged-in users --- $this->checkAndGrantFreeSubscription($user); $this->refreshMarketSubscriptionAfterResponse($user); @@ -268,32 +73,41 @@ class HomeController extends Controller ]; }); - // Fetch Active Subscription & Calculate Remaining Days - $activeSubscribers = $user->userSubscribers() - ->with('subscribe') + $freeSubscription = $user->userSubscribers() + ->whereHas('subscribe', function ($query) { + $query->where('is_free', true); + }) ->where('expired_at', '>=', now()) - ->get(); + ->first(); $current_plan = null; - if ($activeSubscribers->isNotEmpty()) { - $latestSubscription = $activeSubscribers->sortByDesc('expired_at')->first(); - $expiredDays = $activeSubscribers->sum(function ($subscriber) { - return $subscriber->expired_at->diffInDays(now()); - }); + if ($freeSubscription) { + $current_plan = [ + 'id' => $freeSubscription->id, + 'name' => $freeSubscription->subscribe->name, + 'price' => $freeSubscription->subscribe->price, + 'expired_day' => $freeSubscription->expired_at->diffInDays(now()), + 'is_free' => true, + ]; + } - // Accurately check if the active plan is free - $isFree = (bool) ( - $latestSubscription->is_free || - ($latestSubscription->subscribe && $latestSubscription->subscribe->is_free) - ); + $latestSubscription = $user->userSubscribers() + ->where('expired_at', '>=', now()) + ->latest('expired_at') + ->first(); + $expiredDays = UserSubscriber::query()->where('user_id', $user->id)->where('expired_at', '>=', now())->get()->sum(function ($subscriber) { + return $subscriber->expired_at->diffInDays(now()); + }); + + if ($latestSubscription) { $current_plan = [ 'id' => $latestSubscription->id, 'name' => $latestSubscription->subscribe->name ?? 'Subscription', - 'price' => $latestSubscription->subscribe->price ?? 0, + 'price' => $latestSubscription->subscribe->price ?? 100, 'expired_day' => $expiredDays, - 'is_free' => $isFree, + 'is_free' => (bool)$latestSubscription->is_free, ]; } @@ -315,9 +129,6 @@ class HomeController extends Controller ]); } - /** - * Helper methods below - */ private function getCategoryList(int $categoryId) { $type = $categoryId === 1 ? 'hagigi' : 'kifari'; @@ -346,6 +157,111 @@ class HomeController extends Controller return $data; } + public function index() + { + $user = auth()->user(); + + // --- NEW: Check and grant free subscription for existing logged-in users --- + $this->checkAndGrantFreeSubscription($user); + + $this->refreshMarketSubscriptionAfterResponse($user); + + $recent = RecentArt::query()->where('user_id', $user->id)->get()->map(function ($q) { + return [ + 'id' => $q->law?->id, + 'name' => $q->law?->title, + 'is_locked' => $q->law?->is_locked, + ]; + }); + + $laws = Law::orderBy('created_at')->get()->map(function ($q) { + return [ + 'id' => $q->id, + 'name' => $q->title, + 'is_locked' => $q->is_locked, + ]; + }); + + $categories = ['hagigi', 'kifari']; + $lawsByCategory = []; + + foreach ($categories as $category) { + $lawsByCategory[$category] = Law::whereHas('category', function ($q) use ($category) { + $q->where('type', $category); + })->get()->map(function ($q) { + return [ + 'id' => $q->id, + 'title' => $q->title, + 'is_locked' => $q->is_locked, + 'category_id' => $q->category_id, + 'price' => $q->price, + 'image' => $q->image, + 'type' => 'law', + ]; + }); + } + + $free_law = Law::where('is_locked', false)->orderBy('created_at')->get()->map(function ($q) { + return [ + 'id' => $q->id, + 'name' => $q->title, + 'is_locked' => $q->is_locked, + ]; + }); + + $freeSubscription = $user->userSubscribers() + ->whereHas('subscribe', function ($query) { + $query->where('is_free', true); + }) + ->where('expired_at', '>=', now()) + ->first(); + + $current_plan = null; + + if ($freeSubscription) { + $current_plan = [ + 'id' => $freeSubscription->id, + 'name' => $freeSubscription->subscribe->name, + 'price' => $freeSubscription->subscribe->price, + 'expired_day' => $freeSubscription->expired_at->diffInDays(now()), + 'is_free' => true, + ]; + } + + $latestSubscription = $user->userSubscribers() + ->where('expired_at', '>=', now()) + ->latest('expired_at') + ->first(); + + $expiredDays = UserSubscriber::query()->where('user_id', $user->id)->where('expired_at', '>=', now())->get()->sum(function ($subscriber) { + return $subscriber->expired_at->diffInDays(now()); + }); + + if ($latestSubscription) { + $current_plan = [ + 'id' => $latestSubscription->id, + 'name' => $latestSubscription->subscribe->name ?? 'Subscription', + 'price' => $latestSubscription->subscribe->price ?? 100, + 'expired_day' => $expiredDays, + 'is_free' => (bool)$latestSubscription->is_free, + ]; + } + + $unread_notifications_count = Notification::unreadForUser($user->id)->count(); + + return $this->success([ + 'recent' => $recent, + 'laws' => $lawsByCategory, + 'last_law' => $laws, + 'free' => $free_law, + 'current_plan' => $current_plan, + 'unread_notifications_count' => $unread_notifications_count, + ]); + } + + /** + * Helper to automatically assign a free plan if the user has never had one. + */ private function checkAndGrantFreeSubscription($user): void { $hasUsedFreePlan = $user->userSubscribers() @@ -357,6 +273,7 @@ class HomeController extends Controller $freePlan = SubscribePlan::where('is_free', true)->where('is_active', true)->first(); if ($freePlan) { + // Exactly matching the logic to keep the UI clean $user->userSubscribers()->create([ 'subscribe_plan_id' => $freePlan->id, 'expired_at' => now()->addDays($freePlan->expired_day + 1),