S52 Capstone 2 Added

master
Ron Reciproco 1 year ago
parent 46a2e16bef
commit ee9419584f

@ -163,17 +163,29 @@ exports.getUserDetails = async (req, res) => {
return res.status(404).json({ message: "User not found" }); return res.status(404).json({ message: "User not found" });
} }
// Create a new object with only the desired properties (excluding password)
const userWithoutPassword = {
_id: user._id,
username: user.username,
email: user.email,
firstName: user.firstName,
lastName: user.lastName,
orderedProducts: user.orderedProducts,
// Add other properties you want to include in the response
};
// Return the user details in the response // Return the user details in the response
res.status(200).json({ res.status(200).json({
user, user: userWithoutPassword,
}); });
} catch (error) { } catch (error) {
console.error(error); console.error(error);
res.status(500).json({ message: "Internal server error" }); res.status(500).json({ message: false });
} }
}; };
exports.setAdmin = async (req, res) => { exports.setAdmin = async (req, res) => {
try { try {
const { userId } = req.body // assuming userId is sent in the request body const { userId } = req.body // assuming userId is sent in the request body
@ -194,11 +206,3 @@ exports.setAdmin = async (req, res) => {
} }
} }
exports.getAllOrders = async (req, res) => {
try {
const orders = await User.find({}, "orderedProducts");
res.status(200).json({ success: true, data: orders });
} catch (error) {
res.status(500).json({ success: false, error: error.message });
}
};

@ -39,8 +39,18 @@
"response": [] "response": []
}, },
{ {
"name": "User Authenticate", "name": "User Authenticate/Login",
"request": { "request": {
"auth": {
"type": "bearer",
"bearer": [
{
"key": "token",
"value": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiI2NTU0NGQ5YmU1YzAxZjZjMGNhNzkyMDAiLCJlbWFpbCI6IndhcGF0dUBlbWFpbC5jb20iLCJpc0FkbWluIjpmYWxzZSwiaWF0IjoxNzAwMjE0NTcwLCJleHAiOjE3MDAyMTgxNzB9.IMrvxc4l2A5cwMATP3FuCIiZUmaS-eewpqLz5CORQQA",
"type": "string"
}
]
},
"method": "POST", "method": "POST",
"header": [], "header": [],
"body": { "body": {
@ -78,7 +88,7 @@
"bearer": [ "bearer": [
{ {
"key": "token", "key": "token",
"value": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiI2NTUzNjU0NDk4YzFiYmRhMzNmODJiZjAiLCJlbWFpbCI6ImRpdmluZUBleGFtcGxlLmNvbSIsImlhdCI6MTY5OTk3NTczNSwiZXhwIjoxNjk5OTc5MzM1fQ.oWOhcmPp_5-c4vcSncTdfZWpTCybBQejZaLy3RiNV-E", "value": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiI2NTU0NGQ5YmU1YzAxZjZjMGNhNzkyMDAiLCJlbWFpbCI6IndhcGF0dUBlbWFpbC5jb20iLCJpc0FkbWluIjpmYWxzZSwiaWF0IjoxNzAwMjE0NTcwLCJleHAiOjE3MDAyMTgxNzB9.IMrvxc4l2A5cwMATP3FuCIiZUmaS-eewpqLz5CORQQA",
"type": "string" "type": "string"
} }
] ]
@ -87,7 +97,7 @@
"header": [], "header": [],
"body": { "body": {
"mode": "raw", "mode": "raw",
"raw": "{\r\n \"userId\": \"6553654498c1bbda33f82bf0\",\r\n \"newEmail\": \"divine@example.com\",\r\n \"newFirstname\": \"Ron\",\r\n \"newLastName\": \"Pogi\",\r\n \"newPassword\": \"crypto123\"\r\n}\r\n", "raw": "{\r\n \"userId\": \"65544d9be5c01f6c0ca79200\",\r\n \"newEmail\": \"user@email.com\",\r\n \"newFirstname\": \"Ron\",\r\n \"newLastName\": \"Pogi\",\r\n \"newPassword\": \"user\"\r\n}\r\n",
"options": { "options": {
"raw": { "raw": {
"language": "json" "language": "json"
@ -110,39 +120,19 @@
"response": [] "response": []
}, },
{ {
"name": "Product Get All", "name": "Retrieve Active Products",
"request": {
"method": "GET",
"header": [],
"url": {
"raw": "http://localhost:3000/user/all",
"protocol": "http",
"host": [
"localhost"
],
"port": "3000",
"path": [
"user",
"all"
]
}
},
"response": []
},
{
"name": "Product Get All [Active]",
"request": { "request": {
"method": "GET", "method": "GET",
"header": [], "header": [],
"url": { "url": {
"raw": "http://localhost:3000/user/active", "raw": "http://localhost:3000/product/active",
"protocol": "http", "protocol": "http",
"host": [ "host": [
"localhost" "localhost"
], ],
"port": "3000", "port": "3000",
"path": [ "path": [
"user", "product",
"active" "active"
] ]
} }
@ -150,19 +140,19 @@
"response": [] "response": []
}, },
{ {
"name": "Get a Single Product", "name": "Retrieve Single Product",
"request": { "request": {
"method": "GET", "method": "GET",
"header": [], "header": [],
"url": { "url": {
"raw": "http://localhost:3000/user/products/65545619b88d0a48f00ae778", "raw": "http://localhost:3000/product/products/65545619b88d0a48f00ae778",
"protocol": "http", "protocol": "http",
"host": [ "host": [
"localhost" "localhost"
], ],
"port": "3000", "port": "3000",
"path": [ "path": [
"user", "product",
"products", "products",
"65545619b88d0a48f00ae778" "65545619b88d0a48f00ae778"
] ]
@ -171,7 +161,7 @@
"response": [] "response": []
}, },
{ {
"name": "Order / User Checkout [Non-admin]", "name": "User Checkout(Create Order)",
"request": { "request": {
"method": "POST", "method": "POST",
"header": [], "header": [],
@ -210,7 +200,7 @@
"bearer": [ "bearer": [
{ {
"key": "token", "key": "token",
"value": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiI2NTU0YWM4ZGQ3ZmJmOWVlOTAyMTdlNzciLCJlbWFpbCI6Im1hc3RlckBlbWFpbC5jb20iLCJpc0FkbWluIjpmYWxzZSwiaWF0IjoxNzAwMDUwOTkzLCJleHAiOjE3MDAwNTQ1OTN9._K7A7ZmE4ApbmE1qtpPYRmiugYn7HpgsIOAW7yR0pUA", "value": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiI2NTU0NGQ5YmU1YzAxZjZjMGNhNzkyMDAiLCJlbWFpbCI6IndhcGF0dUBlbWFpbC5jb20iLCJpc0FkbWluIjpmYWxzZSwiaWF0IjoxNzAwMjE0NTcwLCJleHAiOjE3MDAyMTgxNzB9.IMrvxc4l2A5cwMATP3FuCIiZUmaS-eewpqLz5CORQQA",
"type": "string" "type": "string"
} }
] ]
@ -219,7 +209,7 @@
"header": [], "header": [],
"body": { "body": {
"mode": "raw", "mode": "raw",
"raw": "{\r\n \"userId\": \"6554ac8dd7fbf9ee90217e77\"\r\n}\r\n", "raw": "{\r\n \"userId\": \"65544d9be5c01f6c0ca79200\"\r\n}\r\n",
"options": { "options": {
"raw": { "raw": {
"language": "json" "language": "json"
@ -240,53 +230,34 @@
} }
}, },
"response": [] "response": []
}, }
]
},
{
"name": "Admin",
"item": [
{ {
"name": "Retrieve Authenticated user's orders", "name": "Retrieve All Products",
"request": { "request": {
"auth": { "method": "GET",
"type": "bearer",
"bearer": [
{
"key": "token",
"value": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiI2NTU0NGQ5YmU1YzAxZjZjMGNhNzkyMDAiLCJlbWFpbCI6IndhcGF0dUBlbWFpbC5jb20iLCJpc0FkbWluIjpmYWxzZSwiaWF0IjoxNzAwMDUwMzYzLCJleHAiOjE3MDAwNTM5NjN9.Csls5KcCnhERt_QrmcFz7vOkEvDaz8-B79AydV2DKqo",
"type": "string"
}
]
},
"method": "POST",
"header": [], "header": [],
"body": {
"mode": "raw",
"raw": "{\r\n \"userId\": \"65544d9be5c01f6c0ca79200\"\r\n}\r\n",
"options": {
"raw": {
"language": "json"
}
}
},
"url": { "url": {
"raw": "http://localhost:3000/user/getOrders", "raw": "http://localhost:3000/product/all",
"protocol": "http", "protocol": "http",
"host": [ "host": [
"localhost" "localhost"
], ],
"port": "3000", "port": "3000",
"path": [ "path": [
"user", "product",
"getOrders" "all"
] ]
} }
}, },
"response": [] "response": []
} },
]
},
{
"name": "Admin",
"item": [
{ {
"name": "Product Create[Admin]", "name": "Create Product",
"request": { "request": {
"auth": { "auth": {
"type": "bearer", "type": "bearer",
@ -310,22 +281,22 @@
} }
}, },
"url": { "url": {
"raw": "http://localhost:3000/user/products", "raw": "http://localhost:3000/product/create",
"protocol": "http", "protocol": "http",
"host": [ "host": [
"localhost" "localhost"
], ],
"port": "3000", "port": "3000",
"path": [ "path": [
"user", "product",
"products" "create"
] ]
} }
}, },
"response": [] "response": []
}, },
{ {
"name": "Update a product[Admin]", "name": "Update Product",
"request": { "request": {
"auth": { "auth": {
"type": "bearer", "type": "bearer",
@ -349,14 +320,14 @@
} }
}, },
"url": { "url": {
"raw": "http://localhost:3000/user/products/65545a1e6fa9d841e1518d1d", "raw": "http://localhost:3000/product/products/65545a1e6fa9d841e1518d1d",
"protocol": "http", "protocol": "http",
"host": [ "host": [
"localhost" "localhost"
], ],
"port": "3000", "port": "3000",
"path": [ "path": [
"user", "product",
"products", "products",
"65545a1e6fa9d841e1518d1d" "65545a1e6fa9d841e1518d1d"
] ]
@ -365,7 +336,7 @@
"response": [] "response": []
}, },
{ {
"name": "Activate Product[Admin]", "name": "Activate Product",
"request": { "request": {
"auth": { "auth": {
"type": "bearer", "type": "bearer",
@ -380,14 +351,14 @@
"method": "PUT", "method": "PUT",
"header": [], "header": [],
"url": { "url": {
"raw": "http://localhost:3000/user/products/6554634e5cac4bcd6f2394ed/activate", "raw": "http://localhost:3000/product/products/6554634e5cac4bcd6f2394ed/activate",
"protocol": "http", "protocol": "http",
"host": [ "host": [
"localhost" "localhost"
], ],
"port": "3000", "port": "3000",
"path": [ "path": [
"user", "product",
"products", "products",
"6554634e5cac4bcd6f2394ed", "6554634e5cac4bcd6f2394ed",
"activate" "activate"
@ -397,19 +368,19 @@
"response": [] "response": []
}, },
{ {
"name": "Archive Product[Admin]", "name": "Archive/Draft Product",
"request": { "request": {
"method": "PUT", "method": "PUT",
"header": [], "header": [],
"url": { "url": {
"raw": "http://localhost:3000/user/products/6554634e5cac4bcd6f2394ed/archive", "raw": "http://localhost:3000/product/products/6554634e5cac4bcd6f2394ed/archive",
"protocol": "http", "protocol": "http",
"host": [ "host": [
"localhost" "localhost"
], ],
"port": "3000", "port": "3000",
"path": [ "path": [
"user", "product",
"products", "products",
"6554634e5cac4bcd6f2394ed", "6554634e5cac4bcd6f2394ed",
"archive" "archive"
@ -440,8 +411,18 @@
"response": [] "response": []
}, },
{ {
"name": "Retrieve all Orders[Admin]", "name": "Retrieve All Orders",
"request": { "request": {
"auth": {
"type": "bearer",
"bearer": [
{
"key": "token",
"value": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiI2NTU0YWM4ZGQ3ZmJmOWVlOTAyMTdlNzciLCJlbWFpbCI6Im1hc3RlckBlbWFpbC5jb20iLCJpc0FkbWluIjpmYWxzZSwiaWF0IjoxNzAwMjEyNjkzLCJleHAiOjE3MDAyMTYyOTN9.J908JWFjN5dKRw0-XJPHa4kD6QAW4M7tv1LOVmbtM_E",
"type": "string"
}
]
},
"method": "GET", "method": "GET",
"header": [], "header": [],
"url": { "url": {

@ -31,7 +31,8 @@ mongoose
}) })
// Routes // Routes
app.use("/user", userRoute, productRoute) app.use("/user", userRoute)
app.use("/product", productRoute)
app.use("/cart", cartRoute) app.use("/cart", cartRoute)
// Server up // Server up

@ -1,140 +1,176 @@
> Run: npm start ## E-COMMERCE API DOCUMENTATION
**** Stretch Goals **** **_INSTALLATION COMMAND:_**
+ Set user as Admin ( Admin Only )
+ Retrieve Authenticated User's Orders `npm install bcrypt cors dotenv express faker jsonwebtoken mongoose nodemon`
+ 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) **_Start_**
+ Authentication Token with expiration (1hr) npm start
+ dotenv
+ faker (Auto Generate Names) **_TEST ACCOUNTS:_**
+ 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() - Regular User:
- email: user@email.com
**** Accounts **** - pwd: user
- Admin User:
User: ( Password: wapatu ) - email: admin@email.com
{ - pwd: admin
"userId": "65544d9be5c01f6c0ca79200",
"email": "wapatu@example.com", **_ROUTES:_**
"firstName": "Estevan",
"lastName": "Cummings", - User registration (POST)
"isAdmin": false, - http://localhost:3000/user/register
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiI2NTU0NGQ5YmU1YzAxZjZjMGNhNzkyMDAiLCJlbWFpbCI6IndhcGF0dUBleGFtcGxlLmNvbSIsImlzQWRtaW4iOmZhbHNlLCJpYXQiOjE3MDAwMjM3MjQsImV4cCI6MTcwMDAyNzMyNH0.dpWV9Zx64TH4RLgmV_RlyrMBCa0HwDe9wJRAkwAyjys" - auth header required: NO
} - request body:
{
Admin: (Password is: admin ) "email": "admin@email.com",
{ "password": "admin"
"userId": "65535cb526b586a3e2fd56cc", }
"email": "admin@email.com",
"isAdmin": true, - User authentication (POST)
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiI2NTUzNWNiNTI2YjU4NmEzZTJmZDU2Y2MiLCJlbWFpbCI6ImFkbWluQGVtYWlsLmNvbSIsImlzQWRtaW4iOnRydWUsImlhdCI6MTcwMDAyMzgxMSwiZXhwIjoxNzAwMDI3NDExfQ.DrhpNlBJKpfHod7MfTalQ5j2-s8tnR630yh2-_EIYWw" - http://localhost:3000/user/login
} - auth header required: NO
- request body:
**** Links **** {
"email": "admin@email.com",
REGISTER "password": "admin"
http://localhost:3000/user/register }
--> Use post
{ - Create Product (Admin only) (POST)
"email": "admin@email.com", - http://localhost:4000/product/create
"password": "admin" - auth header required: YES
} - request body:
{
LOGIN "name": "Poring Card",
http://localhost:3000/user/login "description": "Description unknown",
--> Use post "price": 500
{ }
"email": "admin@email.com",
"password": "admin" - Update Profile
} - http://localhost:3000/user/update
- auth header required: YES
UPDATE PROFILE - request body:
http://localhost:3000/user/update {
--> Must use Admin token // use put "userId": "",
{ "newEmail": "",
"userId": "6554473388d9942bbf4de065", "newFirstname": "",
"newEmail": "mundo@email.com", "newLastName": "",
"newFirstname": "Ron", "newPassword": ""
"newLastName": "Pogi", }
"newPassword": "mundo"
} - Retrieve all products (Admin only) (GET)
- http://localhost:3000/product/all
CREATE PRODUCT [ADMIN] - auth header required: YES
http://localhost:3000/user/products - request body: none
--> Must use Admin token // use post
{ - Retrieve all active products (GET)
"name": "Poring Card", - http://localhost:3000/product/active
"description": "Description unknown", - auth header required: NO
"price": 500 - request body: none
}
- Get all products (GET)
GET ALL PRODUCT - http://localhost:3000/product/active
http://localhost:3000/user/all - auth header required: NO
--> Use get - request body: none
GET ALL ACTIVE PRODUCT - Get a product (GET)
http://localhost:3000/user/active - http://localhost:3000/product/products/65545a1e6fa9d841e1518d1d
--> Use get - auth header required: YES
- request body: none
GET A SINGLE PROUCT
http://localhost:3000/user/products/65538bd4a601aa30730f6d4c - Update Single product (PUT)
--> Use get - http://localhost:3000/product/products/65545a1e6fa9d841e1518d1d
- auth header required: YES
UPDATE A PRODUCT [ADMIN] - request body:
http://localhost:3000/user/products/65545a1e6fa9d841e1518d1d {
--> Must use Admin token // Use put "name": "Christmas Cookie Card",
{ "description": "Updated Product Description",
"name": "Christmas Cookie Card", "price": 29.99,
"description": "Updated Product Description", "isActive": false
"price": 29.99, }
"isActive": false
} - Create Order (POST)
- http://localhost:3000/user/order
ACTIVATE / ARCHIVE A PRODUCT [ADMIN] - auth header required: YES
--> Use Put - request body:
http://localhost:3000/user/products/6554634e5cac4bcd6f2394ed/activate {
http://localhost:3000/user/products/6554634e5cac4bcd6f2394ed/archive "userId": "65535cb526b586a3e2fd56cc", // Replace with a valid user ID from your database
"products": [
{
RETRIEVE OWN USER DATA "productId": "6553a4e897ac8ac9462f96c4", // Replace with a valid product ID from your database
--> Use Get "productName": "Mastering Card",
http://localhost:3000/user/retrieveUser "quantity": 1
{ }
],
"userId": "6554ac8dd7fbf9ee90217e77" "totalAmount": 500
} }
CART - Add to Cart
--> Must use token - Activate / Archive Product (PUT)
http://localhost:3000/cart/add-to-cart - auth header required: YES
{ - request body: none
"userId": "655396dcc8ea29f42422e214", - http://localhost:3000/product/products/6554634e5cac4bcd6f2394ed/activate
"productId": "6553a54566c4c86c39034b55", - http://localhost:3000/product/products/6554634e5cac4bcd6f2394ed/archive
"quantity": 5
} - Set User to Admin (POST) [Admin Only]
- hhttp://localhost:3000/user/set-admin/
CART - Delete Item - auth header required: YES
http://localhost:3000/cart/remove-from-cart - request body:
--> Must use token {
{ "userId":
"userId": "655396dcc8ea29f42422e214", }
"productId": "6553a55666c4c86c39034b59",
"quantity": 1 - Retrieve All Orders [Admin Only] (GET)
} - http://localhost:3000/user/orders-all
- auth header required: YES
CART - Update Quantity - request body: none
http://localhost:3000/cart//update-quantity
--> Must use token - Add To Cart (POST)
{ - http://localhost:3000/cart/add-to-cart
"userId": "655396dcc8ea29f42422e214", - auth header required: YES
"productId": "6553a55666c4c86c39034b59", - request body:
"quantity": 2000 // Update to the desired quantity {
} "userId": "655396dcc8ea29f42422e214",
"productId": "6553a54566c4c86c39034b55",
CART - Cart Details [ Total ] "quantity": 5
--> Must use token }
http://localhost:3000/cart/cart-details
{ - Delete Item (DELETE)
"userId": "655396dcc8ea29f42422e214" - 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()

@ -3,14 +3,14 @@ const router = express.Router()
const productController = require("../controllers/product") const productController = require("../controllers/product")
const auth = require("../auth") const auth = require("../auth")
const { authenticateToken, verifyAdmin } = auth const { authenticateToken, verifyAdmin, } = auth
// S50 // S50
// Create a product route (accessible only by isAdmin) // Create a product route (accessible only by isAdmin)
router.post("/products", authenticateToken, verifyAdmin, productController.createProduct) router.post("/create", authenticateToken, verifyAdmin, productController.createProduct)
// Retrieve all products route (accessible to both admin and normal user) // Retrieve all products route (accessible to both admin and normal user)
router.get("/all", productController.getAllProducts) router.get("/all", authenticateToken, verifyAdmin, productController.getAllProducts)
// Retrieve all active products route (accessible to both admin and normal user) // Retrieve all active products route (accessible to both admin and normal user)
router.get("/active", productController.getActiveProducts) router.get("/active", productController.getActiveProducts)

Loading…
Cancel
Save