84 lines
3.7 KiB
PHP
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');
|
|
});
|