60 lines
2.4 KiB
PHP
60 lines
2.4 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers\Admin;
|
|
|
|
use App\Http\Controllers\Controller;
|
|
use App\Models\Booking;
|
|
use App\Models\Business;
|
|
use App\Models\DjProfile;
|
|
use App\Models\Enquiry;
|
|
use App\Models\Review;
|
|
use App\Models\User;
|
|
use Illuminate\Http\Request;
|
|
use Illuminate\View\View;
|
|
use Spatie\Permission\Models\Role;
|
|
|
|
class SectionController extends Controller
|
|
{
|
|
private const SECTIONS = [
|
|
'users', 'djs', 'clients', 'bookings', 'payments', 'reviews', 'messages',
|
|
'notifications', 'support', 'reports', 'content', 'roles', 'privacy', 'settings',
|
|
];
|
|
|
|
public function __invoke(Request $request, string $section): View
|
|
{
|
|
abort_unless(in_array($section, self::SECTIONS, true), 404);
|
|
|
|
$data = [
|
|
'section' => $section,
|
|
'counts' => [
|
|
'users' => User::count(),
|
|
'djs' => DjProfile::count(),
|
|
'businesses' => Business::count(),
|
|
'clients' => User::whereHas('roles', fn ($query) => $query->where('name', 'client'))->count(),
|
|
'bookings' => Booking::count(),
|
|
'enquiries' => Enquiry::count(),
|
|
'reviews' => Review::count(),
|
|
],
|
|
];
|
|
|
|
$data += match ($section) {
|
|
'users' => ['users' => User::with('roles')->latest()->paginate(20)],
|
|
'djs' => ['djs' => DjProfile::with(['user', 'business'])->latest()->paginate(20)],
|
|
'clients' => ['clients' => User::whereHas('roles', fn ($query) => $query->where('name', 'client'))->withCount(['enquiries', 'bookings'])->latest()->paginate(20)],
|
|
'bookings' => ['bookings' => Booking::with(['client', 'djProfile'])->latest('event_date')->paginate(20)],
|
|
'payments' => ['bookings' => Booking::with(['client', 'djProfile'])->latest()->paginate(20)],
|
|
'reviews' => ['reviews' => Review::with(['user', 'djProfile'])->latest()->paginate(20)],
|
|
'roles' => ['roles' => Role::withCount('users')->orderBy('name')->get()],
|
|
'reports' => ['report' => [
|
|
'booking_value' => Booking::sum('total'),
|
|
'deposits' => Booking::sum('deposit'),
|
|
'published_djs' => DjProfile::where('is_published', true)->count(),
|
|
'pending_reviews' => Review::where('status', 'pending')->count(),
|
|
]],
|
|
default => [],
|
|
};
|
|
|
|
return view("admin.sections.{$section}", $data);
|
|
}
|
|
}
|