@tiledesk/tiledesk-server 2.2.39 → 2.3.3

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 (71) hide show
  1. package/CHANGELOG.md +24 -0
  2. package/LICENSE +14 -657
  3. package/README.md +17 -3
  4. package/app.js +14 -2
  5. package/channels/chat21/chat21WebHook.js +12 -1
  6. package/event/botEvent.js +1 -1
  7. package/event/subscriptionEvent.js +11 -0
  8. package/fonts/Roboto-Italic.ttf +0 -0
  9. package/fonts/Roboto-Medium.ttf +0 -0
  10. package/fonts/Roboto-MediumItalic.ttf +0 -0
  11. package/fonts/Roboto-Regular.ttf +0 -0
  12. package/middleware/passport.js +4 -1
  13. package/models/lead.js +2 -0
  14. package/models/request.js +38 -11
  15. package/models/subscriptionLog.js +34 -0
  16. package/models/tagLibrary.js +42 -0
  17. package/package.json +4 -11
  18. package/pubmodules/activities/activityArchiver.js +295 -0
  19. package/pubmodules/activities/index.js +3 -0
  20. package/pubmodules/activities/models/activity.js +88 -0
  21. package/pubmodules/activities/routes/activity.js +710 -0
  22. package/pubmodules/activities/test/activityRoute.js +85 -0
  23. package/pubmodules/analytics/analytics.js +1719 -0
  24. package/pubmodules/analytics/index.js +3 -0
  25. package/pubmodules/canned/cannedResponse.js +51 -0
  26. package/pubmodules/canned/cannedResponseRoute.js +157 -0
  27. package/pubmodules/canned/index.js +3 -0
  28. package/pubmodules/emailNotification/requestNotification.js +184 -26
  29. package/pubmodules/messageActions/messageActionsInterceptor.js +4 -2
  30. package/pubmodules/pubModulesManager.js +104 -5
  31. package/pubmodules/scheduler/tasks/closeAgentUnresponsiveRequestTask.js +3 -1
  32. package/pubmodules/scheduler/tasks/closeBotUnresponsiveRequestTask.js +3 -1
  33. package/pubmodules/trigger/default.js +271 -0
  34. package/pubmodules/trigger/event/actionEventEmitter.js +10 -0
  35. package/pubmodules/trigger/event/flowEventEmitter.js +10 -0
  36. package/pubmodules/trigger/event/triggerEventEmitter.js +10 -0
  37. package/pubmodules/trigger/index.js +3 -0
  38. package/pubmodules/trigger/models/trigger.js +149 -0
  39. package/pubmodules/trigger/rulesTrigger.js +1181 -0
  40. package/pubmodules/trigger/start.js +114 -0
  41. package/pubmodules/trigger/triggerRoute.js +150 -0
  42. package/routes/department.js +51 -0
  43. package/routes/group.js +140 -0
  44. package/routes/lead.js +24 -1
  45. package/routes/message.js +6 -3
  46. package/routes/project.js +52 -0
  47. package/routes/public-request.js +265 -2
  48. package/routes/request.js +83 -11
  49. package/routes/subscription.js +140 -0
  50. package/routes/tag.js +138 -0
  51. package/routes/user-request.js +3 -2
  52. package/routes/widget.js +16 -1
  53. package/routes/widgetLoader.js +31 -0
  54. package/services/emailService.js +189 -11
  55. package/services/faqService.js +1 -1
  56. package/services/leadService.js +2 -0
  57. package/services/modulesManager.js +7 -188
  58. package/services/requestService.js +364 -6
  59. package/services/subscriptionNotifier.js +485 -0
  60. package/template/email/assignedEmailMessage.html +1 -1
  61. package/template/email/assignedRequest.html +1 -1
  62. package/template/email/newMessage.html +1 -1
  63. package/template/email/newMessageFollower.html +236 -0
  64. package/template/email/passwordChanged.html +1 -1
  65. package/template/email/pooledEmailMessage.html +1 -1
  66. package/template/email/pooledRequest.html +1 -1
  67. package/template/email/resetPassword.html +2 -2
  68. package/template/email/ticket.html +1 -1
  69. package/test/messageRoute.js +69 -0
  70. package/test/requestService.js +3 -1
  71. package/views/messages.jade +2 -2
