Welcome to Fusion Electronics, a MERN-Stack E-commerce Application! This project is a working demo of a full-stack web application that was built using the MERN stack (MongoDB, Express.js, React.js, Node.js). Additionally, it also includes features such as user authentication, checkout process, product recommendations with vector search, and more! It aims to provide a comprehensive example of building a modern e-commerce platform, covering frontend user interface, backend server logic, database management, and integration with third-party libraries.
- Introduction
- Live Deployment
- User Interface
- Features
- Technologies Used
- Getting Started
- Project Structure
- Running the Application
- Product Recommendations with Vector Database
- Testing the APIs
- Unit & Integration Testing
- Swagger API Documentation
- OpenAPI Specification
- Deployment
- Containerization
- GitHub Actions & CI/CD
- Contributing
- License
- Creator
This project is a demonstration of building an e-commerce application using the MERN stack, which consists of MongoDB (database), Express.js (server), React.js (frontend), and Node.js (runtime environment). The application allows users to browse products, add them to a shopping cart, proceed to checkout, and simulate the order processing. It includes comprehensive validations for user inputs and simulates the checkout process on the backend.
The application is designed to be user-friendly and responsive, providing a seamless shopping experience. It also includes features such as product search, user authentication, and order confirmation. Additionally, it uses Weaviate for product recommendations based on vector search, enhancing the user experience by suggesting relevant products.
The application is deployed live on Vercel. You can access it at the following URL: Fusion Electronics App.
The primary backend server is deployed on Vercel and can be accessed at the following URL: Fusion Electronics API.
The backup backend server is deployed on Render and can be accessed at the following URL: Fusion Electronics API.
Important
Note: The backend server may take a few seconds to wake up if it has been inactive for a while. For your information, it is hosted on the free tier of Render, with 0.1 CPU and 512 MB of memory only, so it may take a bit longer to respond to requests, especially after periods of inactivity.
-
Product Management:
- View a list of products.
- View detailed product information.
- Add products to the shopping cart.
-
Shopping Cart:
- View items in the shopping cart.
- Remove items from the cart.
- Calculate total amount of items in the cart.
-
Checkout Process:
- Enter billing, shipping, and payment information.
- Simulate the order creation process on the backend.
- Receive confirmation of order success.
-
Frontend:
- React.js
- Material-UI for styling
- Axios for API requests
react-credit-cards-2
for credit card visualizationreact-router-dom
for routingreact-hook-form
for form validationreact-toastify
for toast notifications- Jest and React Testing Library for testing
-
Backend:
- Node.js
- Express.js
- MongoDB (with Mongoose ODM)
- Axios for external API requests
- JsonWebToken for user authentication
- Bcrypt for password hashing
- Dotenv for environment variables
- Cors for cross-origin resource sharing
- Swagger for API documentation
- Nodemon for server hot-reloading
- Middleware: JWT for securing API endpoints
- Weaviate for product recommendations with vector database
- FAISS & LangChain for efficient similarity search
- Jest for unit and integration testing
-
Development Tools:
- Jetbrains WebStorm (IDE)
- Postman (for API testing)
- Git (version control)
- npm (package manager)
- Docker (for containerization)
The project is organized into two main "stacks": The backend is in the backend
directory that hosts all product & order data and the frontend is in the root
directory. Here is an overview of the project structure:
fullstack-ecommerce/
βββ backend/ # Node.js server files
β βββ config/ # Configuration files
β β βββ db.js # Database connection
β βββ docs/
β β βββ swagger.js # Swagger API documentation setup
β βββ models/ # Mongoose models
β β βββ user.js # User schema
β β βββ product.js # Product schema
β βββ routes/ # Route handlers
β β βββ products.js # Product routes
β β βββ search.js # Search routes
β β βββ checkout.js # Checkout routes
β βββ middleware/ # Middleware functions
β β βββ auth.js # Authentication middleware
β βββ scripts/ # Scripts for various tasks
β β βββ build-faiss-index.js # Script to build FAISS index
β β βββ search-faiss-index.js # Script to search FAISS index
β β βββ query-weaviate.js # Script to query Weaviate
β β βββ weaviate-upsert.js # Script to upsert products to Weaviate
β β βββ sync-weaviate.js # Script to synchronize products with Weaviate
β βββ seed/ # Database seed data
β β βββ productSeeds.js # Product seed data
β βββ weaviateClient.js # Weaviate client setup
β βββ faiss.sh # FAISS index setup script
β βββ .env # Environment variables
β βββ index.js # Server entry point
βββ public/ # Frontend public assets
β βββ index.html # HTML template
β βββ manifest.json # Web app manifest
β βββ favicon.ico # Favicon
βββ src/ # React.js frontend files
β βββ components/ # Reusable components
β β βββ CheckoutForm.jsx # Checkout form component
β β βββ ProductCard.jsx # Product card component
β β βββ NavigationBar.jsx # Navigation bar component
β β βββ OrderConfirmation.jsx # Order confirmation component
β β βββ ProductListing.jsx # Product listing component
β β βββ SearchResults.jsx # Search results component
β β βββ ShoppingCart.jsx # Shopping cart component
β βββ dev/ # Development utilities
β β βββ index.js # Development entry point
β β βββ palette.jsx # Color palette
β β βββ preview.jsx # Component preview
β β βββ useInitials.js # Initials hook
β βββ pages/ # Page components
β β βββ Cart.jsx # Cart page component
β β βββ Checkout.jsx # Checkout page component
β β βββ Home.jsx # Home page component
β β βββ ProductDetails.jsx # Product details page component
β β βββ OrderSuccess.jsx # Order success page component
β β βββ ProductDetails.jsx # Product details page component
β β βββ Shop.jsx # Shop page component
β βββ App.jsx # Main application component
β βββ App.css # Main application styles
β βββ index.js # React entry point
βββ build/ # Frontend production build files
βββ tests/ # Test files
βββ .gitignore # Git ignore file
βββ package.json # NPM package file
βββ jsconfig.json # JS config file
βββ setupProxy.js # Proxy configuration
(... and more files not listed here ...)
Before running this project, ensure you have the following installed:
- Node.js (with npm)
- MongoDB (with either local or remote instance)
- Git
-
Clone the repository:
git clone https://github.com/hoangsonww/MERN-Stack-Ecommerce-App.git cd MERN-Stack-Ecommerce-App # Fix the path if necessary
-
Install project dependencies:
# Install server (backend) dependencies cd backend npm install # Note: If you encounter any issues with the backend/package-lock.json not updating, run the following command from root directory: npm install --no-workspaces --prefix backend # Install client (frontend) dependencies cd .. npm install
-
Set up the backend:
-
Create a
.env
file in thebackend/
directory and add the following environment variable (replace the URI with your MongoDB connection string):MONGO_URI=mongodb://localhost:27017/Ecommerce-Products JWT_SECRET=your_secret_key
For your information, I am using MongoDB Atlas for this project. You can create a free account and get your connection string from there if you want to deploy the application to the cloud.
-
Ensure that your MongoDB server is running. If you're using Mac, you can start the MongoDB server with the following command:
brew services start mongodb-community
-
Seed the database with sample data:
cd backend/seed node productSeeds.js dev
-
Run the backend server: (first
cd
into the backend directory)cd .. npm start
-
-
Set up the frontend:
- First,
cd
into theroot
directory if you are not already there:Orcd ..
cd fullstack-ecommerce
- Start the frontend development server:
npm start
- First,
Tip
The frontend server will run on http://localhost:3000
by default. If you encounter any errors when starting related to the react-credit-cards-2
package, it is OK to just ignore them as the application will still run correctly.
- Open your browser and navigate to
http://localhost:3000
to view the application.
The application uses Weaviate & FAISS as vector databases/stores to provide product recommendations based on vector search. The product data is indexed in Weaviate, allowing for efficient similarity searches and recommendations.
To set up Weaviate for product recommendations, follow these steps:
- Sign up for a Weaviate account at Weaviate Cloud.
- Create a new Weaviate instance and note the API endpoint.
- Get your Weaviate API key from the Weaviate console.
- Update the
.env
file in thebackend/
directory with your Weaviate API endpoint and API key:WEAVIATE_HOST=https://your-weaviate-instance.weaviate.network WEAVIATE_API_KEY=your_weaviate_api_key
- Run the Weaviate client script to index the product data:
cd backend npm run weaviate-upsert
- Synchronize the product data with Weaviate by running the following command:
npm run sync-weaviate
- Start or restart the backend server to apply the changes:
npm start
Additionally, to set up FAISS & LangChain for efficient similarity search, you can run the following commands in the backend/scripts/
directory:
-
Build the FAISS index:
cd backend node build-faiss-index.js
-
Search efficiently with LangChain:
npm run faiss-search -- "your search text" 5
Replace "your search text"
with the text you want to search for, and 5
with the number of results you want to retrieve. It should return something like:
π Top 5 results for "your search text 5":
1. id=6874a44ee237afdff3374d27 distance=1.2893
2. id=6874a44ee237afdff3374d25 distance=1.3328
3. id=6874a44ee237afdff3374d23 distance=1.3522
4. id=6874a44ee237afdff3374d2e distance=1.3739
5. id=6874a44ee237afdff3374d28 distance=1.3753
Now, the application will use Weaviate & FAISS & LangChain to provide product recommendations based on vector search. When users view a product, they will see recommended products based on similarity to the viewed product. Try going to the product details page of any product, and you will see a list of recommended products based on the current product!
- Simply open your browser and navigate to
http://localhost:5000/api/products
to view the list of products. - You can also change the sample data by navigating to
backend/seed/productSeeds.js
and modifying the data there.
We have implemented unit and integration tests for the application using Jest and React Testing Library. To run the tests, follow these steps:
cd backend
# Run backend tests (default mode)
npm run test
# Run frontend tests (watch mode - this will automatically re-run tests on file changes)
npm run test:watch
# Run frontend tests (coverage mode - this will generate a coverage report)
npm run test:coverage
cd .. # if you are still in the backend directory
# Run frontend tests (default mode)
npm run test
# Run frontend tests (watch mode - this will automatically re-run tests on file changes)
npm run test:watch
# Run frontend tests (coverage mode - this will generate a coverage report)
npm run test:coverage
Note
If you encounter any issues when running the tests, ensure that you have run npm install
in both the backend
and root
(frontend) directories to install all necessary dependencies.
Also, if the issue persists, try removing the node_modules
directory and the package-lock.json
file in both directories, and then run npm install
again to reinstall all dependencies.
- The backend server includes Swagger API documentation that can be accessed at
http://localhost:5000/api-docs
. - Before accessing the above URL, ensure that the backend server is running.
- The Swagger UI provides a detailed overview of the API endpoints, request/response schemas, and example requests.
- If you have everything set up correctly, you should see the Swagger UI documentation page:
- View the API Documentation
- Open Swagger Editor.
- Upload the
openapi.yaml
file or paste its content. - Visualize and interact with the API documentation.
- Test the API
- Import
openapi.yaml
into Postman:- Open Postman β Import β Select
openapi.yaml
. - Test the API endpoints directly from Postman.
- Open Postman β Import β Select
- Or use Swagger UI:
- Provide the file URL or upload it to view and test endpoints.
- Generate Client Libraries
- Install OpenAPI Generator:
npm install @openapitools/openapi-generator-cli -g
- Generate a client library:
openapi-generator-cli generate -i openapi.yaml -g <language> -o ./client
- Replace
<language>
with the desired programming language.
- Generate Server Stubs
- Generate a server stub:
openapi-generator-cli generate -i openapi.yaml -g <framework> -o ./server
- Replace
<framework>
with the desired framework.
- Run a Mock Server
- Install Prism:
npm install -g @stoplight/prism-cli
- Start the mock server:
prism mock openapi.yaml
- Validate the OpenAPI File
- Use Swagger Validator:
- Upload
openapi.yaml
or paste its content to check for errors.
- Upload
This guide enables you to view, test, and utilize the API. You can generate client libraries, server stubs, and run a mock server using the OpenAPI Specification.
To deploy the application:
- Configure deployment settings for both frontend (React) and backend (Node.js) according to your chosen hosting provider (e.g., AWS, Heroku, Netlify).
This project can be containerized using Docker. First, ensure that Docker Desktop is running on your system. Then, to create a Docker image, run the following command:
docker compose up --build
This command will create a Docker image for the frontend and backend, and run the application in a containerized environment.
This project includes a GitHub Actions workflow for continuous integration and deployment. The workflow is defined in the .github/workflows/ci.yml
file and will automatically run tests and build the application on every push or pull request.
Contributions to this project are welcome! Here are some ways you can contribute:
- Report bugs and request features by opening issues.
- Implement new features or enhancements and submit pull requests.
- Improve documentation and README files.
This project is licensed under the MIT License - see the LICENSE file for details.
Fusion Electronics was created with β€οΈ by:
- Son Nguyen - hoangsonww
- Email: [email protected].
Thank you for exploring Fusion Electronics - a MERN Stack E-commerce Application! If you have any questions or feedback, feel free to reach out or open an issue.
Happy coding! π