Files
Atomcms-edit/routes/api.php
T
root 0c6c558a59 Add radio embed widget, SSE real-time, song history, moderation panel, and Auto DJ
- Embed widget: standalone iframe player with dark/light/transparent themes, copy-paste embed code admin page
- Real-time SSE: streaming now-playing/listeners/dj events, replaces polling in radio-player and embed
- Song history: auto-records song changes to radio_song_plays table, Filament resource to view
- DJ moderation: unified panel for shouts approval, song request queue, DJ applications
- Auto DJ: playlist management with round-robin playback when no DJ is live
- Refactored radio-player Alpine component to use EventSource API with auto-reconnect
2026-05-24 14:07:32 +02:00

128 lines
6.4 KiB
PHP
Executable File

<?php
use App\Http\Controllers\Api\AuthController;
use App\Http\Controllers\Api\HotelApiController;
use App\Http\Controllers\Community\RadioController;
use App\Http\Controllers\RadioListenerPointController;
use App\Models\Miscellaneous\WebsiteSetting;
use App\Models\RadioApiKey;
use Illuminate\Support\Facades\Route;
/*
|--------------------------------------------------------------------------
| API Routes
|--------------------------------------------------------------------------
|
| Here is where you can register API routes for your application. These
| routes are loaded by the bootstrap/app.php file and assigned
| to the "api" middleware group. Enjoy building your API!
|
*/
// Authentication routes for Next.js frontend
Route::prefix('auth')->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');
});