diff --git a/app/Http/Controllers/api/HomeController.php b/app/Http/Controllers/api/HomeController.php index 7bf5a80..fcfed31 100644 --- a/app/Http/Controllers/api/HomeController.php +++ b/app/Http/Controllers/api/HomeController.php @@ -129,6 +129,105 @@ class HomeController extends Controller ]); } + public function homeV3() + { + $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, + ]; + }); + + // --- V3 FIXED LOGIC: 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 + ]); + } + private function getCategoryList(int $categoryId) { $type = $categoryId === 1 ? 'hagigi' : 'kifari';