Files
jouwdriedee/routes/web.php
T

180 lines
11 KiB
PHP

<?php
use App\Http\Controllers\AccountController;
use App\Http\Controllers\Admin\CategoryController as AdminCategoryController;
use App\Http\Controllers\Admin\CommunicationController as AdminCommunicationController;
use App\Http\Controllers\Admin\ContentController;
use App\Http\Controllers\Admin\CustomerController as AdminCustomerController;
use App\Http\Controllers\Admin\MakerWorldController;
use App\Http\Controllers\Admin\OrderController as AdminOrderController;
use App\Http\Controllers\Admin\ProductController as AdminProductController;
use App\Http\Controllers\Auth\ForgotPasswordController;
use App\Http\Controllers\Auth\LoginController;
use App\Http\Controllers\Auth\RegisterController;
use App\Http\Controllers\CartController;
use App\Http\Controllers\CheckoutController;
use App\Http\Controllers\ContactController;
use App\Http\Controllers\ShopController;
use App\Models\Category;
use App\Models\Product;
use Illuminate\Cookie\Middleware\EncryptCookies;
use Illuminate\Session\Middleware\StartSession;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Route;
use Illuminate\Support\Facades\Schema;
// Health & Diagnostics (Alleen toegankelijk in debug-modus of voor ingelogde admins)
Route::get('/health-debug', function () {
if (! config('app.debug') && ! (auth()->check() && auth()->user()->isAdmin())) {
abort(404);
}
$dbPath = config('database.connections.sqlite.database');
$diagnostics = [
'php_version' => PHP_VERSION,
'app_env' => config('app.env'),
'has_app_key' => ! empty(config('app.key')),
'app_key_len' => strlen((string) config('app.key')),
'db_connection' => config('database.default'),
'db_path' => $dbPath,
'db_file_exists' => is_string($dbPath) && file_exists($dbPath),
'db_dir_writable' => is_string($dbPath) && is_writable(dirname($dbPath)),
];
try {
DB::connection()->getPdo();
$diagnostics['db_pdo'] = 'CONNECTED';
$diagnostics['tables'] = Schema::getTableListing();
} catch (Throwable $e) {
$diagnostics['db_pdo_error'] = $e->getMessage();
}
try {
$diagnostics['categories_count'] = Category::count();
} catch (Throwable $e) {
$diagnostics['categories_error'] = $e->getMessage();
}
try {
$diagnostics['products_count'] = Product::count();
} catch (Throwable $e) {
$diagnostics['products_error'] = $e->getMessage();
}
return response()->json($diagnostics);
})->withoutMiddleware([
StartSession::class,
EncryptCookies::class,
]);
// Shop & Product routes
Route::get('/', [ShopController::class, 'index'])->name('home');
Route::get('/catalogus', [ShopController::class, 'catalog'])->name('catalog');
Route::get('/product/{slug}', [ShopController::class, 'show'])->name('product.show');
Route::get('/custom-3d-print', [ShopController::class, 'customRequest'])->name('custom.request');
Route::post('/custom-3d-print', [ShopController::class, 'storeCustomRequest'])->name('custom.store');
Route::post('/custom-3d-print/bestellen', [CartController::class, 'addCustom'])->name('custom.cart.add');
// Winkelwagen
Route::get('/winkelwagen', [CartController::class, 'index'])->name('cart.index');
Route::post('/winkelwagen/toevoegen', [CartController::class, 'add'])->name('cart.add');
Route::post('/winkelwagen/bijwerken', [CartController::class, 'update'])->name('cart.update');
Route::delete('/winkelwagen/verwijderen/{key}', [CartController::class, 'remove'])->name('cart.remove');
Route::get('/winkelwagen/aantal', [CartController::class, 'count'])->name('cart.count');
// Contact & Klantvraag stellen
Route::get('/contact', [ContactController::class, 'index'])->name('contact.index');
Route::post('/contact', [ContactController::class, 'store'])->name('contact.store')->middleware('throttle:10,1');
// Afrekenen & Bevestiging
Route::get('/afrekenen', [CheckoutController::class, 'index'])->name('checkout.index');
Route::post('/afrekenen', [CheckoutController::class, 'store'])->name('checkout.store')->middleware('throttle:10,1');
Route::get('/bestelling-ontvangen/{orderNumber}', [CheckoutController::class, 'success'])->name('checkout.success');
// Authenticatie & Klantenportaal
Route::middleware('guest')->group(function () {
Route::get('/inloggen', [LoginController::class, 'showLoginForm'])->name('login');
Route::post('/inloggen', [LoginController::class, 'login'])->name('login.submit')->middleware('throttle:5,1');
Route::redirect('/login', '/inloggen');
Route::get('/registreren', [RegisterController::class, 'showRegistrationForm'])->name('register');
Route::post('/registreren', [RegisterController::class, 'register'])->name('register.submit')->middleware('throttle:6,1');
Route::redirect('/register', '/registreren');
Route::get('/wachtwoord-vergeten', [ForgotPasswordController::class, 'showLinkRequestForm'])->name('password.request');
Route::post('/wachtwoord-vergeten', [ForgotPasswordController::class, 'sendResetLinkEmail'])->name('password.email')->middleware('throttle:3,1');
Route::get('/wachtwoord-resetten/{token}', [ForgotPasswordController::class, 'showResetForm'])->name('password.reset');
Route::post('/wachtwoord-resetten', [ForgotPasswordController::class, 'reset'])->name('password.update')->middleware('throttle:5,1');
});
Route::middleware('auth')->group(function () {
Route::post('/uitloggen', [LoginController::class, 'logout'])->name('logout');
Route::get('/uitloggen', [LoginController::class, 'logout']); // Fallback voor GET uitloggen
// Klantendashboard / Mijn Account
Route::get('/mijn-account', [AccountController::class, 'index'])->name('account.index');
Route::put('/mijn-account/profiel', [AccountController::class, 'updateProfile'])->name('account.profile');
Route::put('/mijn-account/wachtwoord', [AccountController::class, 'updatePassword'])->name('account.password');
});
// Admin & CMS Beheer (Beveiligd: alleen ingelogde admins)
Route::prefix('admin')->name('admin.')->middleware(['auth', 'admin'])->group(function () {
Route::redirect('/', '/admin/content');
// Layout, Stijl & Teksten CMS
Route::get('/content', [ContentController::class, 'index'])->name('content.index');
Route::post('/content', [ContentController::class, 'update'])->name('content.update');
Route::post('/content/reset', [ContentController::class, 'reset'])->name('content.reset');
Route::post('/content/test-mail', [ContentController::class, 'sendTestMail'])->name('content.test-mail');
Route::post('/toggle-offline', [ContentController::class, 'toggleOffline'])->name('toggle-offline');
// Producten Beheer
Route::post('/products/upload-image', [AdminProductController::class, 'uploadImage'])->name('products.upload-image');
Route::post('/products/calculate-price', [AdminProductController::class, 'calculatePrice'])->name('products.calculate-price');
Route::resource('products', AdminProductController::class)->except(['show']);
// Categorieën Beheer
Route::resource('categories', AdminCategoryController::class)->only(['index', 'edit', 'update']);
// Bestellingen Beheer
Route::get('/orders', [AdminOrderController::class, 'index'])->name('orders.index');
Route::get('/orders/{order}', [AdminOrderController::class, 'show'])->name('orders.show');
Route::post('/orders/{order}/status', [AdminOrderController::class, 'updateStatus'])->name('orders.status');
// Communicatie Beheer (Vragen van klanten & antwoorden)
Route::get('/communicatie', [AdminCommunicationController::class, 'index'])->name('communications.index');
Route::get('/communicatie/{communication}', [AdminCommunicationController::class, 'show'])->name('communications.show');
Route::post('/communicatie/{communication}/status', [AdminCommunicationController::class, 'updateStatus'])->name('communications.status');
Route::post('/communicatie/{communication}/reply', [AdminCommunicationController::class, 'sendReply'])->name('communications.reply');
Route::delete('/communicatie/{communication}', [AdminCommunicationController::class, 'destroy'])->name('communications.destroy');
// Klanten & Klantprofielen Beheer
Route::get('/klanten', [AdminCustomerController::class, 'index'])->name('customers.index');
Route::get('/klanten/{customer}', [AdminCustomerController::class, 'show'])->name('customers.show');
// MakerWorld Importer & Collecties Auto-Sync
Route::get('/makerworld', [MakerWorldController::class, 'index'])->name('makerworld.index');
Route::post('/makerworld/login', [MakerWorldController::class, 'login'])->name('makerworld.login');
Route::post('/makerworld/verify-code', [MakerWorldController::class, 'verifyCode'])->name('makerworld.verify-code');
Route::post('/makerworld/resend-code', [MakerWorldController::class, 'resendCode'])->name('makerworld.resend-code');
Route::post('/makerworld/token', [MakerWorldController::class, 'saveToken'])->name('makerworld.token');
Route::post('/makerworld/disconnect', [MakerWorldController::class, 'disconnect'])->name('makerworld.disconnect');
Route::get('/makerworld/preview', [MakerWorldController::class, 'preview'])->name('makerworld.preview');
Route::post('/makerworld/import', [MakerWorldController::class, 'import'])->name('makerworld.import');
Route::post('/makerworld/batch-import', [MakerWorldController::class, 'batchImport'])->name('makerworld.batch-import');
// Collecties Auto-Sync Management
Route::post('/makerworld/collections/add', [MakerWorldController::class, 'addCollection'])->name('makerworld.collections.add');
Route::post('/makerworld/collections/{collection}/toggle', [MakerWorldController::class, 'toggleCollectionSync'])->name('makerworld.collections.toggle');
Route::post('/makerworld/collections/{collection}/sync', [MakerWorldController::class, 'syncCollectionNow'])->name('makerworld.collections.sync');
Route::delete('/makerworld/collections/{collection}', [MakerWorldController::class, 'deleteCollection'])->name('makerworld.collections.delete');
// Artikel Beheer (Staging & Curation voor geïmporteerde modellen)
Route::get('/makerworld/staging', [MakerWorldController::class, 'staging'])->name('makerworld.staging');
Route::post('/makerworld/staging/{product}/publish', [MakerWorldController::class, 'publishStaged'])->name('makerworld.staging.publish');
Route::post('/makerworld/staging/bulk-publish', [MakerWorldController::class, 'bulkPublishStaged'])->name('makerworld.staging.bulk-publish');
Route::delete('/makerworld/staging/{product}', [MakerWorldController::class, 'rejectStaged'])->name('makerworld.staging.reject');
Route::post('/makerworld/staging/bulk-reject', [MakerWorldController::class, 'bulkRejectStaged'])->name('makerworld.staging.bulk-reject');
});