Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
126 changes: 126 additions & 0 deletions app/server.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ const swaggerUi = require('swagger-ui-express');
const YAML = require('yamljs');
const swaggerDocument = YAML.load('./swagger.yaml'); // Replace './swagger.yaml' with the path to your Swagger file
const app = express();
require('dotenv').config();

app.use(bodyParser.json());

Expand All @@ -22,10 +23,135 @@ app.use((err, req, res, next) => {
// Swagger
app.use('/api-docs', swaggerUi.serve, swaggerUi.setup(swaggerDocument));

//Middleware

const authenticateJWT = (req, res, next) => {
const authHeader = req.headers.authorization;
if(!authHeader) {
return res.sendStatus(401);
}

if(authHeader) {
const token = authHeader.split(' ')[1];

jwt.verify(token, process.env.JWT_SECRET, (err, user) => {
if(err) {
return res.sendStatus(403);
}

req.user = user;
next();
});
}
};

// Starting the server
const PORT = process.env.PORT || 3000;

app.listen(PORT, () => {
console.log(`Server running on port ${PORT}`);
});


app.get('/brands', (req, res) => {
return res.json(brands);
});

app.get('/brands/:id/products', (req, res) => {

if(!brands.some(brand => brand.id === req.params.id)) {
return res.status(404).send("Brand not found")
}
const brandProducts = products.filter((product) => product.categoryId == req.params.id)
res.json(brandProducts)
})

app.get('/products', (req, res) => {
return res.json(products)
})


app.post('/login', (req, res) => {

if(!req.body.username || !req.body.password) {
return res.status(400).send("Username and password are required")
}

let user = users.find((user) => user.login.username === req.body.username)

if(!user) {
return res.status(401).send("User not found")
}

if(user.login.password !== req.body.password) {
return res.status(401).send("Invalid password")
}

if(user.login.password === req.body.password) {
const token = jwt.sign(user, process.env.JWT_SECRET)
res.json({ accessToken: token })
}

});


app.get('/me/cart', authenticateJWT, (req, res) => {
let user = users.find((user) => user.login.username === req.user.login.username)
res.json(user.cart);
});

app.post('/me/cart', authenticateJWT, (req, res) => {
if(req.body == {}) {
return res.status(400).send("Product is required")
}
if(!req.body.productId || !req.body.name || !req.body.price || !req.body.quantity) {
return res.status(400).send("Product is invalid")
}
let user = users.find((user) => user.login.username === req.user.login.username)
user.cart.push(req.body)
res.status(201).json (user.cart);
});


app.delete('/me/cart/:productId', authenticateJWT, (req, res) => {
let userIndex = users.findIndex((user) => user.login.username === req.user.login.username);

if (userIndex === -1) {
return res.status(404).send("User not found");
}

let user = users[userIndex];
user.cart = user.cart.filter((product) => product.id != req.params.productId);

// Update the user in the users array
users[userIndex] = user;
res.json(user.cart);
});

app.post('/me/cart/:productId', authenticateJWT, (req, res) => {
let userIndex = users.findIndex((user) => user.login.username === req.user.login.username);

if (userIndex === -1) {
return res.status(404).send("User not found");
}

let user = users[userIndex];


let cartProductIndex = user.cart.findIndex((product) => product.id == req.params.productId);


// update the quantity of the product
if (cartProductIndex === -1) {
return res.status(404).send("Product not found");
} else {
user.cart[cartProductIndex].quantity = req.body.quantity;
}

// Update the user in the users array
users[userIndex] = user;

res.json(user.cart);
});

module.exports = app;
206 changes: 105 additions & 101 deletions initial-data/users.json
Original file line number Diff line number Diff line change
@@ -1,104 +1,108 @@
[
{
"gender": "female",
"cart":[],
"name": {
"title": "mrs",
"first": "susanna",
"last": "richards"
},
"location": {
"street": "2343 herbert road",
"city": "duleek",
"state": "donegal",
"postcode": 38567
},
"email": "[email protected]",
"login": {
"username": "yellowleopard753",
"password": "jonjon",
"salt": "eNuMvema",
"md5": "a8be2a69c8c91684588f4e1a29442dd7",
"sha1": "f9a60bbf8b550c10712e470d713784c3ba78a68e",
"sha256": "4dca9535634c102fbadbe62dc5b37cd608f9f3ced9aacf42a5669e5a312690a0"
},
"dob": "1954-10-09 10:47:17",
"registered": "2003-08-03 01:12:24",
"phone": "031-941-6700",
"cell": "081-032-7884",
"picture": {
"large": "https://randomuser.me/api/portraits/women/55.jpg",
"medium": "https://randomuser.me/api/portraits/med/women/55.jpg",
"thumbnail": "https://randomuser.me/api/portraits/thumb/women/55.jpg"
},
"nat": "IE"
{
"gender": "female",
"cart": [],
"name": {
"title": "mrs",
"first": "susanna",
"last": "richards"
},
{
"gender": "male",
"cart":[],
"name": {
"title": "mr",
"first": "salvador",
"last": "jordan"
},
"location": {
"street": "9849 valley view ln",
"city": "burkburnett",
"state": "delaware",
"postcode": 78623
},
"email": "[email protected]",
"login": {
"username": "lazywolf342",
"password": "tucker",
"salt": "oSngghny",
"md5": "30079fb24f447efc355585fcd4d97494",
"sha1": "dbeb2d0155dad0de0ab9bbe21c062e260a61d741",
"sha256": "4f9416fa89bfd251e07da3ca0aed4d077a011d6ef7d6ed75e1d439c96d75d2b2"
},
"dob": "1955-07-28 22:32:14",
"registered": "2010-01-10 06:52:31",
"phone": "(944)-261-2164",
"cell": "(888)-556-7285",
"picture": {
"large": "https://randomuser.me/api/portraits/men/4.jpg",
"medium": "https://randomuser.me/api/portraits/med/men/4.jpg",
"thumbnail": "https://randomuser.me/api/portraits/thumb/men/4.jpg"
},
"nat": "US"
"location": {
"street": "2343 herbert road",
"city": "duleek",
"state": "donegal",
"postcode": 38567
},
{
"gender": "female",
"cart":[],
"name": {
"title": "mrs",
"first": "natalia",
"last": "ramos"
},
"location": {
"street": "7934 avenida de salamanca",
"city": "madrid",
"state": "aragón",
"postcode": 43314
},
"email": "[email protected]",
"login": {
"username": "greenlion235",
"password": "waters",
"salt": "w10ZFgoO",
"md5": "19f6fb510c58be44b2df1816d88b739d",
"sha1": "18e545aee27156ee6be35596631353a14ee03007",
"sha256": "2b23b25939ece8ba943fe9abcb3074105867c267d122081a2bc6322f935ac809"
},
"dob": "1947-03-05 15:23:07",
"registered": "2004-07-19 02:44:19",
"phone": "903-556-986",
"cell": "696-867-013",
"picture": {
"large": "https://randomuser.me/api/portraits/women/54.jpg",
"medium": "https://randomuser.me/api/portraits/med/women/54.jpg",
"thumbnail": "https://randomuser.me/api/portraits/thumb/women/54.jpg"
},
"nat": "ES"
}
]
"email": "[email protected]",
"login": {
"username": "yellowleopard753",
"password": "jonjon",
"salt": "eNuMvema",
"md5": "a8be2a69c8c91684588f4e1a29442dd7",
"sha1": "f9a60bbf8b550c10712e470d713784c3ba78a68e",
"sha256": "4dca9535634c102fbadbe62dc5b37cd608f9f3ced9aacf42a5669e5a312690a0"
},
"dob": "1954-10-09 10:47:17",
"registered": "2003-08-03 01:12:24",
"phone": "031-941-6700",
"cell": "081-032-7884",
"picture": {
"large": "https://randomuser.me/api/portraits/women/55.jpg",
"medium": "https://randomuser.me/api/portraits/med/women/55.jpg",
"thumbnail": "https://randomuser.me/api/portraits/thumb/women/55.jpg"
},
"nat": "IE"
},
{
"gender": "male",
"cart": [
{ "id": 1, "name": "product 1", "price": 100, "quantity": 2 },
{ "id": 2, "name": "product 2", "price": 200, "quantity": 1 },
{ "id": 3, "name": "product 3", "price": 300, "quantity": 3 }
],
"name": {
"title": "mr",
"first": "salvador",
"last": "jordan"
},
"location": {
"street": "9849 valley view ln",
"city": "burkburnett",
"state": "delaware",
"postcode": 78623
},
"email": "[email protected]",
"login": {
"username": "lazywolf342",
"password": "tucker",
"salt": "oSngghny",
"md5": "30079fb24f447efc355585fcd4d97494",
"sha1": "dbeb2d0155dad0de0ab9bbe21c062e260a61d741",
"sha256": "4f9416fa89bfd251e07da3ca0aed4d077a011d6ef7d6ed75e1d439c96d75d2b2"
},
"dob": "1955-07-28 22:32:14",
"registered": "2010-01-10 06:52:31",
"phone": "(944)-261-2164",
"cell": "(888)-556-7285",
"picture": {
"large": "https://randomuser.me/api/portraits/men/4.jpg",
"medium": "https://randomuser.me/api/portraits/med/men/4.jpg",
"thumbnail": "https://randomuser.me/api/portraits/thumb/men/4.jpg"
},
"nat": "US"
},
{
"gender": "female",
"cart": [],
"name": {
"title": "mrs",
"first": "natalia",
"last": "ramos"
},
"location": {
"street": "7934 avenida de salamanca",
"city": "madrid",
"state": "aragón",
"postcode": 43314
},
"email": "[email protected]",
"login": {
"username": "greenlion235",
"password": "waters",
"salt": "w10ZFgoO",
"md5": "19f6fb510c58be44b2df1816d88b739d",
"sha1": "18e545aee27156ee6be35596631353a14ee03007",
"sha256": "2b23b25939ece8ba943fe9abcb3074105867c267d122081a2bc6322f935ac809"
},
"dob": "1947-03-05 15:23:07",
"registered": "2004-07-19 02:44:19",
"phone": "903-556-986",
"cell": "696-867-013",
"picture": {
"large": "https://randomuser.me/api/portraits/women/54.jpg",
"medium": "https://randomuser.me/api/portraits/med/women/54.jpg",
"thumbnail": "https://randomuser.me/api/portraits/thumb/women/54.jpg"
},
"nat": "ES"
}
]
Loading