const express = require('express');
const router = express.Router();
const jwt = require('jsonwebtoken');
const bcrypt = require('bcrypt');
const zod = require('zod');
const { signUpBody, loginBody } = require('../types');
const { User } = require('../models/User');
const { fetchUser } = require('../controllers/fetchUser');
const { userAuth } = require('../middlewares/userAuth');
router.get('/me', userAuth, async (req, res) => {
try {
let user = await User.findOne({_id : req.userId}).select('-password');
if (user) {
res.status(200).json({user});
return;
} else {
res.json({message:"failed to fetch user"});
}
} catch (err) {
console.log(err);
res.json({message: "Api Call Failed"});
}
});
router.post('/signUp', async (req, res) => {
try {
const {success} = signUpBody.safeParse(req.body);
if (!success) {
res.json({message:"Invalid Details"});
return;
}
// checking for existing user
let userExists = await fetchUser(req.body.email);
if (userExists) {
res.json({message:"User already exists"});
return;
}
let { name, email, phone, password } = req.body;
let salt = await bcrypt.genSalt(10);
let hash = await bcrypt.hash(password, salt);
let createdUser = await User.create({
name,
email,
phone,
password: hash
})
if (createdUser) {
let userId = createdUser._id.toString();
let token = jwt.sign({
userId: userId
}, process.env.SECRET_KEY);
res.status(200).json({
message: "success",
token: token
});
} else {
console.log(createdUser);
res.json({message:"failed to create user"});
}
} catch (err) {
console.log(err);
res.json({message: "Api Call Failed"});
}
});
router.post('/signin', async (req, res) => {
try {
let {success} = loginBody.safeParse(req.body);
if (!success) {
res.json({message: "Invalid Credentials"});
return;
}
let userExists = await fetchUser(req.body.email);
if (!userExists) {
res.json({message: "User does not exist"});
return;
}
const checkPassword = await bcrypt.compare(req.body.password, userExists.password);
if (checkPassword) {
let token = jwt.sign({
userId: userExists._id,
}, process.env.SECRET_KEY);
return res.status(200).json({
message: "success",
token: token
})
} else {
return res.json({
message: "Password is incorrect"
})
}
} catch (err) {
console.log(err);
res.json({message: "Api Call Failed"});
}
});
router.put('/edit', userAuth, async (req, res) => {
try {
let edited = false;
let userId = req.userId;
if (req.body.name) {
await User.updateOne({_id: userId}, {name: req.body.name});
edited = true;
}
if (req.body.phone) {
await User.updateOne({_id: userId}, {phone: req.body.phone});
edited = true;
}
if (req.body.password) {
let password = req.body.password;
if (password.length >= 6) {
let salt = await bcrypt.genSalt(10);
let hash = await bcrypt.hash(password, salt);
await User.updateOne({_id: userId}, {password: hash});
edited = true;
} else {
res.json({message:"The password must be at least 6 characters"});
return;
}
}
if (edited) {
res.status(200).json({message:"Profile updated successfuly"});
} else {
res.json({message:"failed to update user"});
}
} catch (err) {
console.log(err);
res.json({message: "Api Call Failed"});
}
});
router.delete('/delete', userAuth, async (req, res) => {
try {
let userId = req.userId;
let {deletedCount} = await User.deleteOne({_id: userId});
if (deletedCount) {
res.status(200).json({message:"User deleted successfully"});
} else {
res.json({message: "failed to delete user"});
}
} catch (err) {
console.log(err);
res.json({message: "Api Call Failed"});
}
});
module.exports = router;