diff --git a/crud-node-mongo/hotel-backend/controllers/bookingController.js b/crud-node-mongo/hotel-backend/controllers/bookingController.js index 6c57117..bb0f217 100644 --- a/crud-node-mongo/hotel-backend/controllers/bookingController.js +++ b/crud-node-mongo/hotel-backend/controllers/bookingController.js @@ -24,10 +24,11 @@ exports.bookRoom = async (req, res) => { const existingBooking = await Booking.findOne({ roomNumber, $or: [ - { startTime: { $lt: endTimeDate }, endTime: { $gt: startTimeDate } }, - { startTime: { $gte: startTimeDate, $lt: endTimeDate } }, - { endTime: { $lte: endTimeDate, $gt: startTimeDate } }, - ], + { + startTime: { $lt: endTimeDate },//This will cover all the overlap cases. + endTime: { $gt: startTimeDate }, + } + ] }); if (existingBooking) { @@ -39,7 +40,7 @@ exports.bookRoom = async (req, res) => { // Calculate duration and price const duration = (endTimeDate - startTimeDate) / (1000 * 60 * 60); // Convert to hours - const room = await Room.findOne({ roomNumber }); + const room = existingBooking;//this unnesessary and wasiting database time and resources const totalPrice = duration * room.pricePerHour; // Create new booking @@ -150,7 +151,7 @@ exports.cancelBooking = async (req, res) => { booking.status = "cancelled"; booking.refundAmount = refundAmount; - await Booking.findByIdAndDelete(bookingId); + await booking.save();// You're updating the booking's status to "cancelled" and adding a refundAmount, but then you're deleting that booking from the database right after.** res .status(200) @@ -183,6 +184,9 @@ exports.viewBookings = async (req, res) => { query.startTime = { $gte: startDateTime, $lte: endDateTime }; } + // Exclude cancelled bookings by default + query.status = { $ne: "cancelled" }; + // Find bookings based on filters const bookings = await Booking.find(query); @@ -191,4 +195,36 @@ exports.viewBookings = async (req, res) => { console.error(error); res.status(500).json({ message: "Internal Server Error" }); } -}; \ No newline at end of file +}; + +// Report a booking +// controllers/bookingController.js +exports.reportBooking = async (req, res) => { + try{ + const bookingId = req.params.id; + const {reason} = req.body; + + const booking = await Booking.findbyIdAndUpdate( + bookingId, + { isReported: true, reportReason: reason }, + { new: true} + ); + if(!booking){ + return res.status(404).json({message: "Booking not found"}) + } + res.status(200).json({message:"Booking reported",booking}); + } + catch(err){ + res.status(500).json({message: "Error reporting booking",error: err.message}); + } + } + + //Get all reported bookings + exports.getReportedBookings = async (req, res) =>{ + try{ + const reported = await Booking.find({ isReported: true}); + res.status(200).json(reported); + } catch(err) { + res.status(500).json({message: "Error fetching reports",error: err.message}); + } + } diff --git a/crud-node-mongo/hotel-backend/models/bookingModels.js b/crud-node-mongo/hotel-backend/models/bookingModels.js index a8514f6..1e200c8 100644 --- a/crud-node-mongo/hotel-backend/models/bookingModels.js +++ b/crud-node-mongo/hotel-backend/models/bookingModels.js @@ -17,7 +17,11 @@ const bookingSchema = new mongoose.Schema({ startTime: { type: Date, required: true }, roomType : {type : String, required : true}, endTime: { type: Date, required: true }, - totalPrice: { type: Number, required: false }, + totalPrice: { type: Number}, + + // New fields + isReported: {type: Boolean, default:false}, + reportReason: {type: String, defult: null}, }); const Booking = mongoose.model("Booking", bookingSchema); diff --git a/crud-node-mongo/hotel-backend/routes/bookingRoutes.js b/crud-node-mongo/hotel-backend/routes/bookingRoutes.js index e9f49d1..37389ab 100644 --- a/crud-node-mongo/hotel-backend/routes/bookingRoutes.js +++ b/crud-node-mongo/hotel-backend/routes/bookingRoutes.js @@ -11,4 +11,9 @@ router.put("/edit/:id", bookingController.editBooking); router.delete("/cancel/:id", bookingController.cancelBooking); router.get("/view", bookingController.viewBookings); +//Report a booking +router.post("/report/:id", bookingController.reportBooking); + +//View all reported bookings +router.get("/reports",bookingController.getReportedBookings); module.exports = router;