updates for admin area

This commit is contained in:
Mark Gregory
2026-09-12 21:04:45 +01:00
parent 8c9dbfee08
commit ab3134de13
43 changed files with 573 additions and 137 deletions
@@ -0,0 +1,55 @@
<?php
namespace App\Http\Controllers\Admin;
use App\Http\Controllers\Controller;
use App\Models\DjProfile;
use App\Models\Review;
use App\Models\User;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Cache;
use Spatie\Permission\Models\Role;
use Spatie\Permission\PermissionRegistrar;
class ActionController extends Controller
{
public function userRole(Request $request, User $user): RedirectResponse
{
$data = $request->validate(['role' => ['required', 'in:super-admin,admin,dj,client,moderator,support']]);
$role = Role::firstOrCreate(['name' => $data['role'], 'guard_name' => 'web']);
$user->syncRoles([$role]);
app(PermissionRegistrar::class)->forgetCachedPermissions();
return back()->with('success', "{$user->name}'s role has been updated.");
}
public function toggleDjPublished(DjProfile $djProfile): RedirectResponse
{
$djProfile->update(['is_published' => ! $djProfile->is_published]);
return back()->with('success', 'DJ publication status updated.');
}
public function toggleDjFeatured(DjProfile $djProfile): RedirectResponse
{
$djProfile->update(['is_featured' => ! $djProfile->is_featured]);
return back()->with('success', 'DJ featured status updated.');
}
public function reviewStatus(Request $request, Review $review): RedirectResponse
{
$data = $request->validate(['status' => ['required', 'in:pending,published,rejected']]);
$review->update($data);
return back()->with('success', 'Review moderation status updated.');
}
public function clearCaches(): RedirectResponse
{
Cache::flush();
return back()->with('success', 'Application cache cleared.');
}
}
@@ -5,13 +5,25 @@ namespace App\Http\Controllers\Admin;
use App\Http\Controllers\Controller;
use App\Models\Booking;
use App\Models\DjProfile;
use App\Models\Enquiry;
use App\Models\Review;
use App\Models\User;
use Illuminate\View\View;
class DashboardController extends Controller
{
public function __invoke()
public function __invoke(): View
{
return view('admin.dashboard', ['stats' => ['users' => User::count(), 'djs' => DjProfile::count(), 'bookings' => Booking::count(), 'reviews' => Review::where('status', 'pending')->count()]]);
return view('admin.dashboard', [
'stats' => [
'users' => User::count(),
'djs' => DjProfile::count(),
'bookings' => Booking::count(),
'pending reviews' => Review::where('status', 'pending')->count(),
],
'recentUsers' => User::latest()->take(6)->get(),
'recentEnquiries' => Enquiry::with(['user', 'djProfile'])->latest()->take(6)->get(),
'recentBookings' => Booking::with(['client', 'djProfile'])->latest()->take(6)->get(),
]);
}
}
@@ -9,29 +9,51 @@ 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
{
public function __invoke(string $section): View
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
{
$allowed = [
'users', 'djs', 'clients', 'bookings', 'payments', 'reviews', 'messages',
'notifications', 'support', 'reports', 'content', 'roles', 'privacy', 'settings',
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(),
],
];
abort_unless(in_array($section, $allowed, true), 404);
$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 => [],
};
$counts = [
'users' => User::count(),
'djs' => DjProfile::count(),
'businesses' => Business::count(),
'clients' => User::role('client')->count(),
'bookings' => Booking::count(),
'enquiries' => Enquiry::count(),
'reviews' => Review::count(),
];
return view('admin.section', compact('section', 'counts'));
return view("admin.sections.{$section}", $data);
}
}