252 lines
3.5 KiB
Markdown
252 lines
3.5 KiB
Markdown
|
# Ecomm Backend
|
||
|
|
||
|
This repository contains the backend implementation for the Ecomm e-commerce application.
|
||
|
|
||
|
## Description
|
||
|
|
||
|
This is a simple e-commerce backend application built with Node.js, TypeScript, Express.js, MongoDB, and Docker. It provides API endpoints to manage users, products and cart of user.
|
||
|
|
||
|
## My Approach
|
||
|
|
||
|
Creating a simple Express.js application with TypeScript.
|
||
|
added the required dependencies and dev dependencies.
|
||
|
added best ORM to connect with MongoDB and Node.js.
|
||
|
created the required models and controllers for the application.
|
||
|
added the required routes for the application.
|
||
|
added the required environment variables for the application.
|
||
|
added the required middleware for the application.
|
||
|
added the required error handling for the application.
|
||
|
|
||
|
|
||
|
## Table of Contents
|
||
|
|
||
|
- [Technologies Used]
|
||
|
- [How to Run]
|
||
|
- [API Documentation]
|
||
|
- [Users]
|
||
|
- [Create a New User]
|
||
|
- [Login]
|
||
|
- [Products]
|
||
|
- [Get All Products]
|
||
|
|
||
|
## Technologies Used
|
||
|
|
||
|
- Node.js
|
||
|
- TypeScript
|
||
|
- Express.js
|
||
|
- MongoDB
|
||
|
- Mongoose ORM
|
||
|
- Docker (docker-compose)
|
||
|
- bcrypt
|
||
|
- JWT
|
||
|
- deep-email-validator
|
||
|
|
||
|
## How to Run
|
||
|
|
||
|
To run the Ecomm backend application, follow these steps:
|
||
|
|
||
|
1. Clone the repository.
|
||
|
2. Ensure that you have Docker and Docker Compose installed.
|
||
|
3. Implement the required environment variables by creating an `.env` file.
|
||
|
4. Run the following command in the root directory:
|
||
|
```
|
||
|
docker-compose up
|
||
|
```
|
||
|
The application will be running on port 3000, and the database will be running on port 27017.
|
||
|
|
||
|
API Documentation
|
||
|
# Users
|
||
|
Create a New User - POST /users
|
||
|
Creates a new user.
|
||
|
|
||
|
Request Body
|
||
|
|
||
|
```
|
||
|
{
|
||
|
"name": "string",
|
||
|
"email": "string",
|
||
|
"password": "string"
|
||
|
}
|
||
|
```
|
||
|
Response Body
|
||
|
status code 200
|
||
|
```
|
||
|
{
|
||
|
message:
|
||
|
"User created successfully"
|
||
|
}
|
||
|
```
|
||
|
status code 400
|
||
|
```
|
||
|
{
|
||
|
message:
|
||
|
"User already exists"
|
||
|
}
|
||
|
```
|
||
|
status code 500
|
||
|
```
|
||
|
{
|
||
|
message:
|
||
|
"Internal server error"
|
||
|
}
|
||
|
```
|
||
|
Login - POST /users/login
|
||
|
Logs in a user.
|
||
|
|
||
|
Request Body
|
||
|
```
|
||
|
{
|
||
|
"email": "string",
|
||
|
"password": "string"
|
||
|
}
|
||
|
```
|
||
|
Response Body
|
||
|
status code 200
|
||
|
```
|
||
|
{
|
||
|
access-token:
|
||
|
"TOKEN"
|
||
|
}
|
||
|
```
|
||
|
|
||
|
# Products
|
||
|
Get All Products - GET /products
|
||
|
Gets all products.
|
||
|
|
||
|
Parameters
|
||
|
```
|
||
|
page: number(default: 0)
|
||
|
limit: number(default: 50)
|
||
|
```
|
||
|
Response Body
|
||
|
status code 200
|
||
|
```
|
||
|
{
|
||
|
products: [
|
||
|
{
|
||
|
_id: "string",
|
||
|
name: "string",
|
||
|
description: "string",
|
||
|
price: number,
|
||
|
image: "string",
|
||
|
createdAt: "string",
|
||
|
updatedAt: "string"
|
||
|
}
|
||
|
]
|
||
|
}
|
||
|
```
|
||
|
status code 404
|
||
|
```
|
||
|
{
|
||
|
message:
|
||
|
"Product not found."
|
||
|
}
|
||
|
````
|
||
|
|
||
|
# Cart
|
||
|
|
||
|
Add Product to Cart - POST /cart
|
||
|
Adds a product to cart.
|
||
|
(authentication required)
|
||
|
|
||
|
Request Body
|
||
|
```
|
||
|
{
|
||
|
"productId": "string"
|
||
|
}
|
||
|
```
|
||
|
Response Body
|
||
|
status code 200
|
||
|
```
|
||
|
{
|
||
|
Cart :{
|
||
|
"{ProductId}": Quantity
|
||
|
}
|
||
|
}
|
||
|
```
|
||
|
status code 500
|
||
|
```
|
||
|
{
|
||
|
message:
|
||
|
"An error occurred while adding the product to the cart."
|
||
|
}
|
||
|
```
|
||
|
|
||
|
List Cart Items - GET /cart
|
||
|
Lists all cart items.
|
||
|
(authentication required)
|
||
|
|
||
|
Response Body
|
||
|
status code 200
|
||
|
```
|
||
|
{
|
||
|
Cart :{
|
||
|
"{ProductId}": Quantity
|
||
|
}
|
||
|
}
|
||
|
```
|
||
|
status 404
|
||
|
```
|
||
|
{
|
||
|
message:
|
||
|
"Cart not found."
|
||
|
}
|
||
|
```
|
||
|
status code 500
|
||
|
```
|
||
|
{
|
||
|
message:
|
||
|
"An error occurred while listing the cart."
|
||
|
}
|
||
|
```
|
||
|
|
||
|
checkout - POST /cart/checkout
|
||
|
checkout the cart.
|
||
|
(authentication required)
|
||
|
|
||
|
status 200
|
||
|
```
|
||
|
{
|
||
|
order: {
|
||
|
{productId}: quantity
|
||
|
}
|
||
|
}
|
||
|
```
|
||
|
|
||
|
status 404
|
||
|
```
|
||
|
{
|
||
|
message:
|
||
|
"Cart not found."
|
||
|
}
|
||
|
```
|
||
|
|
||
|
# Database Schema
|
||
|
## User
|
||
|
```
|
||
|
{
|
||
|
name: string,
|
||
|
email: string,
|
||
|
password: string,
|
||
|
cart: {
|
||
|
productId: number
|
||
|
}
|
||
|
}
|
||
|
```
|
||
|
## Product
|
||
|
```
|
||
|
{
|
||
|
name: string,
|
||
|
description: string,
|
||
|
price: number
|
||
|
userId: string
|
||
|
}
|
||
|
```
|
||
|
## Cart
|
||
|
```
|
||
|
{
|
||
|
userId: string,
|
||
|
products: Map<string, number>
|
||
|
}
|
||
|
```
|