@tiledesk/tiledesk-server 2.2.39 → 2.3.1-8.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (93) hide show
  1. package/CHANGELOG.md +121 -0
  2. package/LICENSE +14 -657
  3. package/README.md +17 -3
  4. package/app.js +21 -60
  5. package/channels/chat21/chat21Handler.js +18 -3
  6. package/channels/chat21/chat21WebHook.js +31 -15
  7. package/channels/chat21/package-lock.json +663 -706
  8. package/channels/chat21/package.json +2 -2
  9. package/deploy.sh +2 -0
  10. package/event/botEvent.js +1 -1
  11. package/event/subscriptionEvent.js +11 -0
  12. package/fonts/Roboto-Italic.ttf +0 -0
  13. package/fonts/Roboto-Medium.ttf +0 -0
  14. package/fonts/Roboto-MediumItalic.ttf +0 -0
  15. package/fonts/Roboto-Regular.ttf +0 -0
  16. package/middleware/ipFilter.js +220 -0
  17. package/middleware/passport.js +11 -2
  18. package/models/lead.js +2 -0
  19. package/models/project.js +10 -0
  20. package/models/project_user.js +4 -0
  21. package/models/request.js +50 -12
  22. package/models/subscriptionLog.js +34 -0
  23. package/models/tagLibrary.js +42 -0
  24. package/package.json +6 -12
  25. package/pubmodules/activities/activityArchiver.js +314 -0
  26. package/pubmodules/activities/index.js +3 -0
  27. package/pubmodules/activities/models/activity.js +88 -0
  28. package/pubmodules/activities/routes/activity.js +710 -0
  29. package/pubmodules/activities/test/activityRoute.js +85 -0
  30. package/pubmodules/analytics/analytics.js +1719 -0
  31. package/pubmodules/analytics/index.js +3 -0
  32. package/pubmodules/canned/cannedResponse.js +55 -0
  33. package/pubmodules/canned/cannedResponseRoute.js +163 -0
  34. package/pubmodules/canned/index.js +3 -0
  35. package/pubmodules/emailNotification/requestNotification.js +215 -28
  36. package/pubmodules/events/eventRoute.js +37 -7
  37. package/pubmodules/messageActions/messageActionsInterceptor.js +4 -2
  38. package/pubmodules/pubModulesManager.js +129 -5
  39. package/pubmodules/rasa/listener.js +5 -5
  40. package/pubmodules/rules/conciergeBot.js +4 -4
  41. package/pubmodules/scheduler/tasks/closeAgentUnresponsiveRequestTask.js +3 -1
  42. package/pubmodules/scheduler/tasks/closeBotUnresponsiveRequestTask.js +3 -1
  43. package/pubmodules/tilebot/index.js +11 -0
  44. package/pubmodules/tilebot/listener.js +69 -0
  45. package/pubmodules/trigger/default.js +271 -0
  46. package/pubmodules/trigger/event/actionEventEmitter.js +10 -0
  47. package/pubmodules/trigger/event/flowEventEmitter.js +10 -0
  48. package/pubmodules/trigger/event/triggerEventEmitter.js +10 -0
  49. package/pubmodules/trigger/index.js +3 -0
  50. package/pubmodules/trigger/models/trigger.js +149 -0
  51. package/pubmodules/trigger/rulesTrigger.js +1181 -0
  52. package/pubmodules/trigger/start.js +118 -0
  53. package/pubmodules/trigger/triggerRoute.js +150 -0
  54. package/routes/auth.js +7 -2
  55. package/routes/department.js +51 -0
  56. package/routes/faq.js +7 -0
  57. package/routes/faq_kb.js +1 -1
  58. package/routes/group.js +140 -0
  59. package/routes/lead.js +24 -1
  60. package/routes/message.js +6 -3
  61. package/routes/project.js +118 -0
  62. package/routes/project_user.js +9 -0
  63. package/routes/public-request.js +280 -2
  64. package/routes/request.js +122 -16
  65. package/routes/subscription.js +140 -0
  66. package/routes/tag.js +138 -0
  67. package/routes/user-request.js +3 -2
  68. package/routes/users.js +1 -1
  69. package/routes/widget.js +80 -3
  70. package/routes/widgetLoader.js +31 -0
  71. package/services/banUserNotifier.js +86 -0
  72. package/services/emailService.js +189 -11
  73. package/services/faqService.js +2 -2
  74. package/services/geoService.js +30 -4
  75. package/services/leadService.js +2 -0
  76. package/services/modulesManager.js +7 -188
  77. package/services/requestService.js +364 -6
  78. package/services/subscriptionNotifier.js +485 -0
  79. package/template/email/assignedEmailMessage.html +1 -1
  80. package/template/email/assignedRequest.html +1 -1
  81. package/template/email/newMessage.html +1 -1
  82. package/template/email/newMessageFollower.html +236 -0
  83. package/template/email/passwordChanged.html +1 -1
  84. package/template/email/pooledEmailMessage.html +1 -1
  85. package/template/email/pooledRequest.html +1 -1
  86. package/template/email/resetPassword.html +2 -2
  87. package/template/email/ticket.html +1 -1
  88. package/test/cannedRoute.js +166 -0
  89. package/test/messageRoute.js +69 -0
  90. package/test/requestService.js +3 -1
  91. package/utils/orgUtil.js +3 -3
  92. package/views/messages.jade +2 -2
  93. package/websocket/webSocketServer.js +23 -5
