group(function () { Route::post('/login', [AuthController::class, 'login']); Route::post('/logout', [AuthController::class, 'logout'])->middleware('auth:sanctum'); Route::get('/user', [AuthController::class, 'user'])->middleware('auth:sanctum'); Route::post('/register', [AuthController::class, 'register']); Route::put('/user', [AuthController::class, 'updateUser'])->middleware('auth:sanctum'); Route::put('/user/password', [AuthController::class, 'updatePassword'])->middleware('auth:sanctum'); }); // Home page data Route::get('/home', [AuthController::class, 'home']); // User Profile Route::get('/user/{username}', [HotelApiController::class, 'fetchUser'])->middleware('throttle:120,1'); Route::get('/profile/{username}', [HotelApiController::class, 'userProfile']); // Online Users Route::get('/online-users', [HotelApiController::class, 'onlineUsers'])->middleware('throttle:120,1'); Route::get('/online-count', [HotelApiController::class, 'onlineUserCount'])->middleware('throttle:120,1')->name('api.online-count'); // Articles Route::get('/articles', [HotelApiController::class, 'articles']); Route::get('/articles/{slug}', [HotelApiController::class, 'article']); Route::post('/articles/{slug}/comment', [AuthController::class, 'articleComment'])->middleware('auth:sanctum'); // Photos Route::get('/photos', [HotelApiController::class, 'photos']); // Staff Route::get('/staff', [HotelApiController::class, 'staff']); // Shop Route::get('/shop/packages', [HotelApiController::class, 'shopPackages']); Route::get('/shop/categories', [HotelApiController::class, 'shopCategories']); // Teams / Guilds Route::get('/teams', [HotelApiController::class, 'teams']); // Leaderboard Route::get('/leaderboard', [HotelApiController::class, 'leaderboard']); // Rare Values Route::get('/rare-values', [HotelApiController::class, 'rareValues']); Route::get('/rare-values/categories', [HotelApiController::class, 'rareValuesCategories']); // Settings Route::get('/settings', [HotelApiController::class, 'settings']); // Radio API Route::get('/radio/current-dj', [RadioController::class, 'currentDJ'])->middleware('throttle:100,1')->name('api.radio.current-dj'); Route::get('/radio/config', [RadioController::class, 'config'])->middleware('throttle:100,1')->name('api.radio.config'); Route::get('/radio/now-playing', [RadioController::class, 'nowPlaying'])->middleware('throttle:100,1')->name('api.radio.now-playing'); Route::get('/radio/listeners', [RadioController::class, 'listeners'])->middleware('throttle:100,1')->name('api.radio.listeners'); Route::get('/radio/shouts', [RadioController::class, 'getShouts'])->middleware('throttle:100,1')->name('api.radio.shouts'); // Radio SSE (Server-Sent Events) stream Route::get('/radio/sse', [\App\Http\Controllers\Radio\SseController::class, 'stream'])->name('api.radio.sse'); // Radio embed config Route::get('/radio/embed/config', [\App\Http\Controllers\Radio\EmbedController::class, 'config'])->middleware('throttle:100,1')->name('api.radio.embed.config'); // Radio Settings Route::get('/settings/radio/auto-play', function () { $autoPlaySetting = cache()->remember('radio_auto_play_setting', 300, fn () => WebsiteSetting::where('key', 'radio_auto_play')->first()); return response()->json([ 'auto_play' => $autoPlaySetting && (bool) $autoPlaySetting->value, ]); })->middleware('throttle:100,1')->name('api.settings.radio.auto-play'); // Radio Points Route::get('/radio/points', [RadioListenerPointController::class, 'index'])->middleware('throttle:150,1'); Route::get('/radio/points/leaderboard', [RadioListenerPointController::class, 'leaderboard'])->middleware('throttle:150,1'); Route::get('/radio/points/user', [RadioListenerPointController::class, 'userPoints'])->middleware('auth:sanctum', 'throttle:150,1'); Route::get('/radio/points/stats', [RadioListenerPointController::class, 'stats'])->middleware('throttle:150,1'); // Help Center Tickets Route::get('/help/tickets', [HotelApiController::class, 'helpTickets'])->middleware('auth:sanctum'); Route::get('/help/tickets/{id}', [HotelApiController::class, 'helpTicket'])->middleware('auth:sanctum'); Route::post('/help/tickets', [HotelApiController::class, 'helpTicketCreate'])->middleware('auth:sanctum'); Route::post('/help/tickets/{id}/reply', [HotelApiController::class, 'helpTicketReply'])->middleware('auth:sanctum'); // Photo Upload Route::post('/photos/upload', [HotelApiController::class, 'uploadPhoto'])->middleware('auth:sanctum'); // Shop Purchase Route::post('/shop/packages/{packageId}/purchase', [HotelApiController::class, 'purchasePackage'])->middleware('auth:sanctum'); // Protected Radio API (requires API key) Route::prefix('radio')->middleware(['radio.api', 'throttle:radio'])->group(function () { Route::get('/current-dj', [RadioController::class, 'currentDJ'])->name('api.radio.v2.current-dj'); Route::get('/now-playing', [RadioController::class, 'nowPlaying'])->name('api.radio.v2.now-playing'); Route::get('/listeners', [RadioController::class, 'listeners'])->name('api.radio.v2.listeners'); Route::get('/config', [RadioController::class, 'config'])->name('api.radio.v2.config'); Route::get('/shouts', [RadioController::class, 'getShouts'])->name('api.radio.v2.shouts'); Route::get('/points', [RadioListenerPointController::class, 'index'])->name('api.radio.v2.points'); Route::get('/points/leaderboard', [RadioListenerPointController::class, 'leaderboard'])->name('api.radio.v2.points.leaderboard'); Route::get('/points/stats', [RadioListenerPointController::class, 'stats'])->name('api.radio.v2.points.stats'); Route::get('/verify', function () { return response()->json([ 'valid' => true, 'message' => 'API key is geldig', ]); })->name('api.radio.v2.verify'); });