Skip to content

Commit 2ac838b

Browse files
committed
Added drinks-website
1 parent 4869fae commit 2ac838b

28 files changed

+14831
-0
lines changed

React/drinks-website/.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
node_modules/
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
node_modules/
2+
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
{
2+
"name": "api",
3+
"version": "1.0.0",
4+
"description": "",
5+
"main": "index.js",
6+
"scripts": {
7+
"start": "nodemon ./src/server.js --watch ./src",
8+
"test": "echo \"Error: no test specified\" && exit 1"
9+
},
10+
"keywords": [],
11+
"author": "",
12+
"license": "ISC",
13+
"dependencies": {
14+
"bcrypt": "^3.0.6",
15+
"cors": "^2.8.5",
16+
"express": "^4.17.1",
17+
"express-async-router": "^0.1.15",
18+
"express-validator": "^6.2.0",
19+
"jsonwebtoken": "^8.5.1",
20+
"mongoose": "^5.7.1",
21+
"morgan": "^1.9.1"
22+
},
23+
"devDependencies": {
24+
"chai": "^4.2.0",
25+
"chai-http": "^4.3.0",
26+
"mocha": "^6.2.0",
27+
"nodemon": "^1.19.2"
28+
}
29+
}
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
const mongoose = require("mongoose");
2+
3+
const { Schema } = mongoose;
4+
5+
const drinkSchema = Schema({
6+
name: {
7+
require: true,
8+
type: String,
9+
},
10+
type: {
11+
enum: ["energy", "alcoholic", "healthy"],
12+
type: String,
13+
default: "energy",
14+
},
15+
calories: {
16+
type: Number,
17+
required: true,
18+
},
19+
price: {
20+
type: Number,
21+
require: true,
22+
}
23+
}, {
24+
timestamps: true,
25+
toJSON: {
26+
virtuals: true,
27+
},
28+
toObject: {
29+
virtual: true,
30+
}
31+
});
32+
drinkSchema.virtual("reviews", {
33+
localField: "_id",
34+
foreignField: "drink",
35+
ref: "Review",
36+
justOne: false,
37+
});
38+
39+
const Drink = mongoose.model("Drink", drinkSchema);
40+
41+
module.exports = Drink;
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
const mongoose = require("mongoose");
2+
3+
const { Schema } = mongoose;
4+
const { ObjectId } = mongoose.Types;
5+
6+
const reviewSchema = Schema({
7+
rating: {
8+
type: Number,
9+
required: true,
10+
min: 0,
11+
max: 5,
12+
},
13+
comment: {
14+
type: String,
15+
},
16+
drink: {
17+
type: ObjectId,
18+
ref: "Drink",
19+
required: true
20+
}
21+
}, {
22+
timestamps: true,
23+
toJSON: {
24+
virtuals: true,
25+
}
26+
});
27+
28+
const Review = mongoose.model("Review", reviewSchema);
29+
30+
module.exports = Review;
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
const Drink = require("../models/Drink");
2+
const { AsyncRouter } = require("express-async-router");
3+
4+
const router = AsyncRouter();
5+
6+
// List route
7+
router.get("/", async (req, res) => {
8+
const drinks = await Drink.find({}).populate("reviews");
9+
10+
res.send(drinks);
11+
});
12+
13+
// Create route
14+
router.post("/", async (req, res) => {
15+
const drink = new Drink(req.body);
16+
await drink.save();
17+
18+
res.status(201).send(drink);
19+
});
20+
21+
// Retrieve route
22+
router.get("/:_id", async (req, res) => {
23+
const drink = await Drink.findOne({_id: req.params._id}).populate("reviews");
24+
if(!drink) return res.sendStatus(404);
25+
26+
res.send(drink);
27+
});
28+
29+
// Update route
30+
router.patch("/:_id", async (req, res) => {
31+
const drink = await Drink.findOne({_id: req.params._id});
32+
if(!drink) return res.sendStatus(404);
33+
34+
drink.set(req.body);
35+
await drink.save();
36+
37+
res.send(drink);
38+
});
39+
40+
// Delete route
41+
router.delete("/:_id", async (req, res) => {
42+
const drink = await Drink.findOne({_id: req.params._id}).populate("reviews");
43+
if(!drink) return res.sendStatus(404);
44+
45+
drink.reviews.forEach(async (review) => {
46+
await review.remove();
47+
});
48+
await drink.remove();
49+
50+
res.send(drink);
51+
});
52+
53+
module.exports = router;
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
const Review = require("../models/Review");
2+
const { AsyncRouter } = require("express-async-router");
3+
4+
const router = AsyncRouter();
5+
6+
// List route
7+
router.get("/", async (req, res) => {
8+
const reviews = await Review.find({});
9+
10+
res.send(reviews);
11+
});
12+
13+
// Create route
14+
router.post("/", async (req, res) => {
15+
const review = new Review(req.body);
16+
await review.save();
17+
18+
res.status(201).send(review);
19+
});
20+
21+
// Retrieve route
22+
router.get("/:_id", async (req, res) => {
23+
const review = await Review.findOne({_id: req.params._id});
24+
if(!review) return res.sendStatus(404);
25+
26+
res.send(review);
27+
});
28+
29+
// Update route
30+
router.patch("/:_id", async (req, res) => {
31+
const review = await Review.findOne({_id: req.params._id});
32+
if(!review) return res.sendStatus(404);
33+
34+
review.set(req.body);
35+
await review.save();
36+
37+
res.send(review);
38+
});
39+
40+
// Delete route
41+
router.delete("/:_id", async (req, res) => {
42+
const review = await Review.findOne({_id: req.params._id});
43+
if(!review) return res.sendStatus(404);
44+
await review.remove();
45+
46+
res.send(review);
47+
});
48+
49+
module.exports = router;
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
const express = require("express");
2+
const morgan = require("morgan");
3+
const cors = require("cors");
4+
const mongoose = require("mongoose");
5+
6+
const DrinkRouter = require("./routes/drink.routes");
7+
const ReviewRouter = require("./routes/review.routes");
8+
9+
const app = express();
10+
11+
app.use(cors());
12+
app.use(morgan("tiny"));
13+
app.use(express.json());
14+
15+
app.get("/", (req, res) => {
16+
res.send("Hello drinkers!");
17+
});
18+
19+
app.use("/drinks", DrinkRouter);
20+
app.use("/reviews", ReviewRouter);
21+
22+
const connectDatabase = async () => {
23+
const database = await mongoose.connect('mongodb://localhost/test-api', {
24+
useNewUrlParser: true,
25+
useCreateIndex: true,
26+
useFindAndModify: true,
27+
useUnifiedTopology: true
28+
});
29+
30+
console.log("Connected to database...");
31+
32+
return database;
33+
}
34+
35+
const startServer = (port=8000) => {
36+
app.listen(port, async () => {
37+
await connectDatabase();
38+
console.log(`Listening @ localhost:${port}...`);
39+
});
40+
}
41+
42+
startServer();

React/drinks-website/api/test/test-helper.js

Whitespace-only changes.

0 commit comments

Comments
 (0)