@tiledesk/tiledesk-server 2.3.5 → 2.3.7-1.1
Sign up to get free protection for your applications and to get access to all the features.
- package/.github/workflows/docker-community-worker-push-latest.yml +23 -0
- package/.github/workflows/docker-image-tag-worker-community-tag-push.yml +22 -0
- package/CHANGELOG.md +361 -3
- package/Dockerfile-jobs +31 -0
- package/app.js +62 -69
- package/channels/chat21/chat21Handler.js +37 -6
- package/channels/chat21/chat21WebHook.js +52 -29
- package/channels/chat21/package-lock.json +663 -706
- package/channels/chat21/package.json +2 -2
- package/config/labels/widget.json +337 -136
- package/deploy.sh +2 -0
- package/event/messageEvent.js +110 -9
- package/jobs.js +80 -0
- package/jobsManager.js +47 -0
- package/middleware/has-role.js +10 -3
- package/middleware/ipFilter.js +220 -0
- package/middleware/passport.js +8 -2
- package/models/department.js +1 -1
- package/models/faq.js +77 -25
- package/models/faq_kb.js +19 -0
- package/models/message.js +10 -8
- package/models/project.js +10 -0
- package/models/project_user.js +10 -0
- package/models/request.js +12 -1
- package/package.json +12 -11
- package/pubmodules/activities/activityArchiver.js +216 -90
- package/pubmodules/activities/routes/activity.js +1 -1
- package/pubmodules/apps/index.js +8 -0
- package/pubmodules/apps/listener.js +27 -0
- package/pubmodules/cache/index.js +2 -0
- package/pubmodules/cache/mongoose-cachegoose-fn.js +630 -0
- package/pubmodules/canned/cannedResponse.js +4 -0
- package/pubmodules/canned/cannedResponseRoute.js +10 -5
- package/pubmodules/dialogflow/index.js +10 -0
- package/pubmodules/dialogflow/listener.js +66 -0
- package/pubmodules/emailNotification/requestNotification.js +58 -28
- package/pubmodules/events/eventRoute.js +49 -24
- package/pubmodules/messageTransformer/messageHandlebarsTransformerInterceptor.js +6 -1
- package/pubmodules/messageTransformer/messageTransformerInterceptor.js +10 -4
- package/pubmodules/pubModulesManager.js +173 -7
- package/pubmodules/queue/index.js +4 -0
- package/pubmodules/queue/reconnect.js +331 -0
- package/pubmodules/queue/reconnectFanout.js +256 -0
- package/pubmodules/rasa/listener.js +5 -5
- package/pubmodules/routing-queue/index.js +3 -0
- package/pubmodules/routing-queue/listener.js +328 -0
- package/pubmodules/rules/conciergeBot.js +4 -4
- package/pubmodules/scheduler/tasks/closeAgentUnresponsiveRequestTask.js +6 -1
- package/pubmodules/scheduler/tasks/closeBotUnresponsiveRequestTask.js +7 -1
- package/pubmodules/tilebot/index.js +11 -0
- package/pubmodules/tilebot/listener.js +85 -0
- package/pubmodules/trigger/rulesTrigger.js +137 -14
- package/pubmodules/trigger/start.js +5 -1
- package/pubmodules/whatsapp/index.js +7 -0
- package/pubmodules/whatsapp/listener.js +32 -0
- package/routes/auth.js +7 -2
- package/routes/campaigns.js +3 -3
- package/routes/department.js +3 -2
- package/routes/email.js +32 -2
- package/routes/faq.js +37 -2
- package/routes/faq_kb.js +496 -133
- package/routes/faqpub.js +5 -0
- package/routes/lead.js +56 -0
- package/routes/message.js +196 -14
- package/routes/messagesRoot.js +39 -0
- package/routes/project.js +76 -4
- package/routes/project_user.js +11 -1
- package/routes/project_user_test.js +19 -0
- package/routes/request.js +134 -30
- package/routes/troubleshooting.js +12 -0
- package/routes/users-util.js +39 -0
- package/routes/users.js +1 -1
- package/routes/widget.js +64 -2
- package/services/BotSubscriptionNotifier.js +5 -0
- package/services/banUserNotifier.js +86 -0
- package/services/cacheEnabler.js +56 -0
- package/services/chatbotService.js +101 -0
- package/services/departmentService.js +25 -3
- package/services/emailService.js +170 -28
- package/services/faqBotHandler.js +2 -3
- package/services/faqService.js +28 -3
- package/services/geoService.js +36 -6
- package/services/labelService.js +1 -1
- package/services/leadService.js +3 -2
- package/services/messageService.js +4 -2
- package/services/modulesManager.js +23 -76
- package/services/operatingHoursService.js +9 -4
- package/services/requestService.js +75 -39
- package/services/subscriptionNotifier.js +9 -4
- package/services/trainingService.js +106 -0
- package/template/email/assignedEmailMessage.html +21 -11
- package/template/email/assignedRequest.html +21 -11
- package/template/email/beenInvitedExistingUser.html +16 -6
- package/template/email/beenInvitedNewUser.html +16 -6
- package/template/email/emailDirect.html +130 -0
- package/template/email/newMessage.html +18 -8
- package/template/email/newMessageFollower.html +22 -12
- package/template/email/passwordChanged.html +15 -5
- package/template/email/pooledEmailMessage.html +21 -11
- package/template/email/pooledRequest.html +20 -10
- package/template/email/resetPassword.html +15 -5
- package/template/email/sendTranscript.html +7 -4
- package/template/email/ticket.html +17 -7
- package/template/email/verify.html +15 -5
- package/test/cannedRoute.js +157 -0
- package/test/chatbot-mock.js +127 -0
- package/test/example-json-intents.txt +1 -0
- package/test/example-json.txt +1 -0
- package/test/example.json +1 -0
- package/test/faqRoute.js +353 -208
- package/test/faqkbRoute.js +669 -64
- package/test/imageRoute.js +1 -1
- package/test/messageRoute.js +387 -5
- package/test/requestRoute.js +6 -6
- package/test/requestService.js +55 -4
- package/test-int/cache-project.js +90 -0
- package/test-int/cache-project_user.js +88 -0
- package/utils/UIDGenerator.js +20 -0
- package/utils/cacheUtil.js +2 -2
- package/utils/orgUtil.js +3 -3
- package/utils/promiseUtil.js +31 -0
- package/utils/recipientEmailUtil.js +66 -0
- package/utils/sendEmailUtil.js +34 -0
- package/utils/sendMessageUtil.js +1 -1
- package/utils/stringUtil.js +12 -0
- package/websocket/webSocketServer.js +33 -10
@@ -21,6 +21,12 @@ class PubModulesManager {
|
|
21
21
|
this.rasa = undefined;
|
22
22
|
this.rasaRoute = undefined;
|
23
23
|
|
24
|
+
this.apps = undefined;
|
25
|
+
this.appsRoute = undefined;
|
26
|
+
|
27
|
+
this.whatsapp = undefined;
|
28
|
+
this.whatsappRoute = undefined;
|
29
|
+
|
24
30
|
this.activityArchiver = undefined;
|
25
31
|
this.activityRoute = undefined;
|
26
32
|
|
@@ -31,6 +37,18 @@ class PubModulesManager {
|
|
31
37
|
this.trigger = undefined;
|
32
38
|
this.triggerRoute = undefined;
|
33
39
|
|
40
|
+
this.tilebot = undefined;
|
41
|
+
this.tilebotRoute = undefined;
|
42
|
+
|
43
|
+
this.queue = undefined;
|
44
|
+
|
45
|
+
this.jobsManager = undefined;
|
46
|
+
|
47
|
+
this.routingQueue = undefined;
|
48
|
+
|
49
|
+
this.cache = undefined;
|
50
|
+
|
51
|
+
this.dialogFlow = undefined;
|
34
52
|
}
|
35
53
|
|
36
54
|
|
@@ -41,6 +59,23 @@ class PubModulesManager {
|
|
41
59
|
app.use('/modules/rasa', this.rasaRoute);
|
42
60
|
winston.info("ModulesManager rasaRoute controller loaded");
|
43
61
|
}
|
62
|
+
if (this.appsRoute) {
|
63
|
+
app.use('/modules/apps', this.appsRoute);
|
64
|
+
winston.info("ModulesManager appsRoute controller loaded");
|
65
|
+
}
|
66
|
+
if (this.whatsappRoute) {
|
67
|
+
app.use('/modules/whatsapp', this.whatsappRoute);
|
68
|
+
winston.info("ModulesManager whatsappRoute controller loaded");
|
69
|
+
}
|
70
|
+
if (this.tilebotRoute) {
|
71
|
+
app.use('/modules/tilebot', this.tilebotRoute);
|
72
|
+
winston.info("ModulesManager tilebot controller loaded");
|
73
|
+
}
|
74
|
+
|
75
|
+
if (this.dialogFlow) {
|
76
|
+
app.use("/modules/dialogFlow", this.dialogFlow.dialogflowRoute);
|
77
|
+
winston.info("ModulesManager dialogFlow controller loaded");
|
78
|
+
}
|
44
79
|
|
45
80
|
}
|
46
81
|
useUnderProjects(app) {
|
@@ -82,6 +117,8 @@ class PubModulesManager {
|
|
82
117
|
init(config) {
|
83
118
|
winston.debug("PubModulesManager init");
|
84
119
|
|
120
|
+
this.jobsManager = config.jobsManager;
|
121
|
+
|
85
122
|
try {
|
86
123
|
this.appRules = require('./rules/appRules');
|
87
124
|
// this.appRules.start();
|
@@ -122,7 +159,6 @@ class PubModulesManager {
|
|
122
159
|
}
|
123
160
|
|
124
161
|
|
125
|
-
|
126
162
|
try {
|
127
163
|
this.emailNotification = require('./emailNotification');
|
128
164
|
winston.debug("this.emailNotification:"+ this.emailNotification);
|
@@ -195,8 +231,38 @@ class PubModulesManager {
|
|
195
231
|
}
|
196
232
|
}
|
197
233
|
|
234
|
+
try {
|
235
|
+
this.apps = require('./apps');
|
236
|
+
winston.debug("this.apps: " + this.apps);
|
237
|
+
this.apps.listener.listen(config);
|
198
238
|
|
239
|
+
this.appsRoute = this.apps.appsRoute;
|
199
240
|
|
241
|
+
winston.info("PubModulesManager initialized apps.");
|
242
|
+
} catch(err) {
|
243
|
+
if (err.code == 'MODULE_NOT_FOUND') {
|
244
|
+
winston.info("PubModulesManager init apps module not found");
|
245
|
+
}else {
|
246
|
+
winston.info("PubModulesManager error initializing init apps module", err);
|
247
|
+
}
|
248
|
+
}
|
249
|
+
|
250
|
+
try {
|
251
|
+
this.whatsapp = require('./whatsapp');
|
252
|
+
winston.debug("this.whatsapp: " + this.whatsapp);
|
253
|
+
this.whatsapp.listener.listen(config);
|
254
|
+
|
255
|
+
this.whatsappRoute = this.whatsapp.whatsappRoute;
|
256
|
+
|
257
|
+
winston.info("PubModulesManager initialized apps.");
|
258
|
+
} catch(err) {
|
259
|
+
if (err.code == 'MODULE_NOT_FOUND') {
|
260
|
+
winston.info("PubModulesManager init apps module not found");
|
261
|
+
}else {
|
262
|
+
winston.info("PubModulesManager error initializing init apps module", err);
|
263
|
+
}
|
264
|
+
}
|
265
|
+
|
200
266
|
|
201
267
|
try {
|
202
268
|
this.activityArchiver = require('./activities').activityArchiver;
|
@@ -257,6 +323,84 @@ class PubModulesManager {
|
|
257
323
|
}
|
258
324
|
}
|
259
325
|
|
326
|
+
|
327
|
+
|
328
|
+
|
329
|
+
try {
|
330
|
+
this.tilebot = require('./tilebot');
|
331
|
+
winston.debug("this.tilebot:"+ this.tilebot);
|
332
|
+
this.tilebot.listener.listen(config);
|
333
|
+
this.tilebotRoute = this.tilebot.tilebotRoute;
|
334
|
+
|
335
|
+
winston.info("PubModulesManager initialized tilebot.");
|
336
|
+
} catch(err) {
|
337
|
+
if (err.code == 'MODULE_NOT_FOUND') {
|
338
|
+
winston.info("PubModulesManager init tilebot module not found");
|
339
|
+
}else {
|
340
|
+
winston.info("PubModulesManager error initializing init tilebot module", err);
|
341
|
+
}
|
342
|
+
}
|
343
|
+
|
344
|
+
|
345
|
+
|
346
|
+
|
347
|
+
try {
|
348
|
+
this.queue = require('./queue');
|
349
|
+
winston.debug("this.queue:"+ this.queue);
|
350
|
+
|
351
|
+
winston.info("PubModulesManager initialized queue.");
|
352
|
+
} catch(err) {
|
353
|
+
if (err.code == 'MODULE_NOT_FOUND') {
|
354
|
+
winston.info("PubModulesManager init queue module not found");
|
355
|
+
}else {
|
356
|
+
winston.info("PubModulesManager error initializing init queue module", err);
|
357
|
+
}
|
358
|
+
}
|
359
|
+
|
360
|
+
|
361
|
+
|
362
|
+
|
363
|
+
try {
|
364
|
+
this.routingQueue = require('./routing-queue').listener;
|
365
|
+
// this.routingQueue.listen();
|
366
|
+
winston.debug("this.routingQueue:"+ this.routingQueue);
|
367
|
+
|
368
|
+
winston.info("PubModulesManager routing queue initialized");
|
369
|
+
} catch(err) {
|
370
|
+
if (err.code == 'MODULE_NOT_FOUND') {
|
371
|
+
winston.info("PubModulesManager init routing queue module not found");
|
372
|
+
}else {
|
373
|
+
winston.error("PubModulesManager error initializing init routing queue module", err);
|
374
|
+
}
|
375
|
+
}
|
376
|
+
|
377
|
+
|
378
|
+
try {
|
379
|
+
this.cache = require('./cache').cachegoose(config.mongoose);
|
380
|
+
winston.debug("this.cache:"+ this.cache);
|
381
|
+
winston.info("PubModulesManager cache initialized");
|
382
|
+
} catch(err) {
|
383
|
+
if (err.code == 'MODULE_NOT_FOUND') {
|
384
|
+
winston.info("PubModulesManager init cache module not found");
|
385
|
+
}else {
|
386
|
+
winston.error("PubModulesManager error initializing init cache module", err);
|
387
|
+
}
|
388
|
+
}
|
389
|
+
|
390
|
+
|
391
|
+
|
392
|
+
try {
|
393
|
+
this.dialogFlow = require('./dialogflow');
|
394
|
+
winston.debug("this.dialogFlow:"+ this.dialogFlow);
|
395
|
+
this.dialogFlow.listener.listen(config);
|
396
|
+
winston.info("PubModulesManager dialogFlow initialized");
|
397
|
+
} catch(err) {
|
398
|
+
if (err.code == 'MODULE_NOT_FOUND') {
|
399
|
+
winston.info("PubModulesManager init dialogFlow module not found");
|
400
|
+
}else {
|
401
|
+
winston.error("PubModulesManager error initializing init dialogFlow module", err);
|
402
|
+
}
|
403
|
+
}
|
260
404
|
}
|
261
405
|
|
262
406
|
start() {
|
@@ -291,9 +435,11 @@ class PubModulesManager {
|
|
291
435
|
|
292
436
|
}
|
293
437
|
|
438
|
+
// job_here
|
294
439
|
if (this.emailNotification) {
|
295
440
|
try {
|
296
|
-
this.emailNotification.requestNotification.listen();
|
441
|
+
// this.emailNotification.requestNotification.listen();
|
442
|
+
this.jobsManager.listenEmailNotification(this.emailNotification);
|
297
443
|
winston.info("PubModulesManager emailNotification started.");
|
298
444
|
} catch(err) {
|
299
445
|
winston.info("PubModulesManager error starting requestNotification module", err);
|
@@ -309,21 +455,41 @@ class PubModulesManager {
|
|
309
455
|
}
|
310
456
|
}
|
311
457
|
|
312
|
-
|
458
|
+
// job_here
|
313
459
|
if (this.activityArchiver) {
|
314
460
|
try {
|
315
|
-
this.activityArchiver.listen();
|
316
|
-
|
461
|
+
// this.activityArchiver.listen();
|
462
|
+
this.jobsManager.listenActivityArchiver(this.activityArchiver);
|
463
|
+
winston.info("PubModulesManager activityArchiver started");
|
464
|
+
} catch(err) {
|
465
|
+
winston.info("PubModulesManager error starting activityArchiver module", err);
|
466
|
+
}
|
467
|
+
}
|
468
|
+
|
469
|
+
|
470
|
+
if (this.routingQueue) {
|
471
|
+
try {
|
472
|
+
this.routingQueue.listen();
|
473
|
+
winston.info("PubModulesManager routingQueue started");
|
317
474
|
} catch(err) {
|
318
|
-
winston.info("
|
475
|
+
winston.info("PubModulesManager error starting routingQueue module", err);
|
319
476
|
}
|
320
477
|
}
|
321
478
|
|
479
|
+
// if (this.dialogFlow) {
|
480
|
+
// try {
|
481
|
+
// this.dialogFlow.listen();
|
482
|
+
// winston.info("PubModulesManager dialogFlow started");
|
483
|
+
// } catch(err) {
|
484
|
+
// winston.info("PubModulesManager error starting dialogFlow module", err);
|
485
|
+
// }
|
486
|
+
// }
|
487
|
+
|
322
488
|
|
323
489
|
}
|
324
490
|
|
325
491
|
|
326
|
-
|
492
|
+
|
327
493
|
}
|
328
494
|
|
329
495
|
var pubModulesManager = new PubModulesManager();
|
@@ -0,0 +1,331 @@
|
|
1
|
+
var amqp = require('amqplib/callback_api');
|
2
|
+
var winston = require('../../config/winston');
|
3
|
+
const requestEvent = require('../../event/requestEvent');
|
4
|
+
const messageEvent = require('../../event/messageEvent');
|
5
|
+
const authEvent = require('../../event/authEvent');
|
6
|
+
// https://elements.heroku.com/addons/cloudamqp
|
7
|
+
// https://gist.github.com/carlhoerberg/006b01ac17a0a94859ba#file-reconnect-js
|
8
|
+
// http://www.rabbitmq.com/tutorials/tutorial-one-javascript.html
|
9
|
+
|
10
|
+
// if the connection is closed or fails to be established at all, we will reconnect
|
11
|
+
var amqpConn = null;
|
12
|
+
|
13
|
+
var url = process.env.CLOUDAMQP_URL + "?heartbeat=60" || "amqp://localhost";
|
14
|
+
// attento devi aggiornare configMap di PRE E PROD
|
15
|
+
// var url = process.env.AMQP_URL + "?heartbeat=60" || "amqp://localhost?heartbeat=60";
|
16
|
+
|
17
|
+
var exchange = 'amq.topic';
|
18
|
+
|
19
|
+
function start() {
|
20
|
+
amqp.connect(url, function(err, conn) {
|
21
|
+
if (err) {
|
22
|
+
winston.error("[AMQP]", err);
|
23
|
+
return setTimeout(start, 1000);
|
24
|
+
}
|
25
|
+
conn.on("error", function(err) {
|
26
|
+
if (err.message !== "Connection closing") {
|
27
|
+
winston.error("[AMQP] conn error", err);
|
28
|
+
}
|
29
|
+
});
|
30
|
+
conn.on("close", function() {
|
31
|
+
winston.error("[AMQP] reconnecting");
|
32
|
+
return setTimeout(start, 1000);
|
33
|
+
});
|
34
|
+
|
35
|
+
winston.info("[AMQP] connected");
|
36
|
+
amqpConn = conn;
|
37
|
+
|
38
|
+
whenConnected();
|
39
|
+
});
|
40
|
+
}
|
41
|
+
|
42
|
+
function whenConnected() {
|
43
|
+
startPublisher();
|
44
|
+
|
45
|
+
|
46
|
+
let jobWorkerEnabled = false;
|
47
|
+
if (process.env.JOB_WORKER_ENABLED=="true" || process.env.JOB_WORKER_ENABLED == true) {
|
48
|
+
jobWorkerEnabled = true;
|
49
|
+
}
|
50
|
+
winston.info("JobsManager jobWorkerEnabled: "+ jobWorkerEnabled);
|
51
|
+
|
52
|
+
if (jobWorkerEnabled == false) {
|
53
|
+
winston.info("Queue Reconnect start worker");
|
54
|
+
startWorker();
|
55
|
+
} else {
|
56
|
+
winston.info("Queue Reconnect without worker because external worker is enabled");
|
57
|
+
}
|
58
|
+
|
59
|
+
}
|
60
|
+
|
61
|
+
var pubChannel = null;
|
62
|
+
var offlinePubQueue = [];
|
63
|
+
function startPublisher() {
|
64
|
+
amqpConn.createConfirmChannel(function(err, ch) {
|
65
|
+
if (closeOnErr(err)) return;
|
66
|
+
ch.on("error", function(err) {
|
67
|
+
winston.error("[AMQP] channel error", err);
|
68
|
+
});
|
69
|
+
ch.on("close", function() {
|
70
|
+
winston.info("[AMQP] channel closed");
|
71
|
+
});
|
72
|
+
|
73
|
+
pubChannel = ch;
|
74
|
+
while (true) {
|
75
|
+
var m = offlinePubQueue.shift();
|
76
|
+
if (!m) break;
|
77
|
+
publish(m[0], m[1], m[2]);
|
78
|
+
}
|
79
|
+
});
|
80
|
+
}
|
81
|
+
|
82
|
+
// method to publish a message, will queue messages internally if the connection is down and resend later
|
83
|
+
function publish(exchange, routingKey, content) {
|
84
|
+
try {
|
85
|
+
pubChannel.publish(exchange, routingKey, content, { persistent: true },
|
86
|
+
function(err, ok) {
|
87
|
+
if (err) {
|
88
|
+
winston.error("[AMQP] publish", err);
|
89
|
+
offlinePubQueue.push([exchange, routingKey, content]);
|
90
|
+
pubChannel.connection.close();
|
91
|
+
}
|
92
|
+
});
|
93
|
+
} catch (e) {
|
94
|
+
winston.error("[AMQP] publish", e);
|
95
|
+
offlinePubQueue.push([exchange, routingKey, content]);
|
96
|
+
}
|
97
|
+
}
|
98
|
+
|
99
|
+
// A worker that acks messages only if processed succesfully
|
100
|
+
// var channel;
|
101
|
+
function startWorker() {
|
102
|
+
amqpConn.createChannel(function(err, ch) {
|
103
|
+
if (closeOnErr(err)) return;
|
104
|
+
ch.on("error", function(err) {
|
105
|
+
winston.error("[AMQP] channel error", err);
|
106
|
+
});
|
107
|
+
ch.on("close", function() {
|
108
|
+
winston.info("[AMQP] channel closed");
|
109
|
+
});
|
110
|
+
ch.prefetch(10);//leggila da env
|
111
|
+
ch.assertExchange(exchange, 'topic', {
|
112
|
+
durable: true
|
113
|
+
});
|
114
|
+
ch.assertQueue("jobs", { durable: true }, function(err, _ok) {
|
115
|
+
if (closeOnErr(err)) return;
|
116
|
+
ch.bindQueue(_ok.queue, exchange, "request_create", {}, function(err3, oka) {
|
117
|
+
winston.info("Queue bind: "+_ok.queue+ " err: "+err3+ " key: request_create");
|
118
|
+
winston.info("Data queue", oka)
|
119
|
+
});
|
120
|
+
ch.bindQueue(_ok.queue, exchange, "request_update_preflight", {}, function(err3, oka) {
|
121
|
+
winston.info("Queue bind: "+_ok.queue+ " err: "+err3+ " key: request_update_preflight");
|
122
|
+
winston.info("Data queue", oka)
|
123
|
+
});
|
124
|
+
ch.bindQueue(_ok.queue, exchange, "request_participants_update", {}, function(err3, oka) {
|
125
|
+
winston.info("Queue bind: "+_ok.queue+ " err: "+err3+ " key: request_participants_update");
|
126
|
+
winston.info("Data queue", oka)
|
127
|
+
});
|
128
|
+
|
129
|
+
ch.bindQueue(_ok.queue, exchange, "request_update", {}, function(err3, oka) {
|
130
|
+
winston.info("Queue bind: "+_ok.queue+ " err: "+err3+ " key: request_update");
|
131
|
+
winston.info("Data queue", oka)
|
132
|
+
});
|
133
|
+
|
134
|
+
ch.bindQueue(_ok.queue, exchange, "request_close", {}, function(err3, oka) {
|
135
|
+
winston.info("Queue bind: "+_ok.queue+ " err: "+err3+ " key: request_close");
|
136
|
+
winston.info("Data queue", oka)
|
137
|
+
});
|
138
|
+
|
139
|
+
ch.bindQueue(_ok.queue, exchange, "request_close_extended", {}, function(err3, oka) {
|
140
|
+
winston.info("Queue bind: "+_ok.queue+ " err: "+err3+ " key: request_close_extended");
|
141
|
+
winston.info("Data queue", oka)
|
142
|
+
});
|
143
|
+
|
144
|
+
ch.bindQueue(_ok.queue, exchange, "message_create", {}, function(err3, oka) {
|
145
|
+
winston.info("Queue bind: "+_ok.queue+ " err: "+err3+ " key: message_create");
|
146
|
+
winston.info("Data queue", oka)
|
147
|
+
});
|
148
|
+
ch.bindQueue(_ok.queue, exchange, "project_user_update", {}, function(err3, oka) {
|
149
|
+
winston.info("Queue bind: "+_ok.queue+ " err: "+err3+ " key: project_user_update");
|
150
|
+
winston.info("Data queue", oka)
|
151
|
+
});
|
152
|
+
ch.consume("jobs", processMsg, { noAck: false });
|
153
|
+
winston.info("Worker is started");
|
154
|
+
});
|
155
|
+
|
156
|
+
|
157
|
+
function processMsg(msg) {
|
158
|
+
work(msg, function(ok) {
|
159
|
+
try {
|
160
|
+
if (ok)
|
161
|
+
ch.ack(msg);
|
162
|
+
else
|
163
|
+
ch.reject(msg, true);
|
164
|
+
} catch (e) {
|
165
|
+
closeOnErr(e);
|
166
|
+
}
|
167
|
+
});
|
168
|
+
}
|
169
|
+
});
|
170
|
+
}
|
171
|
+
|
172
|
+
function work(msg, cb) {
|
173
|
+
const message_string = msg.content.toString();
|
174
|
+
const topic = msg.fields.routingKey //.replace(/[.]/g, '/');
|
175
|
+
|
176
|
+
winston.debug("Got msg topic:" + topic);
|
177
|
+
|
178
|
+
winston.debug("Got msg:"+ message_string + " topic:" + topic);
|
179
|
+
|
180
|
+
if (topic === 'request_create') {
|
181
|
+
winston.debug("reconnect here topic:" + topic);
|
182
|
+
// requestEvent.emit('request.create.queue', msg.content);
|
183
|
+
requestEvent.emit('request.create.queue', JSON.parse(message_string));
|
184
|
+
}
|
185
|
+
if (topic === 'request_update') {
|
186
|
+
winston.debug("reconnect here topic:" + topic);
|
187
|
+
// requestEvent.emit('request.update.queue', msg.content);
|
188
|
+
requestEvent.emit('request.update.queue', JSON.parse(message_string));
|
189
|
+
}
|
190
|
+
|
191
|
+
if (topic === 'request_update_preflight') {
|
192
|
+
winston.debug("reconnect here topic:" + topic);
|
193
|
+
// requestEvent.emit('request.update.queue', msg.content);
|
194
|
+
requestEvent.emit('request.update.preflight.queue', JSON.parse(message_string));
|
195
|
+
}
|
196
|
+
|
197
|
+
if (topic === 'request_participants_update') {
|
198
|
+
winston.debug("reconnect here topic:" + topic);
|
199
|
+
// requestEvent.emit('request.update.queue', msg.content);
|
200
|
+
requestEvent.emit('request.participants.update.queue', JSON.parse(message_string));
|
201
|
+
}
|
202
|
+
|
203
|
+
if (topic === 'request_close') {
|
204
|
+
winston.debug("reconnect here topic:" + topic);
|
205
|
+
// requestEvent.emit('request.update.queue', msg.content);
|
206
|
+
requestEvent.emit('request.close.queue', JSON.parse(message_string));
|
207
|
+
}
|
208
|
+
|
209
|
+
if (topic === 'request_close_extended') {
|
210
|
+
winston.debug("reconnect here topic:" + topic);
|
211
|
+
// requestEvent.emit('request.update.queue', msg.content);
|
212
|
+
requestEvent.emit('request.close.extended.queue', JSON.parse(message_string));
|
213
|
+
}
|
214
|
+
|
215
|
+
if (topic === 'message_create') {
|
216
|
+
winston.debug("reconnect here topic:" + topic);
|
217
|
+
// requestEvent.emit('request.create.queue', msg.content);
|
218
|
+
messageEvent.emit('message.create.queue', JSON.parse(message_string));
|
219
|
+
}
|
220
|
+
if (topic === 'project_user_update') {
|
221
|
+
winston.debug("reconnect here topic:" + topic);
|
222
|
+
// requestEvent.emit('request.create.queue', msg.content);
|
223
|
+
authEvent.emit('project_user.update.queue', JSON.parse(message_string));
|
224
|
+
}
|
225
|
+
cb(true);
|
226
|
+
// WebSocket.cb(true);
|
227
|
+
// requestEvent.on(msg.KEYYYYYYY+'.ws', msg.content);
|
228
|
+
}
|
229
|
+
|
230
|
+
|
231
|
+
function closeOnErr(err) {
|
232
|
+
if (!err) return false;
|
233
|
+
winston.error("[AMQP] error", err);
|
234
|
+
amqpConn.close();
|
235
|
+
return true;
|
236
|
+
}
|
237
|
+
|
238
|
+
// setInterval(function() {
|
239
|
+
// var d = new Date();
|
240
|
+
// publish(exchange, "request_create", Buffer.from("work work work: "+d));
|
241
|
+
// publish(exchange, "request_update", Buffer.from("work2 work work: "+d));
|
242
|
+
// }, 1000);
|
243
|
+
|
244
|
+
|
245
|
+
function listen() {
|
246
|
+
|
247
|
+
// http://www.squaremobius.net/amqp.node/channel_api.html
|
248
|
+
// https://docs.parseplatform.org/parse-server/guide/#scalability
|
249
|
+
|
250
|
+
requestEvent.on('request.create', function(request) {
|
251
|
+
setImmediate(() => {
|
252
|
+
winston.debug("reconnect request.create")
|
253
|
+
publish(exchange, "request_create", Buffer.from(JSON.stringify(request)));
|
254
|
+
});
|
255
|
+
});
|
256
|
+
|
257
|
+
requestEvent.on('request.update', function(request) {
|
258
|
+
setImmediate(() => {
|
259
|
+
winston.debug("reconnect request.update")
|
260
|
+
publish(exchange, "request_update", Buffer.from(JSON.stringify(request)));
|
261
|
+
});
|
262
|
+
});
|
263
|
+
|
264
|
+
|
265
|
+
|
266
|
+
|
267
|
+
requestEvent.on('request.participants.update', function(request) {
|
268
|
+
setImmediate(() => {
|
269
|
+
publish(exchange, "request_participants_update", Buffer.from(JSON.stringify(request)));
|
270
|
+
winston.debug("reconnect participants.update published")
|
271
|
+
});
|
272
|
+
});
|
273
|
+
|
274
|
+
requestEvent.on('request.update.preflight', function(request) {
|
275
|
+
setImmediate(() => {
|
276
|
+
// winston.info("reconnect request.update.preflight")
|
277
|
+
publish(exchange, "request_update_preflight", Buffer.from(JSON.stringify(request)));
|
278
|
+
winston.debug("reconnect request.update.preflight published")
|
279
|
+
});
|
280
|
+
});
|
281
|
+
|
282
|
+
|
283
|
+
requestEvent.on('request.close', function(request) {
|
284
|
+
setImmediate(() => {
|
285
|
+
publish(exchange, "request_close", Buffer.from(JSON.stringify(request)));
|
286
|
+
});
|
287
|
+
});
|
288
|
+
|
289
|
+
requestEvent.on('request.close.extended', function(request) {
|
290
|
+
setImmediate(() => {
|
291
|
+
publish(exchange, "request_close_extended", Buffer.from(JSON.stringify(request)));
|
292
|
+
});
|
293
|
+
});
|
294
|
+
|
295
|
+
|
296
|
+
|
297
|
+
messageEvent.on('message.create', function(message) {
|
298
|
+
setImmediate(() => {
|
299
|
+
publish(exchange, "message_create", Buffer.from(JSON.stringify(message)));
|
300
|
+
});
|
301
|
+
});
|
302
|
+
|
303
|
+
authEvent.on('project_user.update',function(data) {
|
304
|
+
setImmediate(() => {
|
305
|
+
let user = undefined;
|
306
|
+
let body = undefined;
|
307
|
+
if (data.req ) {
|
308
|
+
if (data.req.user) { //i think is null from chat21webhook
|
309
|
+
user = data.req.user;
|
310
|
+
}
|
311
|
+
if (data.req.body) {
|
312
|
+
body = data.req.body;
|
313
|
+
}
|
314
|
+
}
|
315
|
+
var dat = {updatedProject_userPopulated: data.updatedProject_userPopulated, req: {user: user, body: body}}; //remove request
|
316
|
+
winston.debug("dat",dat);
|
317
|
+
publish(exchange, "project_user_update", Buffer.from(JSON.stringify(dat)));
|
318
|
+
});
|
319
|
+
});
|
320
|
+
|
321
|
+
}
|
322
|
+
|
323
|
+
if (process.env.QUEUE_ENABLED === "true") {
|
324
|
+
requestEvent.queueEnabled = true;
|
325
|
+
messageEvent.queueEnabled = true;
|
326
|
+
authEvent.queueEnabled = true;
|
327
|
+
listen();
|
328
|
+
start();
|
329
|
+
winston.info("Queue enabled. endpint: " + url );
|
330
|
+
}
|
331
|
+
|