Skip to content
Merged
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
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 0 additions & 2 deletions backend/package-lock.json

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

45 changes: 28 additions & 17 deletions backend/src/controllers/authController.ts
Original file line number Diff line number Diff line change
@@ -1,14 +1,14 @@
import type { Request, Response, NextFunction } from "express";
import bcrypt from "bcryptjs";
import User, { type IUser } from "../models/userModel.js";
import User, { type IUser } from "../models/userModel.js";
import { generateToken } from "../utils/generateToken.js";
import { userSchema, loginSchema } from "../utils/validateInputs.js";
import dotenv from "dotenv";

dotenv.config();
const asTypedUser = (user: any): IUser & { _id: string } => user as IUser & { _id: string };

//signup controller
// ✅ SIGNUP CONTROLLER
export const registerUser = async (req: Request, res: Response, next: NextFunction) => {
try {
const parseResult = userSchema.safeParse(req.body);
Expand All @@ -19,10 +19,15 @@ export const registerUser = async (req: Request, res: Response, next: NextFuncti
});
}

const { name, email, password } = parseResult.data;
const { email, password } = parseResult.data;

// ✅ Auto-derive name from email
const name = email.split("@")[0];

const existingUser = await User.findOne({ email });
if (existingUser)
if (existingUser) {
return res.status(400).json({ success: false, message: "Email already registered" });
}

const hashedPassword = await bcrypt.hash(password, 10);
const newUser = await User.create({ name, email, password: hashedPassword });
Expand All @@ -38,7 +43,7 @@ export const registerUser = async (req: Request, res: Response, next: NextFuncti
}
};

//sign in controller
// ✅ LOGIN CONTROLLER (same as before)
export const loginUser = async (req: Request, res: Response, next: NextFunction) => {
try {
const parseResult = loginSchema.safeParse(req.body);
Expand All @@ -53,6 +58,7 @@ export const loginUser = async (req: Request, res: Response, next: NextFunction)
const foundUser = await User.findOne({ email });
if (!foundUser)
return res.status(400).json({ success: false, message: "Invalid credentials" });

if (!foundUser.password || foundUser.password === "") {
return res.status(400).json({
success: false,
Expand All @@ -76,22 +82,27 @@ export const loginUser = async (req: Request, res: Response, next: NextFunction)
}
};

//OAuth callback handler
export const oauthCallback = (req: Request & { user?: any }, res: Response) => {
// ✅ GET PROFILE CONTROLLER (unchanged)
export const getUserProfile = async (req: Request, res: Response) => {
try {
const frontendUrl = process.env.FRONTEND_URL || "http://localhost:5173";
const user = req.user as IUser & { _id: string } | undefined;
const user = await User.findById(req.userId).select("-password");

if (!user) {
return res.redirect(`${frontendUrl}/signin?error=oauth_failed`);
return res.status(404).json({
success: false,
message: "User not found",
});
}

const token = generateToken(user._id.toString());
const redirectUrl = `${frontendUrl}/oauth-success#token=${token}`;

return res.redirect(redirectUrl);
} catch (err) {
const frontendUrl = process.env.FRONTEND_URL || "http://localhost:5173";
return res.redirect(`${frontendUrl}/signin?error=server_error`);
res.status(200).json({
success: true,
user,
});
} catch (error) {
console.error(error);
res.status(500).json({
success: false,
message: "Server error",
});
}
};
4 changes: 3 additions & 1 deletion backend/src/routes/authRoutes.ts
Original file line number Diff line number Diff line change
@@ -1,11 +1,13 @@
import express from "express";
import { registerUser, loginUser, oauthCallback } from "../controllers/authController.js";
import { registerUser, loginUser, getUserProfile } from "../controllers/authController.js";
import passport from "passport";
import { protect } from "../middleware/authMiddleware.js";

const router = express.Router();

router.post("/signup", registerUser);
router.post("/signin", loginUser);
router.get("/me", protect, getUserProfile);

// Google OAuth
router.get(
Expand Down
Loading
Loading