create-nodeapi-backend
Version:
A powerful Node.js backend boilerplate with Express, MongoDB, Firebase, JWT auth, Nodemailer, cron jobs, input validation (Joi), and serverless support for Vercel. Scaffold a full-featured API backend in seconds.
93 lines (82 loc) • 2.29 kB
JavaScript
const { User, Otp } = require("../../model/index");
const config = require("../../config/index")
const bcrypt = require("bcrypt");
const generateConfirmationCode = require("../../utils/codeGen");
const generateToken = require("../../utils/genToken");
const sendVerificationEmail = require("../mailerService/sendVerificationEmail");
const createUserAccount = async ({
email,
password,
profileName,
googleId,
name,
displayName,
picture
}) => {
try {
const existingUser = await User.findOne({ email }, { _id: 1 });
if (existingUser) {
return {
code: 302,
message: "Account with this Email existed"
};
}
const userProfile = googleId
? {
googleId,
isVerified: true,
profile: {
firstName: name.givenName,
lastName: name.familyName,
displayName
},
profileImages: { avatar: picture }
}
: {
profile: {
firstName: profileName.firstName,
lastName: profileName.lastName
},
password: await bcrypt.hash(password, 10)
};
const newUser = await User.create({
email,
...userProfile
});
if (!googleId) {
const code = generateConfirmationCode();
const promises = [
Otp.create({
email: newUser.email,
otp: code,
expiresAt: new Date(Date.now() + 2 * 60 * 1000)
})
];
if (config.env !== "test") {
promises.push(sendVerificationEmail({ email: newUser.email, code }));
}
await Promise.all(promises);
}
const token = await generateToken({
id: newUser._id.toString(),
email: newUser.email,
role: newUser.role,
type: "access"
});
return {
code: 201,
message: googleId
? "Account Created Successfully"
: "OTP Sent to your email",
data: {
id: newUser._id.toString(),
email: newUser.email,
token
}
};
} catch (error) {
console.error(error);
return { code: 500, message: "Internal Server Error", error };
}
};
module.exports = createUserAccount;