@@ -0,0 +1,114 @@
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.info("triggers created for new project");
106
+
107
+
108
+ });
109
+ });
110
+
111
+ rulesTrigger.listen();
112
+
113
+
114
+
@@ -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;
@@ -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;
@@ -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);
package/routes/project.js CHANGED
@@ -2,6 +2,8 @@ var express = require('express');
2
2
  var router = express.Router();
3
3
  var Project = require("../models/project");
4
4
  var projectEvent = require("../event/projectEvent");
5
+ var projectService = require("../services/projectService");
6
+
5
7
  var Project_user = require("../models/project_user");
6
8
 
7
9
  var operatingHoursService = require("../services/operatingHoursService");
@@ -17,6 +19,56 @@ var RoleConstants = require("../models/roleConstants");
17
19
  var cacheUtil = require('../utils/cacheUtil');
18
20
  var orgUtil = require("../utils/orgUtil");
19
21
 
22
+
23
+ router.post('/', [passport.authenticate(['basic', 'jwt'], { session: false }), validtoken], async (req, res) => {
24
+
25
+ // create(name, createdBy, settings)
26
+ return projectService.create(req.body.name, req.user.id, undefined, req.body.defaultLanguage).then(function(savedProject) {
27
+ res.json(savedProject);
28
+ });
29
+
30
+ });
31
+
32
+ // DOWNGRADE PLAN. UNUSED
33
+ router.put('/:projectid/downgradeplan', [passport.authenticate(['basic', 'jwt'], { session: false }), validtoken, roleChecker.hasRole('owner')], function (req, res) {
34
+ winston.debug('downgradeplan - UPDATE PROJECT REQ BODY ', req.body);
35
+ Project.findByIdAndUpdate(req.params.projectid, req.body, { new: true, upsert: true }, function (err, updatedProject) {
36
+ if (err) {
37
+ winston.error('Error putting project ', err);
38
+ return res.status(500).send({ success: false, msg: 'Error updating object.' });
39
+ }
40
+ projectEvent.emit('project.downgrade', updatedProject );
41
+ res.json(updatedProject);
42
+ });
43
+ });
44
+
45
+
46
+ router.delete('/:projectid/physical', [passport.authenticate(['basic', 'jwt'], { session: false }), validtoken, roleChecker.hasRole('owner')], function (req, res) {
47
+ winston.debug(req.body);
48
+ // TODO delete also department, faq_kb, faq, group, label, lead, message, project_users, requests, subscription
49
+ Project.remove({ _id: req.params.projectid }, function (err, project) {
50
+ if (err) {
51
+ winston.error('Error deleting project ', err);
52
+ return res.status(500).send({ success: false, msg: 'Error deleting object.' });
53
+ }
54
+ projectEvent.emit('project.delete', project );
55
+ res.json(project);
56
+ });
57
+ });
58
+
59
+ router.delete('/:projectid', [passport.authenticate(['basic', 'jwt'], { session: false }), validtoken, roleChecker.hasRole('owner')], function (req, res) {
60
+ winston.debug(req.body);
61
+ // TODO delete also department, faq_kb, faq, group, label, lead, message, project_users, requests, subscription
62
+ Project.findByIdAndUpdate(req.params.projectid, {status:0}, { new: true, upsert: true }, function (err, project) {
63
+ if (err) {
64
+ winston.error('Error deleting project ', err);
65
+ return res.status(500).send({ success: false, msg: 'Error deleting object.' });
66
+ }
67
+ projectEvent.emit('project.delete', project );
68
+ res.json(project);
69
+ });
70
+ });
71
+
20
72
  router.put('/:projectid', [passport.authenticate(['basic', 'jwt'], { session: false }), validtoken, roleChecker.hasRole('admin')], function (req, res) {
21
73
  winston.debug('UPDATE PROJECT REQ BODY ', req.body);
22
74