Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Added Backend Route for Café Reservation Form and .env Configuration #42

Merged
merged 19 commits into from
Oct 3, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
19 commits
Select commit Hold shift + click to select a range
db7237b
Added backend form submission for Reservation
samar12-rad Oct 2, 2024
8b7f3b4
Merge branch 'main' of https://github.com/samar12-rad/PlayCafe into r…
samar12-rad Oct 2, 2024
1834450
Tried to fix deployement issues
samar12-rad Oct 3, 2024
13ca5e7
Fixed package.json
samar12-rad Oct 3, 2024
9c4027e
Setup backend with mvc architechture added proper routing
samar12-rad Oct 3, 2024
1fd66bf
restructured
samar12-rad Oct 3, 2024
39dc5ab
Merge branch 'main' of samar12-rad/PlayCafe into Backend-Restructuring
samar12-rad Oct 3, 2024
4af9a60
Setup backend with mvc architechture added proper routing
samar12-rad Oct 3, 2024
5bf789d
Setup backend with mvc architechture added proper routing
samar12-rad Oct 3, 2024
269fcc0
Setup backend with mvc architechture added proper routing for future
samar12-rad Oct 3, 2024
51f78ac
Removed env mongo signature
samar12-rad Oct 3, 2024
367a8f4
resolved gitrrabit conflicts
samar12-rad Oct 3, 2024
ab8d55e
resolved gitrrabit in index.js
samar12-rad Oct 3, 2024
35d21d2
Merge branch 'main' of https://github.com/samar12-rad/PlayCafe into B…
samar12-rad Oct 3, 2024
4a71b38
added env.example
samar12-rad Oct 3, 2024
3a45128
Merge branch 'main' of https://github.com/samar12-rad/PlayCafe into r…
samar12-rad Oct 3, 2024
4d880aa
Merge branch 'Backend' of https://github.com/samar12-rad/PlayCafe int…
samar12-rad Oct 3, 2024
888aa5c
Made reservation portal which stores reservation data in backend
samar12-rad Oct 3, 2024
1271b72
removed .env, added .env.example
samar12-rad Oct 3, 2024
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions backend/.env
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
MONGO_URI=mongodb+srv://vsamarth1212:[email protected]/
1 change: 1 addition & 0 deletions backend/.env.exapmle
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
MONGO_URI=enter_your_mongo_uri
2 changes: 1 addition & 1 deletion backend/.gitignore
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
node_modules
dist
.env

package-lock.json
42 changes: 42 additions & 0 deletions backend/controller/reservation.controller.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
const { z } = require("zod");
const Reservation = require("../models/reservation.model");

// Define the Zod schema for reservation validation
const reservationSchema = z.object({
guests: z.string(),
date: z.string(),
time: z.string(),
});
RamakrushnaBiswal marked this conversation as resolved.
Show resolved Hide resolved

async function createReservation(req, res) {
try {
const validationResult = reservationSchema.safeParse(req.body);

if (!validationResult.success) {
console.error("Validation error:", validationResult.error.errors);
return res.status(400).json({
success: false,
message: "Validation failed",
errors: validationResult.error.errors,
});
}

const reservation = await Reservation.create(validationResult.data);
RamakrushnaBiswal marked this conversation as resolved.
Show resolved Hide resolved

res.status(201).json({
success: true,
message: "Reservation created successfully",
data: reservation,
});
} catch (error) {
console.error("Error creating reservation:", error);
res.status(500).json({
success: false,
message: "An error occurred while creating the reservation",
});
}
RamakrushnaBiswal marked this conversation as resolved.
Show resolved Hide resolved
}

module.exports = {
createReservation,
};
RamakrushnaBiswal marked this conversation as resolved.
Show resolved Hide resolved
30 changes: 28 additions & 2 deletions backend/index.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,32 @@
const express = require("express");
const cors = require("cors");
const app = express();
const port = 3000;
require("dotenv").config();
const mongoose = require("mongoose");

