-
Notifications
You must be signed in to change notification settings - Fork 1
/
server.js
178 lines (147 loc) · 4.27 KB
/
server.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
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
const PORT = 3033;
const jsonServer = require("json-server");
const auth = require("json-server-auth");
const server = jsonServer.create();
const router = jsonServer.router("db.json");
server.use(jsonServer.bodyParser);
server.db = router.db;
const rules = auth.rewriter({
users: 600,
"/api/*": "/$1",
"/products/all": "/products/",
"/products/category/:category": "/products?category=:category",
"/admin/*": "/664/$1",
"/carts/*": "/640/carts/$1",
"/orders/*": "/640/orders/$1",
"/pay/:orderid": "/640/orders/:orderid",
});
// 產品
server.post("/api/admin/products/", (req, res, next) => {
const { name, price, category } = req.body;
// 新增時檢查欄位
if (!name || !price || !category) {
res.json({ success: false, message: "需輸入完整資訊" });
return;
}
if (isNaN(Number(price))) {
res.json({ success: false, message: "價格欄位需為數字" });
return;
}
next();
});
// 購物車
server.post("/api/carts/", (req, res, next) => {
const { productId, qty } = req.body;
if (!productId) {
res.json({ success: false, message: "需輸入商品id" });
return;
}
if (qty && isNaN(Number(qty))) {
res.json({ success: false, message: "數量欄位需為數字" });
return;
}
if (!qty) req.body.qty = 1;
next();
});
// 訂單
server.post("/api/orders/", (req, res, next) => {
const { userId, total, paid } = req.body;
const { db } = req.app;
// 取出目前登入 User 購物車資料
const carts = db
.get("carts")
.value()
.filter((item) => item.userId === req.claims.sub);
// 若購物車內無項目則返回訊息
if (carts.length == 0) {
res.json({ success: false, message: "購物車無項目可成立訂單" });
return;
}
// 取出目前登入 User 購物車資料取出中的 ProductID
const cartsProductIDs = Array.from(
new Set(carts.map((item) => item.productId))
);
// 取出在購物車中的商品資料
const products = db
.get("products")
.value()
.filter((item) => cartsProductIDs.includes(item.id));
let calcTotal = 0;
// 取得商品價格
const getProductsPrice = (productId) =>
products.find((item) => item.id === parseInt(productId)).price || 0;
// Total 計算
carts.forEach((item) => {
calcTotal +=
parseInt(getProductsPrice(item.productId)) * parseInt(item.qty);
let product = products.find((product) => product.id == item.productId);
product.qty = item.qty;
});
if (calcTotal == 0) {
res.json({ success: false, message: "訂單總金額為 0,無法成立訂單" });
return;
}
// 移除 carts 項目
carts
.map((item) => item.id)
.forEach((id) => {
db.get("carts").removeById(id).value();
});
req.body.detail = products;
req.body.total = calcTotal;
req.body.paid = false;
next();
});
// 付款
server.put("/api/pay/*", (req, res, next) => {
const { db } = req.app;
const path = req.url;
const [, mod, resource, id] = path.split("/");
if (!id) {
res.json({ success: false, message: "需要輸入訂單 id" });
return;
}
let orderData = db
.get("orders")
.value()
.find((item) => item.id == id);
if (!orderData) {
res.json({ success: false, message: "未找到該筆訂單" });
return;
}
if (orderData.paid) {
res.json({ success: false, message: "該筆訂單已付款" });
return;
}
req.body.userId = orderData.userId;
req.body.detail = orderData.detail;
req.body.total = orderData.total;
req.body.paid = true;
next();
});
server.use(rules);
server.use(auth);
server.use(router);
router.render = (req, res) => {
// GET 購物車只列出登入的 User 的
if (req.url == "/carts/" && req.method == "GET") {
console.log(req.claims);
res.locals.data = res.locals.data.filter(
(item) => item.userId == req.claims.sub
);
}
// GET 訂單只列出登入的 User 的
if (req.url == "/orders/" && req.method == "GET") {
res.locals.data = res.locals.data.filter(
(item) => item.userId == req.claims.sub
);
}
// 自定義輸出結果,除原本的物件外多一個屬性 success
res.json({
success: res.statusCode >= 400 ? false : true,
message: res.locals.data,
});
};
server.listen(PORT, () => {
console.log(`json-server-auth is running at http://localhost:${PORT} ~`);
});