updates for admin area

This commit is contained in:
Mark Gregory
2026-09-12 20:45:05 +01:00
parent 0704924aa8
commit 8c9dbfee08
50 changed files with 1337 additions and 152 deletions
@@ -0,0 +1,37 @@
<?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\View\View;
class SectionController extends Controller
{
public function __invoke(string $section): View
{
$allowed = [
'users', 'djs', 'clients', 'bookings', 'payments', 'reviews', 'messages',
'notifications', 'support', 'reports', 'content', 'roles', 'privacy', 'settings',
];
abort_unless(in_array($section, $allowed, true), 404);
$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'));
}
}
@@ -0,0 +1,42 @@
<?php
namespace App\Http\Controllers\Auth;
use App\Http\Controllers\Controller;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\View\View;
class AuthenticatedSessionController extends Controller
{
public function create(): View
{
return view('auth.login');
}
public function store(Request $request): RedirectResponse
{
$credentials = $request->validate([
'email' => ['required', 'email'],
'password' => ['required', 'string'],
]);
if (! Auth::attempt($credentials, $request->boolean('remember'))) {
return back()->withErrors(['email' => 'The provided credentials do not match our records.'])->onlyInput('email');
}
$request->session()->regenerate();
return redirect()->intended(route('dashboard'));
}
public function destroy(Request $request): RedirectResponse
{
Auth::guard('web')->logout();
$request->session()->invalidate();
$request->session()->regenerateToken();
return redirect()->route('home');
}
}
@@ -0,0 +1,47 @@
<?php
namespace App\Http\Controllers\Auth;
use App\Http\Controllers\Controller;
use App\Models\User;
use Illuminate\Auth\Events\PasswordReset;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Password;
use Illuminate\Support\Str;
use Illuminate\Validation\Rules\Password as PasswordRule;
use Illuminate\View\View;
class NewPasswordController extends Controller
{
public function create(Request $request): View
{
return view('auth.reset-password', ['request' => $request]);
}
public function store(Request $request): RedirectResponse
{
$request->validate([
'token' => ['required'],
'email' => ['required', 'email'],
'password' => ['required', 'confirmed', PasswordRule::defaults()],
]);
$status = Password::reset(
$request->only('email', 'password', 'password_confirmation', 'token'),
function (User $user, string $password): void {
$user->forceFill([
'password' => Hash::make($password),
'remember_token' => Str::random(60),
])->save();
event(new PasswordReset($user));
}
);
return $status === Password::PASSWORD_RESET
? redirect()->route('login')->with('status', __($status))
: back()->withInput($request->only('email'))->withErrors(['email' => __($status)]);
}
}
@@ -0,0 +1,28 @@
<?php
namespace App\Http\Controllers\Auth;
use App\Http\Controllers\Controller;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Password;
use Illuminate\View\View;
class PasswordResetLinkController extends Controller
{
public function create(): View
{
return view('auth.forgot-password');
}
public function store(Request $request): RedirectResponse
{
$request->validate(['email' => ['required', 'email']]);
$status = Password::sendResetLink($request->only('email'));
return $status === Password::RESET_LINK_SENT
? back()->with('status', __($status))
: back()->withInput($request->only('email'))->withErrors(['email' => __($status)]);
}
}
@@ -0,0 +1,37 @@
<?php
namespace App\Http\Controllers\Auth;
use App\Http\Controllers\Controller;
use App\Models\User;
use Illuminate\Auth\Events\Registered;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Validation\Rules\Password;
use Illuminate\View\View;
class RegisteredUserController extends Controller
{
public function create(): View
{
return view('auth.register');
}
public function store(Request $request): RedirectResponse
{
$data = $request->validate([
'name' => ['required', 'string', 'max:255'],
'email' => ['required', 'string', 'lowercase', 'email', 'max:255', 'unique:users,email'],
'password' => ['required', 'confirmed', Password::defaults()],
]);
$user = User::create($data);
$user->assignRole('client');
event(new Registered($user));
Auth::login($user);
return redirect()->route('dashboard');
}
}
+22
View File
@@ -4,6 +4,8 @@ namespace App\Models;
use Illuminate\Database\Eloquent\Concerns\HasUlids;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\Relations\HasOne;
class Booking extends Model
{
@@ -15,4 +17,24 @@ class Booking extends Model
{
return ['event_date' => 'date', 'total' => 'decimal:2', 'deposit' => 'decimal:2', 'paid_at' => 'datetime'];
}
public function enquiry(): BelongsTo
{
return $this->belongsTo(Enquiry::class);
}
public function client(): BelongsTo
{
return $this->belongsTo(User::class, 'client_id');
}
public function djProfile(): BelongsTo
{
return $this->belongsTo(DjProfile::class);
}
public function review(): HasOne
{
return $this->hasOne(Review::class);
}
}
+17
View File
@@ -4,6 +4,8 @@ namespace App\Models;
use Illuminate\Database\Eloquent\Concerns\HasUlids;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\Relations\HasOne;
class Enquiry extends Model
{
@@ -15,4 +17,19 @@ class Enquiry extends Model
{
return ['event_date' => 'date', 'budget' => 'decimal:2'];
}
public function user(): BelongsTo
{
return $this->belongsTo(User::class);
}
public function djProfile(): BelongsTo
{
return $this->belongsTo(DjProfile::class);
}
public function booking(): HasOne
{
return $this->hasOne(Booking::class);
}
}
+16
View File
@@ -4,10 +4,26 @@ namespace App\Models;
use Illuminate\Database\Eloquent\Concerns\HasUlids;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
class Review extends Model
{
use HasUlids;
protected $fillable = ['booking_id', 'user_id', 'dj_profile_id', 'rating', 'title', 'body', 'status', 'dj_reply'];
public function booking(): BelongsTo
{
return $this->belongsTo(Booking::class);
}
public function user(): BelongsTo
{
return $this->belongsTo(User::class);
}
public function djProfile(): BelongsTo
{
return $this->belongsTo(DjProfile::class);
}
}
+24 -4
View File
@@ -2,14 +2,19 @@
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Relations\BelongsToMany;
use Illuminate\Database\Eloquent\Relations\HasMany;
use Illuminate\Database\Eloquent\Relations\HasOne;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
use Laravel\Cashier\Billable;
use Laravel\Sanctum\HasApiTokens;
use Spatie\Permission\Traits\HasRoles;
class User extends Authenticatable
{
use HasApiTokens,HasRoles,Notifiable;
use Billable, HasApiTokens, HasFactory, HasRoles, Notifiable;
protected $fillable = ['name', 'email', 'password', 'phone', 'avatar_path', 'marketing_opt_in'];
@@ -17,16 +22,31 @@ class User extends Authenticatable
protected function casts(): array
{
return ['email_verified_at' => 'datetime', 'password' => 'hashed', 'marketing_opt_in' => 'boolean'];
return [
'email_verified_at' => 'datetime',
'password' => 'hashed',
'marketing_opt_in' => 'boolean',
'trial_ends_at' => 'datetime',
];
}
public function businesses()
public function businesses(): BelongsToMany
{
return $this->belongsToMany(Business::class)->withPivot(['role'])->withTimestamps();
}
public function djProfile()
public function djProfile(): HasOne
{
return $this->hasOne(DjProfile::class);
}
public function enquiries(): HasMany
{
return $this->hasMany(Enquiry::class);
}
public function bookings(): HasMany
{
return $this->hasMany(Booking::class, 'client_id');
}
}
+18
View File
@@ -0,0 +1,18 @@
<?php
namespace App\Providers;
use Illuminate\Support\ServiceProvider;
class AppServiceProvider extends ServiceProvider
{
public function register(): void
{
//
}
public function boot(): void
{
//
}
}