From 44053cf14317b2c59f6f7f7d9011f0f35bbab27b Mon Sep 17 00:00:00 2001 From: Saptarshi Mukherjee Date: Wed, 4 Mar 2026 15:33:05 +0530 Subject: [PATCH] Enable booking functionality --- controllers/bookings.js | 5 +++ controllers/users.js | 87 +++++++++++++++++++++------------------ routes/user.js | 22 +++++----- views/includes/navbar.ejs | 1 + views/listings/show.ejs | 2 +- views/users/dashboard.ejs | 56 +++++++++++++++++++++++++ 6 files changed, 122 insertions(+), 51 deletions(-) create mode 100644 views/users/dashboard.ejs diff --git a/controllers/bookings.js b/controllers/bookings.js index 6f5838f..52a0c8c 100644 --- a/controllers/bookings.js +++ b/controllers/bookings.js @@ -12,6 +12,11 @@ module.exports.createBooking = async (req, res) => { return res.redirect("/listings"); } + if (listing.owner.equals(req.user._id)) { + req.flash("error", "You cannot book your own listing."); + return res.redirect(`/listings/${id}`); + } + const { checkIn, checkOut, guests } = req.body.booking; const numGuests = parseInt(guests); diff --git a/controllers/users.js b/controllers/users.js index 4395787..cdccd6c 100644 --- a/controllers/users.js +++ b/controllers/users.js @@ -1,46 +1,53 @@ -const User =require("../models/user") +const User = require("../models/user"); +const Booking = require("../models/booking"); -module.exports.renderSignUpForm =(req,res)=>{ - res.render("users/signup.ejs") - } - -module.exports.signUp =async(req,res,next)=>{ - try{ - let {username,email,password}=req.body; - const newUSer = new User({email,username}) - const registeredUser = await User.register(newUSer,password); - - req.login(registeredUser,(err)=>{ - if (err) { - return next(err); - } - req.flash("success","Welcome to WanderLust "); - res.redirect("/listings"); - }) - - } - catch(err){ - req.flash("error",err.message) - res.redirect("/signup") - } +module.exports.renderSignUpForm = (req, res) => { + res.render("users/signup.ejs") } -module.exports.renderLoginForm =(req,res)=>{ - res.render("users/login.ejs") - } - -module.exports.login =async(req,res)=>{ - req.flash("success","welcome back to WanderLust ! ") - let redirectUrl = res.locals.redirectUrl ||"/listings" - res.redirect(redirectUrl); - } +module.exports.signUp = async (req, res, next) => { + try { + let { username, email, password } = req.body; + const newUSer = new User({ email, username }) + const registeredUser = await User.register(newUSer, password); -module.exports.logout=(req,res,next)=>{ - req.logOut((err=>{ - if(err){ - next(err); + req.login(registeredUser, (err) => { + if (err) { + return next(err); } - req.flash("success","You are logged Out!"); + req.flash("success", "Welcome to WanderLust "); res.redirect("/listings"); - })) - } \ No newline at end of file + }) + + } + catch (err) { + req.flash("error", err.message) + res.redirect("/signup") + } +} + +module.exports.renderLoginForm = (req, res) => { + res.render("users/login.ejs") +} + +module.exports.login = async (req, res) => { + req.flash("success", "welcome back to WanderLust ! ") + let redirectUrl = res.locals.redirectUrl || "/listings" + res.redirect(redirectUrl); +} + +module.exports.logout = (req, res, next) => { + req.logOut((err => { + if (err) { + next(err); + } + req.flash("success", "You are logged Out!"); + res.redirect("/listings"); + })) +} + +module.exports.renderDashboard = async (req, res) => { + // Populate listing to show details on the dashboard + const bookings = await Booking.find({ user: req.user._id }).populate("listing"); + res.render("users/dashboard.ejs", { bookings }); +}; \ No newline at end of file diff --git a/routes/user.js b/routes/user.js index 6ad0359..db64866 100644 --- a/routes/user.js +++ b/routes/user.js @@ -1,22 +1,24 @@ const express = require("express"); -const router = express.Router({mergeParams:true}); +const router = express.Router({ mergeParams: true }); const User = require("../models/user.js"); const wrapAsync = require("../utils/wrapAsync"); const passport = require("passport"); -const {saveRedirectUrl}= require("../middleware.js") +const { saveRedirectUrl, isLoggedIn } = require("../middleware.js") const userController = require("../controllers/users.js") router.route("/signup") -.get(userController.renderSignUpForm) -.post(wrapAsync(userController.signUp)); + .get(userController.renderSignUpForm) + .post(wrapAsync(userController.signUp)); router.route("/login") -.get(userController.renderLoginForm) -.post( - saveRedirectUrl, - passport.authenticate("local",{failureRedirect:"/login",failureFlash:true}) ,userController.login); -router.get("/logout",userController.logout) + .get(userController.renderLoginForm) + .post( + saveRedirectUrl, + passport.authenticate("local", { failureRedirect: "/login", failureFlash: true }), userController.login); +router.get("/logout", userController.logout) +router.route("/dashboard") + .get(isLoggedIn, wrapAsync(userController.renderDashboard)); -module.exports =router; \ No newline at end of file +module.exports = router; \ No newline at end of file diff --git a/views/includes/navbar.ejs b/views/includes/navbar.ejs index a57c632..0d6ed9f 100644 --- a/views/includes/navbar.ejs +++ b/views/includes/navbar.ejs @@ -62,6 +62,7 @@ Login <% } %> <% if( currUser){ %> + My Bookings My Trips Logout diff --git a/views/listings/show.ejs b/views/listings/show.ejs index df86a46..9d94eea 100644 --- a/views/listings/show.ejs +++ b/views/listings/show.ejs @@ -114,7 +114,7 @@
diff --git a/views/users/dashboard.ejs b/views/users/dashboard.ejs new file mode 100644 index 0000000..bed29f9 --- /dev/null +++ b/views/users/dashboard.ejs @@ -0,0 +1,56 @@ +<% layout('/layouts/boilerplate') -%> + +
+
+
+

My Bookings

+
+
+ + <% if (bookings && bookings.length> 0) { %> +
+ <% for (let booking of bookings) { %> + <% if (booking.listing) { %> +
+
+ Listing Image +
+
+ <%= booking.listing.title %> +
+

+ <%= booking.listing.location %>, <%= booking.listing.country %> +

+
+

Check-in: + <%= booking.checkIn.toLocaleDateString() %> +

+

Check-out: + <%= booking.checkOut.toLocaleDateString() %> +

+

Guests: + <%= booking.guests %> +

+
Total Paid: ₹ <%= + booking.totalPrice.toLocaleString("en-IN") %> +
+
+ +
+
+ <% } %> + <% } %> +
+ <% } else { %> + + <% } %> +
\ No newline at end of file