// const fastify = require("fastify")({ // logger: true, // }); const bcrypt = require("bcrypt"); const saltRounds = 10; const libphonenumberjs = require("libphonenumber-js"); // External Dependancies // offers http-friendly error objects. const boom = require("boom"); // Get Data Models const User = require("../models/User"); const customJwtAuth = require("../customAuthJwt"); const fastify = require("fastify")({ logger: true, }); //function to encrypt password. //used bcrypt module. async function bcryptPassword(password) { encryptedPwd = bcrypt.hash(password, saltRounds); return encryptedPwd; } //function to decrypt password return user object . //used bcrypt module. async function bcryptComparePassword(pwd, encpassword) { isSame = bcrypt.compare(pwd, encpassword); return isSame; } // Get current users exports.getCurrentUser = async (req, reply) => { try { const users = await await User.findOne({ username: req.user.username }); return users; } catch (err) { throw boom.boomify(err); } }; // Get all users exports.getUsers = async (req, reply) => { const limit = parseInt(req.query.limit) || 100; const page = parseInt(req.query.page) || 1; const startindex = (page - 1) * limit; try { await User.find() .limit(limit) .skip(startindex) .exec() .then((docs) => { reply.send({ status_code: 200, data: docs, count: docs.length }); }) .catch((err) => { console.log(err); reply.send({ error: err }); }); } catch (err) { throw boom.boomify(err); } }; // Get single user by ID exports.getSingleUser = async (req, reply) => { try { const username = req.params.username; const user = await User.findOne({ username: username }); return user; } catch (err) { throw boom.boomify(err); } }; // Edit user info by userId exports.editUserInfo = async (req, body) => { try { const { userId } = req.params; const userInfo = await User.findById(userId); const updateData = req.body; console.log(updateData.firstName); if (updateData.firstName) userInfo.profile.firstName = updateData.firstName; if (updateData.lastName) userInfo.profile.lastName = updateData.lastName; if (updateData.phone) userInfo.profile.contactNumber = updateData.phone; if (updateData.address1) userInfo.profile.address1 = updateData.address1; if (updateData.address2) userInfo.profile.address2 = updateData.address2; if (updateData.city) userInfo.profile.city = updateData.city; if (updateData.state) userInfo.profile.state = updateData.state; if (updateData.country) userInfo.profile.country = updateData.country; if (updateData.zip) userInfo.profile.zip = updateData.zip; if (updateData.phone) userInfo.phone = updateData.phone; if (updateData.email) userInfo.emails[0].email = updateData.email; if (updateData.role) userInfo.profile.role = updateData.role; const user = await userInfo.save(); return user; } catch (err) { throw boom.boomify(err); } }; exports.editCuurentUserInfo = async (req, reply) => { try { const { username } = req.params; const userInfo = await User.findOne({ username: username.toString() }); const updateData = req.body; if (updateData.firstName) userInfo.profile.firstName = updateData.firstName; if (updateData.lastName) userInfo.profile.lastName = updateData.lastName; if (updateData.phone) userInfo.profile.contactNumber = updateData.phone; if (updateData.address1) userInfo.profile.address1 = updateData.address1; if (updateData.address2) userInfo.profile.address2 = updateData.address2; if (updateData.city) userInfo.profile.city = updateData.city; if (updateData.state) userInfo.profile.state = updateData.state; if (updateData.country) userInfo.profile.country = updateData.country; if (updateData.zip) userInfo.profile.zip = updateData.zip; // if (updateData.phone) userInfo.phone = updateData.phone; if (updateData.email) userInfo.emails[0].email = updateData.email; if (updateData.role) userInfo.profile.role = updateData.role; if (updateData.phone) { const phoneNumber = libphonenumberjs.parsePhoneNumber(updateData.phone); if (phoneNumber) { // access returned collection if (!phoneNumber.isValid()) { error = { armintatankdata: { error: true, code: 10002, message: "10002 - Phone # " + updateData.phone + " is not a valid phone number", }, }; req.body.regError = error; reply.status(406).send(error); } } } if (userInfo.phone == updateData.phone) { console.log("IF++++++++++++++="); userInfo.phone = updateData.phone; userInfo.phoneVerified = true; } else { console.log("Ilse++++++++++++++="); userInfo.phone = updateData.phone; userInfo.phoneVerified = false; } const user = await userInfo.save(); return user; } catch (err) { throw boom.boomify(err); } }; // Add a new user // Function accepts username, password , encrypts password and saves it in the database. exports.addUser = async (req, reply) => { try { // console.log("This is the reply in the handler after the validations", reply); userData = { username: req.body.username, emails: req.body.emails, password: req.body.password, phone: req.body.phone, buildingName: req.body.buildingName, inchargeName: req.body.inchargeName, profile: { firstName: req.body.firstname, lastName: req.body.lastname, contactNumber: req.body.phone, country: req.body.country, state: req.body.state, city: req.body.city, address1: req.body.address1, address2: req.body.address2, zip: req.body.zip, notes: req.body.notes, }, }; var user = new User(userData); //password is not at the top level in the collection. userpass = req.body.password; // If fields are sent via form encoding , capture the fields and assign them to the user Object. checkFormEncoding = isUserFormUrlEncoded(req); if (checkFormEncoding.isUserFormUrlEncoded) { usertobeInserted = checkFormEncoding.user; console.log("thsi true url string"); user.username = usertobeInserted.username; user.firstName = usertobeInserted.firstName; user.lastName = usertobeInserted.lastName; user.lastName = usertobeInserted.lastName; user.phone = usertobeInserted.phone; user.emails = usertobeInserted.emails; user.passsword = usertobeInserted.password; user.buildingName = usertobeInserted.buildingName; user.inchargeName = usertobeInserted.inchargeName; } console.log("---------checkurl ecnoded string-----------------------"); // Store hash in your password DB. hash = await bcryptPassword(userpass); if (hash) { user.services.password.bcrypt = hash; if (req.body.role) { user.profile.role = req.body.role; console.log("******************************************************"); console.log(user); } else { // override and make the user role as "user" by default role = ["user"]; user.profile.role = role; } insertedUser = await user.save(); console.log(insertedUser); if (insertedUser) { // Prepare user object and wrap it inside the armintatankdata var retUser = { armintatankdata: { username: insertedUser.username, phone: insertedUser.phone, emails: [ { email: insertedUser.emails[0].email, }, ], profile: insertedUser.profile, }, status_code: 200, }; return retUser; } } } catch (err) { throw boom.boomify(err); } }; // Login a user // Accepts a user , password , and checks in the system to see if user exists , and password is valid // returns a user object so that jwt token can be created and sent back to the client exports.loginUser = async (req) => { try { const phone = req.body.phone; const password = req.body.password; const user = await User.findOne({ phone: phone }); console.log(user.username) // compare users password with what is supplied if (user) { isSame = await bcryptComparePassword( password, user.services.password.bcrypt ); // if password supplied matches return object if (isSame) { return { same: true, user: user }; } else { return { same: false }; } } else { return { same: false }; } } catch (err) { throw boom.boomify(err); } }; // Update an existing user exports.updateUser = async (req, reply) => { try { const id = req.params.id; const user = req.body; const { ...updateData } = user; const update = await User.findByIdAndUpdate(id, updateData, { new: true }); return update; } catch (err) { throw boom.boomify(err); } }; // Delete a user exports.deleteUser = async (req, reply) => { try { const id = req.params.id; const user = await User.findByIdAndRemove(id); return user; } catch (err) { throw boom.boomify(err); } }; //Added the getphone user and delphone user apis for testing purposes exports.getPhoneUser = async (req, reply) => { try { console.log(" requesting the api getPhoneUser , and passing the phone "); const phone = req.body.phone; const user = await User.findOne({ phone: phone }); return user; } catch (err) { throw boom.boomify(err); } }; exports.delPhoneUser = async (req, reply) => { try { const phone = req.body.phone; console.log("deleting users wiht the phone ....", phone); const user = await User.deleteOne({ phone: phone }); return user; } catch (err) { throw boom.boomify(err); } };