app.get("/", (req, res) => res.send("Hello World!"));
app.listen(port, () => console.log(`Example app listening on port ${port}!`));
app.use(
cors({
origin: ["http://localhost:5173", "https://play-cafe.vercel.app"],
})
);

app.use(express.json());

mongoose
.connect(process.env.MONGO_URI, {
useNewUrlParser: true,
useUnifiedTopology: true,
})
.then(() => {
console.log("Connected to MongoDB");
})
.catch((error) => {
console.error("Database connection failed:", error.message);
console.error(error.stack);
process.exit(1);
});

app.use("/api", require("./routes/index"));

app.listen(port, () => console.log(`Server is running on port ${port}!`));
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🛠️ Refactor suggestion

Make the server port configurable via environment variables

Currently, the server port is hardcoded to 3000. To allow greater flexibility and ease of deployment across different environments, consider using an environment variable for the port number.

Apply this diff to make the port configurable:

-const port = 3000;
+const port = process.env.PORT || 3000;

 app.listen(port, () => console.log(`Server is running on port ${port}!`));

Committable suggestion was skipped due to low confidence.

21 changes: 21 additions & 0 deletions backend/models/reservation.model.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
const mongoose = require("mongoose");
const Schema = mongoose.Schema;

const reservationSchema = new Schema({
guests: {
type: String,
required: true,
},
date: {
type: String,
required: true,
},
time: {
type: String,
required: true,
},
});

const Reservation = mongoose.model("Reservation", reservationSchema);

module.exports = Reservation;
10 changes: 9 additions & 1 deletion backend/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,21 @@
"version": "1.0.0",
"main": "index.js",
"scripts": {
"start": "nodemon index.js",
Copy link
Contributor

@coderabbitai coderabbitai bot Oct 3, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🛠️ Refactor suggestion

Consider adding separate scripts for development and production

While using nodemon for auto-reloading during development is great, it's not typically used in production. Consider adding separate scripts for development and production:

 "scripts": {
-    "start": "nodemon index.js",
+    "start": "node index.js",
+    "dev": "nodemon index.js",
     "test": "echo \"Error: no test specified\" && exit 1"
 },

This way, npm start can be used for production, and npm run dev for development with auto-reloading.

📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
"start": "nodemon index.js",
"start": "node index.js",
"dev": "nodemon index.js",

Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@samar12-rad
add this
"start": "node index.js",
"dev": "nodemon index.js",

other wise give error while deploying

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Seems like the humans are having a chat. I'll hop back into my burrow for now. If you need me again, just tag @coderabbitai in a new comment, and I'll come hopping out!

"test": "echo \"Error: no test specified\" && exit 1"
},
"keywords": [],
"author": "",
"license": "ISC",
"description": "",
"dependencies": {
"express": "^4.21.0"
"cors": "^2.8.5",
"dotenv": "^16.4.5",
"express": "^4.21.0",
RamakrushnaBiswal marked this conversation as resolved.
Show resolved Hide resolved
"mongoose": "^8.7.0",
"zod": "^3.23.8"
},
"devDependencies": {
"nodemon": "^3.1.7"
RamakrushnaBiswal marked this conversation as resolved.
Show resolved Hide resolved
}
}
18 changes: 18 additions & 0 deletions backend/routes/index.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
const express = require("express");
const Reservation = require("../models/reservation.model");

const router = express.Router();

router.use("/reservation", require("./reservationRouter"));
router.get("/", (req, res) => {
res.json({
message: "Welcome to the restaurant API!",
version: "1.0.0",
endpoints: {
Reservation: "/reservation",
},
documentation: "https://api-docs-url.com",
});
});

module.exports = router;
17 changes: 17 additions & 0 deletions backend/routes/reservationRouter.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
const express = require("express");
const { createReservation } = require("../controller/reservation.controller");
const router = express.Router();

