2016-06-07 00:37:09 +00:00
|
|
|
'use strict';
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Module dependencies.
|
|
|
|
*/
|
|
|
|
var mongoose = require('mongoose'),
|
|
|
|
errorHandler = require('../controllers/errors.server.controller'),
|
2017-10-07 08:23:42 +00:00
|
|
|
Form = mongoose.model('Form'),
|
|
|
|
request = require('request');
|
2016-06-07 00:37:09 +00:00
|
|
|
|
|
|
|
// Create the chat configuration
|
|
|
|
module.exports = function (io, socket) {
|
|
|
|
var visitorsData = {};
|
|
|
|
|
2017-10-07 09:40:24 +00:00
|
|
|
var saveVisitorData = function (data, socket, cb){
|
2016-06-07 00:37:09 +00:00
|
|
|
Form.findById(data.formId, function(err, form) {
|
|
|
|
if (err) {
|
2017-09-30 00:33:55 +00:00
|
|
|
console.error(err);
|
2016-06-07 00:37:09 +00:00
|
|
|
throw new Error(errorHandler.getErrorMessage(err));
|
|
|
|
}
|
|
|
|
|
|
|
|
var newVisitor = {
|
2017-09-30 00:33:55 +00:00
|
|
|
socketId: data.socketId,
|
2016-06-07 00:37:09 +00:00
|
|
|
referrer: data.referrer,
|
|
|
|
lastActiveField: data.lastActiveField,
|
|
|
|
timeElapsed: data.timeElapsed,
|
2016-06-17 21:51:17 +00:00
|
|
|
isSubmitted: data.isSubmitted,
|
|
|
|
language: data.language,
|
|
|
|
ipAddr: data.ipAddr,
|
|
|
|
deviceType: data.deviceType
|
2016-06-07 00:37:09 +00:00
|
|
|
};
|
2016-11-09 19:04:47 +00:00
|
|
|
|
2016-06-07 00:37:09 +00:00
|
|
|
form.analytics.visitors.push(newVisitor);
|
|
|
|
|
2017-10-07 09:40:24 +00:00
|
|
|
request('https://freegeoip.net/json/'+socket.conn.transport.socket._socket.remoteAddress, (error, response, body)=> {
|
|
|
|
var geoData = body;
|
|
|
|
data.geoLocation = {
|
|
|
|
city: geoData.city,
|
|
|
|
country: geoData.country_name
|
2016-06-07 00:37:09 +00:00
|
|
|
}
|
2017-10-07 09:40:55 +00:00
|
|
|
form.save(function (formSaveErr) {
|
|
|
|
if (err) {
|
|
|
|
console.error(err);
|
|
|
|
throw new Error(errorHandler.getErrorMessage(formSaveErr));
|
|
|
|
}
|
2016-06-07 00:37:09 +00:00
|
|
|
|
2017-10-07 09:40:24 +00:00
|
|
|
form.form_fields = form.form_fields.map(v => Object.assign({}, v, { fieldValue: null }));
|
|
|
|
|
|
|
|
form.save(function (formSaveErr) {
|
|
|
|
if (err) {
|
|
|
|
console.error(err);
|
|
|
|
throw new Error(errorHandler.getErrorMessage(formSaveErr));
|
|
|
|
}
|
|
|
|
|
|
|
|
if(cb){
|
|
|
|
return cb();
|
|
|
|
}
|
|
|
|
});
|
2016-06-07 00:37:09 +00:00
|
|
|
});
|
|
|
|
});
|
|
|
|
};
|
|
|
|
|
2017-04-23 02:27:45 +00:00
|
|
|
io.on('connection', function(current_socket) {
|
2016-06-07 00:37:09 +00:00
|
|
|
// a user has visited our page - add them to the visitorsData object
|
2017-04-23 02:27:45 +00:00
|
|
|
current_socket.on('form-visitor-data', function(data) {
|
2017-09-30 00:33:55 +00:00
|
|
|
visitorsData[current_socket.id] = data;
|
|
|
|
visitorsData[current_socket.id].socketId = current_socket.id;
|
|
|
|
visitorsData[current_socket.id].isSaved = false;
|
2017-10-07 08:23:42 +00:00
|
|
|
|
|
|
|
visitorsData[current_socket.id].ipAddr = current_socket.conn.transport.socket._socket.remoteAddress;
|
|
|
|
|
2017-10-07 09:40:24 +00:00
|
|
|
if (data.isSubmitted && !data.isSaved) {
|
|
|
|
visitorsData[current_socket.id].isSaved = true;
|
|
|
|
saveVisitorData(data, function() {
|
|
|
|
current_socket.disconnect(true);
|
|
|
|
});
|
|
|
|
}
|
2016-06-07 00:37:09 +00:00
|
|
|
});
|
|
|
|
|
2017-04-23 02:27:45 +00:00
|
|
|
current_socket.on('disconnect', function() {
|
|
|
|
var data = visitorsData[current_socket.id];
|
|
|
|
if(data && !data.isSubmitted && !data.isSaved) {
|
|
|
|
data.isSaved = true;
|
2017-09-30 00:33:55 +00:00
|
|
|
saveVisitorData(data, function() {
|
|
|
|
delete visitorsData[current_socket.id];
|
|
|
|
});
|
|
|
|
} else {
|
|
|
|
delete visitorsData[current_socket.id];
|
2016-06-07 00:37:09 +00:00
|
|
|
}
|
|
|
|
});
|
|
|
|
});
|
|
|
|
};
|
2017-10-07 08:34:01 +00:00
|
|
|
|