Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
Binary file added Mern_Project/2024-10-29 23-58-32.mkv
Binary file not shown.
1 change: 1 addition & 0 deletions Mern_Project/Backend/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
.env
29 changes: 29 additions & 0 deletions Mern_Project/Backend/app.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
import express from "express";
import cors from "cors";
import dotenv from 'dotenv';
import { dbConnection } from "./database/dbConnection.js";
import { errorMiddleware } from "./error/error.js";
import reservationRouter from "./routes/reservationRoute.js";

const app = express();
dotenv.config({ path: "./config/.env" });

// CORS middleware setup
app.use(cors({
origin: [process.env.FRONTENDURL], // Ensure FRONTENDURL is set to 'http://localhost:5173'
methods: ["GET", "POST", "OPTIONS"], // OPTIONS is necessary for preflight
credentials: true,
}));

// Middleware for parsing JSON and URL-encoded data
app.use(express.json());
app.use(express.urlencoded({ extended: true }));

// Database connection
dbConnection();

// Routes and error middleware
app.use("/api/v1/reservation", reservationRouter);
app.use(errorMiddleware);

export default app;
71 changes: 71 additions & 0 deletions Mern_Project/Backend/controller/reservation.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
// import ErrorHandler from "../error/error.js";
// import {Reservation} from "../models/reservationSchema.js";

// export const sendReservation = async(req, res, next )=> {
// const { firstName, lastName, email, phone, date ,time} = req.body;
// if (!firstName || !lastName || !email || !phone || !date || !time) {
// return next(new ErrorHandler("Please fill full reservation form!", 400));
// }
// try{
// await Reservation.create({ firstName, lastName, email, phone, date, time });
// res.status(200).
// json({
// success: true,
// message: "Reservation sent Succesfully!",
// });
// }catch (error){
// if (error.name == "ValidationError"){
// const validationErrors = Object.values(error.errors).map((err) => err.message);
// return next(new ErrorHandler(validationErrors.join(" , "), 400));
// }
// return next(error);
// }
// };
import ErrorHandler from "../error/error.js";
import { Reservation } from "../models/reservationSchema.js";

export const sendReservation = async (req, res, next) => {
const { firstName, lastName, email, phone, date, time } = req.body;

const missingFields = [];

if (!firstName) missingFields.push("firstName");
if (!lastName) missingFields.push("lastName");
if (!email) missingFields.push("email");
if (!phone) missingFields.push("phone");
if (!date) missingFields.push("date");
if (!time) missingFields.push("time");

// If there are missing fields, return an error
if (missingFields.length > 0) {
return res.status(400).json({
success: false,
message: `Please fill the following fields: ${missingFields.join(", ")}`
});
}

try {
await Reservation.create({ firstName, lastName, email, phone, date, time });
return res.status(200).json({
success: true,
message: "Reservation sent successfully!"
});
} catch (error) {
// Handle Mongoose validation errors
if (error.name === "ValidationError") {
const validationErrors = Object.values(error.errors).map(err => err.message);
return res.status(400).json({
success: false,
message: validationErrors.join(", ")
});
}

// Log unexpected errors to the terminal
console.error("Unexpected Error:", error);

return res.status(500).json({
success: false,
message: "Internal server error!"
});
}
};
26 changes: 26 additions & 0 deletions Mern_Project/Backend/database/dbConnection.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
import mongoose from "mongoose";

// export const dbConnection = ()=>{
// mongoose
// .connect(process.env.MONGO_URI,{
// dbName: "RESTAURANT",
// })
// .then(()=>{
// console.log("Connected to database is Successful");
// })
// .catch((err)=>{
// console.log(`Some error occured while connecting to Database! ${err}`);
// });
// };

export const dbConnection = async () => {
try {
await mongoose.connect(process.env.MONGO_URI, {
dbName: "RESTAURANT",
});
console.log("Connected to database successfully");
} catch (err) {
console.error(`Error connecting to the database: ${err.message}`);
throw err; // Or handle it with your error middleware
}
};
44 changes: 44 additions & 0 deletions Mern_Project/Backend/error/error.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
// class ErrorHandler extends Error{
// constructor(message, statusCode){
// super(message);
// this.statusCode =statusCode;
// }
// }

// export const errorMiddleware = (err, req, res, next) => {
// err.messsage = err.message || "Internal Server Error!";
// err.statusCode = err.statusCode || 500;

// return res.status(err.statusCode).json({
// success: false,
// message: err.message,
// });
// };

// export default ErrorHandler;
class ErrorHandler extends Error {
constructor(message, statusCode) {
super(message);
this.statusCode = statusCode;

// Capture the stack trace for debugging
Error.captureStackTrace(this, this.constructor);
}
}

export const errorMiddleware = (err, req, res, next) => {
// Ensure that error properties exist
err.message = err.message || "Internal Server Error!";
err.statusCode = err.statusCode || 500;

// Log the error for debugging (optional)
console.error("Error:", err);

// Return the error response
return res.status(err.statusCode).json({
success: false,
message: err.message,
});
};

export default ErrorHandler;
38 changes: 38 additions & 0 deletions Mern_Project/Backend/models/reservationSchema.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
import mongoose from "mongoose";
import validator from "validator";

const reservationSchema = new mongoose.Schema({
firstName:{
type: String,
required: true,
minLength: [3,"First name must contain at least 3 character !"],
maxLength: [30, "First name must not exceed 30 character! "],
},
lastName:{
type: String,
required: true,
minLength: [3,"Last name must contain at least 3 character !"],
maxLength: [30, "Last name must not exceed 30 character! "],
},
email:{
type: String,
required: true,
validate: [validator.isEmail,"Provide a valid email!"],
},
phone:{
type: String,
required: true,
minLength: [10,"Phone number must contain only 10 digits!"],
maxLength: [10,"Phone number must contain only 10 digits!"],
},
time:{
type:String,
required :true,
},
date:{
type: Date,
required: true,
}
});

export const Reservation = mongoose.model ("Reservation", reservationSchema);
16 changes: 16 additions & 0 deletions Mern_Project/Backend/node_modules/.bin/mime

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

17 changes: 17 additions & 0 deletions Mern_Project/Backend/node_modules/.bin/mime.cmd

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

28 changes: 28 additions & 0 deletions Mern_Project/Backend/node_modules/.bin/mime.ps1

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading