const express = require("express"); const mongoose = require("mongoose"); const cors = require("cors"); const session = require("express-session"); const passport = require("passport"); const bodyParser = require("body-parser"); const path = require("path"); const bcrypt = require("bcryptjs"); require("dotenv").config(); // Import Routes const authRoutes = require("./routes/authRoutes"); const courseRoutes = require("./routes/courseRoutes"); const facultyRoutes = require("./routes/facultyRoutes"); const appointmentRoutes = require("./routes/appointmentRoutes"); const optionsRoutes = require("./routes/optionsRoutes"); // MongoDB Connection mongoose .connect(process.env.mongoURI, { useNewUrlParser: true, useUnifiedTopology: true }) .then(() => console.log("MongoDB connected")) .catch((err) => { console.error("MongoDB connection error:", err); process.exit(1); // Exit the app if the database connection fails }); // Initialize App const app = express(); const PORT = 8080; // Middleware app.use(cors({ origin: "http://localhost:3000", credentials: true })); app.use(express.json()); app.use(bodyParser.urlencoded({ extended: true })); app.use( session({ secret: "secret", // This can be replaced with another secret from .env if required resave: false, saveUninitialized: false, }) ); app.use(passport.initialize()); app.use(passport.session()); // Passport Config require("./config/passport"); // Routes app.use("/password", authRoutes); app.use("/api/courses", courseRoutes); app.use("/api/faculty", facultyRoutes); app.use("/api/appointments", appointmentRoutes); // Appointment route handles the updated structure app.use("/api/options", optionsRoutes); // Google OAuth Routes app.get( "/auth/google", passport.authenticate("google", { scope: ["profile", "email"] }) ); app.get( "/auth/google/callback", passport.authenticate("google", { failureRedirect: "/" }), (req, res) => { res.redirect("http://localhost:3000/Welcom"); // Redirect to a frontend route after successful login } ); // Local authentication routes (register and login) app.post("/api/register", async (req, res) => { try { const { username, email, password } = req.body; const hashedPassword = await bcrypt.hash(password, 10); let user = await User.findOne({ email }); if (user) { if (user.googleId && user.password) { return res.status(400).json({ message: "User already exists" }); } if (!user.googleId && user.password) { return res.status(400).json({ message: "User already exists" }); } if (user.googleId && !user.password) { user.password = hashedPassword; await user.save(); } } else { user = new User({ username, email, password: hashedPassword }); await user.save(); } req.login(user, (err) => { if (err) { console.error("Error logging in user after registration:", err); return res.status(500).send("Internal server error"); } return res.status(200).json({ message: "Registered and logged in successfully", user, }); }); } catch (error) { console.error("Error registering user:", error); res.status(400).send("Registration failed"); } }); app.post("/api/login", (req, res, next) => { passport.authenticate("local", (err, user, info) => { if (err) { return res.status(500).json({ message: "Internal server error" }); } if (!user) { return res.status(401).json({ message: "Incorrect email or password" }); } req.logIn(user, (err) => { if (err) { return res.status(500).json({ message: "Internal server error" }); } return res.status(200).json({ message: "Login successful", user }); }); })(req, res, next); }); app.get("/auth/logout", function (req, res) { req.logout((err) => { if (err) { console.log(err); return res.status(500).json({ message: "Error logging out" }); } req.session.destroy(function (err) { if (err) { console.log(err); return res.status(500).json({ message: "Error destroying session" }); } res.json({ message: "Logout successful" }); }); }); }); // User Profile Route app.get("/api/user/profile", async (req, res) => { try { if (req.user) { return res.json({ user: req.user }); } else { return res.status(401).json({ error: "Unauthorized" }); } } catch (error) { console.error("Error fetching user data:", error); res.status(500).json({ message: "Internal server error" }); } }); // Serve React Build Files app.use(express.static(path.join(__dirname, "../client/build"))); app.get("*", (req, res) => res.sendFile(path.join(__dirname, "../client/build/index.html")) ); // Error Handling Middleware app.use((err, req, res, next) => { console.error("Error:", err.stack); res.status(err.status || 500).json({ error: err.message || "Internal Server Error" }); }); // Start Server app.listen(PORT, () => { console.log(`Server is running at http://localhost:8080`); });