-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathindex.js
122 lines (103 loc) · 4.03 KB
/
index.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
const express = require("express");
const cors = require("cors");
require("dotenv").config();
const jwt = require("jsonwebtoken");
const { MongoClient, ServerApiVersion, ObjectId } = require("mongodb");
const app = express();
const port = process.env.PORT || 8888;
// middleware
app.use(cors());
app.use(express.json());
// Middle Tier
const verifyJWT = async (req, res, next) => {
const authHeader = req.headers["authorization"];
if (!authHeader) {
return res.status(401).send({ message: "unauthorized" });
}
const token = authHeader.split(" ")[1];
jwt.verify(token, process.env.JWT_TOKEN_KEY, async (err, decoded) => {
if (err) {
return res.status(403).send("forbidden");
} else {
req.decoded = decoded;
}
await next();
});
};
const uri = `mongodb+srv://${process.env.DB_USER}:${process.env.DB_PASSWORD}@ema-john.n18lm9w.mongodb.net/?retryWrites=true&w=majority`;
const client = new MongoClient(uri, { useNewUrlParser: true, useUnifiedTopology: true, serverApi: ServerApiVersion.v1 });
const run = async () => {
try {
await client.connect();
const productCollections = client.db("db_ema_john").collection("products");
const orderCollections = client.db("db_ema_john").collection("orders");
// AUTH API
app.post("/login", async (req, res) => {
const user = req.body;
const token = jwt.sign(user, process.env.JWT_TOKEN_KEY, {
expiresIn: "1d",
});
res.send({ token });
});
// Products / Orders API
app.get("/products", async (req, res) => {
const page = parseInt(req.query.page);
const size = parseInt(req.query.size);
const cursor = productCollections.find({});
let products;
if (page || size) {
products = await cursor
.skip(page * size)
.limit(size)
.toArray();
} else {
products = await cursor.toArray();
}
res.send(products);
});
// counts total number of products
app.get("/nop", async (req, res) => {
const count = await productCollections.estimatedDocumentCount({});
res.json({ count });
});
// use post to get products by keys (ids)
app.post("/product_by_keys", async (req, res) => {
const keys = req.body;
const ids = keys.map((id) => ObjectId(id));
const query = { _id: { $in: ids } };
const cursor = productCollections.find(query);
const products = await cursor.toArray();
res.send(products);
});
// Manage Order
app.post("/orders", async (req, res) => {
const orderDetails = req.body;
const result = orderCollections.insertOne(orderDetails);
res.send(result);
});
// get orders
app.get("/orders", verifyJWT, async (req, res) => {
const decodedEmail = req.decoded.email;
const email = req.query.email;
if (email) {
if (decodedEmail === email) {
const query = { email };
const cursor = orderCollections.find(query);
const orders = await cursor.toArray();
res.send(orders);
} else {
res.status(403).send("forbidden");
}
} else {
const cursor = orderCollections.find({});
const orders = await cursor.toArray();
res.send(orders);
}
});
} finally {
// client.close();
}
};
run().catch(console.dir);
app.get("/", (req, res) => res.send("Hello John! Ema waiting for your response!"));
app.listen(port, () => console.log(`Example app listening on port ${port}!`));