File size: 7,231 Bytes
10dc6f2
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
<?php

use App\Http\Controllers\HomeController;
use App\Http\Controllers\EventController;
use App\Http\Controllers\CheckoutController;
use App\Http\Controllers\DashboardController;
use App\Http\Controllers\MyTicketsController;
use App\Http\Controllers\OrdersController;
use App\Http\Controllers\ProfileController;
use App\Http\Controllers\Organizer\DashboardController as OrgDashboardController;
use App\Http\Controllers\Organizer\EventController as OrgEventController;
use App\Http\Controllers\Organizer\TicketTierController;
use App\Http\Controllers\Organizer\OrderController as OrgOrderController;
use App\Http\Controllers\Organizer\ScannerController;
use App\Http\Controllers\Admin\DashboardController as AdminDashboardController;
use App\Http\Controllers\Admin\CategoryController;
use App\Http\Controllers\Admin\EventController as AdminEventController;
use App\Http\Controllers\Admin\UserController;
use App\Http\Controllers\Admin\ReportController;
use Illuminate\Support\Facades\Route;

// ═══════════════════════════════════════════════════════════
// PUBLIC
// ═══════════════════════════════════════════════════════════

Route::get('/', [HomeController::class, 'index'])->name('home');
Route::get('/events', [EventController::class, 'index'])->name('events.index');
Route::get('/events/{slug}', [EventController::class, 'show'])->name('events.show');

// ═══════════════════════════════════════════════════════════
// AUTHENTICATED (any role)
// ═══════════════════════════════════════════════════════════

Route::middleware('auth')->group(function () {

    // Customer dashboard
    Route::get('/dashboard', [DashboardController::class, 'index'])->name('dashboard');

    // Checkout flow
    Route::post('/checkout/{event}', [CheckoutController::class, 'store'])->name('checkout.store');
    Route::get('/checkout/{order}/summary', [CheckoutController::class, 'summary'])->name('checkout.summary');
    Route::post('/checkout/{order}/pay', [CheckoutController::class, 'pay'])->name('checkout.pay');
    Route::get('/checkout/{order}/success', [CheckoutController::class, 'success'])->name('checkout.success');

    // My tickets
    Route::get('/my-tickets', [MyTicketsController::class, 'index'])->name('tickets.index');
    Route::get('/my-tickets/{attendee}', [MyTicketsController::class, 'show'])->name('tickets.show');
    Route::get('/my-tickets/{attendee}/pdf', [MyTicketsController::class, 'downloadPdf'])->name('tickets.pdf');

    // Orders
    Route::get('/orders', [OrdersController::class, 'index'])->name('orders.index');
    Route::get('/orders/export/csv', [OrdersController::class, 'exportCsv'])->name('orders.export.csv');
    Route::get('/orders/{order}', [OrdersController::class, 'show'])->name('orders.show');
    Route::post('/orders/{order}/cancel', [OrdersController::class, 'cancel'])->name('orders.cancel');

    // Profile (Breeze)
    Route::get('/profile', [ProfileController::class, 'edit'])->name('profile.edit');
    Route::patch('/profile', [ProfileController::class, 'update'])->name('profile.update');
    Route::delete('/profile', [ProfileController::class, 'destroy'])->name('profile.destroy');
});

// ═══════════════════════════════════════════════════════════
// ORGANIZER
// ═══════════════════════════════════════════════════════════

Route::middleware(['auth', 'role:organizer,admin'])->prefix('organizer')->name('organizer.')->group(function () {

    Route::get('/dashboard', [OrgDashboardController::class, 'index'])->name('dashboard');

    // Event CRUD
    Route::resource('events', OrgEventController::class)->except('show');

    // Ticket Tiers (nested under event)
    Route::post('/events/{event}/tiers', [TicketTierController::class, 'store'])->name('tiers.store');
    Route::put('/events/{event}/tiers/{tier}', [TicketTierController::class, 'update'])->name('tiers.update');
    Route::delete('/events/{event}/tiers/{tier}', [TicketTierController::class, 'destroy'])->name('tiers.destroy');

    // Orders per event
    Route::get('/events/{event}/orders', [OrgOrderController::class, 'index'])->name('events.orders');
    Route::get('/events/{event}/orders/{order}', [OrgOrderController::class, 'show'])->name('events.orders.show');
    Route::get('/events/{event}/export/csv', [OrgOrderController::class, 'exportCsv'])->name('events.export.csv');

    // Scanner
    Route::get('/scanner', [ScannerController::class, 'index'])->name('scanner');
    Route::post('/scanner/check-in', [ScannerController::class, 'checkIn'])->name('scanner.checkin');
});

// ═══════════════════════════════════════════════════════════
// ADMIN
// ═══════════════════════════════════════════════════════════

Route::middleware(['auth', 'role:admin'])->prefix('admin')->name('admin.')->group(function () {

    Route::get('/dashboard', [AdminDashboardController::class, 'index'])->name('dashboard');

    // Users
    Route::get('/users', [UserController::class, 'index'])->name('users.index');
    Route::patch('/users/{user}', [UserController::class, 'update'])->name('users.update');
    Route::delete('/users/{user}', [UserController::class, 'destroy'])->name('users.destroy');

    // Categories
    Route::get('/categories', [CategoryController::class, 'index'])->name('categories.index');
    Route::post('/categories', [CategoryController::class, 'store'])->name('categories.store');
    Route::patch('/categories/{category}', [CategoryController::class, 'update'])->name('categories.update');
    Route::delete('/categories/{category}', [CategoryController::class, 'destroy'])->name('categories.destroy');

    // Events
    Route::get('/events', [AdminEventController::class, 'index'])->name('events.index');
    Route::patch('/events/{event}', [AdminEventController::class, 'updateStatus'])->name('events.update');

    // Reports
    Route::get('/reports', [ReportController::class, 'index'])->name('reports');
});

// ═══════════════════════════════════════════════════════════
// AUTH (Breeze)
// ═══════════════════════════════════════════════════════════

require __DIR__.'/auth.php';