router.post("/create", createReservation);
router.get("/", (req, res) => {
res.json({
message: "Welcome to the restaurant reservation API!",
version: "1.0.0",
endpoints: {
createReservation: "/create [POST]",
},
documentation: "https://api-docs-url.com",
});
});

module.exports = router;
1 change: 1 addition & 0 deletions frontend/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
"@splidejs/splide": "^4.1.4",
"@splidejs/splide-extension-auto-scroll": "^0.5.3",
"autoprefixer": "^10.4.19",
"axios": "^1.7.7",
"clsx": "^2.1.1",
"framer-motion": "^11.5.6",
"react": "^18.3.1",
Expand Down
42 changes: 39 additions & 3 deletions frontend/src/components/Pages/Register.jsx
Original file line number Diff line number Diff line change
@@ -1,10 +1,36 @@
import { useState } from "react";
import pic from "../../assets/img/abt1.jpg";
import pic2 from "../../assets/img/abt1.png";
import pic3 from "../../assets/img/abt2.png";
import pic4 from "../../assets/img/abt3.png";
import pic5 from "../../assets/img/abt4.png";

export default function Register() {
const [date, setDate] = useState("");
const [time, setTime] = useState("");
const [guests, setGuests] = useState();

const handleSubmit = (e) => {
console.log(guests);
console.log(time);
console.log(date);
e.preventDefault();
fetch("http://localhost:3000/api/reservation/create", {
method: "POST",
headers: {
"Content-Type": "application/json",
},
body: JSON.stringify({
guests,
date,
time,
}),
})
.then((res) => res.json())
.then((data) => console.log(data))
.catch((error) => console.log(error));
};
RamakrushnaBiswal marked this conversation as resolved.
Show resolved Hide resolved

return (
<>
<div className="w-full mx-auto mt-10 lg:mt-0 md:mt-0">
Expand Down Expand Up @@ -46,6 +72,9 @@ export default function Register() {
</label>
<select
id="guests"
onChange={(e) => {
setGuests(e.target.value);
}}
className="flex h-10 w-full items-center rounded-md border border-input bg-background px-3 py-2 text-sm ring-offset-background placeholder:text-muted-foreground focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50"
>
<option value="">Select number of guests</option>
Expand All @@ -67,7 +96,10 @@ export default function Register() {
<input
type="date"
id="date"
className="flex h-10 w-full items-center rounded-md border border-input bg-white px-3 py-2 text-sm ring-offset-background placeholder:text-muted-foreground focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50"
onChange={(e) => {
setDate(e.target.value);
}}
className="flex h-10 w-full items-center rounded-md border border-input bg-background px-3 py-2 text-sm ring-offset-background placeholder:text-muted-foreground focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50"
/>
</div>
</div>
Expand All @@ -80,6 +112,9 @@ export default function Register() {
</label>
<select
id="time"
onChange={(e) => {
setTime(e.target.value);
}}
className="flex h-10 w-full items-center rounded-md border border-input bg-background px-3 py-2 text-sm ring-offset-background placeholder:text-muted-foreground focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50"
>
<option value="">Select time</option>
Expand All @@ -93,6 +128,7 @@ export default function Register() {
<button
className="inline-flex items-center justify-center p-4 bg-[#D9D9D9] hover:bg-[#C9C9C9]"
type="submit"
onClick={handleSubmit}
>
Reserve Now
</button>
Expand All @@ -101,8 +137,8 @@ export default function Register() {
</div>
</section>
<h1 className="text-3xl sm:text-4xl md:text-5xl lg:text-6xl font-bold tracking-tighter text-amber-100 bg-green-900 p-5 text-center">
Popular Board Games
</h1>
Popular Board Games
</h1>
<div className="mt-8 w-full flex justify-center bg-white ">
<div className="grid grid-cols-1 sm:grid-cols-2 md:grid-cols-3 gap-4 mt-8 mb-10">
<div
Expand Down
Loading