From 980d09b0d264284c63db83e5df41a06c88d80219 Mon Sep 17 00:00:00 2001 From: Taranpreet Kaur <141022139+Taranpreet10451@users.noreply.github.com> Date: Mon, 24 Jun 2024 13:25:51 +0530 Subject: [PATCH 1/5] Adding Public Review Completed the task. --- server/controllers/canteenController.js | 80 ++++++++++ server/models/feedback.js | 12 ++ server/routes/canteen.js | 3 +- src/App.css | 49 ++++++ src/components/Feedback.jsx | 49 ++++++ src/pages/Home.jsx | 10 ++ src/pages/MenuPage.jsx | 202 +++++++++++++++++++----- 7 files changed, 368 insertions(+), 37 deletions(-) create mode 100644 server/models/feedback.js create mode 100644 src/components/Feedback.jsx diff --git a/server/controllers/canteenController.js b/server/controllers/canteenController.js index e36b07c..793f7ab 100644 --- a/server/controllers/canteenController.js +++ b/server/controllers/canteenController.js @@ -3,6 +3,11 @@ const Breakfast = require('../models/breakfast'); const Lunch = require('../models/lunch'); const Dinner = require('../models/dinner'); const Canteen = require("../models/canteenLoginInfo"); +<<<<<<< Updated upstream +======= +const Feedback = require("../models/feedback") +const Session = require("../models/session") +>>>>>>> Stashed changes const { uploader } = require('../config/cloudinaryConfig'); @@ -43,6 +48,76 @@ const getBreakfast = async(req , res , next) =>{ res.status(500).json({success : false , error : error}); } } +const feedback = async (req, res) => { + const { canteenId, feedback, rating } = req.body; + const token = req.body.studentId; // This is the token + + try { + // Find the session with the given token + const session = await Session.findOne({ token }); + + if (!session) { + return res.status(404).json({ message: 'Session not found' }); + } + + const userId = session.userId; // Extract userId from the session + + const newFeedback = new Feedback({ + canteen: canteenId, + student: userId, + comment: feedback, + rating: rating, + }); + + const savedFeedback = await newFeedback.save(); + res.status(201).json(savedFeedback); + } catch (error) { + res.status(500).json({ message: 'Error saving feedback', error: error.message }); + } +}; +const canteenFeedbackRender = async (req, res) => { + try { + const reviews = await Feedback.aggregate([ + { $sample: { size: 3 } }, // Fetch 3 random feedback entries + { + $lookup: { + from: 'students', // Collection name for students + localField: 'student', + foreignField: '_id', + as: 'studentInfo' + } + }, + { + $lookup: { + from: 'canteens', // Collection name for canteens + localField: 'canteen', + foreignField: '_id', + as: 'canteenInfo' + } + }, + { + $addFields: { + studentName: { $arrayElemAt: ['$studentInfo.name', 0] }, + canteenName: { $arrayElemAt: ['$canteenInfo.name', 0] } + } + }, + { + $project: { + _id: 1, + comment: 1, + rating: 1, + createdAt: 1, + studentName: 1, + canteenName: 1 + } + } + ]); + + res.json(reviews); + } catch (error) { + res.status(500).json({ message: error.message }); + } +}; const getLunch = async(req , res , next) =>{ @@ -297,4 +372,9 @@ module.exports = { updateBreakfastDish, updateLunchDish, updateDinnerDish, +<<<<<<< Updated upstream +======= + feedback, + canteenFeedbackRender +>>>>>>> Stashed changes }; diff --git a/server/models/feedback.js b/server/models/feedback.js new file mode 100644 index 0000000..d30298a --- /dev/null +++ b/server/models/feedback.js @@ -0,0 +1,12 @@ +const mongoose = require('mongoose'); + +const feedbackSchema = new mongoose.Schema({ + student: { type: mongoose.Schema.Types.ObjectId, ref: 'Student' }, + canteen: { type: mongoose.Schema.Types.ObjectId, ref: 'Canteen' }, + comment: String, + rating: Number, + createdAt: { type: Date, default: Date.now } +}); + +const Feedback = mongoose.model('Feedback', feedbackSchema); +module.exports = Feedback; diff --git a/server/routes/canteen.js b/server/routes/canteen.js index 83e6242..75097b3 100644 --- a/server/routes/canteen.js +++ b/server/routes/canteen.js @@ -7,7 +7,8 @@ const { auth, isCanteen } = require('../middlewares/auth'); const multerUploads = require('../middleware/multer.middleware'); router.get('/getcanteen' , canteenController.getAllCanteen); - +router.post("/feedback", canteenController.feedback) +router.get("/reviews", canteenController.canteenFeedbackRender) //yeh mere routes router.get('/:id/breakfast' , canteenController.getBreakfast); diff --git a/src/App.css b/src/App.css index 3464378..95be599 100644 --- a/src/App.css +++ b/src/App.css @@ -42,4 +42,53 @@ li:hover span { .nav-item{ font-size: 52px !important; +<<<<<<< Updated upstream +======= +} + +.star-rating { + display: flex; + flex-direction: row; +} + +.star { + font-size: 2rem; + color: #d3d3d3; + background: none; + border: none; + cursor: pointer; + transition: color 0.2s; +} + +.star.on { + color: #ffc107; +} + +.star.off { + color: #d3d3d3; +} +.reviews-container{ + display: flex; + flex-direction: row; + justify-content: space-around; + +} +.review-card{ + width: calc(90vw/3); + border: 1px solid green; + background-color: white; + background-color: aquamarine; +} +.stdfeedback{ + background-color: white; + padding: 2% 3%; +} +.stdname{ + margin: 2% 3%; +} + +.stars { + color: yellow; + font-size: 24px; /* Increase the font size to make the stars bigger */ +>>>>>>> Stashed changes } \ No newline at end of file diff --git a/src/components/Feedback.jsx b/src/components/Feedback.jsx new file mode 100644 index 0000000..0d3121c --- /dev/null +++ b/src/components/Feedback.jsx @@ -0,0 +1,49 @@ +import React, { useEffect, useState } from 'react'; +import axios from 'axios'; + +const Reviews = () => { + const [reviews, setReviews] = useState([]); + + useEffect(() => { + const fetchReviews = async () => { + try { + const response = await axios.get(`${process.env.REACT_APP_BASE_URL}/reviews`); // Adjust URL based on your backend route + setReviews(response.data); + } catch (error) { + console.error('Error fetching reviews:', error); + } + }; + + fetchReviews(); + }, []); + + const renderStars = (rating) => { + const totalStars = 5; + const filledStars = '★'.repeat(rating); + const emptyStars = '☆'.repeat(totalStars - rating); + return ( + + {filledStars} + {emptyStars} + + ); + }; + + return ( +
+ {reviews.map(review => ( +
+

{review.studentName}

+
+

Rating: {renderStars(review.rating)}

+

{review.comment}

+

Canteen: {review.canteenName}

+

{new Date(review.createdAt).toLocaleString()}

+
+
+ ))} +
+ ); +}; + +export default Reviews; diff --git a/src/pages/Home.jsx b/src/pages/Home.jsx index 95f0de0..57de9ab 100644 --- a/src/pages/Home.jsx +++ b/src/pages/Home.jsx @@ -10,6 +10,10 @@ import Footer from "../components/Footer"; import FloatBtn from "../components/FloatBtn/FloatBtn"; import { useAuth } from "../authContext"; import { useNavigate } from "react-router-dom"; +<<<<<<< Updated upstream +======= +import Reviews from "../components/Feedback"; +>>>>>>> Stashed changes function Home() { const navigate = useNavigate(); @@ -84,6 +88,12 @@ function Home() {
+<<<<<<< Updated upstream +======= +
+ +
+>>>>>>> Stashed changes