@@ -0,0 +1,118 @@
1
+ var faqService = require('../../services/faqService');
2
+ var Trigger = require('./models/trigger');
3
+ var DefaultTrigger = require('./default');
4
+ var projectEvent = require('../../event/projectEvent');
5
+ var winston = require('../../config/winston');
6
+
7
+ var rulesTrigger = require('./rulesTrigger');
8
+
9
+
10
+ function saveTrigger(trigger) {
11
+ trigger.save(function (err, savedTrigger) {
12
+ if (err) {
13
+ return winston.error("Error saving trigger for project with id "+trigger.id_project , err);
14
+ }
15
+ return winston.debug("Trigger saved for project with id "+trigger.id_project, saveTrigger);
16
+ });
17
+ }
18
+ projectEvent.on('project.create', async (project) => {
19
+ setImmediate( async () => {
20
+
21
+
22
+
23
+ var botIdentity = await faqService.create("Bot", undefined, project._id, "system", "identity", "An identity bot");
24
+ var botIdentityId = "bot_"+botIdentity.id;
25
+ winston.debug("botIdentityId:"+botIdentityId);
26
+
27
+
28
+ winston.debug("DefaultTrigger.defTriggerObj.s_new_conversation_01",DefaultTrigger.defTriggerObj.s_new_conversation_01._id);
29
+
30
+ let s_new_conversation_01 = Object.assign({}, DefaultTrigger.defTriggerObj.s_new_conversation_01);
31
+ s_new_conversation_01.id_project = project._id;
32
+ winston.debug("s_new_conversation_01",s_new_conversation_01);
33
+ let s_new_conversation_01Trigger = new Trigger(s_new_conversation_01);
34
+ saveTrigger(s_new_conversation_01Trigger);
35
+
36
+
37
+
38
+ // let s_proactive_greeting_01 = Object.assign({}, DefaultTrigger.defTriggerObj.s_proactive_greeting_01);
39
+ // s_proactive_greeting_01.id_project = project._id;
40
+ // let s_proactive_greeting_01Trigger = new Trigger(s_proactive_greeting_01);
41
+ // saveTrigger(s_proactive_greeting_01Trigger);
42
+
43
+
44
+ let s_online_welcome_01 = Object.assign({}, DefaultTrigger.defTriggerObj.s_online_welcome_01);
45
+ s_online_welcome_01.id_project = project._id;
46
+ s_online_welcome_01.actions[0].parameters.sender = botIdentityId;
47
+ let s_online_welcome_01Trigger = new Trigger(s_online_welcome_01);
48
+ saveTrigger(s_online_welcome_01Trigger);
49
+
50
+ let s_offline_welcome_01 = Object.assign({}, DefaultTrigger.defTriggerObj.s_offline_welcome_01);
51
+ s_offline_welcome_01.id_project = project._id;
52
+ s_offline_welcome_01.actions[0].parameters.sender = botIdentityId;
53
+ let s_offline_welcome_01Trigger = new Trigger(s_offline_welcome_01);
54
+ saveTrigger(s_offline_welcome_01Trigger);
55
+
56
+
57
+ let s_closed_operating_hours_01 = Object.assign({}, DefaultTrigger.defTriggerObj.s_closed_operating_hours_01);
58
+ s_closed_operating_hours_01.id_project = project._id;
59
+ s_closed_operating_hours_01.actions[0].parameters.sender = botIdentityId;
60
+ let s_closed_operating_hours_01Trigger = new Trigger(s_closed_operating_hours_01);
61
+ saveTrigger(s_closed_operating_hours_01Trigger);
62
+
63
+
64
+ let s_invite_bot_01 = Object.assign({}, DefaultTrigger.defTriggerObj.s_invite_bot_01);
65
+ s_invite_bot_01.id_project = project._id;
66
+ let s_invite_bot_01Trigger = new Trigger(s_invite_bot_01);
67
+ saveTrigger(s_invite_bot_01Trigger);
68
+
69
+
70
+ let s_checkout_page_01 = Object.assign({}, DefaultTrigger.defTriggerObj.s_checkout_page_01);
71
+ s_checkout_page_01.id_project = project._id;
72
+ s_checkout_page_01.actions[0].parameters.sender = botIdentityId;
73
+ let s_checkout_page_01Trigger = new Trigger(s_checkout_page_01);
74
+ saveTrigger(s_checkout_page_01Trigger);
75
+
76
+
77
+ let s_ticketing_taking_01 = Object.assign({}, DefaultTrigger.defTriggerObj.s_ticketing_taking_01);
78
+ s_ticketing_taking_01.id_project = project._id;
79
+ s_ticketing_taking_01.actions[0].parameters.sender = botIdentityId;
80
+ let s_ticketing_taking_01Trigger = new Trigger(s_ticketing_taking_01);
81
+ saveTrigger(s_ticketing_taking_01Trigger);
82
+
83
+
84
+
85
+ //DIABLED
86
+ /*
87
+ let s_new_login_01 = Object.assign({}, DefaultTrigger.defTriggerObj.s_new_login_01);
88
+ s_new_login_01.id_project = project._id;
89
+ let s_new_login_01Trigger = new Trigger(s_new_login_01);
90
+ saveTrigger(s_new_login_01Trigger);
91
+
92
+ let s_invite_proactive_greeting_bot_01 = Object.assign({}, DefaultTrigger.defTriggerObj.s_invite_proactive_greeting_bot_01);
93
+ s_invite_proactive_greeting_bot_01.id_project = project._id;
94
+ let s_invite_proactive_greeting_bot_01Trigger = new Trigger(s_invite_proactive_greeting_bot_01);
95
+ saveTrigger(s_invite_proactive_greeting_bot_01Trigger);
96
+
97
+ let s_proactivegreeting_message_01 = Object.assign({}, DefaultTrigger.defTriggerObj.s_proactivegreeting_message_01);
98
+ s_proactivegreeting_message_01.id_project = project._id;
99
+ s_proactivegreeting_message_01.actions[0].parameters.sender = botIdentityId;
100
+ let s_proactivegreeting_message_01Trigger = new Trigger(s_proactivegreeting_message_01);
101
+ saveTrigger(s_proactivegreeting_message_01Trigger);
102
+ */
103
+
104
+
105
+ winston.debug("triggers created for new project");
106
+
107
+
108
+
109
+
110
+ // cc
111
+
112
+ });
113
+ });
114
+
115
+ rulesTrigger.listen();
116
+
117
+
118
+
@@ -0,0 +1,150 @@
1
+ var express = require('express');
2
+ var router = express.Router();
3
+ var Trigger = require("./models/trigger");
4
+ var triggerEventEmitter = require("./event/triggerEventEmitter");
5
+ var DefaultTrigger = require('./default');
6
+
7
+ var winston = require('../../config/winston');
8
+
9
+
10
+ winston.debug("trigger route");
11
+
12
+ router.post('/', function (req, res) {
13
+
14
+ winston.debug(req.body);
15
+
16
+ var trigger = new Trigger({
17
+ name: req.body.name,
18
+ description: req.body.description,
19
+ id_project: req.projectid,
20
+ trigger: req.body.trigger,
21
+ conditions: req.body.conditions,
22
+ actions: req.body.actions,
23
+ enabled:true,
24
+ createdBy: req.user.id,
25
+ updatedBy: req.user.id
26
+ });
27
+
28
+ trigger.save(function (err, savedTrigger) {
29
+ if (err) {
30
+ winston.error('--- > ERROR ', err);
31
+ return res.status(500).send({ success: false, msg: 'Error saving object.' });
32
+ }
33
+
34
+ triggerEventEmitter.emit('trigger.create', savedTrigger);
35
+
36
+ res.json(savedTrigger);
37
+ });
38
+ });
39
+
40
+ router.put('/:triggerid', function (req, res) {
41
+
42
+ winston.debug(req.body);
43
+
44
+
45
+ var update = {};
46
+ update.name = req.body.name;
47
+ update.description = req.body.description;
48
+ update.trigger = req.body.trigger;
49
+ update.conditions = req.body.conditions;
50
+
51
+ update.actions = req.body.actions;
52
+ update.enabled = req.body.enabled;
53
+ update.id_project = req.projectid;
54
+ update.updatedBy = req.user.id;
55
+
56
+
57
+ Trigger.findByIdAndUpdate(req.params.triggerid, update, { new: true, upsert: true }, function (err, updatedTrigger) {
58
+ if (err) {
59
+ winston.error('--- > ERROR ', err);
60
+ return res.status(500).send({ success: false, msg: 'Error updating object.' });
61
+ }
62
+
63
+ triggerEventEmitter.emit('trigger.update', updatedTrigger);
64
+
65
+ res.json(updatedTrigger);
66
+ });
67
+ });
68
+
69
+ // curl -v -X PUT -H 'Content-Type:application/json' -u andrea.leo@f21.it:123456 http://localhost:3000/5e9eca85696a55a7eb4615f2/modules/triggers/s_invite_bot_01/reset
70
+
71
+ router.put('/:triggercode/reset', function (req, res) {
72
+
73
+ winston.debug(req.body);
74
+
75
+ var query = {code:req.params.triggercode, id_project: req.projectid};
76
+ winston.verbose("query resetting trigger: " , query);
77
+
78
+
79
+ let triggerObj = Object.assign({}, DefaultTrigger.defTrigger[req.params.triggercode].toJSON());
80
+ triggerObj.id_project = req.projectid;
81
+
82
+ winston.verbose("reset triggerObj: " ,triggerObj);
83
+
84
+ let trigger = new Trigger(triggerObj);
85
+ // var trigger = DefaultTrigger.defTrigger[req.params.triggercode];
86
+ // winston.verbose("trigger: ", trigger.toJSON());
87
+
88
+ Trigger.remove(query, function (errOld, triggerOld) {
89
+ if (errOld) {
90
+ winston.error('Error deleting trigger ', errOld);
91
+ // return res.status(500).send({ success: false, msg: 'Error deleting object.' });
92
+ }
93
+ trigger.save(function (err, updatedTrigger) {
94
+ if (err) {
95
+ winston.error('--- > ERROR ', {triggerObj:triggerObj, err: err, query: query});
96
+ return res.status(500).send({ success: false, msg: 'Error updating object.' });
97
+ }
98
+ triggerEventEmitter.emit('trigger.update', updatedTrigger);
99
+ res.json(updatedTrigger);
100
+ });
101
+ });
102
+
103
+
104
+ });
105
+
106
+
107
+
108
+ router.delete('/:triggerid', function (req, res) {
109
+
110
+ winston.debug(req.body);
111
+
112
+ Trigger.remove({ _id: req.params.triggerid }, function (err, trigger) {
113
+ if (err) {
114
+ winston.error('--- > ERROR ', err);
115
+ return res.status(500).send({ success: false, msg: 'Error deleting object.' });
116
+ }
117
+ triggerEventEmitter.emit('trigger.delete', trigger);
118
+
119
+ res.json(trigger);
120
+ });
121
+ });
122
+
123
+
124
+ router.get('/:triggerid', function (req, res) {
125
+
126
+ winston.debug(req.body);
127
+
128
+ Trigger.findById(req.params.triggerid, function (err, trigger) {
129
+ if (err) {
130
+ winston.error('--- > ERROR ', err)
131
+ return res.status(500).send({ success: false, msg: 'Error getting object.' });
132
+ }
133
+ if (!trigger) {
134
+ return res.status(404).send({ success: false, msg: 'Object not found.' });
135
+ }
136
+ res.json(trigger);
137
+ });
138
+ });
139
+
140
+
141
+
142
+ router.get('/', function (req, res) {
143
+
144
+ Trigger.find({ "id_project": req.projectid }, function (err, triggers) {
145
+ if (err) return next(err);
146
+ res.json(triggers);
147
+ });
148
+ });
149
+
150
+ module.exports = router;
package/routes/auth.js CHANGED
@@ -112,13 +112,18 @@ function (req, res) {
112
112
  winston.error("SigninAnonymously validation error", {errors: errors, reqBody: req.body, reqUrl: req.url });
113
113
  return res.status(422).json({ errors: errors.array() });
114
114
  }
