## E-COMMERCE API DOCUMENTATION

**_INSTALLATION COMMAND:_**

`npm install bcrypt cors dotenv express faker jsonwebtoken mongoose nodemon`

**_Start_**
npm start

**_TEST ACCOUNTS:_**

-   Regular User:
    -   email: user@email.com
    -   pwd: user
-   Admin User:
    -   email: admin@email.com
    -   pwd: admin

**_ROUTES:_**

-   User registration (POST)
    -   http://localhost:3000/user/register
        -   auth header required: NO
        -   request body:
        {
        "email": "admin@email.com",
        "password": "admin"
        }

-   User authentication (POST)
    -   http://localhost:3000/user/login
        -   auth header required: NO
        -   request body:
        {
        "email": "admin@email.com",
        "password": "admin"
        }

-   Create Product (Admin only) (POST)
    -   http://localhost:4000/product/create
        -   auth header required: YES
        -   request body:
            {
            "name": "Poring Card",
            "description": "Description unknown",
            "price": 500
            }
            
-   Update Profile
    -   http://localhost:3000/user/update
        -   auth header required: YES
        -   request body:
            {
            "userId": "",
            "newEmail": "",
            "newFirstname": "",
            "newLastName": "",
            "newPassword": ""
            }
      
-   Retrieve all products (Admin only) (GET)
    -   http://localhost:3000/product/all
        -   auth header required: YES
        -   request body: none

-   Retrieve all active products (GET)
    -   http://localhost:3000/product/active
        -   auth header required: NO
        -   request body: none

-   Get all products (GET)
    -   http://localhost:3000/product/active
        -   auth header required: NO
        -   request body: none

-   Get a product (GET)
    -   http://localhost:3000/product/products/65545a1e6fa9d841e1518d1d
        -   auth header required: YES
        -   request body: none  

-   Update Single product (PUT)
    -   http://localhost:3000/product/products/65545a1e6fa9d841e1518d1d
        -   auth header required: YES
        -   request body:
        {
        "name": "Christmas Cookie Card",
        "description": "Updated Product Description",
        "price": 29.99,
        "isActive": false
        }

-   Create Order (POST)
    -   http://localhost:3000/user/order
        -   auth header required: YES
        -   request body:
        {
        "userId": "65535cb526b586a3e2fd56cc", // Replace with a valid user ID from your database
        "products": [
          {
            "productId": "6553a4e897ac8ac9462f96c4", // Replace with a valid product ID from your database
            "productName": "Mastering Card",
            "quantity": 1
          }
        ],
        "totalAmount": 500
        }


-   Activate / Archive Product (PUT)
    -   auth header required: YES
    -   request body: none         
    -   http://localhost:3000/product/products/6554634e5cac4bcd6f2394ed/activate
    -   http://localhost:3000/product/products/6554634e5cac4bcd6f2394ed/archive 
        
-   Set User to Admin (POST) [Admin Only]
        -   hhttp://localhost:3000/user/set-admin/
        -   auth header required: YES 
        -   request body:
        {
          "userId":
        }

-   Retrieve All Orders [Admin Only] (GET)
    -   http://localhost:3000/user/orders-all
      -   auth header required: YES 
      -   request body: none

-   Add To Cart (POST)
    -   http://localhost:3000/cart/add-to-cart
      -   auth header required: YES 
      -   request body: 
        {
          "userId": "655396dcc8ea29f42422e214",
          "productId": "6553a54566c4c86c39034b55",
          "quantity": 5
        }

-   Delete Item (DELETE)
    -   http://localhost:3000/cart/remove-from-cart
      -   auth header required: YES 
      -   request body: 
        {
          "userId": "655396dcc8ea29f42422e214",
          "productId": "6553a54566c4c86c39034b55",
          "quantity": 5
        }

-   Update Quantity (PUT)
    -   http://localhost:3000/cart//update-quantity
      -   auth header required: YES 
      -   request body: 
        {
        "userId": "655396dcc8ea29f42422e214",
        "productId": "6553a55666c4c86c39034b59",
        "quantity": 2000
        }

-   Cart Total (GET)
    -   http://localhost:3000/cart/cart-details
      -   auth header required: YES 
      -   request body: 
        {
        "userId": "655396dcc8ea29f42422e214"
        }   
    
\***\* Stretch Goals \*\***

-   Set user as Admin ( Admin Only )
-   Retrieve Authenticated User's Orders
-   Retrieve all orders ( Admin Only )
-   Add to Cart ( Added Products, Change Product Quantities, Remove Products From Cart, Subtotal for each item, Total price for all items)
-   Authentication Token with expiration (1hr)
-   dotenv
-   faker (Auto Generate Names)
-   getUserDetails function ( Detects if the user tries to get the details of the other useId's + Token auth)
-   Middleware Secure verification that match Token and UserId to next()
