3 var _ = require('lodash');
4 var Contact = require('../../models').Contact;
5 var ContactPhone = require('../../models').ContactPhone;
6 var ContactEmail = require('../../models').ContactEmail;
7 var ReportCall = require('../../models').ReportCall;
8 var ReportCallHistory = require('../../models').history.ReportCallHistory;
9 var ReportMailSession = require('../../models').ReportMailSession;
10 var ReportMailSessionHistory = require('../../models').history.ReportMailSessionHistory;
11 var Tag = require('../../models').Tag;
12 var stream = require('stream');
13 var sequelize = require('../../models').sequelize;
14 var util = require('util');
16 // Get list of contacts
17 exports.index = function(req, res) {
19 var attributes = ['name', 'surname', 'description'];
20 var per_page = req.query.per_page ? parseInt(req.query.per_page, 10) : 100;
21 var page = req.query.page ? parseInt(req.query.page, 10) : 0;
26 offset: page * per_page
29 _.forIn(req.query, function(value, key) {
35 query.order = util.format('%s %s', req.query.sort_by, req.query.sort_order || 'ASC') || null;
41 attributes.forEach(function(attribute) {
44 $like: '%' + value + '%'
47 query.where.$or.push(tmp);
54 query.where[key].$like = '%' + value + '%';
60 .findAndCountAll(query)
61 .then(function(managed_contacts) {
62 return res.status(200).send(managed_contacts);
64 .catch(function(err) {
65 return handleError(res, err);
69 // Get a single managed_contact
70 exports.show = function(req, res) {
72 .findById(req.params.id, {
89 model: ReportCallHistory,
90 as: 'HistoryInbounds',
95 model: ReportCallHistory,
96 as: 'HistoryOutbounds',
105 model: ReportMailSession,
106 as: 'InboundMessages',
111 model: ReportMailSession,
112 as: 'OutboundMessages',
117 model: ReportMailSessionHistory,
118 as: 'HistoryInboundMessages',
123 model: ReportMailSessionHistory,
124 as: 'HistoryOutboundMessages',
131 .then(function(managed_contact) {
132 if (!managed_contact) {
133 return res.sendStatus(404);
135 return res.send(managed_contact);
137 .catch(function(err) {
139 return handleError(res, err);
143 exports.getHistory = function(req, res) {
147 // validate contact uniqueness
148 exports.contactValidation = function(req, res) {
152 '$Phones.phone$': req.body.phones,
153 '$Emails.email$': req.body.emails
160 .then(function(contacts) {
161 console.log(contacts);
162 return res.status(200).send(contacts);
164 .catch(function(err) {
166 return handleError(res, err);
169 // Creates a new managed_contact in the DB.
170 exports.create = function(req, res, next) {
174 .then(function(tags) {
176 var tagList = _.pluck(_.pluck(tags, 'dataValues'), 'name');
178 var contactTags = req.body.tags.split(',');
179 contactTags.forEach(function(elem) {
180 if (!_.includes(tags, elem)) {
186 if (newTags.length) {
187 Tag.bulkCreate(newTags, {
188 individualHooks: true
192 req.body.UserId = req.user.id;
193 console.log('body', req.body);
194 var phones = _.uniq(_.pluck(req.body.Phones, 'phone'));
196 var emails = _.uniq(_.pluck(req.body.Emails, 'email'));
198 var contactPhones = [];
199 req.body.Phones.forEach(function(elem) {
200 console.log('elem', elem);
201 contactPhones.push(ContactPhone.findOrCreate({
210 console.log('return cP');
211 return contactPhones;
214 .then(function(res) {
215 newPhones = _.map(res, function(elem) {
219 var contactEmails = [];
220 req.body.Emails.forEach(function(elem) {
221 console.log('elem', elem);
222 contactEmails.push(ContactEmail.findOrCreate({
232 return contactEmails;
235 .then(function(res) {
236 newEmails = _.map(res, function(elem) {
239 delete req.body.Phones;
240 delete req.body.Emails;
242 return Contact.create(req.body);
244 .then(function(contact) {
245 return [contact, contact.setPhones(newPhones)];
247 .spread(function(contact) {
248 return [contact, contact.setEmails(newEmails)];
250 .spread(function(contact) {
251 return res.status(201).send(contact);
253 .catch(function(err) {
259 // Updates an existing managed_contact in the DB.
260 exports.update = function(req, res, next) {
261 req.body.Phones = _.uniq(_.pluck(req.body.Phones, 'phone'));
262 req.body.Emails = _.uniq(_.pluck(req.body.Emails, 'email'));
263 console.log(req.body.Phones);
264 console.log(req.body.Emails);
268 '$Phones.phone$': req.body.Phones,
269 '$Emails.email$': req.body.Emails
279 .then(function(contacts) {
280 console.log(contacts);
282 return res.sendStatus(404);
284 if (contacts.length > 0) {
285 return res.status(500).send({
286 message: 'MESSAGE_EXIST_PHONE_OR_EMAIL'
290 .then(function(tags) {
292 var tagList = _.pluck(_.pluck(tags, 'dataValues'), 'name');
294 var contactTags = req.body.tags.split(',');
295 contactTags.forEach(function(elem) {
296 if (!_.includes(tags, elem)) {
302 if (newTags.length) {
303 Tag.bulkCreate(newTags, {
304 individualHooks: true
309 var phones = _.map(req.body.Phones, function(elem) {
312 ContactId: req.params.id
315 var emails = _.map(req.body.Emails, function(elem) {
318 ContactId: req.params.id
321 delete req.body.Phones;
322 delete req.body.Emails;
323 return sequelize.transaction(function(t) {
324 return Contact.update(req.body, {
338 ContactId: req.params.id
345 .bulkCreate(phones, {
352 ContactId: req.params.id
359 .bulkCreate(emails, {
363 return res.sendStatus(201);
370 .catch(function(err) {
371 return handleError(res, err);
374 .catch(function(err) {
375 return handleError(res, err);
379 .catch(function(err) {
381 return handleError(res, err);
385 // Join contacts info in the DB.
386 exports.joinContacts = function(req, res, next) {
389 .then(function(tags) {
391 var tagList = _.pluck(_.pluck(tags, 'dataValues'), 'name');
392 var contactTags = req.body.tags.split(',');
393 contactTags.forEach(function(elem) {
394 if (!_.includes(tags, elem)) {
400 if (newTags.length) {
401 Tag.bulkCreate(newTags, {
402 individualHooks: true
406 .catch(function(err) {
407 return handleError(res, err);
410 var updateId = req.body.id;
412 var phones = _.map(req.body.Phones, function(elem) {
418 var emails = _.map(req.body.Emails, function(elem) {
424 delete req.body.Phones;
425 delete req.body.Emails;
426 return sequelize.transaction(function(t) {
427 return Contact.update(req.body, {
437 .then(function(contact) {
439 .bulkCreate(phones, {
444 .bulkCreate(emails, {
448 return Contact.findById(updateId, {
451 .then(function(contact) {
452 return res.status(201).send(contact);
458 .catch(function(err) {
464 // Deletes a managed_contact from the DB.
465 exports.destroy = function(req, res) {
467 .findById(req.params.id)
468 .then(function(managed_contact) {
469 if (!managed_contact) {
470 return res.sendStatus(404);
472 managed_contact.destroy()
474 return res.sendStatus(204);
476 .catch(function(err) {
477 return handleError(res, err);
480 .catch(function(err) {
481 return handleError(res, err);
485 // Deletes a managed_contact from the DB.
486 exports.bulkDestroy = function(req, res) {
492 individualHooks: true
495 return res.sendStatus(204);
497 .catch(function(err) {
498 return handleError(res, err);
502 function handleError(res, err) {
503 return res.status(500).send(err);