115
- var firstname = req.body.firstname || "Guest";
115
+
116
+ let uid = uuidv4();
117
+ let shortuid = uid.substring(0,4);
118
+ var firstname = req.body.firstname || "guest#"+shortuid; // guest_here
119
+ // var firstname = req.body.firstname || "Guest"; // guest_here
120
+
116
121
 
117
122
 
118
123
  //TODO togli trattini da uuidv4()
119
124
 
120
125
  // TODO remove email.sec?
121
- let userAnonym = {_id: uuidv4(), firstname:firstname, lastname: req.body.lastname, email: req.body.email, attributes: req.body.attributes};
126
+ let userAnonym = {_id: uid, firstname:firstname, lastname: req.body.lastname, email: req.body.email, attributes: req.body.attributes};
122
127
 
123
128
  req.user = UserUtil.decorateUser(userAnonym);
124
129
 
@@ -14,6 +14,40 @@ var cacheUtil = require('../utils/cacheUtil');
14
14
  var departmentEvent = require("../event/departmentEvent");
15
15
 
16
16
 
17
+ router.post('/', [passport.authenticate(['basic', 'jwt'], { session: false }), validtoken, roleChecker.hasRole('admin')], function (req, res) {
18
+
19
+ winston.debug("DEPT REQ BODY ", req.body);
20
+ var newDepartment = new Department({
21
+ routing: req.body.routing,
22
+ name: req.body.name,
23
+ description: req.body.description,
24
+ default: req.body.default,
25
+ status: req.body.status,
26
+ id_group: req.body.id_group,
27
+ id_project: req.projectid,
28
+ createdBy: req.user.id,
29
+ updatedBy: req.user.id
30
+ });
31
+
32
+ if (req.body.id_bot) {
33
+ newDepartment.id_bot = req.body.id_bot;
34
+ newDepartment.bot_only = req.body.bot_only;
35
+ }
36
+
37
+
38
+ newDepartment.save(function (err, savedDepartment) {
39
+ if (err) {
40
+ winston.error('Error creating the department ', err);
41
+ return res.status(500).send({ success: false, msg: 'Error saving object.' });
42
+ }
43
+ winston.debug('NEW DEPT SAVED ', savedDepartment);
44
+ departmentEvent.emit('department.create', savedDepartment);
45
+ res.json(savedDepartment);
46
+ });
47
+ });
48
+
49
+
50
+
17
51
  router.put('/:departmentid', [passport.authenticate(['basic', 'jwt'], { session: false }), validtoken, roleChecker.hasRole('admin')], function (req, res) {
18
52
 
19
53
  winston.debug(req.body);
@@ -265,6 +299,23 @@ router.get('/', function (req, res) {
265
299
  }
266
300
  });
267
301
 
302
+ router.delete('/:departmentid', [passport.authenticate(['basic', 'jwt'], { session: false }), validtoken, roleChecker.hasRole('admin')], function (req, res) {
303
+
304
+ winston.debug(req.body);
305
+ winston.debug("req.params.departmentid: "+req.params.departmentid);
306
+
307
+ Department.findOneAndRemove({_id: req.params.departmentid}, function (err, department) {
308
+ // Department.remove({ _id: req.params.departmentid }, function (err, department) {
309
+
310
+ if (err) {
311
+ winston.error('Error deleting the department ', err);
312
+ return res.status(500).send({ success: false, msg: 'Error deleting object.' });
313
+ }
314
+ // nn funziuona perchje nn c'è id_project
315
+ departmentEvent.emit('department.delete', department);
316
+ res.json(department);
317
+ });
318
+ });
268
319
 
269
320
 
270
321
  module.exports = router;
package/routes/faq.js CHANGED
@@ -299,10 +299,17 @@ router.get('/', function (req, res, next) {
299
299
  query.id_project = req.projectid
300
300
  }
301
301
 
302
+ if (req.query.intent_display_name) {
303
+ query.intent_display_name=req.query.intent_display_name
304
+ }
305
+
306
+
302
307
  winston.debug("GET FAQ query", query);
303
308
 
304
309
  // query.$text = {"$search": "question"};
305
310
 
311
+
312
+
306
313
  return Faq.find(query).
307
314
  skip(skip).limit(limit).
308
315
  populate({path:'faq_kb'})//, match: { trashed: { $in: [null, false] } }}).
package/routes/faq_kb.js CHANGED
@@ -133,7 +133,7 @@ router.post('/askbot', function (req, res) {
133
133
  }
134
134
  winston.debug('faq_kb ', faq_kb.toJSON());
135
135
  winston.debug('faq_kb.type :'+ faq_kb.type);
136
- if (faq_kb.type =="internal") {
136
+ if (faq_kb.type =="internal" || faq_kb.type =="tilebot") {
137
137
 
138
138
 
139
139
 
@@ -0,0 +1,140 @@
1
+ var express = require('express');
2
+ var router = express.Router();
3
+ var Group = require("../models/group");
4
+ var groupEvent = require("../event/groupEvent");
5
+ var winston = require('../config/winston');
6
+
7
+
8
+
9
+ router.post('/', function (req, res) {
10
+
11
+ winston.debug('SAVE GROUP ', req.body);
12
+ var newGroup = new Group({
13
+ name: req.body.name,
14
+ members: req.body.members,
15
+ trashed: false,
16
+ id_project: req.projectid,
17
+ createdBy: req.user.id,
18
+ updatedBy: req.user.id
19
+ });
20
+
21
+ newGroup.save(function (err, savedGroup) {
22
+ if (err) {
23
+ winston.error('Error creating the group ', err);
24
+ return res.status(500).send({ success: false, msg: 'Error saving object.' });
25
+ }
26
+
27
+
28
+ groupEvent.emit('group.create', savedGroup);
29
+ res.json(savedGroup);
30
+ });
31
+ });
32
+
33
+ router.put('/:groupid', function (req, res) {
34
+
35
+ winston.debug(req.body);
36
+
37
+ var update = {};
38
+ if (req.body.name!=undefined) {
39
+ update.name = req.body.name;
40
+ }
41
+ if (req.body.members!=undefined) {
42
+ update.members = req.body.members;
43
+ }
44
+ if (req.body.trashed!=undefined) {
45
+ update.trashed = req.body.trashed;
46
+ }
47
+
48
+
49
+ Group.findByIdAndUpdate(req.params.groupid, update, { new: true, upsert: true }, function (err, updatedGroup) {
50
+ if (err) {
51
+ winston.error('Error putting the group ', err);
52
+ return res.status(500).send({ success: false, msg: 'Error updating object.' });
53
+ }
54
+
55
+ groupEvent.emit('group.update', updatedGroup);
56
+ res.json(updatedGroup);
57
+ });
58
+ });
59
+
60
+ // router.put('/:groupid', function (req, res) {
61
+
62
+ // winston.debug(req.body);
63
+
64
+ // var update = {};
65
+
66
+ // update.name = req.body.name;
67
+ // update.members = req.body.members;
68
+ // update.trashed = req.body.trashed;
69
+
70
+
71
+ // Group.findByIdAndUpdate(req.params.groupid, update, { new: true, upsert: true }, function (err, updatedGroup) {
72
+ // if (err) {
73
+ // winston.error('Error putting the group ', err);
74
+ // return res.status(500).send({ success: false, msg: 'Error updating object.' });
75
+ // }
76
+
77
+ // groupEvent.emit('group.update', updatedGroup);
78
+ // res.json(updatedGroup);
79
+ // });
80
+ // });
81
+
82
+ router.delete('/:groupid', function (req, res) {
83
+
84
+ winston.debug(req.body);
85
+
86
+ Group.findOneAndRemove({_id: req.params.groupid}, function (err, group) {
87
+ // Group.remove({ _id: req.params.groupid }, function (err, group) {
88
+ if (err) {
89
+ winston.error('Error removing the group ', err);
90
+ return res.status(500).send({ success: false, msg: 'Error deleting object.' });
91
+ }
92
+ // nn funziuona perchje nn c'è id_project
93
+ groupEvent.emit('group.delete', group);
94
+
95
+ res.json(group);
96
+ });
97
+ });
98
+
99
+
100
+ router.get('/:groupid', function (req, res) {
101
+
102
+ winston.debug(req.body);
103
+
104
+ Group.findById(req.params.groupid, function (err, group) {
105
+ if (err) {
106
+ winston.error('Error getting the group ', err);
107
+ return res.status(500).send({ success: false, msg: 'Error getting object.' });
108
+ }
109
+ if (!group) {
110
+ winston.warn('group not found', err);
111
+ return res.status(404).send({ success: false, msg: 'Object not found.' });
112
+ }
113
+ res.json(group);
114
+ });
115
+ });
116
+
117
+
118
+
119
+ router.get('/', function (req, res) {
120
+
121
+ winston.debug("req projectid", req.projectid);
122
+
123
+ var query = { "id_project": req.projectid, trashed: false };
124
+
125
+ if (req.query.member) {
126
+ query.members = { $in : req.query.member }
127
+ }
128
+
129
+ winston.debug("query", query);
130
+
131
+ Group.find(query, function (err, groups) {
132
+ if (err) {
133
+ winston.error('Error getting the group ', err);
134
+ return next(err);
135
+ }
136
+ res.json(groups);
137
+ });
138
+ });
139
+
140
+ module.exports = router;
package/routes/lead.js CHANGED
@@ -80,6 +80,15 @@ router.put('/:leadid', function (req, res) {
80
80
 
81
81
 
82
82
  leadEvent.emit('lead.update', updatedLead);
83
+
84
+ if (req.body.fullname!=undefined) {
85
+ leadEvent.emit('lead.fullname.update', updatedLead);
86
+ }
87
+
88
+ if (req.body.email!=undefined) {
89
+ leadEvent.emit('lead.email.update', updatedLead);
90
+ }
91
+
83
92
  res.json(updatedLead);
84
93
  });
85
94
  });
@@ -187,6 +196,11 @@ router.get('/csv', function (req, res, next) {
187
196
 
188
197
  winston.debug("sort query", sortQuery);
189
198
 
199
+ // TODO ORDER BY SCORE
200
+ // return Faq.find(query, {score: { $meta: "textScore" } })
201
+ // .sort( { score: { $meta: "textScore" } } ) //https://docs.mongodb.com/manual/reference/operator/query/text/#sort-by-text-search-score
202
+
203
+
190
204
  // Lead.find({ "id_project": req.projectid }, function (err, leads, next) {
191
205
  return Lead.find(query, '-attributes -__v').
192
206
  skip(skip).limit(limit).
@@ -258,6 +272,8 @@ router.get('/', function (req, res) {
258
272
  query.fullname = { "$exists": true };
259
273
  }
260
274
 
275
+ // aggiungi filtro per data
276
+
261
277
  if (req.query.status) {
262
278
  query.status = req.query.status;
263
279
  }
@@ -277,6 +293,13 @@ router.get('/', function (req, res) {
277
293
 
278
294
  winston.debug("sort query", sortQuery);
279
295
 
296
+ // TODO ORDER BY SCORE
297
+ // return Faq.find(query, {score: { $meta: "textScore" } })
298
+ // .sort( { score: { $meta: "textScore" } } ) //https://docs.mongodb.com/manual/reference/operator/query/text/#sort-by-text-search-score
299
+
300
+
301
+ // aggiungi filtro per data marco
302
+
280
303
  return Lead.find(query).
281
304
  skip(skip).limit(limit).
282
305
  sort(sortQuery).
@@ -288,7 +311,7 @@ router.get('/', function (req, res) {
288
311
 
289
312
  // blocked to 1000 TODO increases it
290
313
  // collection.count is deprecated, and will be removed in a future version. Use Collection.countDocuments or Collection.estimatedDocumentCount instead
291
- return Lead.count(query, function (err, totalRowCount) {
314
+ return Lead.countDocuments(query, function (err, totalRowCount) {
292
315
 
293
316
  var objectToReturn = {
294
317
  perPage: limit,
package/routes/message.js CHANGED
@@ -51,6 +51,7 @@ async (req, res) => {
51
51
  return res.status(422).json({ errors: errors.array() });
52
52
  }
53
53
 
54
+
54
55
  var project_user = req.projectuser;
55
56
  var sender = req.body.sender;
56
57
  var fullname = req.body.senderFullname || req.user.fullName;
@@ -159,7 +160,8 @@ async (req, res) => {
159
160
  location: req.body.location,
160
161
  participants: req.body.participants,
161
162
  lead: createdLead, requester: project_user,
162
- priority: req.body.priority
163
+ priority: req.body.priority,
164
+ followers: req.body.followers,
163
165
  };
164
166
 
165
167
  return requestService.create(new_request).then(function (savedRequest) {
@@ -188,7 +190,8 @@ async (req, res) => {
188
190
  .populate('lead')
189
191
  .populate('department')
190
192
  .populate('participatingBots')
191
- .populate('participatingAgents')
193
+ .populate('participatingAgents')
194
+ // .populate('followers')
192
195
  .populate({path:'requester',populate:{path:'id_user'}})
193
196
  .execPopulate(function (err, savedRequestPopulated){
194
197
 
@@ -247,6 +250,7 @@ async (req, res) => {
247
250
  .populate('department')
248
251
  .populate('participatingBots')
249
252
  .populate('participatingAgents')
253
+ // .populate('followers')
250
254
  .populate({path:'requester',populate:{path:'id_user'}})
251
255
  .execPopulate(function (err, requestPopulated){
252
256
 
@@ -286,7 +290,6 @@ async (req, res) => {
286
290
 
287
291
 
288
292
 
289
-
290
293
  // router.put('/:messageid', function(req, res) {
291
294
 
292
295
  // console.log(req.body);