dealhub/app/Http/Controllers/ExplorePageController.php
kusowl 0789c21100 feature(deal approval): admin can approve the deals
- admin can see the deal details in modal
- admin can approve or delete the deals
2026-01-28 18:21:48 +05:30

92 lines
3.1 KiB
PHP

<?php
namespace App\Http\Controllers;
use App\Actions\AddRecentSearchAction;
use App\Enums\ExplorePageFilters;
use App\Enums\UserTypes;
use App\Http\Requests\ExploreSearchSortRequest;
use App\Models\Deal;
use App\Models\DealCategory;
use App\Queries\ExplorePageDealsQuery;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Pagination\LengthAwarePaginator;
use Illuminate\Support\Collection;
use Illuminate\Support\Facades\Auth;
class ExplorePageController extends Controller
{
public function __invoke(
ExploreSearchSortRequest $request,
ExplorePageDealsQuery $query,
AddRecentSearchAction $addRecentSearchAction
) {
return view('explore')
->with('profileLink', $this->profileLink())
->with('categories', $this->categories())
->with('recentSearches', $this->recentSearches())
->with('deals', $this->deals($request, $query->builder(), $addRecentSearchAction));
}
protected function deals(FormRequest $request, Builder $query, AddRecentSearchAction $action): LengthAwarePaginator
{
$query->tap(fn ($q) => (new Deal)->withActiveDeals($q));
// Add a search query
if ($request->has('search') && $request->get('search') !== null) {
$query->tap(fn ($q) => (new Deal)->search($q, $request->search));
\Illuminate\Support\defer(function () use ($action, $request) {
$action->execute($request->user(), ['query' => $request->search]);
});
}
// Add category sorting filter
if ($request->has('category') && $request->get('category') !== null) {
$query->tap(fn ($q) => (new Deal)->filterByCategory($q, $request->category));
}
// Add sorting filters
$query = match (ExplorePageFilters::tryFrom($request->sortBy)) {
ExplorePageFilters::Like => $query->orderBy('total_likes', 'desc'),
ExplorePageFilters::Click => $query->orderBy('total_redirection', 'desc'),
default => $query->orderByRaw(
'((COALESCE(total_likes, 0) * 70.0) / 100.0) + ((COALESCE(total_redirection, 0) * 30.0) / 100.0) DESC'
)
};
return $query->latest()->paginate();
}
/**
* Determines the link to the user's profile dashboard
* based on the user's role.
*
* @return string The URL for the user's dashboard.
*/
protected function profileLink(): string
{
$user = Auth::user();
return match ($user->role ?? null) {
UserTypes::Broker->value => route('broker.profile.show', $user),
UserTypes::User->value => route('customer.profile.show', $user),
default => route('login.create')
};
}
protected function categories(): Collection
{
return DealCategory::all(['id', 'name']);
}
protected function recentSearches(): Collection
{
if (! Auth::check()) {
return collect();
}
return Auth::user()->recentSearches()->latest()->select(['id', 'query'])->get();
}
}