SESSION_LIFETIME, 'path' => '/', 'secure' => APP_ENV === 'production', 'httponly' => true, 'samesite' => 'Lax', ]); session_start(); // Autoload controllers and models spl_autoload_register(function (string $class): void { $dirs = [ APP_ROOT . '/app/controllers/', APP_ROOT . '/app/models/', APP_ROOT . '/app/middleware/', ]; foreach ($dirs as $dir) { $file = $dir . $class . '.php'; if (file_exists($file)) { require_once $file; return; } } }); // ============================================================ // ROUTES // ============================================================ $router = new Router(); // ----- PUBLIC ----- $router->get('/', 'HomeController@index', 'home'); $router->get('/shop', 'ShopController@index', 'shop'); $router->get('/product/{slug}', 'ShopController@product', 'product'); $router->get('/store/{slug}', 'ShopController@vendorStore', 'store'); $router->get('/category/{slug}', 'ShopController@category', 'category'); $router->get('/search', 'ShopController@search', 'search'); // ----- CART ----- $router->get('/cart', 'CartController@index', 'cart'); $router->post('/cart/add', 'CartController@add'); $router->post('/cart/update', 'CartController@update'); $router->post('/cart/remove', 'CartController@remove'); $router->post('/cart/clear', 'CartController@clear'); $router->post('/cart/apply-coupon', 'CartController@applyCoupon'); // ----- CHECKOUT ----- $router->get('/checkout', 'CheckoutController@index', 'checkout'); $router->post('/checkout/place-order', 'CheckoutController@placeOrder'); $router->get('/checkout/success', 'CheckoutController@success', 'checkout.success'); $router->get('/checkout/failed', 'CheckoutController@failed', 'checkout.failed'); // ----- PAYMENT ----- $router->get('/payment/callback', 'PaymentController@callback'); $router->post('/payment/webhook', 'PaymentController@webhook'); // ----- AUTH ----- $router->get('/login', 'AuthController@loginForm', 'login'); $router->post('/login', 'AuthController@login'); $router->get('/register', 'AuthController@registerForm', 'register'); $router->post('/register', 'AuthController@register'); $router->get('/register/vendor', 'AuthController@vendorRegisterForm', 'register.vendor'); $router->post('/register/vendor', 'AuthController@vendorRegister'); $router->get('/logout', 'AuthController@logout', 'logout'); $router->get('/forgot-password', 'AuthController@forgotForm', 'forgot'); $router->post('/forgot-password', 'AuthController@forgot'); $router->get('/reset-password/{token}', 'AuthController@resetForm', 'reset'); $router->post('/reset-password/{token}', 'AuthController@reset'); $router->get('/verify-email/{token}', 'AuthController@verifyEmail', 'verify.email'); // ----- BUYER DASHBOARD ----- $router->group('/buyer', ['RequireBuyer'], function($r) { $r->get('/dashboard', 'BuyerController@dashboard', 'buyer.dashboard'); $r->get('/orders', 'BuyerController@orders', 'buyer.orders'); $r->get('/orders/{id}', 'BuyerController@orderDetail', 'buyer.order'); $r->post('/orders/{id}/cancel', 'BuyerController@cancelOrder'); $r->post('/orders/{id}/dispute', 'BuyerController@raiseDispute'); $r->get('/wishlist', 'BuyerController@wishlist', 'buyer.wishlist'); $r->post('/wishlist/toggle', 'BuyerController@toggleWishlist'); $r->get('/profile', 'BuyerController@profile', 'buyer.profile'); $r->post('/profile/update', 'BuyerController@updateProfile'); $r->post('/profile/change-password', 'BuyerController@changePassword'); $r->get('/addresses', 'BuyerController@addresses', 'buyer.addresses'); $r->post('/addresses/save', 'BuyerController@saveAddress'); $r->post('/addresses/delete', 'BuyerController@deleteAddress'); $r->get('/notifications', 'BuyerController@notifications', 'buyer.notifications'); $r->post('/reviews/submit', 'BuyerController@submitReview'); }); // ----- VENDOR DASHBOARD ----- $router->group('/vendor', ['RequireVendor'], function($r) { $r->get('/onboarding', 'VendorController@onboarding', 'vendor.onboarding'); $r->post('/onboarding', 'VendorController@saveOnboarding'); $r->get('/dashboard', 'VendorController@dashboard', 'vendor.dashboard'); $r->get('/products', 'VendorController@products', 'vendor.products'); $r->get('/products/add', 'VendorController@addProduct', 'vendor.product.add'); $r->post('/products/add', 'VendorController@saveProduct'); $r->get('/products/{id}/edit', 'VendorController@editProduct', 'vendor.product.edit'); $r->post('/products/{id}/edit', 'VendorController@updateProduct'); $r->post('/products/{id}/delete', 'VendorController@deleteProduct'); $r->get('/orders', 'VendorController@orders', 'vendor.orders'); $r->get('/orders/{id}', 'VendorController@orderDetail', 'vendor.order'); $r->post('/orders/{id}/update-status', 'VendorController@updateOrderStatus'); $r->get('/wallet', 'VendorController@wallet', 'vendor.wallet'); $r->post('/wallet/withdraw', 'VendorController@requestWithdrawal'); $r->get('/analytics', 'VendorController@analytics', 'vendor.analytics'); $r->get('/settings', 'VendorController@settings', 'vendor.settings'); $r->post('/settings/update', 'VendorController@updateSettings'); $r->post('/settings/upload-logo', 'VendorController@uploadLogo'); $r->post('/settings/upload-banner', 'VendorController@uploadBanner'); $r->get('/messages', 'VendorController@messages', 'vendor.messages'); $r->get('/kyc', 'VendorController@kyc', 'vendor.kyc'); $r->post('/kyc/submit', 'VendorController@submitKyc'); }); // ----- ADMIN PANEL ----- $router->group('/admin', ['RequireAdmin'], function($r) { $r->get('/', 'AdminController@dashboard', 'admin.dashboard'); $r->get('/dashboard', 'AdminController@dashboard'); // Users $r->get('/users', 'AdminController@users', 'admin.users'); $r->get('/users/{id}', 'AdminController@userDetail', 'admin.user'); $r->post('/users/{id}/action', 'AdminController@userAction'); // Vendors $r->get('/vendors', 'AdminController@vendors', 'admin.vendors'); $r->get('/vendors/{id}', 'AdminController@vendorDetail', 'admin.vendor'); $r->post('/vendors/{id}/approve', 'AdminController@approveVendor'); $r->post('/vendors/{id}/reject', 'AdminController@rejectVendor'); $r->post('/vendors/{id}/suspend', 'AdminController@suspendVendor'); // Products $r->get('/products', 'AdminController@products', 'admin.products'); $r->get('/products/{id}', 'AdminController@productDetail', 'admin.product'); $r->post('/products/{id}/approve', 'AdminController@approveProduct'); $r->post('/products/{id}/reject', 'AdminController@rejectProduct'); $r->post('/products/{id}/feature', 'AdminController@featureProduct'); // Orders $r->get('/orders', 'AdminController@orders', 'admin.orders'); $r->get('/orders/{id}', 'AdminController@orderDetail', 'admin.order'); $r->post('/orders/{id}/update', 'AdminController@updateOrder'); // Categories $r->get('/categories', 'AdminController@categories', 'admin.categories'); $r->post('/categories/save', 'AdminController@saveCategory'); $r->post('/categories/{id}/delete', 'AdminController@deleteCategory'); // Finance $r->get('/withdrawals', 'AdminController@withdrawals', 'admin.withdrawals'); $r->post('/withdrawals/{id}/process', 'AdminController@processWithdrawal'); // Disputes $r->get('/disputes', 'AdminController@disputes', 'admin.disputes'); $r->get('/disputes/{id}', 'AdminController@disputeDetail', 'admin.dispute'); $r->post('/disputes/{id}/resolve', 'AdminController@resolveDispute'); // Banners $r->get('/banners', 'AdminController@banners', 'admin.banners'); $r->post('/banners/save', 'AdminController@saveBanner'); $r->post('/banners/{id}/delete', 'AdminController@deleteBanner'); // Settings $r->get('/settings', 'AdminController@settings', 'admin.settings'); $r->post('/settings/update', 'AdminController@updateSettings'); // Locations $r->get('/locations', 'AdminController@locations', 'admin.locations'); $r->post('/locations/save-lga', 'AdminController@saveLga'); // Logs $r->get('/logs', 'AdminController@logs', 'admin.logs'); }); // ----- API ----- $router->any('/api/locations/lgas', 'ApiController@lgas'); $router->any('/api/search/suggest', 'ApiController@searchSuggest'); $router->any('/api/wishlist/check', 'ApiController@wishlistCheck'); $router->any('/api/cart/count', 'ApiController@cartCount'); $router->any('/api/notifications/mark-read', 'ApiController@markNotificationsRead'); // Dispatch $router->dispatch();