-
Notifications
You must be signed in to change notification settings - Fork 0
/
router.js
290 lines (268 loc) · 9.46 KB
/
router.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
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
const express = require("express");
const path = require("path");
let router = express.Router();
const app = express();
const fridges = require("./fridges.js"); // import custom module
// function for creating errors
function createError(errorCode, errorMessage) {
let error = new Error();
error.status = errorCode;
error.message = errorMessage;
return error;
}
// GET /fridges -> Return view_pickup.html OR comm-fridge-data.json
router.get("/", async (req, res, next) => {
try {
// determine content-type requested by the client
if (req.accepts("text/html")) {
// read view_pickup.html
let viewAndPickup = await fridges.readFile("./public/view_pickup.html");
if (viewAndPickup) {
// send back HTML file
res.status(200).set("Content-Type", "text/html").send(viewAndPickup);
} else {
// didn't find view_pickup.html
next(
createError(
404,
`404 ERROR: The requested page at /fridges was not found on the server.`
)
);
}
} else if (req.accepts("application/json")) {
// read comm-fridge-data.json
let fridgeData = await fridges.getData("./data/comm-fridge-data.json");
if (fridgeData instanceof Error) {
// didn't find comm-fridge-data.json
next(
createError(
404,
`404 ERROR: The requested resource at /fridges was not found on the server.`
)
);
} else {
// send back JSON file
res
.status(200)
.set("Content-Type", "application/json")
.json(fridgeData);
}
} else {
// the content-type requested by the user doesn't match the type of the server resources
next(createError(500, "500 ERROR: Internal server error."));
}
} catch (err) {
// something else went wrong
next(createError(500, "500 ERROR: Internal server error."));
}
});
// POST /fridges -> Add new fridge
router.post("/", express.json(), async (req, res, next) => {
try {
// check received data
let data = req.body;
let result = await fridges.addFridge(data);
// check if the fridge was added successfully
if (result instanceof Error) {
// something went wrong
next(createError(500, "500 ERROR: Internal server error."));
} else if (result) {
// fridge was successfully added
res.status(200).set("Content-Type", "application/json").json(result);
} else {
// some fields in the client's request were missing
next(createError(400, "400 ERROR: Malformed or illegal request."));
}
} catch (err) {
next(createError(500, "500 ERROR: Internal server error."));
}
});
// GET /fridges/addFridge -> Return addFridge.html
router.get("/addFridge", async (req, res, next) => {
try {
if (req.accepts("text/html")) {
// read addFridge.html
let addFridge = await fridges.readFile("./public/addFridge.html");
if (addFridge) {
// send back HTML file
res.status(200).set("Content-Type", "text/html").send(addFridge);
} else {
// didn't find addFridge.html
next(
createError(
404,
`404 ERROR: The requested page at /fridges${req.url} was not found on the server.`
)
);
}
} else {
// the content-type requested by the user doesn't match the type of the server resources
next(createError(500, "500 ERROR: Internal server error."));
}
} catch (err) {
// something else went wrong
next(createError(500, "500 ERROR: Internal server error."));
}
});
// GET /fridges/editFridge -> Return editFridge.html
router.get("/editFridge", async (req, res, next) => {
try {
if (req.accepts("text/html")) {
// read editFridge.html
let editFridge = await fridges.readFile("./public/editFridge.html");
if (editFridge) {
// send back HTML file
res.status(200).set("Content-Type", "text/html").send(editFridge);
} else {
// didn't find editFridge.html
next(
createError(
404,
`404 ERROR: The requested page at /fridges${req.url} was not found on the server.`
)
);
}
} else {
// the content-type requested by the user doesn't match the type of the server resources
next(createError(500, "500 ERROR: Internal server error."));
}
} catch (err) {
// something else went wrong
next(createError(500, "500 ERROR: Internal server error."));
}
});
// GET /fridges/itemsList -> Return list of items with the data for each item
router.get("/itemsList", express.json(), async (req, res, next) => {
try {
// determine content-type requested by the client
if (req.accepts("application/json")) {
// get items list
let itemsList = await fridges.getData("./data/comm-fridge-items.json");
if (itemsList) {
// send back JSON file
res.status(200).set("Content-Type", "application/json").json(itemsList);
} else {
// didn't find the requested
next(
createError(
404,
`404 ERROR: The requested resource was not found on the server.`
)
);
}
} else {
// the content-type requested by the user doesn't match the accepted return type
next(createError(400, "400 ERROR: Malformed or illegal request."));
}
} catch (err) {
// something else went wrong
next(createError(500, "500 ERROR: Internal server error."));
}
});
// GET /fridges/:fridgeID -> Return information about a fridge with the specified ID
router.get("/:fridgeID", async (req, res, next) => {
try {
// determine content-type requested by the client
if (req.accepts("application/json")) {
// get information about the requested fridge
let fridgeID = req.params.fridgeID;
let fridgeData = await fridges.getFridgeInfo(fridgeID);
if (fridgeData instanceof Error) {
// error reading comm-fridge-data.json
next(fridgeData);
} else if (fridgeData) {
// send back JSON file
res
.status(200)
.set("Content-Type", "application/json")
.json(fridgeData);
} else {
// didn't find fridge with the specified ID
next(
createError(
404,
`404 ERROR: Fridge with the ID ${fridgeID} was not found on the server.`
)
);
}
} else {
// the content-type requested by the user doesn't match the accepted return type
next(createError(400, "400 ERROR: Malformed or illegal request."));
}
} catch (err) {
// something else went wrong
next(createError(500, "500 ERROR: Internal server error."));
}
});
// PUT /fridges/:fridgeID -> Update information about a fridge with the specified ID
router.put("/:fridgeID", express.json(), async (req, res, next) => {
try {
// get information about the requested fridge
let fridgeID = req.params.fridgeID;
// update fridge info
let result = await fridges.updateFridgeInfo(fridgeID, req.body);
if (result instanceof Error) {
// forward error to the error handler
next(result);
} else {
// fridge was successfully updated
res.status(200).set("Content-Type", "application/json").json(result);
}
} catch (err) {
// something else went wrong
next(createError(500, "500 ERROR: Internal server error."));
}
});
// POST /fridges/:fridgeID/items -> Add item to the fridge
router.post("/:fridgeID/items", express.json(), async (req, res, next) => {
try {
let fridgeID = req.params.fridgeID; // get fridgeID
let result = await fridges.addItem(fridgeID, req.body); // add new item to the fridge
if (result instanceof Error) {
next(result); // forward error to the error handler
} else {
// new item was successfully added to the fridge
res.status(200).set("Content-Type", "application/json").json(result);
}
} catch (err) {
// something else went wrong
next(createError(500, "500 ERROR: Internal server error."));
}
});
// DELETE /fridges/:fridgeID/items -> Delete items specified in the query string
// OR delete all items from the fridge
router.delete("/:fridgeID/items", async (req, res, next) => {
try {
let fridgeID = req.params.fridgeID; // get fridgeID
// remove specified items from the fridge
let result = await fridges.removeItems(fridgeID, req.query);
if (result instanceof Error) {
next(result); // forward error to the error handler
} else {
// items were successfully removed from the fridge
res.status(200).set("Content-Type", "text/html").send();
}
} catch (err) {
// something else went wrong
next(createError(500, "500 ERROR: Internal server error.")); // something went wrong
}
});
// DELETE /fridges/:fridgeID/:itemID -> Server should remove specified item from the fridge
router.delete("/:fridgeID/:itemID", async (req, res, next) => {
try {
// extract item and fridge ID
let fridgeID = req.params.fridgeID;
let itemID = req.params.itemID;
// remove item from the fridge
let result = await fridges.removeItem(fridgeID, itemID);
if (result instanceof Error) {
next(result); // forward error to the error handler
} else {
// items were successfully removed from the fridge
res.status(200).set("Content-Type", "text/html").send();
}
} catch (err) {
next(createError(500, "500 ERROR: Internal server error.")); // something went wrong
}
});
module.exports = router;