diff --git a/server/config/passport.js b/server/config/passport.js new file mode 100644 index 0000000..e50b0ce --- /dev/null +++ b/server/config/passport.js @@ -0,0 +1,40 @@ +const passport = require('passport'); +const GoogleStrategy = require('passport-google-oauth20').Strategy; +const User = require('../models/studentLoginInfo'); +const Canteen = require('../models/canteenLoginInfo'); + +passport.use(new GoogleStrategy({ + clientID: process.env.GOOGLE_CLIENT_ID, + clientSecret: process.env.GOOGLE_CLIENT_SECRET, + callbackURL: '/auth/google/callback' +}, +async (accessToken, refreshToken, profile, done) => { + try { + let user = await User.findOne({ googleId: profile.id }); + if (!user) { + user = await User.create({ + googleId: profile.id, + name: profile.displayName, + email: profile.emails[0].value, + }); + } + return done(null, user); + } catch (error) { + return done(error, null); + } +})); + +passport.serializeUser((user, done) => { + done(null, user.id); +}); + +passport.deserializeUser(async (id, done) => { + try { + const user = await User.findById(id); + done(null, user); + } catch (error) { + done(error, null); + } +}); + +module.exports = passport; diff --git a/server/controllers/Auth.js b/server/controllers/Auth.js index 124011e..ec26468 100644 --- a/server/controllers/Auth.js +++ b/server/controllers/Auth.js @@ -18,8 +18,7 @@ exports.studentSignup = async (req, res) => { console.log("This is jwt", process.env.JWT_SECRET); try { console.log(req.body); - const { name, email, collegeName, accountType, password, confirmPassword } = - await req.body; + const { name, email, collegeName, accountType, password, confirmPassword } = req.body; if (password !== confirmPassword) { return res.status(400).json({ @@ -28,14 +27,12 @@ exports.studentSignup = async (req, res) => { }); } - const existingUser = await User.findOne({ - email, - }); + const existingUser = await User.findOne({ email }); if (existingUser) { return res.status(400).json({ success: false, - message: "User alredy exist", + message: "User already exists", }); } @@ -59,17 +56,42 @@ exports.studentSignup = async (req, res) => { password: hashedPassword, }); - await user.save(); + const payload = { + email: user.email, + id: user._id, + accountType: user.accountType, + }; + + let token = jwt.sign(payload, process.env.JWT_SECRET, { + expiresIn: "2h", + }); + + // creating a session + const session = new Session({ + userId: user._id, + token, + }); + await session.save(); + + user.password = undefined; + + res.cookie("token", token, { + httpOnly: true, + secure: true, + maxAge: 3600000, + }); return res.status(200).json({ success: true, - message: "User created succesfully", + message: "User created successfully", + token, + user, }); } catch (error) { console.error(error); return res.status(500).json({ success: false, - message: "USer can not be registred", + message: "User cannot be registered", }); } }; diff --git a/src/App.js b/src/App.js index 87fc149..7d628c2 100644 --- a/src/App.js +++ b/src/App.js @@ -1,6 +1,6 @@ import React from 'react'; import './App.css'; -import { Route, Routes } from 'react-router-dom'; +import { Route, Routes, Navigate } from 'react-router-dom'; import Home from './pages/Home'; import Login from './pages/Login'; import Signup from './pages/Signup'; @@ -14,13 +14,9 @@ import Loader from './components/Loader/Loader'; import ForgotPassword from './pages/ForgotPassword'; import ResetPassword from './pages/ResetPassword'; import { ThemeProvider } from './themeContext'; - import ContactUs from './pages/ContactUs'; - -import { AuthProvider } from './authContext' import EditProfile from './pages/EditProfile'; - const Layout = ({ children }) => { return (
@@ -30,32 +26,78 @@ const Layout = ({ children }) => { }; function App() { + const usertoken = localStorage.getItem('usertoken'); + const token = localStorage.getItem('token'); + const canteenId = localStorage.getItem('canteenId'); + const hasAnyToken = token || usertoken; + + // Check if either token is undefined and redirect to login if true + if (usertoken === undefined || token === undefined) { + localStorage.removeItem('usertoken'); + localStorage.removeItem('token'); + window.location.href = "/login"; // Redirect to login page + return null; // Render nothing else + } + return ( -
} /> - } /> + } /> + } /> } /> } /> } /> - } /> - } /> + {token ? ( + } /> + ) : ( + } /> + )} + + {token ? ( + } /> + ) : ( + } /> + )} + + {usertoken ? ( + } /> + ) : ( + } /> + )} + + {usertoken ? ( + } /> + ) : ( + } /> + )} + + {hasAnyToken ? ( + } /> + ) : ( + : } /> + )} + + {hasAnyToken ? ( + } /> + ) : ( + : } /> + )} + + {hasAnyToken ? ( + } /> + ) : ( + : } /> + )} - } /> - } /> - } /> - } /> - } /> } /> - } /> + } />
-
); } diff --git a/src/components/Modal.js b/src/components/Modal.js new file mode 100644 index 0000000..6602334 --- /dev/null +++ b/src/components/Modal.js @@ -0,0 +1,24 @@ +// Modal.js +import React from 'react'; + +const Modal = ({ show, onClose, children }) => { + if (!show) { + return null; + } + + return ( +
+
+ + {children} +
+
+ ); +}; + +export default Modal; diff --git a/src/pages/About.jsx b/src/pages/About.jsx index d7d3478..01948b4 100644 --- a/src/pages/About.jsx +++ b/src/pages/About.jsx @@ -11,7 +11,7 @@ import { useNavigate } from "react-router-dom"; const About = () => { const navigate = useNavigate() - const { isAuthenticated } = localStorage.getItem('token'); + // const { isAuthenticated } = localStorage.getItem('token'); const [loading,setLoading] = useState(false); useEffect(() => { diff --git a/src/pages/Login.jsx b/src/pages/Login.jsx index e501bf5..81a7c11 100644 --- a/src/pages/Login.jsx +++ b/src/pages/Login.jsx @@ -56,12 +56,11 @@ function Login() { async function submitHandler(event) { event.preventDefault(); - // const apiUrl = - // formData.accountType === "User" - // ? `${process.env.REACT_APP_BASE_URL}/studentLogin` - // : `${process.env.REACT_APP_BASE_URL}/canteenLogin`; + const apiUrl = + formData.accountType === "User" + ? `${process.env.REACT_APP_BASE_URL}/studentLogin` + : `${process.env.REACT_APP_BASE_URL}/canteenLogin`; - const apiUrl = 'http://localhost:8000/api/v1/studentLogin' try { const response = await axios.post(apiUrl, formData); @@ -75,14 +74,16 @@ function Login() { } if (formData.accountType === "User") { - - navigate("/home"); - localStorage.setItem("token", response.data.token); + localStorage.setItem("usertoken", response.data.token) + window.location.href='/home' + + + } else { localStorage.setItem("canteenId", response.data.cantId); localStorage.setItem("token", response.data.token); - navigate(`/section/${response.data.cantId}`); + window.location.href=`/section/${response.data.cantId}`; } diff --git a/src/pages/News.jsx b/src/pages/News.jsx index 8399b3b..93fe3c8 100644 --- a/src/pages/News.jsx +++ b/src/pages/News.jsx @@ -12,11 +12,7 @@ function News() { const [articles, setArticles] = useState([]); const [loading, setLoading] = useState(false); - useEffect(() => { - if(!isAuthenticated){ - navigate('/') - } - }, []) + const fetchNews = async (query) => { try { diff --git a/src/pages/Signup.jsx b/src/pages/Signup.jsx index c2ace93..527b9b3 100644 --- a/src/pages/Signup.jsx +++ b/src/pages/Signup.jsx @@ -73,12 +73,14 @@ function Signup() { toast.success("Account Created Successfully!"); if (formData.accountType === "User") { - navigate("/"); - } else { - const token = response.data.token; - localStorage.setItem("token", token); - localStorage.setItem("canteenId", response.data.cantId); - navigate(`/section/${response.data.cantId}`); + localStorage.setItem("usertoken", response.data.token); + window.location.href="/home"; + } + if (formData.accountType === "Canteen") { + localStorage.setItem("userId", response.data.user); + localStorage.setItem("token", response.data.token); + window.location.href=`/section/${response.data.cantId}`; + } } catch (error) { const errorMessage = error.response?.data?.message || "Failed to create account. Please try again.";