backend/ ├── public/ ├── node_modules/ ├── src/ │ ├── routes/ │ │ ├── auth.js │ │ ├── products.js │ │ ├── productAdminImages.js │ │ ├── images.js │ │ ├── productAdmin.js │ │ └── cart.js │ ├── middleware/ │ │ ├── upload.js │ │ ├── auth.js │ │ └── adminAuth.js │ ├── db/ │ │ └── index.js │ ├── index.js │ └── config.js │ └── Dockerfile ├── package.json ├── .env ├── README.md └── .gitignore db/ ├── init/ │ ├── 05-admin-role.sql │ ├── 02-seed.sql │ ├── 04-product-images.sql │ ├── 03-api-key.sql │ ├── 01-schema.sql frontend/ ├── node_modules/ ├── public/ ├── src/ │ ├── pages/ │ │ ├── Admin/ │ │ │ ├── ProductEditPage.jsx │ │ │ ├── DashboardPage.jsx │ │ │ └── ProductsPage.jsx │ │ ├── ProductsPage.jsx │ │ ├── HomePage.jsx │ │ ├── CartPage.jsx │ │ ├── ProductDetailPage.jsx │ │ ├── VerifyPage.jsx │ │ ├── CheckoutPage.jsx │ │ ├── RegisterPage.jsx │ │ ├── NotFoundPage.jsx │ │ └── LoginPage.jsx │ ├── utils/ │ │ └── imageUtils.js │ ├── components/ │ │ ├── ImageUploader.jsx │ │ ├── ProductImage.jsx │ │ ├── Footer.jsx │ │ ├── ProtectedRoute.jsx │ │ └── Notifications.jsx │ ├── services/ │ │ ├── imageService.js │ │ ├── productService.js │ │ ├── cartService.js │ │ ├── authService.js │ │ └── api.js │ ├── hooks/ │ │ ├── apiHooks.js │ │ └── reduxHooks.js │ ├── layouts/ │ │ ├── MainLayout.jsx │ │ ├── AuthLayout.jsx │ │ └── AdminLayout.jsx │ ├── theme/ │ │ ├── index.js │ │ └── ThemeProvider.jsx │ ├── features/ │ │ ├── ui/ │ │ │ └── uiSlice.js │ │ ├── cart/ │ │ │ └── cartSlice.js │ │ ├── auth/ │ │ │ └── authSlice.js │ │ └── store/ │ │ └── index.js │ ├── assets/ │ ├── App.jsx │ ├── main.jsx │ └── config.js ├── package.json ├── package-lock.json ├── vite.config.js ├── Dockerfile ├── nginx.conf ├── index.html ├── README.md ├── .env ├── setup-frontend.sh └── docker-compose.yml