https://github.com/dxtaner/e-commerce-backend-nodejs
e commerce backend
https://github.com/dxtaner/e-commerce-backend-nodejs
async-await ecommerce expressjs jsonwebtoken jwt-authentication mongoose testing validators
Last synced: 3 months ago
JSON representation
e commerce backend
- Host: GitHub
- URL: https://github.com/dxtaner/e-commerce-backend-nodejs
- Owner: dxtaner
- Created: 2024-01-22T08:18:02.000Z (about 2 years ago)
- Default Branch: main
- Last Pushed: 2024-04-23T05:29:32.000Z (almost 2 years ago)
- Last Synced: 2024-04-23T09:49:36.695Z (almost 2 years ago)
- Topics: async-await, ecommerce, expressjs, jsonwebtoken, jwt-authentication, mongoose, testing, validators
- Language: JavaScript
- Homepage:
- Size: 2.06 MB
- Stars: 0
- Watchers: 1
- Forks: 0
- Open Issues: 3
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
Express.js Application with Compression Middleware
==================================================
This is a basic Express.js application with compression middleware to improve response time. The application also includes a main router for handling API routes.
Getting Started
---------------
1. Install the necessary dependencies:
npm install
3. Start the Express server:
npm start
The server will be running on [http://localhost:3000](http://localhost:3000) by default.
Dependencies
------------
* [Express](https://expressjs.com/): Fast, unopinionated, minimalist web framework for Node.js.
* [Compression](https://www.npmjs.com/package/compression): Middleware for compressing responses.
Application Structure
---------------------
* **Main Router:** The application includes a main router (`MainRouter.js`) for handling API routes. You can find and customize the routes in this file.
* **Middleware:**
* `compression`: Used to compress responses, reducing the size of data sent to clients and improving performance.
* `express.urlencoded` and `express.json`: Middleware for parsing incoming request bodies.
* **Default Route:** The default route ("/") responds with a simple message: "Hello, My App!"
API Routes
----------
All API routes are prefixed with "/api". You can define and extend the routes in the `MainRouter.js` file.
Real-Time Product Updates with Socket.io and MongoDB
====================================================
This repository contains a Node.js application that demonstrates real-time product updates using Socket.io and MongoDB. The application uses a WebSocket connection to notify clients about changes to product data in the MongoDB database.
Prerequisites
-------------
Before running the application, make sure you have the following installed:
* Node.js
* MongoDB
* npm (Node Package Manager)
Installation
------------
1. Clone the repository:
git clone[ https://github.com/your-username/real-time-product-updates.git](https://github.com/dxtaner/e-commerce-backend-nodejs)
cd real-time-product-updates
3. Install dependencies:
npm install
5. Create a `.env` file in the root directory with the following content:
PORT=3000
MONGODB_URI=your_mongodb_connection_string
Replace `your_mongodb_connection_string` with the actual connection string for your MongoDB database.
Router Configuration
====================
This repository contains a set of routers built using Express.js for handling various endpoints of an application. Below is an overview of each router and its purpose:
Routers
-------
1. ### Auth Router
Path: `/auth`
Handles authentication-related endpoints.
2. ### User Router
Path: `/user`
Handles user-related endpoints, requiring authentication.
3. ### Product Router
Path: `/product`
Manages endpoints related to product operations, requiring authentication.
4. ### Cart Item Router
Path: `/cartitem`
Responsible for managing shopping cart items, requiring authentication.
5. ### File Router
Path: `/file`
Manages file-related endpoints, requiring authentication.
6. ### Search Router
Path: `/search`
Handles search functionalities.
Middleware
----------
* ### AuthValidator
Location: `../validators/AuthValidator.js`
Provides authentication checks for routes requiring authorization. Used as middleware for routes handling user, product, cart item, and file operations.
## Auth Router
This router handles authentication-related endpoints.
### Endpoints
1. **Login**
- Path: `/auth/login`
- Method: `POST`
- Description: Authenticates a user.
- Request Body:
- Requires validation using `UserValidator.loginValidator`.
- Should include user credentials (e.g., email and password).
- Controller: `AuthController.loginController`
2. **Register**
- Path: `/auth/register`
- Method: `POST`
- Description: Registers a new user.
- Request Body:
- Requires validation using `UserValidator.registerValidator`.
- Should include user details (e.g., username, email, password).
- Controller: `AuthController.registerController`
## User Router
This router handles user-related endpoints.
### Endpoints
1. **Get User**
- Path: `/user/:objectId`
- Method: `GET`
- Description: Retrieves a specific user by object ID.
- Request Parameters:
- `objectId`: The unique identifier of the user.
- Middleware:
- `UserValidator.getUserValidator`: Validates the request parameters.
- `UserValidator.validate`: Additional validation if needed.
- Controller: `UserController.getUser`
2. **Get All Users**
- Path: `/user`
- Method: `GET`
- Description: Retrieves all users.
- Middleware:
- `UserValidator.getAllUsersValidator`: Validates the request.
- `UserValidator.validate`: Additional validation if needed.
- Controller: `UserController.getAllUsers`
## Product Router
This router handles product-related endpoints.
### Endpoints
1. **Add Product**
- Path: `/product/`
- Method: `POST`
- Description: Adds a new product.
- Request Body:
- Requires validation using `ProductValidator.addProductValidator`.
- Should include product details.
- Controller: `ProductController.addProductController`
2. **Edit Product**
- Path: `/product/:objectId`
- Method: `PUT`
- Description: Updates an existing product.
- Request Parameters:
- `objectId`: The unique identifier of the product to be edited.
- Request Body:
- Requires validation using `ProductValidator.editProductValidator`.
- Should include updated product details.
- Controller: `ProductController.editProductController`
3. **Get All Products**
- Path: `/product/`
- Method: `GET`
- Description: Retrieves all products.
- Controller: `ProductController.getAllProductController`
4. **Get Product**
- Path: `/product/:objectId`
- Method: `GET`
- Description: Retrieves a specific product by object ID.
- Request Parameters:
- `objectId`: The unique identifier of the product.
- Middleware:
- `ProductValidator.getProductValidator`: Validates the request parameters.
- Controller: `ProductController.getProductController`
5. **Delete Product**
- Path: `/product/:objectId`
- Method: `DELETE`
- Description: Deletes a specific product by object ID.
- Request Parameters:
- `objectId`: The unique identifier of the product to be deleted.
- Middleware:
- `ProductValidator.deleteProductValidator`: Validates the request parameters.
- Controller: `ProductController.deleteProductController`
## Cart Item Router
This router handles cart item-related endpoints.
### Endpoints
1. **Add Item to Cart**
- Path: `/cartitem/`
- Method: `POST`
- Description: Adds an item to the cart.
- Request Body:
- Requires validation using `CartItemValidator.addItemToCartValidator`.
- Should include item details.
- Controller: `CartItemController.addItemToCart`
2. **Get Cart Items**
- Path: `/cartitem/`
- Method: `GET`
- Description: Retrieves items from the cart.
- Middleware:
- `CartItemValidator.getItemsValidator`: Validates the request.
- Controller: `CartItemController.getCartItems`
3. **Get All Items**
- Path: `/cartitem/all`
- Method: `GET`
- Description: Retrieves all items from the cart.
- Middleware:
- `CartItemValidator.getItemsValidator`: Validates the request.
- Controller: `CartItemController.getAllItems`
## File Router
This router handles file-related endpoints.
### Endpoints
1. **Upload File**
- Path: `/file/upload`
- Method: `POST`
- Description: Uploads a file.
- Request Body:
- Requires a single file upload using `multipart/form-data` format.
- Controller: `FileController.uploadFile`
2. **Get File**
- Path: `/file/:filename`
- Method: `GET`
- Description: Retrieves a specific file by filename.
- Request Parameters:
- `filename`: The name of the file to be retrieved.
- Controller: `FileController.getFile`
3. **Get All Files**
- Path: `/file/`
- Method: `GET`
- Description: Retrieves metadata for all files.
- Controller: `FileController.getAllFiles`
## Search Router
This router handles search-related endpoints.
### Endpoints
1. **Search**
- Path: `/search/`
- Method: `GET`
- Description: Performs a search operation.
- Controller: `SearchController.searchController`
Usage
-----
1. Clone the repository.
2. Install dependencies using `npm install`.
3. Start the server using `npm start`.
4. Access various endpoints using the provided paths and ensure authentication where necessary.
Authentication
--------------
Authentication is required for routes handling sensitive operations such as user management, product management, cart operations, and file handling. The `AuthValidator` middleware ensures that only authenticated users can access these routes.
Usage
-----
1. Start the MongoDB server.
2. Run the application:
npm start
4. The server will be started at the specified port (default is 3000). Open your browser and navigate to [http://localhost:3000](http://localhost:3000) to access the application.
WebSocket Connection
--------------------
The application uses Socket.io to establish a WebSocket connection between the server and clients. When a client connects to the server, it joins a room specified by the product ID.
// Example: Joining a room based on the product ID
socketio.on("connection", (socket) => {
socket.join(socket.handshake.query.productId);
});
Real-Time Product Updates
-------------------------
The application listens for changes in the MongoDB database using change streams. When a product is updated in the database, the server emits a `product-update` event to the corresponding room, notifying clients about the change.
// Example: Broadcasting product updates to clients in the room
dbStream.on("change", (change) => {
if (change.operationType === "update") {
socketio.in(change.documentKey._id).emit("product-update", {
_id: change.documentKey._id,
...change.updateDescription.updatedFields,
});
}
});
Clients can then listen for the `product-update` event and update their UI accordingly.
Contributing
------------
Feel free to contribute to the project by opening issues or submitting pull requests.
License
-------
This project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details.