updates for admin area
This commit is contained in:
@@ -0,0 +1,26 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers\Account;
|
||||
|
||||
use App\Http\Controllers\Controller;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\View\View;
|
||||
|
||||
class DashboardController extends Controller
|
||||
{
|
||||
public function __invoke(Request $request): View
|
||||
{
|
||||
$user = $request->user();
|
||||
|
||||
return view('account.dashboard', [
|
||||
'user' => $user,
|
||||
'enquiries' => $user->enquiries()->with('djProfile')->latest()->take(5)->get(),
|
||||
'bookings' => $user->bookings()->with('djProfile')->latest('event_date')->take(5)->get(),
|
||||
'stats' => [
|
||||
'enquiries' => $user->enquiries()->count(),
|
||||
'bookings' => $user->bookings()->count(),
|
||||
'upcoming' => $user->bookings()->whereDate('event_date', '>=', today())->count(),
|
||||
],
|
||||
]);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,46 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers\Account;
|
||||
|
||||
use App\Http\Controllers\Controller;
|
||||
use Illuminate\Http\RedirectResponse;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Validation\Rule;
|
||||
use Illuminate\View\View;
|
||||
|
||||
class PageController extends Controller
|
||||
{
|
||||
public function enquiries(Request $request): View
|
||||
{
|
||||
return view('account.enquiries', [
|
||||
'enquiries' => $request->user()->enquiries()->with('djProfile')->latest()->paginate(12),
|
||||
]);
|
||||
}
|
||||
|
||||
public function bookings(Request $request): View
|
||||
{
|
||||
return view('account.bookings', [
|
||||
'bookings' => $request->user()->bookings()->with(['djProfile', 'review'])->latest('event_date')->paginate(12),
|
||||
]);
|
||||
}
|
||||
|
||||
public function profile(Request $request): View
|
||||
{
|
||||
return view('account.profile', ['user' => $request->user()]);
|
||||
}
|
||||
|
||||
public function updateProfile(Request $request): RedirectResponse
|
||||
{
|
||||
$user = $request->user();
|
||||
$data = $request->validate([
|
||||
'name' => ['required', 'string', 'max:120'],
|
||||
'email' => ['required', 'email', 'max:190', Rule::unique('users')->ignore($user->id)],
|
||||
'phone' => ['nullable', 'string', 'max:40'],
|
||||
'marketing_opt_in' => ['nullable', 'boolean'],
|
||||
]);
|
||||
$data['marketing_opt_in'] = $request->boolean('marketing_opt_in');
|
||||
$user->update($data);
|
||||
|
||||
return back()->with('success', 'Your account details have been updated.');
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4,26 +4,40 @@ namespace App\Http\Controllers;
|
||||
|
||||
use App\Models\DjProfile;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\View\View;
|
||||
|
||||
class DjController extends Controller
|
||||
{
|
||||
public function index(Request $r)
|
||||
public function index(Request $request): View
|
||||
{
|
||||
$q = DjProfile::query()->where('is_published', true)->with('genres');
|
||||
if ($r->filled('location')) {
|
||||
$q->where('city', 'like', '%'.$r->string('location').'%');
|
||||
} if ($r->filled('max_price')) {
|
||||
$q->where('price_from', '<=', $r->integer('max_price'));
|
||||
$query = DjProfile::query()->where('is_published', true)->with('genres');
|
||||
|
||||
if ($request->filled('location')) {
|
||||
$query->where('city', 'like', '%'.$request->string('location').'%');
|
||||
}
|
||||
|
||||
return view('djs.index', ['djs' => $q->orderByDesc('is_featured')->orderByDesc('average_rating')->paginate(12)->withQueryString()]);
|
||||
if ($request->filled('max_price')) {
|
||||
$query->where('price_from', '<=', $request->integer('max_price'));
|
||||
}
|
||||
|
||||
$query->orderByDesc('is_featured');
|
||||
|
||||
match ($request->string('sort')->toString()) {
|
||||
'price_low' => $query->orderBy('price_from'),
|
||||
'price_high' => $query->orderByDesc('price_from'),
|
||||
default => $query->orderByDesc('average_rating'),
|
||||
};
|
||||
|
||||
return view('djs.index', ['djs' => $query->paginate(12)->withQueryString()]);
|
||||
}
|
||||
|
||||
public function show(DjProfile $djProfile)
|
||||
public function show(DjProfile $djProfile): View
|
||||
{
|
||||
abort_unless($djProfile->is_published, 404);
|
||||
|
||||
return view('djs.show', ['dj' => $djProfile->load(['genres', 'reviews' => fn ($q) => $q->where('status', 'published')->latest()])]);
|
||||
return view('djs.show', [
|
||||
'dj' => $djProfile->load(['genres', 'reviews' => fn ($query) => $query->where('status', 'published')->latest()]),
|
||||
]);
|
||||
}
|
||||
|
||||
public function apiIndex()
|
||||
|
||||
Reference in New Issue
Block a user