async function login (req, res, next) {
return new Promise(function (resolve, reject) {
var username = req.body.userName;
var password = req.body.password;
var otp = req.body.otp;
var event = req.body.event;
var Id = req.body.ObjId;
var role = req.body.role;
let data1 = {};
UserModel.findOne({ username: username, status: "Active" }).then(data => {
if (data && pwdhash.verify(password, data['password'])) {
UserTokenModel.findOne({ UserId: data._id, Status: "Active", AccessToken: otp }).then(usertokenDoc => {
var currentTime = new Date();
var tokenCreationTime = usertokenDoc.Date.toUTCString();
var tokenCreationTimeUtc = new Date(tokenCreationTime + UTC");
var difference = currentTime - tokenCreationTimeUtc;
if (difference < 0) {
difference = 0;
}
var diffMinutes = Math.floor((difference / 1000) / 60);
if (diffMinutes > 3) {
res.sendResponse(500, false, null, "OTP timeout,regeneratethe OTP.");
} else {
let token = jwt.sign({ username: data['username'], user_id: data['_id'] }, config.secret, { expiresIn: config.tokenExpiry });
data1.email = data.email;
data1.token = token;
data1.username = data.username;
data1.status = data.status;
data1.role = data.role;
data1.application = data.application;
var ObjId = saveUserAccessDetails(req, role, username, event, Id);
resolve('Authentication Successful...' + ObjId);
res.sendResponse(200, true, data1, 'Authentication Successful...'+ObjId);
}
}).catch(err => {
reject("OTP hasn't generated for this user.");
res.sendResponse(500, false, null, "OTP hasn't generated for this user.");
})
} else {
reject('Incorrect Username or password');
res.sendResponse(403, false, null, 'Incorrect Username or password');
}
}).catch(err => {
reject(err);
res.sendResponse(500, false, null, err.toString());
})
})
function saveUserAccessDetails(req, role, name, event, Id) {
return new Promise(function (resolve, reject) {
var channel = req.body.channel;
var networkDetailsObj = req.body.networkDetails;
var userAccessModel = new UserAccessLogModel({
"user_name": name,
"networkDetails": networkDetailsObj,
"loggedIn_systemIp": req.body.loggedInSystemIp,
"channel": req.body.channel,
"loginTime": req.body.loginTime,
"logoutTime": req.body.logoutTime,
"name": name,
"role": role,
"Event_name": event
});
if (event == "Logout") {
userAccessModel.findOneAndUpdate({
_id: Id
}, {
$addToSet: {
logoutTime: logoutTime
}
}, {
new: true
}, function (err, accessDoc) {
if (err) {
reject(err);
} else {
resolve(accessDoc._id);
}
})
} else {
userAccessModel.save( function (err, logDoc) {
if (err) {
console.log("error While saving access log" + err);
reject(err);
} else {
console.log("Access log saved successfully..." + logDoc._id);
resolve(logDoc._id);
}
})
}
})
}
I want to send the returned value of saveUserAccessDetails function as a response of login api but it's returning undefined as it's getting execute before saveUserAccessDetails function returns a value,Actually fuctinality is executing asychronusly however i just made it sychronous but its not working as expected . please guide the changes.