@tiledesk/tiledesk-server 2.1.40 → 2.2.3
Sign up to get free protection for your applications and to get access to all the features.
- package/.circleci/config.yml +54 -0
- package/.env.sample +1 -1
- package/.github/workflows/docker-community-push-latest.yml +22 -0
- package/.github/workflows/{docker-image-push.yml → docker-image-en-tag-push.yml} +1 -1
- package/.github/workflows/docker-image-tag-community-tag-push.yml +21 -0
- package/.github/workflows/{docker-push-latest.yml → docker-push-en-push-latest.yml} +1 -1
- package/CHANGELOG.md +195 -1
- package/Dockerfile +1 -1
- package/Dockerfile-en +1 -1
- package/README.md +5 -7
- package/app.js +12 -1
- package/channels/channelManager.js +1 -1
- package/channels/chat21/chat21Contact.js +34 -8
- package/channels/chat21/chat21Handler.js +48 -5
- package/channels/chat21/chat21WebHook.js +34 -9
- package/channels/chat21/nativeauth.js +2 -2
- package/channels/chat21/package-lock.json +3013 -0
- package/config/email.js +2 -0
- package/config/global.js +3 -0
- package/config/labels/widget.json +170 -16
- package/event/messageEvent.js +18 -1
- package/middleware/passport.js +10 -4
- package/migrations/1619185894304-request-remove-duplicated-request-by-request_id--autosync.js +67 -0
- package/models/actionsConstants.js +7 -0
- package/models/department.js +3 -0
- package/models/faq.js +8 -2
- package/models/faq_kb.js +6 -0
- package/models/message.js +10 -4
- package/models/messageConstants.js +9 -3
- package/models/request.js +33 -3
- package/package.json +31 -28
- package/pubmodules/emailNotification/requestNotification.js +483 -56
- package/pubmodules/messageActions/messageActionsInterceptor.js +20 -7
- package/pubmodules/messageTransformer/index.js +5 -1
- package/pubmodules/messageTransformer/messageTransformerInterceptor.js +4 -2
- package/pubmodules/messageTransformer/microLanguageAttributesTransformerInterceptor.js +67 -0
- package/pubmodules/messageTransformer/microLanguageTransformerInterceptor.js +67 -0
- package/pubmodules/pubModulesManager.js +66 -13
- package/pubmodules/rules/conciergeBot.js +81 -49
- package/routes/auth.js +46 -11
- package/routes/campaigns.js +117 -25
- package/routes/department.js +2 -2
- package/routes/faq.js +19 -0
- package/routes/faq_kb.js +13 -4
- package/routes/faqpub.js +1 -1
- package/routes/files.js +17 -2
- package/routes/images.js +1 -1
- package/routes/jwt.js +0 -1
- package/routes/logs.js +26 -0
- package/routes/message.js +7 -2
- package/routes/messagesRoot.js +73 -16
- package/routes/project_user.js +36 -1
- package/routes/request.js +88 -12
- package/routes/requestUtilRoot.js +30 -0
- package/routes/urls.js +12 -0
- package/routes/users.js +5 -1
- package/services/BotSubscriptionNotifier.js +1 -0
- package/services/departmentService.js +29 -5
- package/services/emailService.js +1170 -239
- package/services/faqBotHandler.js +176 -61
- package/services/faqBotSupport.js +182 -117
- package/services/faqService.js +18 -14
- package/services/messageService.js +57 -9
- package/services/modulesManager.js +86 -23
- package/services/requestService.js +58 -17
- package/template/email/assignedEmailMessage.html +205 -0
- package/template/email/assignedRequest.html +44 -14
- package/template/email/beenInvitedExistingUser.html +2 -2
- package/template/email/beenInvitedNewUser.html +1 -1
- package/template/email/newMessage.html +31 -12
- package/template/email/passwordChanged.html +2 -3
- package/template/email/pooledEmailMessage.html +208 -0
- package/template/email/pooledRequest.html +41 -14
- package/template/email/resetPassword.html +2 -3
- package/template/email/sendTranscript.html +1 -1
- package/template/email/test.html +1 -1
- package/template/email/ticket.html +191 -0
- package/template/email/ticket.txt +11 -0
- package/template/email/verify.html +1 -1
- package/test/authentication.js +76 -4
- package/test/authenticationJwt.js +76 -2
- package/test/campaignsRoute.js +226 -0
- package/test/faqService.js +3 -3
- package/test/faqkbRoute.js +3 -2
- package/test/messageRootRoute.js +193 -0
- package/test/messageRoute.js +75 -0
- package/test/messageService.js +39 -2
- package/test/requestRoute.js +27 -9
- package/test/requestService.js +472 -11
- package/test-int/bot.js +673 -8
- package/websocket/webSocketServer.js +7 -4
package/config/email.js
CHANGED
package/config/global.js
ADDED
@@ -22,7 +22,7 @@
|
|
22
22
|
"CALLOUT_TITLE_PLACEHOLDER": "🖐 Need Help?",
|
23
23
|
"CALLOUT_MSG_PLACEHOLDER": "Click here and start chatting with us!",
|
24
24
|
"CUSTOMER_SATISFACTION": "Customer satisfaction",
|
25
|
-
"YOUR_OPINION_ON_OUR_CUSTOMER_SERVICE": "
|
25
|
+
"YOUR_OPINION_ON_OUR_CUSTOMER_SERVICE": "Your opinion on our customer service",
|
26
26
|
"DOWNLOAD_TRANSCRIPT": "Download transcript",
|
27
27
|
"BACK": "Back",
|
28
28
|
"YOUR_RATING": "your rating",
|
@@ -37,14 +37,20 @@
|
|
37
37
|
"BUTTON_EDIT_PROFILE": "Update profile",
|
38
38
|
"BUTTON_DOWNLOAD_TRANSCRIPT": "Download transcript",
|
39
39
|
"RATE_CHAT": "Rate chat",
|
40
|
+
|
40
41
|
"WELLCOME_TITLE": "Hi, welcome to Tiledesk 👋",
|
41
42
|
"WELLCOME_MSG": "How can we help?",
|
42
43
|
"WELLCOME": "Welcome",
|
44
|
+
|
45
|
+
"WELCOME_TITLE": "Hi, welcome to Tiledesk 👋",
|
46
|
+
"WELCOME_MSG": "How can we help?",
|
47
|
+
"WELCOME": "Welcome",
|
48
|
+
|
43
49
|
"OPTIONS": "options",
|
44
50
|
"SOUND_OFF": "sound off",
|
45
51
|
"SOUND_ON": "sound on",
|
46
52
|
"LOGOUT": "logout",
|
47
|
-
"CLOSE": "
|
53
|
+
"CLOSE": "Close",
|
48
54
|
"PREV_CONVERSATIONS": "Your conversations",
|
49
55
|
"YOU": "You",
|
50
56
|
"SHOW_ALL_CONV": "show all",
|
@@ -53,7 +59,22 @@
|
|
53
59
|
"SEE_PREVIOUS": "see previous",
|
54
60
|
"WAITING_TIME_FOUND": "The team typically replies in $reply_time",
|
55
61
|
"WAITING_TIME_NOT_FOUND": "The team will reply as soon as possible",
|
56
|
-
"CLOSED": "
|
62
|
+
"CLOSED": "Closed",
|
63
|
+
|
64
|
+
"INFO_SUPPORT_USER_ADDED_SUBJECT":"you",
|
65
|
+
"INFO_SUPPORT_USER_ADDED_YOU_VERB":"you have been added ",
|
66
|
+
"INFO_SUPPORT_USER_ADDED_COMPLEMENT":"joined",
|
67
|
+
"INFO_SUPPORT_USER_ADDED_VERB":"to chat",
|
68
|
+
"INFO_SUPPORT_CHAT_REOPENED":"Chat reopened",
|
69
|
+
"INFO_SUPPORT_CHAT_CLOSED":"Chat closed",
|
70
|
+
|
71
|
+
"TICKET_TAKING":"The request has been received and the assistance staff is dealing with it.\nTo add more comments, reply to this email.",
|
72
|
+
|
73
|
+
"LABEL_ERROR_FIELD_REQUIRED": "Required field",
|
74
|
+
"SENT_AN_ATTACHMENT": "sent an attachment",
|
75
|
+
"SENT_AN_IMAGE": "sent an image"
|
76
|
+
|
77
|
+
|
57
78
|
}
|
58
79
|
},
|
59
80
|
{
|
@@ -79,7 +100,7 @@
|
|
79
100
|
"CALLOUT_TITLE_PLACEHOLDER": "🖐 Bisogno di aiuto?",
|
80
101
|
"CALLOUT_MSG_PLACEHOLDER": "Clicca qui e inizia a chattare con noi!",
|
81
102
|
"CUSTOMER_SATISFACTION": "Valutazione servizio",
|
82
|
-
"YOUR_OPINION_ON_OUR_CUSTOMER_SERVICE": "
|
103
|
+
"YOUR_OPINION_ON_OUR_CUSTOMER_SERVICE": "Il tuo giudizio sul nostro servizio clienti",
|
83
104
|
"DOWNLOAD_TRANSCRIPT": "Scarica transcript",
|
84
105
|
"BACK": "Indietro",
|
85
106
|
"YOUR_RATING": "il tuo voto",
|
@@ -94,10 +115,16 @@
|
|
94
115
|
"BUTTON_EDIT_PROFILE": "Modifica profilo",
|
95
116
|
"BUTTON_DOWNLOAD_TRANSCRIPT": "Scarica transcript",
|
96
117
|
"RATE_CHAT": "Valuta chat",
|
118
|
+
|
97
119
|
"WELLCOME_TITLE": "Ciao, benvenuto su Tiledesk 👋",
|
98
120
|
"WELLCOME_MSG": "Come possiamo aiutarti?",
|
99
|
-
"OPTIONS": "opzioni",
|
100
121
|
"WELLCOME": "Benvenuto",
|
122
|
+
|
123
|
+
"WELCOME_TITLE": "Ciao, benvenuto su Tiledesk 👋",
|
124
|
+
"WELCOME_MSG": "Come possiamo aiutarti?",
|
125
|
+
"WELCOME": "Benvenuto",
|
126
|
+
|
127
|
+
"OPTIONS": "opzioni",
|
101
128
|
"SOUND_OFF": "suono spento",
|
102
129
|
"SOUND_ON": "suono acceso",
|
103
130
|
"LOGOUT": "disconnetti",
|
@@ -110,7 +137,20 @@
|
|
110
137
|
"SEE_PREVIOUS": "vedi precedenti",
|
111
138
|
"WAITING_TIME_FOUND": "Il team tipicamente risponde in $reply_time",
|
112
139
|
"WAITING_TIME_NOT_FOUND": "Vi risponderemo appena possibile",
|
113
|
-
"CLOSED": "
|
140
|
+
"CLOSED": "Chiusa",
|
141
|
+
|
142
|
+
"INFO_SUPPORT_USER_ADDED_SUBJECT":"tu",
|
143
|
+
"INFO_SUPPORT_USER_ADDED_YOU_VERB":"sei stato aggiunto ",
|
144
|
+
"INFO_SUPPORT_USER_ADDED_COMPLEMENT":"si è unito",
|
145
|
+
"INFO_SUPPORT_USER_ADDED_VERB":"alla chat",
|
146
|
+
"INFO_SUPPORT_CHAT_REOPENED":"Chat riaperta",
|
147
|
+
"INFO_SUPPORT_CHAT_CLOSED":"Chat chiusa",
|
148
|
+
|
149
|
+
"TICKET_TAKING":"La richiesta è stata ricevuta e il personale di assistenza se ne sta occupando.\nPer aggiungere ulteriori commenti, rispondi a questa email.",
|
150
|
+
|
151
|
+
"LABEL_ERROR_FIELD_REQUIRED": "Campo richiesto",
|
152
|
+
"SENT_AN_ATTACHMENT": "ha inviato un allegato",
|
153
|
+
"SENT_AN_IMAGE":"ha inviato un'immagine"
|
114
154
|
}
|
115
155
|
},
|
116
156
|
{
|
@@ -136,7 +176,7 @@
|
|
136
176
|
"CALLOUT_TITLE_PLACEHOLDER": "🖐 Besoin d'aide?",
|
137
177
|
"CALLOUT_MSG_PLACEHOLDER": "Cliquez ici et commencez à discuter avec nous!",
|
138
178
|
"CUSTOMER_SATISFACTION": "Évaluation des services",
|
139
|
-
"YOUR_OPINION_ON_OUR_CUSTOMER_SERVICE": "
|
179
|
+
"YOUR_OPINION_ON_OUR_CUSTOMER_SERVICE": "Votre avis sur notre service client",
|
140
180
|
"DOWNLOAD_TRANSCRIPT": "Télécharger la transcription",
|
141
181
|
"BACK": "En arrière",
|
142
182
|
"YOUR_RATING": "votre vote",
|
@@ -151,10 +191,16 @@
|
|
151
191
|
"BUTTON_EDIT_PROFILE": "Modifier le profil",
|
152
192
|
"BUTTON_DOWNLOAD_TRANSCRIPT": "Télécharger la transcription",
|
153
193
|
"RATE_CHAT": "évaluer la conversation",
|
194
|
+
|
154
195
|
"WELLCOME_TITLE": "Salut, bienvenue à Tiledesk 👋",
|
155
196
|
"WELLCOME_MSG": "Comment pouvons-nous vous aider?",
|
156
|
-
"OPTIONS": "options",
|
157
197
|
"WELLCOME": "Bienvenue",
|
198
|
+
|
199
|
+
"WELCOME_TITLE": "Salut, bienvenue à Tiledesk 👋",
|
200
|
+
"WELCOME_MSG": "Comment pouvons-nous vous aider?",
|
201
|
+
"WELCOME": "Bienvenue",
|
202
|
+
|
203
|
+
"OPTIONS": "options",
|
158
204
|
"SOUND_OFF": "Sound off",
|
159
205
|
"SOUND_ON": "Sound on",
|
160
206
|
"LOGOUT": "Connectez-out",
|
@@ -167,7 +213,20 @@
|
|
167
213
|
"SEE_PREVIOUS": "voir les conversations précédentes",
|
168
214
|
"WAITING_TIME_FOUND": "L'équipe répond généralement en $reply_time",
|
169
215
|
"WAITING_TIME_NOT_FOUND": "Nous vous répondrons dans les plus brefs délais",
|
170
|
-
"CLOSED": "
|
216
|
+
"CLOSED": "Fermé",
|
217
|
+
|
218
|
+
"INFO_SUPPORT_USER_ADDED_SUBJECT":"toi",
|
219
|
+
"INFO_SUPPORT_USER_ADDED_YOU_VERB":"tu as été ajouté ",
|
220
|
+
"INFO_SUPPORT_USER_ADDED_COMPLEMENT":"rejoint",
|
221
|
+
"INFO_SUPPORT_USER_ADDED_VERB":"discuter",
|
222
|
+
"INFO_SUPPORT_CHAT_REOPENED":"Chat rouvert",
|
223
|
+
"INFO_SUPPORT_CHAT_CLOSED":"Chat fermé",
|
224
|
+
|
225
|
+
"TICKET_TAKING":"La demande a été reçue et le personnel d'assistance la traite.\nPour ajouter d'autres commentaires, répondez à cet e-mail.",
|
226
|
+
|
227
|
+
"LABEL_ERROR_FIELD_REQUIRED": "Champ obligatoire",
|
228
|
+
"SENT_AN_ATTACHMENT": "envoyé une pièce jointe",
|
229
|
+
"SENT_AN_IMAGE": "envoyé une image"
|
171
230
|
}
|
172
231
|
},
|
173
232
|
{
|
@@ -208,9 +267,15 @@
|
|
208
267
|
"BUTTON_EDIT_PROFILE":"Actualización del perfil",
|
209
268
|
"BUTTON_DOWNLOAD_TRANSCRIPT":"Download transcript",
|
210
269
|
"RATE_CHAT":"Califica el chat",
|
270
|
+
|
211
271
|
"WELLCOME_TITLE":"Hola, bienvenido a tiledesk 👋",
|
212
272
|
"WELLCOME_MSG":"¿Cómo podemos ayudar?",
|
213
273
|
"WELLCOME":"¡Bienvenido!",
|
274
|
+
|
275
|
+
"WELCOME_TITLE":"Hola, bienvenido a tiledesk 👋",
|
276
|
+
"WELCOME_MSG":"¿Cómo podemos ayudar?",
|
277
|
+
"WELCOME":"¡Bienvenido!",
|
278
|
+
|
214
279
|
"OPTIONS":"Opciones",
|
215
280
|
"SOUND_OFF":"Sonido apagado",
|
216
281
|
"SOUND_ON":"Sonido encendido",
|
@@ -224,7 +289,21 @@
|
|
224
289
|
"SEE_PREVIOUS":"Ver anterior",
|
225
290
|
"WAITING_TIME_FOUND":"El equipo típicamente responde en $reply_time",
|
226
291
|
"WAITING_TIME_NOT_FOUND":"El equipo responderá lo antes posible.",
|
227
|
-
"CLOSED":"
|
292
|
+
"CLOSED":"Cerrado",
|
293
|
+
|
294
|
+
"INFO_SUPPORT_USER_ADDED_SUBJECT":"usted",
|
295
|
+
"INFO_SUPPORT_USER_ADDED_YOU_VERB":"usted ha sido agregado ",
|
296
|
+
"INFO_SUPPORT_USER_ADDED_COMPLEMENT":"unido",
|
297
|
+
"INFO_SUPPORT_USER_ADDED_VERB":"para charlar",
|
298
|
+
"INFO_SUPPORT_CHAT_REOPENED":"Chat reabierto",
|
299
|
+
"INFO_SUPPORT_CHAT_CLOSED":"Chat cerrado",
|
300
|
+
|
301
|
+
"TICKET_TAKING":"La solicitud ha sido recibida y el personal de asistencia está tratando con ella. \nPara agregar más comentarios, responda a este correo electrónico.",
|
302
|
+
|
303
|
+
"LABEL_ERROR_FIELD_REQUIRED": "Campo obligatorio",
|
304
|
+
"SENT_AN_ATTACHMENT": "envió un archivo adjunto",
|
305
|
+
"SENT_AN_IMAGE": "envió una imagen"
|
306
|
+
|
228
307
|
}
|
229
308
|
},
|
230
309
|
{
|
@@ -265,14 +344,20 @@
|
|
265
344
|
"BUTTON_EDIT_PROFILE":"Profil aktualisieren",
|
266
345
|
"BUTTON_DOWNLOAD_TRANSCRIPT":"Download transcript",
|
267
346
|
"RATE_CHAT":"Chat bewerten",
|
347
|
+
|
268
348
|
"WELLCOME_TITLE":"Hallo, willkommen in Tiledesk 👋",
|
269
349
|
"WELLCOME_MSG":"Wie können wir helfen?",
|
270
350
|
"WELLCOME":"Herzlich willkommen",
|
351
|
+
|
352
|
+
"WELCOME_TITLE":"Hallo, willkommen in Tiledesk 👋",
|
353
|
+
"WELCOME_MSG":"Wie können wir helfen?",
|
354
|
+
"WELCOME":"Herzlich willkommen",
|
355
|
+
|
271
356
|
"OPTIONS":"Optionen",
|
272
357
|
"SOUND_OFF":"Ton aus",
|
273
358
|
"SOUND_ON":"Ton an",
|
274
359
|
"LOGOUT":"Ausloggen",
|
275
|
-
"CLOSE":"
|
360
|
+
"CLOSE":"Schließen",
|
276
361
|
"PREV_CONVERSATIONS":"Ihre Gespräche",
|
277
362
|
"YOU":"Du",
|
278
363
|
"SHOW_ALL_CONV":"zeige alles",
|
@@ -281,7 +366,20 @@
|
|
281
366
|
"SEE_PREVIOUS":"siehe vorher",
|
282
367
|
"WAITING_TIME_FOUND":"Das Team antwortet normalerweise in $reply_time",
|
283
368
|
"WAITING_TIME_NOT_FOUND":"Das Team wird so schnell wie möglich antworten",
|
284
|
-
"CLOSED":"
|
369
|
+
"CLOSED":"Geschlossen",
|
370
|
+
|
371
|
+
"INFO_SUPPORT_USER_ADDED_SUBJECT": "Sie",
|
372
|
+
"INFO_SUPPORT_USER_ADDED_YOU_VERB": "Sie wurden hinzugefügt ",
|
373
|
+
"INFO_SUPPORT_USER_ADDED_COMPLEMENT": "beigetreten",
|
374
|
+
"INFO_SUPPORT_USER_ADDED_VERB": "zum Chatten",
|
375
|
+
"INFO_SUPPORT_CHAT_REOPENED": "Chat wieder geöffnet",
|
376
|
+
"INFO_SUPPORT_CHAT_CLOSED": "Chat geschlossen",
|
377
|
+
|
378
|
+
"TICKET_TAKING":"Die Anfrage ist eingegangen und wird vom Hilfspersonal bearbeitet.\nUm weitere Kommentare hinzuzufügen, antworten Sie auf diese E-Mail.",
|
379
|
+
|
380
|
+
"LABEL_ERROR_FIELD_REQUIRED": "Pflichtfeld",
|
381
|
+
"SENT_AN_ATTACHMENT": "Anhang gesendet",
|
382
|
+
"SENT_AN_IMAGE": "ein Bild gesendet"
|
285
383
|
}
|
286
384
|
},
|
287
385
|
{
|
@@ -322,9 +420,15 @@
|
|
322
420
|
"BUTTON_EDIT_PROFILE":"Atualizar perfil",
|
323
421
|
"BUTTON_DOWNLOAD_TRANSCRIPT":"Download transcript",
|
324
422
|
"RATE_CHAT":"Classificar conversa",
|
423
|
+
|
325
424
|
"WELLCOME_TITLE":"Olá, seja bem-vindo ao Tiledesk 👋",
|
326
425
|
"WELLCOME_MSG":"Como podemos ajudar?",
|
327
426
|
"WELLCOME":"Bem-vinda",
|
427
|
+
|
428
|
+
"WELCOME_TITLE":"Olá, seja bem-vindo ao Tiledesk 👋",
|
429
|
+
"WELCOME_MSG":"Como podemos ajudar?",
|
430
|
+
"WELCOME":"Bem-vinda",
|
431
|
+
|
328
432
|
"OPTIONS":"Opções",
|
329
433
|
"SOUND_OFF":"som desligado",
|
330
434
|
"SOUND_ON":"som ligado",
|
@@ -338,7 +442,20 @@
|
|
338
442
|
"SEE_PREVIOUS":"ver anterior",
|
339
443
|
"WAITING_TIME_FOUND":"A equipe normalmente responde em $reply_time",
|
340
444
|
"WAITING_TIME_NOT_FOUND":"A equipe responderá o mais breve possível",
|
341
|
-
"CLOSED":"
|
445
|
+
"CLOSED":"Fechado",
|
446
|
+
|
447
|
+
"INFO_SUPPORT_USER_ADDED_SUBJECT": "você",
|
448
|
+
"INFO_SUPPORT_USER_ADDED_YOU_VERB": "você foi adicionado ",
|
449
|
+
"INFO_SUPPORT_USER_ADDED_COMPLEMENT": "aderiu",
|
450
|
+
"INFO_SUPPORT_USER_ADDED_VERB": "para conversar",
|
451
|
+
"INFO_SUPPORT_CHAT_REOPENED": "Chat reaberto",
|
452
|
+
"INFO_SUPPORT_CHAT_CLOSED": "Bate-papo fechado",
|
453
|
+
|
454
|
+
"TICKET_TAKING":"A solicitação foi recebida e a equipe de assistência está tratando dela. \nPara adicionar mais comentários, responda a este e-mail.",
|
455
|
+
|
456
|
+
"LABEL_ERROR_FIELD_REQUIRED": "Campo obrigatório",
|
457
|
+
"SENT_AN_ATTACHMENT": "enviou um anexo",
|
458
|
+
"SENT_AN_IMAGE": "enviou uma imagem"
|
342
459
|
}
|
343
460
|
},
|
344
461
|
{
|
@@ -379,14 +496,20 @@
|
|
379
496
|
"BUTTON_EDIT_PROFILE":"Обновить профиль",
|
380
497
|
"BUTTON_DOWNLOAD_TRANSCRIPT":"Download transcript",
|
381
498
|
"RATE_CHAT":"Оценить чат",
|
499
|
+
|
382
500
|
"WELLCOME_TITLE":"Привет, добро пожаловать в Tiledesk 👋",
|
383
501
|
"WELLCOME_MSG":"Как мы можем помочь?",
|
384
502
|
"WELLCOME":"желанный",
|
503
|
+
|
504
|
+
"WELCOME_TITLE":"Привет, добро пожаловать в Tiledesk 👋",
|
505
|
+
"WELCOME_MSG":"Как мы можем помочь?",
|
506
|
+
"WELCOME":"желанный",
|
507
|
+
|
385
508
|
"OPTIONS":"опции",
|
386
509
|
"SOUND_OFF":"звук выключен",
|
387
510
|
"SOUND_ON":"звучать на",
|
388
511
|
"LOGOUT":"выйти",
|
389
|
-
"CLOSE":"
|
512
|
+
"CLOSE":"Закрывать",
|
390
513
|
"PREV_CONVERSATIONS":"Ваши разговоры",
|
391
514
|
"YOU":"Вы",
|
392
515
|
"SHOW_ALL_CONV":"показать все",
|
@@ -395,7 +518,19 @@
|
|
395
518
|
"SEE_PREVIOUS":"смотри предыдущий",
|
396
519
|
"WAITING_TIME_FOUND":"Команда обычно отвечает в $reply_time",
|
397
520
|
"WAITING_TIME_NOT_FOUND":"Команда ответит как можно скорее",
|
398
|
-
"CLOSED":"
|
521
|
+
"CLOSED":"Закрыто",
|
522
|
+
"INFO_SUPPORT_USER_ADDED_SUBJECT": "вы",
|
523
|
+
"INFO_SUPPORT_USER_ADDED_YOU_VERB": "вы добавлены ",
|
524
|
+
"INFO_SUPPORT_USER_ADDED_COMPLEMENT": "присоединился",
|
525
|
+
"INFO_SUPPORT_USER_ADDED_VERB": "в чат",
|
526
|
+
"INFO_SUPPORT_CHAT_REOPENED": "Чат возобновлен",
|
527
|
+
"INFO_SUPPORT_CHAT_CLOSED": "Чат закрыт",
|
528
|
+
|
529
|
+
"TICKET_TAKING":"Запрос был получен, и обслуживающий персонал занимается им. \nЧтобы добавить больше комментариев, ответьте на это письмо.",
|
530
|
+
|
531
|
+
"LABEL_ERROR_FIELD_REQUIRED": "Обязательное поле",
|
532
|
+
"SENT_AN_ATTACHMENT": "отправлено вложение",
|
533
|
+
"SENT_AN_IMAGE": "отправил изображение"
|
399
534
|
}
|
400
535
|
},
|
401
536
|
{
|
@@ -436,9 +571,15 @@
|
|
436
571
|
"BUTTON_EDIT_PROFILE":"Profili güncelle",
|
437
572
|
"BUTTON_DOWNLOAD_TRANSCRIPT":"Download transcript",
|
438
573
|
"RATE_CHAT":"Sohbeti derecelendir",
|
574
|
+
|
439
575
|
"WELLCOME_TITLE":"Merhaba Tiledesk’e hoş geldiniz. 👋",
|
440
576
|
"WELLCOME_MSG":"Size nasıl yardımcı olabiliriz?",
|
441
577
|
"WELLCOME":"Hoş geldiniz.",
|
578
|
+
|
579
|
+
"WELCOME_TITLE":"Merhaba Tiledesk’e hoş geldiniz. 👋",
|
580
|
+
"WELCOME_MSG":"Size nasıl yardımcı olabiliriz?",
|
581
|
+
"WELCOME":"Hoş geldiniz.",
|
582
|
+
|
442
583
|
"OPTIONS":"Seçenekler",
|
443
584
|
"SOUND_OFF":"Ses kapalı",
|
444
585
|
"SOUND_ON":"Ses açık",
|
@@ -452,7 +593,20 @@
|
|
452
593
|
"SEE_PREVIOUS":"Öncekine bak",
|
453
594
|
"WAITING_TIME_FOUND":"Ekip genellikle …… içerisinde cevaplar $reply_time",
|
454
595
|
"WAITING_TIME_NOT_FOUND":"Ekip en kısa süre içerisinde cevap verecektir.",
|
455
|
-
"CLOSED":"
|
596
|
+
"CLOSED":"Kapali",
|
597
|
+
|
598
|
+
"INFO_SUPPORT_USER_ADDED_SUBJECT": "siz",
|
599
|
+
"INFO_SUPPORT_USER_ADDED_YOU_VERB": "eklendiniz ",
|
600
|
+
"INFO_SUPPORT_USER_ADDED_COMPLEMENT": "katıldı",
|
601
|
+
"INFO_SUPPORT_USER_ADDED_VERB": "sohbet etmek",
|
602
|
+
"INFO_SUPPORT_CHAT_REOPENED": "Sohbet yeniden açıldı",
|
603
|
+
"INFO_SUPPORT_CHAT_CLOSED": "Sohbet kapatıldı",
|
604
|
+
|
605
|
+
"TICKET_TAKING":"Talep alındı ve yardım ekibi bununla ilgileniyor.\nDaha fazla yorum eklemek için bu e-postayı yanıtlayın.",
|
606
|
+
|
607
|
+
"LABEL_ERROR_FIELD_REQUIRED": "Gerekli alan",
|
608
|
+
"SENT_AN_ATTACHMENT": "bir ek gönderdi",
|
609
|
+
"SENT_AN_IMAGE": "bir resim gönderdi"
|
456
610
|
}
|
457
611
|
}
|
458
612
|
]
|
package/event/messageEvent.js
CHANGED
@@ -61,6 +61,11 @@ function populateMessageWithRequest(message, eventPrefix) {
|
|
61
61
|
populate('participatingAgents').
|
62
62
|
populate({path:'requester',populate:{path:'id_user'}}).
|
63
63
|
lean().
|
64
|
+
//perche lean?
|
65
|
+
// TODO availableAgentsCount nn c'è per il lean problema trigger
|
66
|
+
// request.department._id DA CORREGGERE ANCHE PER REQUEST.CREATE
|
67
|
+
// request.department.hasBot
|
68
|
+
// request.isOpen
|
64
69
|
cache(cacheUtil.defaultTTL, message.id_project+":requests:request_id:"+message.recipient).
|
65
70
|
exec(function (err, request) {
|
66
71
|
|
@@ -88,6 +93,7 @@ function populateMessageWithRequest(message, eventPrefix) {
|
|
88
93
|
winston.debug("message.emit",messageJson );
|
89
94
|
messageEvent.emit(eventPrefix,messageJson );
|
90
95
|
|
96
|
+
//se a req.first_text toglio ritorni a capo è sempre diverso da msg.txt
|
91
97
|
if (message.text === request.first_text){
|
92
98
|
messageEvent.emit(eventPrefix+'.first', messageJson );
|
93
99
|
}
|
@@ -98,6 +104,17 @@ function populateMessageWithRequest(message, eventPrefix) {
|
|
98
104
|
messageEvent.emit(eventPrefix+'.from.requester', messageJson );
|
99
105
|
}
|
100
106
|
|
107
|
+
// olumn":21,"file":"/app/node_modules/mongoose/lib/model.js","function":null,"line":4869,"method":null,"native":false},{"column":11,"file":"/app/node_modules/mongoose/lib/query.js","function":"_hooks.execPost","line":4391,"method":"execPost","native":false},{"column":16,"file":"/app/node_modules/kareem/index.js","function":null,"line":135,"method":null,"native":false},{"column":9,"file":"internal/process/task_queues.js","function":"processTicksAndRejections","line":79,"method":null,"native":false}]}
|
108
|
+
// 2021-01-26T10:30:16.045281+00:00 app[web.1]: error: uncaughtException: Cannot read property 'name' of undefined
|
109
|
+
// 2021-01-26T10:30:16.045283+00:00 app[web.1]: TypeError: Cannot read property 'name' of undefined
|
110
|
+
// 2021-01-26T10:30:16.045284+00:00 app[web.1]: at /app/event/messageEvent.js:101:80
|
111
|
+
// 2021-01-26T10:30:16.045284+00:00 app[web.1]: at /app/node_modules/mongoose/lib/model.js:4846:16
|
112
|
+
// 2021-01-26T10:30:16.045285+00:00 app[web.1]: at /app/node_modules/mongoose/lib/helpers/promiseOrCallback.js:24:16
|
113
|
+
// 2021-01-26T10:30:16.045285+00:00 app[web.1]: at /app/node_modules/mongoose/lib/model.js:4869:21
|
114
|
+
// 2021-01-26T10:30:16.045286+00:00 app[web.1]: at _hooks.execPost (/app/node_modules/mongoose/lib/query.js:4391:11)
|
115
|
+
// 2021-01-26T10:30:16.045286+00:00 app[web.1]: at /app/node_modules/kareem/index.js:135:16
|
116
|
+
// 2021-01-26T10:30:16.045287+00:00 app[web.1]:
|
117
|
+
|
101
118
|
message2Event.emit(eventPrefix+'.request.channel.' + request.channel.name, messageJson );
|
102
119
|
message2Event.emit(eventPrefix+'.request.channelOutbound.' + request.channelOutbound.name, messageJson );
|
103
120
|
message2Event.emit(eventPrefix+'.channel.' + message.channel.name, messageJson );
|
@@ -129,7 +146,7 @@ function populateMessageWithRequest(message, eventPrefix) {
|
|
129
146
|
}
|
130
147
|
|
131
148
|
} else {
|
132
|
-
winston.
|
149
|
+
winston.debug("request is undefined in messageEvent. Is it a direct or group message ?" );
|
133
150
|
messageEvent.emit(eventPrefix,messageJson );
|
134
151
|
message2Event.emit(eventPrefix+'.channel.' + message.channel.name, messageJson );
|
135
152
|
}
|
package/middleware/passport.js
CHANGED
@@ -63,7 +63,7 @@ module.exports = function(passport) {
|
|
63
63
|
|
64
64
|
var opts = {
|
65
65
|
// jwtFromRequest: ExtractJwt.fromAuthHeader(),
|
66
|
-
jwtFromRequest:
|
66
|
+
jwtFromRequest:ExtractJwt.fromExtractors([ExtractJwt.fromAuthHeaderWithScheme("jwt"), ExtractJwt.fromUrlQueryParameter('secret_token')]),
|
67
67
|
//this will help you to pass request body to passport
|
68
68
|
passReqToCallback: true, //https://stackoverflow.com/questions/55163015/how-to-bind-or-pass-req-parameter-to-passport-js-jwt-strategy
|
69
69
|
// secretOrKey: configSecret,
|
@@ -341,9 +341,15 @@ module.exports = function(passport) {
|
|
341
341
|
|
342
342
|
|
343
343
|
passport.use(new BasicStrategy(function(userid, password, done) {
|
344
|
-
|
345
|
-
|
346
|
-
|
344
|
+
|
345
|
+
winston.debug("BasicStrategy: " + userid);
|
346
|
+
|
347
|
+
|
348
|
+
var email = userid.toLowerCase();
|
349
|
+
winston.debug("email lowercase: " + email);
|
350
|
+
|
351
|
+
User.findOne({ email: email, status: 100}, 'email firstname lastname password emailverified id')
|
352
|
+
.cache(cacheUtil.defaultTTL, "users:email:"+email)
|
347
353
|
.exec(function (err, user) {
|
348
354
|
|
349
355
|
if (err) {
|
@@ -0,0 +1,67 @@
|
|
1
|
+
var mongoose = require('mongoose');
|
2
|
+
var winston = require('../config/winston');
|
3
|
+
|
4
|
+
/**
|
5
|
+
* Make any changes you need to make to the database here
|
6
|
+
*/
|
7
|
+
async function up () {
|
8
|
+
// Write migration here
|
9
|
+
await new Promise((resolve, reject) => {
|
10
|
+
|
11
|
+
winston.info("Duplicate");
|
12
|
+
|
13
|
+
|
14
|
+
return mongoose.connection.db.collection('requests').aggregate(
|
15
|
+
{"$group" : { "_id": "$request_id", "count": { "$sum": 1 } } },
|
16
|
+
{"$match": {"_id" :{ "$ne" : null }, "count" : {"$gt": 1} } }, //"duplicated_request_id":{"$ne":true}
|
17
|
+
{"$sort": {"count" : -1} },
|
18
|
+
{"$project": {"request_id" : "$_id", "_id" : 0} }
|
19
|
+
).toArray( function (err, requests) {
|
20
|
+
if (err) {
|
21
|
+
winston.error("Schema migration: requests err", err);
|
22
|
+
}
|
23
|
+
|
24
|
+
winston.info("found requests", requests);
|
25
|
+
winston.info("found requests.length"+requests.length);
|
26
|
+
|
27
|
+
|
28
|
+
requests.forEach(
|
29
|
+
function(request, i){
|
30
|
+
|
31
|
+
winston.info("request",request);
|
32
|
+
winston.info("request._id: " + request._id);
|
33
|
+
|
34
|
+
|
35
|
+
return mongoose.connection.db.collection('requests')
|
36
|
+
//.findOne({request_id:request._id},
|
37
|
+
// ,"id_project": request.id_project+"_deleted",
|
38
|
+
.updateOne({request_id:request._id},{ "$set": { "request_id": request._id+"_duplicated", "duplicated_request_id":true } },
|
39
|
+
function (err, updates) {
|
40
|
+
if (err) {
|
41
|
+
winston.error("Schema migration: requests err", err);
|
42
|
+
}
|
43
|
+
winston.info("updates",updates);
|
44
|
+
});
|
45
|
+
|
46
|
+
});
|
47
|
+
|
48
|
+
|
49
|
+
|
50
|
+
winston.info("Schema updated path for requests "+requests.length);
|
51
|
+
return resolve('ok');
|
52
|
+
|
53
|
+
});
|
54
|
+
|
55
|
+
});
|
56
|
+
}
|
57
|
+
|
58
|
+
/**
|
59
|
+
* Make any changes that UNDO the up function side effects here (if possible)
|
60
|
+
*/
|
61
|
+
async function down () {
|
62
|
+
// Write migration here
|
63
|
+
}
|
64
|
+
|
65
|
+
module.exports = { up, down };
|
66
|
+
|
67
|
+
|
package/models/department.js
CHANGED
@@ -2,6 +2,7 @@ var mongoose = require('mongoose');
|
|
2
2
|
var Schema = mongoose.Schema;
|
3
3
|
var routingConstants = require('../models/routingConstants');
|
4
4
|
var winston = require('../config/winston');
|
5
|
+
var TagSchema = require("../models/tag");
|
5
6
|
|
6
7
|
var DepartmentSchema = new Schema({
|
7
8
|
id_bot: {
|
@@ -46,6 +47,7 @@ var DepartmentSchema = new Schema({
|
|
46
47
|
index: true
|
47
48
|
// required: true
|
48
49
|
},
|
50
|
+
tags: [TagSchema],
|
49
51
|
status: {
|
50
52
|
type: Number,
|
51
53
|
default: 1,
|
@@ -71,6 +73,7 @@ DepartmentSchema.virtual('bot', {
|
|
71
73
|
});
|
72
74
|
|
73
75
|
DepartmentSchema.virtual('hasBot').get(function () {
|
76
|
+
// winston.debug("department hasBot virtual called");
|
74
77
|
if (this.id_bot!=undefined) {
|
75
78
|
return true;
|
76
79
|
}else {
|
package/models/faq.js
CHANGED
@@ -93,8 +93,14 @@ FaqSchema.index({ id_project: 1, id_faq_kb: 1, question: 1 });
|
|
93
93
|
// https://docs.mongodb.com/manual/core/index-text/
|
94
94
|
// https://docs.mongodb.com/manual/tutorial/specify-language-for-text-index/
|
95
95
|
// https://docs.mongodb.com/manual/reference/text-search-languages/#text-search-languages
|
96
|
-
|
97
|
-
|
96
|
+
|
97
|
+
|
98
|
+
FaqSchema.index({question: 'text'},
|
99
|
+
{"name":"faq_fulltext","default_language": defaultFullTextLanguage,"language_override": "language"}); // schema level
|
100
|
+
|
101
|
+
// FaqSchema.index({question: 'text', answer: 'text'},
|
102
|
+
// {"name":"faq_fulltext","default_language": defaultFullTextLanguage,"language_override": "language", weights: {question: 10,answer: 1}}); // schema level
|
103
|
+
|
98
104
|
|
99
105
|
FaqSchema.index({ id_project: 1, id_faq_kb: 1, intent_display_name: 1 }, { unique: true });
|
100
106
|
|
package/models/faq_kb.js
CHANGED
package/models/message.js
CHANGED
@@ -6,6 +6,12 @@ var MessageConstants = require('../models/messageConstants');
|
|
6
6
|
var defaultFullTextLanguage = process.env.DEFAULT_FULLTEXT_INDEX_LANGUAGE || "none";
|
7
7
|
|
8
8
|
var MessageSchema = new Schema({
|
9
|
+
// messageId: {
|
10
|
+
// type: String,
|
11
|
+
// required: true,
|
12
|
+
// // unique: true???
|
13
|
+
// index: true
|
14
|
+
// },
|
9
15
|
sender: {
|
10
16
|
type: String,
|
11
17
|
required: true,
|
@@ -21,10 +27,10 @@ var MessageSchema = new Schema({
|
|
21
27
|
required: true,
|
22
28
|
index: true
|
23
29
|
},
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
30
|
+
recipientFullname: {
|
31
|
+
type: String,
|
32
|
+
required: false
|
33
|
+
},
|
28
34
|
type: {
|
29
35
|
type: String,
|
30
36
|
required: true,
|
@@ -14,10 +14,16 @@ module.exports = {
|
|
14
14
|
DIRECT : "direct",
|
15
15
|
},
|
16
16
|
|
17
|
+
MESSAGE_TYPE : {
|
18
|
+
TEXT : "text",
|
19
|
+
IMAGE : "image",
|
20
|
+
FRAME: "frame"
|
21
|
+
},
|
22
|
+
|
17
23
|
|
18
24
|
LABELS : {
|
19
25
|
EN : {
|
20
|
-
JOIN_OPERATOR_MESSAGE : "We are putting you in touch with an operator..",
|
26
|
+
// JOIN_OPERATOR_MESSAGE : "We are putting you in touch with an operator..",
|
21
27
|
NO_AVAILABLE_OPERATOR_MESSAGE : "Hello, no operators are available at the moment. Please leave a chat message, we will reply to you soon.",
|
22
28
|
// TOUCHING_OPERATOR: "We are putting you in touch with an operator. Please wait..",
|
23
29
|
TOUCHING_OPERATOR: "A new support request has been assigned to you"
|
@@ -25,7 +31,7 @@ module.exports = {
|
|
25
31
|
// REOPEN_MESSAGE : "Chat re-opened"
|
26
32
|
},
|
27
33
|
IT : {
|
28
|
-
JOIN_OPERATOR_MESSAGE : "La stiamo mettendo in contatto con un operatore. Attenda...",
|
34
|
+
// JOIN_OPERATOR_MESSAGE : "La stiamo mettendo in contatto con un operatore. Attenda...",
|
29
35
|
NO_AVAILABLE_OPERATOR_MESSAGE : "Salve al momento non è disponibile alcun operatore. Lasci un messaggio in chat, la contatteremo presto.",
|
30
36
|
TOUCHING_OPERATOR: "Una nuova richiesta di supporto è stata assegnata a te"
|
31
37
|
// TOUCHING_OPERATOR :"La stiamo mettendo in contatto con un operatore. Attenda...",
|
@@ -33,7 +39,7 @@ module.exports = {
|
|
33
39
|
// REOPEN_MESSAGE : "Chat riaperta"
|
34
40
|
},
|
35
41
|
"IT-IT" : {
|
36
|
-
JOIN_OPERATOR_MESSAGE : "La stiamo mettendo in contatto con un operatore. Attenda...",
|
42
|
+
// JOIN_OPERATOR_MESSAGE : "La stiamo mettendo in contatto con un operatore. Attenda...",
|
37
43
|
NO_AVAILABLE_OPERATOR_MESSAGE : "Salve al momento non è disponibile alcun operatore. Lasci un messaggio in chat, la contatteremo presto.",
|
38
44
|
TOUCHING_OPERATOR: "Una nuova richiesta di supporto è stata assegnata a te"
|
39
45
|
// TOUCHING_OPERATOR :"La stiamo mettendo in contatto con un operatore. Attenda...",
|