get('/login', AuthController::class . ':showLogin')->setName('auth.login'); $app->post('/login', AuthController::class . ':login')->setName('auth.login.post'); $app->post('/logout', AuthController::class . ':logout')->setName('auth.logout'); $app->get('/logout', AuthController::class . ':logout')->setName('auth.logout'); // Public image serving (no auth required) $app->get('/images/{path:.+}', 'App\Controllers\ImageController:serve')->setName('images.serve'); // Protected routes (require authentication) $app->group('', function (RouteCollectorProxy $group) { // Global Search $group->get('/search', 'App\Controllers\SearchController:index')->setName('search.index'); $group->get('/', 'App\Controllers\DashboardController:index')->setName('dashboard.index'); // Media Routes $group->group('/media', function (RouteCollectorProxy $mediaGroup) { // Games $mediaGroup->get('/games', GameController::class . ':index')->setName('games.index'); $mediaGroup->get('/games/{game_key}', GameController::class . ':show')->setName('games.show'); $mediaGroup->delete('/games/{game_key}', GameController::class . ':delete')->setName('games.delete'); // Movies $mediaGroup->get('/movies', 'App\Controllers\MovieController:index')->setName('movies.index'); $mediaGroup->get('/movies/{id:\d+}', 'App\Controllers\MovieController:show')->setName('movies.show'); $mediaGroup->delete('/movies/{id:\d+}', 'App\Controllers\MovieController:delete')->setName('movies.delete'); // TV Shows $mediaGroup->get('/tv-shows', 'App\Controllers\TvShowController:index')->setName('tvshows.index'); $mediaGroup->get('/tv-shows/{id:\d+}', 'App\Controllers\TvShowController:show')->setName('tvshows.show'); $mediaGroup->delete('/tv-shows/{id:\d+}', 'App\Controllers\TvShowController:delete')->setName('tvshows.delete'); // Music $mediaGroup->get('/music', 'App\Controllers\MusicController:index')->setName('music.index'); $mediaGroup->get('/music/{id:\d+}', 'App\Controllers\MusicController:show')->setName('music.show'); $mediaGroup->delete('/music/{id:\d+}', 'App\Controllers\MusicController:delete')->setName('music.delete'); // Adult Videos $mediaGroup->get('/adult', AdultController::class . ':index')->setName('adult.index'); $mediaGroup->get('/adult/{id:\d+}', AdultController::class . ':show')->setName('adult.show'); $mediaGroup->delete('/adult/{id:\d+}', AdultController::class . ':delete')->setName('adult.delete'); // Adult Performers (Actors) $mediaGroup->get('/actors', 'App\Controllers\ActorController:index')->setName('actors.index'); $mediaGroup->get('/actors/{id:\d+}', 'App\Controllers\ActorController:show')->setName('actors.show'); $mediaGroup->map(['GET', 'POST'], '/actors/{id:\d+}/edit', 'App\Controllers\ActorController:edit')->setName('actors.edit'); }); })->add(AuthMiddleware::class)->add('App\Http\Middleware\MediaVisibilityMiddleware'); // Admin routes (require admin role) $app->group('/admin', function (RouteCollectorProxy $adminGroup) { // Dashboard $adminGroup->get('', AdminController::class . ':index')->setName('admin.index'); $adminGroup->get('/settings', AdminController::class . ':settings')->setName('admin.settings'); // Media Management $adminGroup->group('/movies', function (RouteCollectorProxy $group) { $group->get('', AdminController::class . ':movies')->setName('admin.movies.index'); $group->map(['GET', 'POST'], '/create', AdminController::class . ':editMovie')->setName('admin.movies.create'); $group->map(['GET', 'POST'], '/{id}/edit', AdminController::class . ':editMovie')->setName('admin.movies.edit'); $group->map(['POST', 'DELETE'], '/{id}', AdminController::class . ':deleteMovie')->setName('admin.movies.delete'); }); $adminGroup->group('/games', function (RouteCollectorProxy $group) { $group->get('', AdminController::class . ':games')->setName('admin.games.index'); $group->map(['GET', 'POST'], '/create', AdminController::class . ':editGame')->setName('admin.games.create'); $group->map(['GET', 'POST'], '/{id}/edit', AdminController::class . ':editGame')->setName('admin.games.edit'); $group->map(['POST', 'DELETE'], '/{id}', AdminController::class . ':deleteGame')->setName('admin.games.delete'); // SteamGridDB API routes $group->group('/sgdb', function (RouteCollectorProxy $sgdb) { $sgdb->get('/search', 'App\Controllers\GameController:searchSteamGridDb')->setName('admin.games.sgdb.search'); $sgdb->get('/media/{gameId}/{type}', 'App\Controllers\GameController:getSteamGridDbMedia')->setName('admin.games.sgdb.media'); $sgdb->post('/media/set', 'App\Controllers\GameController:setSteamGridDbMedia')->setName('admin.games.sgdb.media.set'); }); }); $adminGroup->group('/shows', function (RouteCollectorProxy $group) { $group->get('', AdminController::class . ':shows')->setName('admin.shows.index'); $group->map(['GET', 'POST'], '/create', AdminController::class . ':editShow')->setName('admin.shows.create'); $group->map(['GET', 'POST'], '/{id}/edit', AdminController::class . ':editShow')->setName('admin.shows.edit'); $group->map(['POST', 'DELETE'], '/{id}', AdminController::class . ':deleteShow')->setName('admin.shows.delete'); }); $adminGroup->group('/adult', function (RouteCollectorProxy $group) { $group->get('', [AdminController::class, 'adultVideos']); $group->get('/create', [AdminController::class, 'createAdultVideo']); $group->post('', [AdminController::class, 'storeAdultVideo']); $group->get('/{id}/edit', [AdminController::class, 'editAdultVideo']); $group->post('/{id}', [AdminController::class, 'updateAdultVideo']); $group->post('/{id}/delete', [AdminController::class, 'deleteAdultVideo']); // Actor management routes $group->get('/{id}/actors', [AdminController::class, 'getAdultVideoActors']); $group->post('/{id}/actors', [AdminController::class, 'addActorToAdultVideo']); $group->delete('/{id}/actors/{actorId}', [AdminController::class, 'removeActorFromAdultVideo']); $group->get('/search-actors', [AdminController::class, 'searchActors']); }); $adminGroup->group('/actors', function (RouteCollectorProxy $group) { $group->get('', AdminController::class . ':actors')->setName('admin.actors.index'); $group->post('/merge', AdminController::class . ':mergeActors')->setName('admin.actors.merge'); $group->post('/auto-merge', AdminController::class . ':autoMergeActors')->setName('admin.actors.auto-merge'); }); // Media Sources // Media Sources $adminGroup->group('/sources', function (RouteCollectorProxy $sourcesGroup) { $sourcesGroup->get('', 'App\Controllers\MediaSourceController:index')->setName('admin.sources.index'); $sourcesGroup->get('/create', 'App\Controllers\MediaSourceController:create')->setName('admin.sources.create'); $sourcesGroup->post('', 'App\Controllers\MediaSourceController:store')->setName('admin.sources.store'); $sourcesGroup->get('/{id:\d+}/edit', 'App\Controllers\MediaSourceController:edit')->setName('admin.sources.edit'); $sourcesGroup->post('/{id:\d+}', 'App\Controllers\MediaSourceController:update')->setName('admin.sources.update'); $sourcesGroup->post('/{id:\d+}/delete', 'App\Controllers\MediaSourceController:destroy')->setName('admin.sources.destroy'); // Source sync operations $sourcesGroup->post('/{id:\d+}/sync', 'App\Controllers\MediaSourceController:startSync')->setName('admin.sources.sync'); $sourcesGroup->get('/sync/status/{log_id}', 'App\Controllers\MediaSourceController:syncStatus')->setName('admin.sources.sync.status'); }); // Sync Management $adminGroup->group('/sync', function (RouteCollectorProxy $syncGroup) { $syncGroup->get('', 'App\Controllers\SyncController:index')->setName('admin.sync.index'); $syncGroup->post('', 'App\Controllers\SyncController:start')->setName('admin.sync.start'); $syncGroup->post('/{id:\d+}', AdminController::class . ':syncSource')->setName('admin.sync'); $syncGroup->get('/status/{id:\d+}', AdminController::class . ':syncStatus')->setName('admin.sync.status'); $syncGroup->get('/status/{log_id}', 'App\Controllers\SyncController:status')->setName('admin.sync.status'); $syncGroup->post('/{log_id}/cancel', 'App\Controllers\SyncController:cancel')->setName('admin.sync.cancel'); $syncGroup->post('/clear-logs', 'App\Controllers\SyncController:clearLogs')->setName('admin.sync.clearLogs'); }); // Playnite Import $adminGroup->group('/playnite', function (RouteCollectorProxy $playniteGroup) { $playniteGroup->get('/import', 'App\Controllers\PlayniteImportController:showImport')->setName('admin.playnite.import'); $playniteGroup->post('/import', 'App\Controllers\PlayniteImportController:upload')->setName('admin.playnite.upload'); //$playniteGroup->get('/upload', 'App\Controllers\PlayniteImportController:upload')->setName('admin.playnite.upload'); $playniteGroup->post('/confirm', 'App\Controllers\PlayniteImportController:confirm')->setName('admin.playnite.confirm'); $playniteGroup->post('/cancel', 'App\Controllers\PlayniteImportController:cancel')->setName('admin.playnite.cancel'); $playniteGroup->post('/api', 'App\Controllers\PlayniteImportController:apiImport')->setName('admin.playnite.api'); }); })->add(AdminMiddleware::class);