2024-08-27 08:37:01 +08:00
|
|
|
import User from "../models/User.js";
|
|
|
|
import bcrypt from "bcrypt";
|
|
|
|
import jwt from "jsonwebtoken";
|
|
|
|
import cloudinary from "cloudinary";
|
|
|
|
import multer from "multer";
|
|
|
|
import streamifier from "streamifier";
|
|
|
|
import DatauriParser from "datauri/parser.js";
|
|
|
|
import path from "path";
|
|
|
|
import axios from "axios";
|
|
|
|
/* READ */
|
|
|
|
|
|
|
|
cloudinary.config({
|
|
|
|
cloud_name: process.env.CLOUDINARY_CLOUD_NAME,
|
|
|
|
api_key: process.env.CLOUDINARY_API_KEY,
|
|
|
|
api_secret: process.env.CLOUDINARY_API_SECRET,
|
|
|
|
});
|
|
|
|
|
|
|
|
// Configure Multer middleware to handle file uploads
|
|
|
|
const upload = multer({
|
|
|
|
storage: multer.memoryStorage(),
|
|
|
|
limits: {
|
|
|
|
fileSize: 10 * 1024 * 1024, // 10 MB
|
|
|
|
},
|
|
|
|
});
|
|
|
|
|
|
|
|
export const getUsers = async (req, res, next) => {
|
|
|
|
try {
|
|
|
|
const users = await User.find();
|
|
|
|
res.status(200).json(users);
|
|
|
|
} catch (err) {
|
|
|
|
res.status(404).json({ message: err.message });
|
|
|
|
|
|
|
|
next(err);
|
|
|
|
}
|
|
|
|
};
|
|
|
|
export const getUser = async (req, res) => {
|
|
|
|
try {
|
|
|
|
const { id } = req.params;
|
|
|
|
const user = await User.findOne().or([
|
|
|
|
{ email: id },
|
|
|
|
{ phone: id },
|
|
|
|
{ username: id },
|
|
|
|
]);
|
|
|
|
if (user) {
|
|
|
|
res.status(200).json(user);
|
|
|
|
} else {
|
|
|
|
res.status(404).json({ message: "user not found" });
|
|
|
|
}
|
|
|
|
} catch (err) {
|
|
|
|
res.status(400).json({ message: err.message });
|
|
|
|
}
|
|
|
|
};
|
|
|
|
export const getUserId = async (req, res) => {
|
|
|
|
try {
|
|
|
|
const { id } = req.params;
|
|
|
|
const user = await User.findById(id);
|
|
|
|
if (user) {
|
|
|
|
res.status(200).json(user);
|
|
|
|
} else {
|
|
|
|
res.status(404).json({ message: "user not found" });
|
|
|
|
}
|
|
|
|
} catch (err) {
|
|
|
|
res.status(404).json({ message: err.message });
|
|
|
|
}
|
|
|
|
};
|
|
|
|
export const updateUser = async (req, res, next) => {
|
|
|
|
try {
|
|
|
|
const {
|
2024-08-30 16:35:49 +08:00
|
|
|
// fName,
|
|
|
|
// lName,
|
2024-08-27 08:37:01 +08:00
|
|
|
email,
|
2024-08-30 16:35:49 +08:00
|
|
|
// phone,
|
|
|
|
// address1,
|
|
|
|
// address2,
|
|
|
|
// city,
|
|
|
|
// province,
|
|
|
|
// country,
|
|
|
|
// zip,
|
|
|
|
// type,
|
|
|
|
// status,
|
|
|
|
// transactions,
|
2024-08-27 08:37:01 +08:00
|
|
|
} = req.body;
|
|
|
|
|
|
|
|
const emailTaken = await User.findOne({ email: email });
|
|
|
|
const phoneTaken = await User.findOne({ phone: phone });
|
|
|
|
|
|
|
|
let taken = false;
|
|
|
|
if (phoneTaken._id.toString().includes(req.params.id)) {
|
|
|
|
taken = false;
|
|
|
|
} else {
|
|
|
|
taken = true;
|
|
|
|
}
|
|
|
|
|
|
|
|
console.log(taken);
|
|
|
|
if (req.file) {
|
|
|
|
const extName = path.extname(req.file.originalname).toString();
|
|
|
|
const file64 = parser.format(extName, req.file.buffer);
|
|
|
|
const result = await cloudinary.uploader.upload(file64.content, {
|
|
|
|
folder: "obPayUserPhoto",
|
|
|
|
transformation: [{ width: 500, height: 500, crop: "limit" }],
|
|
|
|
});
|
|
|
|
if (!emailTaken && !taken) {
|
|
|
|
const newUser = {
|
2024-08-30 16:35:49 +08:00
|
|
|
// fName,
|
|
|
|
// lName,
|
2024-08-27 08:37:01 +08:00
|
|
|
email,
|
2024-08-30 16:35:49 +08:00
|
|
|
// phone,
|
|
|
|
// address1,
|
|
|
|
// address2,
|
|
|
|
// city,
|
|
|
|
// province,
|
|
|
|
// country,
|
|
|
|
// zip,
|
|
|
|
// type,
|
|
|
|
// status,
|
|
|
|
// transactions,
|
|
|
|
// photo: result.secure_url,
|
2024-08-27 08:37:01 +08:00
|
|
|
};
|
|
|
|
const updatedUser = await User.findByIdAndUpdate(
|
|
|
|
req.params.id,
|
|
|
|
{ $set: newUser },
|
|
|
|
{ new: true }
|
|
|
|
);
|
|
|
|
res.status(200).json(updatedUser);
|
|
|
|
} else if (emailTaken) {
|
|
|
|
res.status(500).json({ error: "email taken" });
|
|
|
|
} else if (taken) {
|
|
|
|
res.status(500).json({ error: "phone taken" });
|
|
|
|
}
|
|
|
|
} else if (!req.file) {
|
|
|
|
if (!emailTaken && !taken) {
|
|
|
|
const newUser = {
|
2024-08-30 16:35:49 +08:00
|
|
|
// fName,
|
|
|
|
// lName,
|
2024-08-27 08:37:01 +08:00
|
|
|
email,
|
2024-08-30 16:35:49 +08:00
|
|
|
// phone,
|
|
|
|
// address1,
|
|
|
|
// address2,
|
|
|
|
// city,
|
|
|
|
// province,
|
|
|
|
// country,
|
|
|
|
// zip,
|
|
|
|
// transactions,
|
|
|
|
// status,
|
2024-08-27 08:37:01 +08:00
|
|
|
};
|
|
|
|
const updatedUser = await User.findByIdAndUpdate(
|
|
|
|
req.params.id,
|
|
|
|
{ $set: newUser },
|
|
|
|
{ new: true }
|
|
|
|
);
|
|
|
|
res.status(200).json(updatedUser);
|
|
|
|
} else if (emailTaken) {
|
|
|
|
res.status(500).json({ error: "email taken" });
|
|
|
|
} else if (taken) {
|
|
|
|
const newUser = {
|
2024-08-30 16:35:49 +08:00
|
|
|
// fName,
|
|
|
|
// lName,
|
2024-08-27 08:37:01 +08:00
|
|
|
email,
|
2024-08-30 16:35:49 +08:00
|
|
|
// phone,
|
|
|
|
// address1,
|
|
|
|
// address2,
|
|
|
|
// city,
|
|
|
|
// province,
|
|
|
|
// country,
|
|
|
|
// zip,
|
|
|
|
// transactions,
|
|
|
|
// status,
|
2024-08-27 08:37:01 +08:00
|
|
|
};
|
|
|
|
const updatedUser = await User.findByIdAndUpdate(
|
|
|
|
req.params.id,
|
|
|
|
{ $set: newUser },
|
|
|
|
{ new: true }
|
|
|
|
);
|
|
|
|
res.status(500).json({ error: updatedUser });
|
|
|
|
}
|
|
|
|
}
|
|
|
|
} catch (err) {
|
|
|
|
res.status(404).json({ message: err.message });
|
|
|
|
|
|
|
|
next(err);
|
|
|
|
}
|
|
|
|
};
|
|
|
|
export const updateUserSub = async (req, res, next) => {
|
|
|
|
try {
|
|
|
|
console.log(req.params.id);
|
|
|
|
|
|
|
|
const emailTaken = await User.findOne({ email: req.body.email });
|
|
|
|
const usernameTaken = await User.findOne({ username: req.body.username });
|
|
|
|
|
|
|
|
const updatedUser = await User.findByIdAndUpdate(
|
|
|
|
req.params.id,
|
|
|
|
{ $set: req.body },
|
|
|
|
{ new: true }
|
|
|
|
);
|
|
|
|
if (updatedUser) {
|
|
|
|
res.status(200).json(updatedUser);
|
|
|
|
} else {
|
|
|
|
res.status(400).json("User does not exist.");
|
|
|
|
}
|
|
|
|
} catch (err) {
|
|
|
|
next(err);
|
|
|
|
res.status(400).json(err);
|
|
|
|
console.log(err);
|
|
|
|
}
|
|
|
|
};
|
|
|
|
export const updateUserPass = async (req, res, next) => {
|
|
|
|
try {
|
|
|
|
console.log(req.params.id);
|
|
|
|
if (req.body.password) {
|
|
|
|
const salt = await bcrypt.genSalt();
|
|
|
|
const passwordHash = await bcrypt.hash(req.body.password, salt);
|
|
|
|
|
|
|
|
const updatedUser = await User.findByIdAndUpdate(
|
|
|
|
req.params.id,
|
|
|
|
{ $set: { password: passwordHash } },
|
|
|
|
{ new: true }
|
|
|
|
);
|
|
|
|
|
|
|
|
if (updatedUser) {
|
|
|
|
res.status(200).json(updatedUser);
|
|
|
|
} else {
|
|
|
|
res.status(200).json("User does not exist.");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
} catch (err) {
|
|
|
|
next(err);
|
|
|
|
}
|
|
|
|
};
|
|
|
|
export const updateUserPhoto = async (req, res, next) => {
|
|
|
|
try {
|
|
|
|
console.log(req.params.id);
|
|
|
|
if (req.file) {
|
|
|
|
const extName = path.extname(req.file.originalname).toString();
|
|
|
|
const file64 = parser.format(extName, req.file.buffer);
|
|
|
|
const result = await cloudinary.uploader.upload(file64.content, {
|
|
|
|
folder: "obPayUserPhoto",
|
|
|
|
transformation: [{ width: 500, height: 500, crop: "limit" }],
|
|
|
|
});
|
|
|
|
const updatedUser = await User.findByIdAndUpdate(
|
|
|
|
req.params.id,
|
|
|
|
{ $set: { photo: result } },
|
|
|
|
{ new: true }
|
|
|
|
);
|
|
|
|
|
|
|
|
if (updatedUser) {
|
|
|
|
res.status(200).json(updatedUser);
|
|
|
|
} else {
|
|
|
|
res.status(200).json("User does not exist.");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
} catch (err) {
|
|
|
|
next(err);
|
|
|
|
res.status(400).json(err);
|
|
|
|
}
|
|
|
|
};
|
|
|
|
export const updateUserFriends = async (req, res, next) => {
|
|
|
|
try {
|
|
|
|
console.log(req.params.id);
|
|
|
|
const user = await User.findById(req.params.id);
|
|
|
|
if (!user) {
|
|
|
|
return res.status(404).json("User does not exist.");
|
|
|
|
}
|
|
|
|
const { number, favorite, nickname } = req.body;
|
|
|
|
const newFriend = { number, favorite, nickname };
|
|
|
|
user.friends.push(newFriend);
|
|
|
|
const updatedUser = await user.save();
|
|
|
|
res.status(200).json(updatedUser);
|
|
|
|
} catch (err) {
|
|
|
|
next(err);
|
|
|
|
}
|
|
|
|
};
|
|
|
|
export const updateUserFriendData = async (req, res, next) => {
|
|
|
|
try {
|
|
|
|
const userId = req.params.id;
|
|
|
|
const friendId = req.params.friendId;
|
|
|
|
const { number, favorite, nickname } = req.body;
|
|
|
|
const updatedUser = await User.findOneAndUpdate(
|
|
|
|
{ _id: userId, "friends._id": friendId },
|
|
|
|
{
|
|
|
|
$set: {
|
|
|
|
"friends.$.number": number,
|
|
|
|
"friends.$.favorite": favorite,
|
|
|
|
"friends.$.nickname": nickname,
|
|
|
|
},
|
|
|
|
},
|
|
|
|
{ new: true }
|
|
|
|
);
|
|
|
|
if (updatedUser) {
|
|
|
|
res.status(200).json(updatedUser);
|
|
|
|
} else {
|
|
|
|
res.status(404).json("User or friend not found.");
|
|
|
|
console.log("heyy" + friendId + " " + userId);
|
|
|
|
}
|
|
|
|
} catch (err) {
|
|
|
|
next(err);
|
|
|
|
}
|
|
|
|
};
|
|
|
|
export const deleteUserFriend = async (req, res, next) => {
|
|
|
|
try {
|
|
|
|
const userId = req.params.id;
|
|
|
|
const friendId = req.params.friendId;
|
|
|
|
const updatedUser = await User.findOneAndUpdate(
|
|
|
|
{ _id: userId },
|
|
|
|
{ $pull: { friends: { _id: friendId } } },
|
|
|
|
{ new: true }
|
|
|
|
);
|
|
|
|
if (updatedUser) {
|
|
|
|
res.status(200).json(updatedUser);
|
|
|
|
} else {
|
|
|
|
res.status(404).json("User or friend not found.");
|
|
|
|
}
|
|
|
|
} catch (err) {
|
|
|
|
next(err);
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
export const deleteUser = async (req, res, next) => {
|
|
|
|
try {
|
|
|
|
await User.findByIdAndDelete(req.params.id);
|
|
|
|
res.status(200).json("User has been deleted.");
|
|
|
|
} catch (err) {
|
|
|
|
res.status(404).json({ message: err.message });
|
|
|
|
|
|
|
|
next(err);
|
|
|
|
}
|
|
|
|
};
|
|
|
|
export const sendOtpEmail = async (req, res) => {
|
|
|
|
const { username } = req.body;
|
|
|
|
|
|
|
|
try {
|
|
|
|
const user = await User.findOne({ email: username });
|
|
|
|
|
|
|
|
if (!user) {
|
|
|
|
return res.status(404).json({ message: "User not found" });
|
|
|
|
}
|
|
|
|
// Generate OTP (simplified for demonstration)
|
|
|
|
const otp = Math.floor(100000 + Math.random() * 900000);
|
|
|
|
const otpExpiration = new Date(Date.now() + 600000); // OTP expires in 10 minutes
|
|
|
|
|
|
|
|
const updated = await User.findOneAndUpdate(
|
|
|
|
{ email: username },
|
|
|
|
{ otp, otpExpiration }
|
|
|
|
);
|
|
|
|
|
|
|
|
const requestData = {
|
|
|
|
email: username,
|
|
|
|
html: "<p>Your One-Time Pin (OTP) is: <strong>" + otp + "</strong></p>",
|
|
|
|
};
|
|
|
|
|
|
|
|
const responseFromExternalAPI = await axios.post(
|
|
|
|
"http://192.168.50.15:4038/api/send-email",
|
|
|
|
requestData
|
|
|
|
);
|
|
|
|
// console.log(responseFromExternalAPI);
|
|
|
|
|
|
|
|
// Process the response from the external API
|
|
|
|
const responseData = responseFromExternalAPI.data;
|
|
|
|
|
|
|
|
return res.json({ message: responseData });
|
|
|
|
} catch (error) {
|
|
|
|
console.error(error);
|
|
|
|
return res.status(500).json({ message: "Internal Server Error" });
|
|
|
|
}
|
|
|
|
};
|
|
|
|
export const confirmOtp = async (req, res) => {
|
|
|
|
const { username, otp } = req.body;
|
|
|
|
|
|
|
|
// Verify OTP and its expiration time
|
|
|
|
const user = await User.findOne({
|
|
|
|
email: username,
|
|
|
|
otp,
|
|
|
|
otpExpiration: { $gt: Date.now() },
|
|
|
|
});
|
|
|
|
|
|
|
|
if (!user) {
|
|
|
|
return res.status(400).send("Invalid OTP or expired");
|
|
|
|
}
|
|
|
|
|
|
|
|
user.otp = null;
|
|
|
|
user.otpExpiration = null;
|
|
|
|
|
|
|
|
await user.save();
|
|
|
|
|
|
|
|
return res.status(200).json({ message: "OTP success" });
|
|
|
|
};
|