-
Notifications
You must be signed in to change notification settings - Fork 0
/
app.js
140 lines (118 loc) · 3.8 KB
/
app.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
const express = require("express");
const app = express();
const mongoose = require("mongoose");
const Listing = require("./models/listing.js");
const path = require("path");
const methodOverride = require("method-override");
const ejsMate = require("ejs-mate");
const wrapAsync =require("./utils/wrapAsync.js");
const ExpressError = require("./utils/ExpressError.js");
const{listingSchema} = require("./schema.js");
const Review = require("./models/review.js");
const MONGO_URL = "mongodb://127.0.0.1:27017/travelnest";
main()
.then(() => {
console.log("connected to DB");
})
.catch((err) => {
console.log(err);
});
async function main() {
await mongoose.connect(MONGO_URL);
}
app.set("view engine", "ejs");
app.set("views", path.join(__dirname, "views"));
app.use(express.urlencoded({ extended: true }));
app.use(methodOverride("_method"));
app.engine('ejs', ejsMate);
app.use(express.static(path.join(__dirname,"public")))
app.get("/", (req, res) => {
res.send("Hi, I am root");
});
const validateListings = (req,res,next) =>{
let {error} = listingSchema.validate(req.body);
if(error){
let errMsg = error.details.map((el) => el.message).join(",");
throw new ExpressError(400,errMsg);
}else{
next();
}
}
//Index Route
app.get("/listings", wrapAsync(async (req, res) => {
const allListings = await Listing.find({});
res.render("listings/index.ejs", { allListings });
}));
//New Route
app.get("/listings/new", (req, res) => {
res.render("listings/new.ejs");
});
//Show Route
app.get("/listings/:id", wrapAsync(async (req, res) => {
let { id } = req.params;
const listing = await Listing.findById(id);
res.render("listings/show.ejs", { listing });
}));
//Create Route
app.post("/listings", validateListings, wrapAsync(async (req, res) => {
let result = listingSchema.validate(req,res);
if(result.error){
throw new ExpressError(400,result.error);
}
const newListing = new Listing(req.body.listing);
await newListing.save();
res.redirect("/listings");
}));
//Edit Route
app.get("/listings/:id/edit", wrapAsync(async (req, res) => {
let { id } = req.params;
const listing = await Listing.findById(id);
res.render("listings/edit.ejs", { listing });
}));
//Update Route
app.put("/listings/:id",validateListings, wrapAsync(async (req, res) => {
let { id } = req.params;
await Listing.findByIdAndUpdate(id, { ...req.body.listing });
res.redirect(`/listings/${id}`);
}));
//Delete Route
app.delete("/listings/:id", wrapAsync(async (req, res) => {
let { id } = req.params;
let deletedListing = await Listing.findByIdAndDelete(id);
console.log(deletedListing);
res.redirect("/listings");
}));
//Reviews
//Post Route
app.post("/listings/:id/review", async (req, res) => {
let listing = await Listing.findById(req.params.id);
let newReview = new Review(req.body.review);
listing.reviews.push(newReview);
await newReview.save();
await listing.save();
console.log("new review is saved");
res.send("New review saved");
});
// app.get("/testListing", async (req, res) => {
// let sampleListing = new Listing({
// title: "My New Villa",
// description: "By the beach",
// price: 1200,
// location: "Calangute, Goa",
// country: "India",
// });
// await sampleListing.save();
// console.log("sample was saved");
// res.send("successful testing");
// });
app.all("*", (req,res,next) =>{
next(new ExpressError(404,"page not found"));
});
app.use((err,req,res,next) =>{
let { statusCode =500, message="Something went wrong"} = err;
res.render("listings/error.ejs" , { err });
//res.status(statusCode).send(messege);
});
app.listen(8080, () => {
console.log("server is listening to port 8080");
});