Files

84 lines
3.7 KiB
PHP

<?php
use Illuminate\Support\Facades\Route;
use App\Http\Controllers\CategoryController;
use App\Http\Controllers\BookController;
use App\Http\Controllers\SummaryController;
use App\Http\Controllers\ReadlistController;
use App\Http\Controllers\StaticPageController;
use App\Http\Controllers\ContactController;
use App\Http\Controllers\SummaryReportController;
use App\Http\Controllers\SummaryRequestController;
use App\Http\Controllers\SummaryReviewController;
use App\Http\Controllers\SitemapController;
use App\Http\Controllers\GutendexController;
use App\Models\Book;
Route::get('/', function () {
$latestBooks = Book::with(['category', 'authors', 'summary'])
->orderBy('created_at', 'desc')
->limit(6)
->get();
return view('welcome', compact('latestBooks'));
});
// Static pages
Route::get('/about', [StaticPageController::class, 'about'])->name('about');
Route::get('/privacy', [StaticPageController::class, 'privacy'])->name('privacy');
Route::get('/terms', [StaticPageController::class, 'terms'])->name('terms');
// Contact
Route::get('/contact', [ContactController::class, 'show'])->name('contact.show');
Route::post('/contact', [ContactController::class, 'send'])->name('contact.send');
// Bind the {book} route parameter to resolve by slug or numeric ID (backward compatible)
Route::bind('book', function ($value) {
return App\Models\Book::where('slug', $value)
->orWhere(function ($q) use ($value) {
if (is_numeric($value)) {
$q->where('id', (int) $value);
}
})
->firstOrFail();
});
Route::resource('categories', CategoryController::class);
Route::resource('books', BookController::class);
Route::resource('summaries', SummaryController::class);
// Readlist + Reports + Requests routes
Route::middleware('auth')->group(function () {
Route::get('/readlist', [ReadlistController::class, 'index'])->name('readlist.index');
Route::post('/readlist/{book}', [ReadlistController::class, 'store'])->name('readlist.store');
Route::delete('/readlist/{book}', [ReadlistController::class, 'destroy'])->name('readlist.destroy');
// Summary reports
Route::post('/books/{book}/report', [SummaryReportController::class, 'store'])->name('summary-reports.store');
// Summary requests
Route::get('/requests', [SummaryRequestController::class, 'index'])->name('requests.index');
Route::get('/requests/create', [SummaryRequestController::class, 'create'])->name('requests.create');
Route::post('/requests', [SummaryRequestController::class, 'store'])->name('requests.store');
// Summary reviews
Route::post('/books/{book}/reviews', [SummaryReviewController::class, 'store'])->name('reviews.store');
Route::delete('/reviews/{review}', [SummaryReviewController::class, 'destroy'])->name('reviews.destroy');
});
Auth::routes();
// Dashboard route (alias for /home)
Route::get('/dashboard', [App\Http\Controllers\HomeController::class, 'index'])->name('dashboard');
Route::get('/home', [App\Http\Controllers\HomeController::class, 'index'])->name('home');
// Sitemap
Route::get('/sitemap.xml', [SitemapController::class, 'index'])->name('sitemap');
// Admin - Gutendex Management (requires authentication and admin privileges)
Route::middleware(['auth', 'admin'])->prefix('admin')->name('admin.')->group(function () {
Route::get('/gutendex', [GutendexController::class, 'dashboard'])->name('gutendex.dashboard');
Route::get('/gutendex/status', [GutendexController::class, 'status'])->name('gutendex.status');
Route::post('/gutendex/import', [GutendexController::class, 'import'])->name('gutendex.import');
Route::post('/gutendex/retry/{book}', [GutendexController::class, 'retry'])->name('gutendex.retry');
});