@tiledesk/tiledesk-server 2.1.41 → 2.2.4
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 +198 -1
- package/Dockerfile +1 -1
- package/Dockerfile-en +1 -1
- package/README.md +5 -7
- package/app.js +12 -1
- package/channels/chat21/chat21Contact.js +34 -8
- package/channels/chat21/chat21Handler.js +48 -5
- package/channels/chat21/chat21WebHook.js +34 -5
- package/channels/chat21/nativeauth.js +2 -2
- package/config/email.js +2 -1
- 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/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 +3 -3
- package/models/request.js +33 -3
- package/package.json +31 -28
- package/pubmodules/emailNotification/requestNotification.js +380 -62
- package/pubmodules/messageActions/messageActionsInterceptor.js +20 -7
- package/pubmodules/messageTransformer/index.js +1 -1
- package/pubmodules/messageTransformer/microLanguageAttributesTransformerInterceptor.js +67 -0
- package/pubmodules/pubModulesManager.js +66 -14
- package/pubmodules/rules/conciergeBot.js +81 -49
- package/routes/auth.js +34 -10
- package/routes/campaigns.js +117 -25
- package/routes/faq.js +19 -0
- package/routes/faq_kb.js +13 -4
- package/routes/faqpub.js +1 -1
- 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 +1103 -298
- package/services/faqBotHandler.js +176 -61
- package/services/faqBotSupport.js +181 -117
- package/services/faqService.js +17 -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 +78 -52
- package/template/email/ticket.txt +5 -1
- 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 +5 -5
- 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/template/email/ticket-taking.txt +0 -7
@@ -0,0 +1,54 @@
|
|
1
|
+
# Use the latest 2.1 version of CircleCI pipeline process engine.
|
2
|
+
# See: https://circleci.com/docs/2.0/configuration-reference
|
3
|
+
version: 2.1
|
4
|
+
|
5
|
+
orbs:
|
6
|
+
# The Node.js orb contains a set of prepackaged CircleCI configuration you can utilize
|
7
|
+
# Orbs reduce the amount of configuration required for common tasks.
|
8
|
+
# See the orb documentation here: https://circleci.com/developer/orbs/orb/circleci/node
|
9
|
+
node: circleci/node@4.1
|
10
|
+
|
11
|
+
|
12
|
+
jobs:
|
13
|
+
# Below is the definition of your job to build and test your app, you can rename and customize it as you want.
|
14
|
+
build-and-test:
|
15
|
+
# These next lines define a Docker executor: https://circleci.com/docs/2.0/executor-types/
|
16
|
+
# You can specify an image from Dockerhub or use one of our Convenience Images from CircleCI's Developer Hub.
|
17
|
+
# A list of available CircleCI Docker Convenience Images are available here: https://circleci.com/developer/images/image/cimg/node
|
18
|
+
docker:
|
19
|
+
- image: cimg/node:15.1
|
20
|
+
# Then run your tests!
|
21
|
+
# CircleCI will report the results back to your VCS provider.
|
22
|
+
steps:
|
23
|
+
# Checkout the code as the first step.
|
24
|
+
- checkout
|
25
|
+
# Next, the node orb's install-packages step will install the dependencies from a package.json.
|
26
|
+
# The orb install-packages step will also automatically cache them for faster future runs.
|
27
|
+
- node/install-packages
|
28
|
+
# If you are using yarn instead npm, remove the line above and uncomment the two lines below.
|
29
|
+
# - node/install-packages:
|
30
|
+
# pkg-manager: yarn
|
31
|
+
- restore_cache:
|
32
|
+
keys:
|
33
|
+
# when lock file changes, use increasingly general patterns to restore cache
|
34
|
+
- node-v1-{{ .Branch }}-{{ checksum "package-lock.json" }}
|
35
|
+
- node-v1-{{ .Branch }}-
|
36
|
+
- node-v1-
|
37
|
+
- save_cache:
|
38
|
+
paths:
|
39
|
+
- ~/usr/local/lib/node_modules # location depends on npm version
|
40
|
+
key: node-v1-{{ .Branch }}-{{ checksum "package-lock.json" }}
|
41
|
+
- run:
|
42
|
+
name: Run tests
|
43
|
+
command: npm test
|
44
|
+
|
45
|
+
workflows:
|
46
|
+
# Below is the definition of your workflow.
|
47
|
+
# Inside the workflow, you provide the jobs you want to run, e.g this workflow runs the build-and-test job above.
|
48
|
+
# CircleCI will run this workflow on every commit.
|
49
|
+
# For more details on extending your workflow, see the configuration docs: https://circleci.com/docs/2.0/configuration-reference/#workflows
|
50
|
+
sample:
|
51
|
+
jobs:
|
52
|
+
- build-and-test
|
53
|
+
# For running simple node tests, you could optionally use the node/test job from the orb to replicate and replace the job above in fewer lines.
|
54
|
+
# - node/test
|
package/.env.sample
CHANGED
@@ -0,0 +1,22 @@
|
|
1
|
+
name: Docker Image Community latest CI
|
2
|
+
|
3
|
+
on:
|
4
|
+
push:
|
5
|
+
branches: [ master ]
|
6
|
+
pull_request:
|
7
|
+
branches: [ master ]
|
8
|
+
|
9
|
+
jobs:
|
10
|
+
push_to_registry:
|
11
|
+
name: Push Docker image to Docker Hub
|
12
|
+
runs-on: ubuntu-latest
|
13
|
+
|
14
|
+
steps:
|
15
|
+
- uses: actions/checkout@v2
|
16
|
+
name: Check out the repo
|
17
|
+
- uses: docker/build-push-action@v1
|
18
|
+
with:
|
19
|
+
username: ${{ secrets.DOCKERHUB_USERNAME }}
|
20
|
+
password: ${{ secrets.DOCKERHUB_TOKEN }}
|
21
|
+
repository: tiledesk/tiledesk-server
|
22
|
+
tags: latest
|
@@ -0,0 +1,21 @@
|
|
1
|
+
name: Publish Docker Community image tags
|
2
|
+
|
3
|
+
on:
|
4
|
+
push:
|
5
|
+
tags:
|
6
|
+
- '**' # Push events to every tag including hierarchical tags like
|
7
|
+
jobs:
|
8
|
+
|
9
|
+
push_to_registry:
|
10
|
+
name: Push Docker image to Docker Hub
|
11
|
+
runs-on: ubuntu-latest
|
12
|
+
steps:
|
13
|
+
- name: Check out the repo
|
14
|
+
uses: actions/checkout@v2
|
15
|
+
- name: Push to Docker Hub
|
16
|
+
uses: docker/build-push-action@v1
|
17
|
+
with:
|
18
|
+
username: ${{ secrets.DOCKERHUB_USERNAME }}
|
19
|
+
password: ${{ secrets.DOCKERHUB_TOKEN }}
|
20
|
+
repository: tiledesk/tiledesk-server
|
21
|
+
tag_with_ref: true
|
package/CHANGELOG.md
CHANGED
@@ -1,3 +1,200 @@
|
|
1
|
+
# 2.2.4
|
2
|
+
- email invitation fix
|
3
|
+
|
4
|
+
# 2.2.3
|
5
|
+
- Email inboud fix (others disabled and inboudDomain variable fix and token query string encode fix)
|
6
|
+
|
7
|
+
# 2.2.2
|
8
|
+
- log fix
|
9
|
+
|
10
|
+
# 2.2.1
|
11
|
+
- log fix
|
12
|
+
|
13
|
+
# 2.2.0
|
14
|
+
- Cache circleci fix
|
15
|
+
- Added EMAIL_REPLY_ENABLED and EMAIL_INBOUND_DOMAIN env parameters.
|
16
|
+
- Added API_URL env variable TODO use wehbook url the same as API_URL if not differnet
|
17
|
+
|
18
|
+
# 2.1.42 (Compatible with tiledesk-dashboard 2.2.X)
|
19
|
+
|
20
|
+
|
21
|
+
- Added ticket_id sequence field to the request model
|
22
|
+
- Routing round robin fix (Also in 2.1.40.1)
|
23
|
+
- GLOBAL_SECRET env variable fix (Also in 2.1.40.4)
|
24
|
+
- Chatbot now support blocked_intent
|
25
|
+
- BugFix route request to another department with the same agents (Also in 2.1.40.1)
|
26
|
+
- Renamed the chatbot webhook payload field from faq to intent
|
27
|
+
- Updated tiledesk-chat-util to 0.8.21 (Also in 2.1.40.1)
|
28
|
+
- Removed request first_text replace new line with empty string (for ticketing)
|
29
|
+
|
30
|
+
- Fix login problem when email contains upper case char
|
31
|
+
- Removed answer field from the fulltext search of the faqs (2.1.40.3)
|
32
|
+
|
33
|
+
- Stripe fix for adding new agents (2.1.40.13)
|
34
|
+
- Added request delete endpoint by id (Also in 2.1.40.15)
|
35
|
+
- Campaigns direct and for group (Also in 2.1.40.16)
|
36
|
+
|
37
|
+
- Csv request export added tags (2.1.40.14)
|
38
|
+
- Changed request_id to the new standard: support-group-<project_id>-<uid>
|
39
|
+
- Added tag to the department model
|
40
|
+
- Bugfix first message with an image fix and touchText limited to 30 character or subject (2.1.40.3)
|
41
|
+
- Fix request create if department id is not correct
|
42
|
+
- MessageRoot endpoint also for group messages (Also in 2.1.40.16)
|
43
|
+
- c21 handler group mesages support (Also in 2.1.40.16)
|
44
|
+
- Added recipientFullname field to message model. Added save method to messageServive (Also in 2.1.40.16)
|
45
|
+
- ChatBot webhook fix when the webhook returns also attributes
|
46
|
+
- Messages export csv supported
|
47
|
+
- Request util to lookup id_project from request_id (2.1.40.24)
|
48
|
+
|
49
|
+
- Find user id from user email endpoint (also in 2.1.40.21)
|
50
|
+
- Inizialize enterprise modules before public modules
|
51
|
+
- Request Notification fix loading snapshot agents (also in 2.1.40.22)
|
52
|
+
- Config secret fix from env (also in 2.1.40.22)
|
53
|
+
- Lic ck for users (also in 2.1.40.26)
|
54
|
+
- Added s_ticketing_taking_01 trigger
|
55
|
+
- Added email template from project settings
|
56
|
+
- Faq pagination support
|
57
|
+
- For Ticketing send to the cc(s) the agent replies
|
58
|
+
- \agent now is hidden
|
59
|
+
- added \close faq
|
60
|
+
- \close now is hidden
|
61
|
+
- set custom role in custom auth using signInWithCustomToken
|
62
|
+
- Chat21 contacts find for agent logged with custom auth
|
63
|
+
- Added language field to faq_kb and used to specify the language for faq full-text query (default en)
|
64
|
+
- Added request priority field
|
65
|
+
- Concierge bot fix to reroute only for temp conversation without a bot. Race condition issue when you try manually route a request for example inside a chatbot webhook (Also in 2.1.40.31)
|
66
|
+
- Added webhook_enabled parameter to the faqService create method and test refactor
|
67
|
+
- Added SYNC_JOIN_LEAVE_GROUP_EVENT environment variable to enable sync between Chat21 (join and leave) and Tiledesk. Default is false. (Also in 2.1.40.32 )
|
68
|
+
- Added ALLOW_REOPEN_CHAT environment variable to reopen a chat if a user write after a chat is closed
|
69
|
+
- Used message.received instead message.create in the messageActionsInterceptor to fix race condition sometime occurs with \close message sent by the bot
|
70
|
+
- Please type your reply above this line Only if replyTo is specified
|
71
|
+
- Webhook origin header fix for webhook
|
72
|
+
|
73
|
+
|
74
|
+
## Email inbound
|
75
|
+
- EmailService supports custom email config with custom SMTP server settings and custom from email
|
76
|
+
- Added Tiledesk customer header in the outbound email
|
77
|
+
- Added Message-ID and sender (message sender fullname) on the outbound email
|
78
|
+
- Added project object to sendRequestTranscript function
|
79
|
+
- Welcome label fix key
|
80
|
+
- Seamless source page fix
|
81
|
+
|
82
|
+
# 2.1.41
|
83
|
+
- remove duplicate request script with: 1619185894304-request-remove-duplicated-request-by-request_id--autosync.js
|
84
|
+
- requestNotification improvement not sending email with empty email field
|
85
|
+
- Enabled witb DISABLE_SEND_OFFLINE_EMAIL the seamless conversation with email
|
86
|
+
- signinWithCustomToken endpoint of the auth router now support id_project body parameter for jwt with generic https://www.tiledesk.com audience field (used by tiledesk-smtp-server)
|
87
|
+
- files download endpoint
|
88
|
+
- emailService added EMAIL_REPLY_TO parameter;
|
89
|
+
- Added email notification for new message and new request for email and form channel (ticket)
|
90
|
+
- Added microLanguageTransformationInterceptor enabled when message.attributes.microlanguage==true
|
91
|
+
|
92
|
+
|
93
|
+
# 2.1.40.34 -> PROD
|
94
|
+
- logfix
|
95
|
+
|
96
|
+
# 2.1.40.33
|
97
|
+
|
98
|
+
- Added setTimeout to resolve race condition for \close event returned by bot
|
99
|
+
|
100
|
+
# 2.1.40.32
|
101
|
+
- Added SYNC_JOIN_LEAVE_GROUP_EVENT environment variable to enable sync between Chat21 (join and leave) and Tiledesk. Default is false.
|
102
|
+
|
103
|
+
# 2.1.40.31
|
104
|
+
- Concierge bot fix to reroute only for temp conversation without a bot. Race condition issue when you try manually route a request for example inside a chatbot webhook
|
105
|
+
|
106
|
+
# 2.1.40.30 -> PROD
|
107
|
+
- logfix
|
108
|
+
|
109
|
+
# 2.1.40.29
|
110
|
+
- --production for npm install within Docker for Enterprise
|
111
|
+
|
112
|
+
# 2.1.40.28
|
113
|
+
- --production for npm install within Docker
|
114
|
+
|
115
|
+
# 2.1.40.27
|
116
|
+
- Added language field to faq_kb and used to specify the language for faq full-text query
|
117
|
+
|
118
|
+
# 2.1.40.26
|
119
|
+
- Lic ck bug fix for users
|
120
|
+
|
121
|
+
# 2.1.40.25
|
122
|
+
- microLanguageTransformerInterceptor startup error. It is disabled. Module not present
|
123
|
+
|
124
|
+
# 2.1.40.24
|
125
|
+
- emailService toJSON is not a function fix
|
126
|
+
|
127
|
+
# 2.1.40.23
|
128
|
+
- requestNotification fix and requestUtilRoot lookup endpoint added
|
129
|
+
|
130
|
+
# 2.1.40.22
|
131
|
+
- Inizialize enterprise modules before public modules
|
132
|
+
- Request Notification fix loading snapshot agents
|
133
|
+
|
134
|
+
# 2.1.40.21
|
135
|
+
- Find user id from user email endpoint
|
136
|
+
|
137
|
+
# 2.1.40.20
|
138
|
+
- MessageRoot endpoint validation fix
|
139
|
+
|
140
|
+
# 2.1.40.19
|
141
|
+
- Stripe fix with version 1.1.5
|
142
|
+
|
143
|
+
# 2.1.40.18
|
144
|
+
- Messages export csv supported
|
145
|
+
|
146
|
+
# 2.1.40.17
|
147
|
+
- Stripe restored to the previous version 1.1.3
|
148
|
+
|
149
|
+
# 2.1.40.16
|
150
|
+
- added message recipientfullname field to the message entity to support chat campaigns for direct and group
|
151
|
+
|
152
|
+
# 2.1.40.15
|
153
|
+
- tag fix
|
154
|
+
|
155
|
+
# 2.1.40.14
|
156
|
+
- requet CSV export fix
|
157
|
+
|
158
|
+
# 2.1.40.13
|
159
|
+
- Stripe fix for adding new agents
|
160
|
+
|
161
|
+
# 2.1.40.12
|
162
|
+
- Docker image number fix
|
163
|
+
|
164
|
+
# 2.1.40.11
|
165
|
+
- Docker image number fix
|
166
|
+
|
167
|
+
# 2.1.40.10
|
168
|
+
- Docker image number fix
|
169
|
+
|
170
|
+
# 2.1.40.9
|
171
|
+
- Added request delete endpoint by id
|
172
|
+
|
173
|
+
# 2.1.40.7
|
174
|
+
- logfix
|
175
|
+
|
176
|
+
# 2.1.40.6
|
177
|
+
- Fix request create if department id is not correct
|
178
|
+
|
179
|
+
# 2.1.40.5
|
180
|
+
- Logfix
|
181
|
+
|
182
|
+
# 2.1.40.4
|
183
|
+
- GLOBAL_SECRET env variable fix
|
184
|
+
|
185
|
+
# 2.1.40.3
|
186
|
+
- Bugfix first message with an image fix and touchText limited to 30 character or subject
|
187
|
+
- Removed answer field from the fulltext search of the faqs
|
188
|
+
|
189
|
+
|
190
|
+
# 2.1.40.2
|
191
|
+
- log fix
|
192
|
+
|
193
|
+
# 2.1.40.1
|
194
|
+
- Routing round robin fix
|
195
|
+
- Updated tiledesk-chat-util to 0.8.21
|
196
|
+
- BugFix route request to another department with the same agents
|
197
|
+
|
1
198
|
|
2
199
|
# 2.1.40
|
3
200
|
- webhook fix for return empty body
|
@@ -171,7 +368,7 @@ Added email notification setting for each teammate (also in 2.1.14.3)
|
|
171
368
|
- Fix TD218 Audit log for user invitation already registered
|
172
369
|
|
173
370
|
# 2.1.12
|
174
|
-
- Chat21 engine selection with CHAT21_ENGINE=[
|
371
|
+
- Chat21 engine selection with CHAT21_ENGINE=[mqtt|firebase]
|
175
372
|
- Schema migration tool with mongoose-migrate. Added env property DISABLE_AUTO_SHEMA_MIGRATION
|
176
373
|
- #TD-250 Added emoji callout
|
177
374
|
- Cors fix. Removed alternative cors response header.
|
package/Dockerfile
CHANGED
package/Dockerfile-en
CHANGED
package/README.md
CHANGED
@@ -1,8 +1,12 @@
|
|
1
1
|
[![npm version](https://badge.fury.io/js/%40tiledesk%2Ftiledesk-server.svg)](https://badge.fury.io/js/%40tiledesk%2Ftiledesk-server)
|
2
2
|
|
3
|
-
[![
|
3
|
+
[![CircleCI](https://circleci.com/gh/Tiledesk/tiledesk-server.svg?style=svg)](https://circleci.com/gh/Tiledesk/tiledesk-server)
|
4
4
|
|
5
5
|
|
6
|
+
> ***🚀 Do you want to install Tiledesk on your server with just one click?***
|
7
|
+
>
|
8
|
+
> ***Use [Docker Compose Tiledesk installation](https://github.com/Tiledesk/tiledesk-deployment/blob/master/docker-compose/README.md) guide***
|
9
|
+
|
6
10
|
# Introduction
|
7
11
|
|
8
12
|
Tiledesk-server is the server engine of Tiledesk. Tiledesk is an Open Source Live Chat platform with integrated ChatBot written in NodeJs and Express. Build your own customer support with a multi-channel platform for Web, Android and iOS. More info here https://www.tiledesk.com.
|
@@ -81,9 +85,3 @@ To see how to upgrade tiledesk-server see [here](./docs/upgrading.md)
|
|
81
85
|
# Testing
|
82
86
|
Run unit test with `npm test` and integration test with `npm run test:int`
|
83
87
|
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
package/app.js
CHANGED
@@ -99,6 +99,9 @@ var cacheUtil = require("./utils/cacheUtil");
|
|
99
99
|
var images = require('./routes/images');
|
100
100
|
var files = require('./routes/files');
|
101
101
|
var campaigns = require('./routes/campaigns');
|
102
|
+
var logs = require('./routes/logs');
|
103
|
+
var requestUtilRoot = require('./routes/requestUtilRoot');
|
104
|
+
var urls = require('./routes/urls');
|
102
105
|
|
103
106
|
var bootDataLoader = require('./services/bootDataLoader');
|
104
107
|
var settingDataLoader = require('./services/settingDataLoader');
|
@@ -133,6 +136,11 @@ try {
|
|
133
136
|
}
|
134
137
|
|
135
138
|
|
139
|
+
//enterprise modules can modify pubmodule
|
140
|
+
modulesManager.start();
|
141
|
+
|
142
|
+
pubModulesManager.start();
|
143
|
+
|
136
144
|
|
137
145
|
settingDataLoader.save();
|
138
146
|
schemaMigrationService.checkSchemaMigration();
|
@@ -281,7 +289,11 @@ app.use('/testauth', [passport.authenticate(['basic', 'jwt'], { session: false }
|
|
281
289
|
app.use('/widgets', widgetsLoader);
|
282
290
|
app.use('/images', images);
|
283
291
|
app.use('/files', files);
|
292
|
+
app.use('/urls', urls);
|
284
293
|
app.use('/users', [passport.authenticate(['basic', 'jwt'], { session: false }), validtoken], users);
|
294
|
+
app.use('/logs', logs);
|
295
|
+
app.use('/requests_util', [passport.authenticate(['basic', 'jwt'], { session: false }), validtoken], requestUtilRoot);
|
296
|
+
|
285
297
|
|
286
298
|
// TODO security issues
|
287
299
|
if (process.env.DISABLE_TRANSCRIPT_VIEW_PAGE ) {
|
@@ -310,7 +322,6 @@ app.use('/:projectid/', [projectIdSetter, projectSetter]);
|
|
310
322
|
app.use('/:projectid/authtestWithRoleCheck', [passport.authenticate(['basic', 'jwt'], { session: false }), validtoken], authtestWithRoleCheck);
|
311
323
|
|
312
324
|
app.use('/:projectid/leads', [passport.authenticate(['basic', 'jwt'], { session: false }), validtoken, roleChecker.hasRoleOrTypes('agent', ['bot','subscription'])], lead);
|
313
|
-
// guest perche nn c'è guest???? no???
|
314
325
|
app.use('/:projectid/requests/:request_id/messages', [passport.authenticate(['basic', 'jwt'], { session: false }), validtoken, roleChecker.hasRoleOrTypes(null, ['bot','subscription'])] , message);
|
315
326
|
|
316
327
|
app.use('/:projectid/messages', [passport.authenticate(['basic', 'jwt'], { session: false }), validtoken, roleChecker.hasRoleOrTypes('agent', ['bot','subscription'])] , messagesRootRoute);
|
@@ -17,12 +17,22 @@ const { Query } = require('mongoose');
|
|
17
17
|
|
18
18
|
router.get('/:contact_id', [passport.authenticate(['basic', 'jwt'], { session: false }), validtoken], async (req, res) => {
|
19
19
|
winston.debug('REQ USER ID ', req.user._id);
|
20
|
-
|
21
|
-
var contact_id = req.params.contact_id;
|
22
|
-
winston.debug('contact_id: '+ contact_id);
|
23
20
|
|
21
|
+
var isObjectId = mongoose.Types.ObjectId.isValid(req.user._id);
|
22
|
+
winston.debug("isObjectId:"+ isObjectId);
|
23
|
+
|
24
|
+
var query = { role: { $in : [RoleConstants.OWNER, RoleConstants.ADMIN, RoleConstants.SUPERVISOR, RoleConstants.AGENT]}, status: "active" };
|
25
|
+
winston.debug(' query: ',query);
|
26
|
+
|
24
27
|
|
25
|
-
|
28
|
+
if (isObjectId) {
|
29
|
+
query.id_user = req.user._id;
|
30
|
+
// query.id_user = mongoose.Types.ObjectId(contact_id);
|
31
|
+
} else {
|
32
|
+
query.uuid_user = req.user._id;
|
33
|
+
}
|
34
|
+
|
35
|
+
var projects = await Project_user.find(query).
|
26
36
|
exec();
|
27
37
|
|
28
38
|
var projectsArray = [];
|
@@ -32,16 +42,19 @@ router.get('/:contact_id', [passport.authenticate(['basic', 'jwt'], { session: f
|
|
32
42
|
});
|
33
43
|
|
34
44
|
|
35
|
-
var
|
45
|
+
var contact_id = req.params.contact_id;
|
46
|
+
winston.debug('contact_id: '+ contact_id);
|
47
|
+
|
48
|
+
isObjectId = mongoose.Types.ObjectId.isValid(contact_id);
|
36
49
|
winston.debug("isObjectId:"+ isObjectId);
|
37
50
|
|
38
|
-
|
51
|
+
query = { id_project: { $in : projectsArray }, role: { $in : [RoleConstants.OWNER, RoleConstants.ADMIN, RoleConstants.SUPERVISOR, RoleConstants.AGENT]}, status: "active" };
|
39
52
|
winston.debug(' query: ',query);
|
40
53
|
|
41
54
|
if (isObjectId) {
|
42
55
|
query.id_user = contact_id;
|
43
56
|
// query.id_user = mongoose.Types.ObjectId(contact_id);
|
44
|
-
}else {
|
57
|
+
} else {
|
45
58
|
query.uuid_user = contact_id;
|
46
59
|
}
|
47
60
|
|
@@ -130,8 +143,21 @@ router.get('/', [passport.authenticate(['basic', 'jwt'], { session: false }), va
|
|
130
143
|
var sortQuery={};
|
131
144
|
sortQuery[sortField] = direction;
|
132
145
|
|
146
|
+
var query = { role: { $in : [RoleConstants.OWNER, RoleConstants.ADMIN, RoleConstants.SUPERVISOR, RoleConstants.AGENT]}, status: "active" };
|
147
|
+
|
148
|
+
var isObjectId = mongoose.Types.ObjectId.isValid(req.user._id);
|
149
|
+
winston.debug("isObjectId:"+ isObjectId);
|
150
|
+
|
151
|
+
if (isObjectId) {
|
152
|
+
query.id_user = req.user._id;
|
153
|
+
// query.id_user = mongoose.Types.ObjectId(contact_id);
|
154
|
+
} else {
|
155
|
+
query.uuid_user = req.user._id;
|
156
|
+
}
|
157
|
+
|
158
|
+
|
133
159
|
|
134
|
-
var projects = await Project_user.find(
|
160
|
+
var projects = await Project_user.find(query).
|
135
161
|
exec();
|
136
162
|
|
137
163
|
var projectsArray = [];
|
@@ -189,7 +189,7 @@ class Chat21Handler {
|
|
189
189
|
setImmediate(() => {
|
190
190
|
winston.debug("Chat21Handler on lead.update ", lead);
|
191
191
|
|
192
|
-
// AGGIORNA SOLO SE PASSA DA GUEST A ALTRO??
|
192
|
+
// TODO AGGIORNA SOLO SE PASSA DA GUEST A ALTRO??
|
193
193
|
Request.find({lead: lead._id, id_project: lead.id_project}, function(err, requests) {
|
194
194
|
|
195
195
|
if (err) {
|
@@ -364,10 +364,10 @@ class Chat21Handler {
|
|
364
364
|
// winston.warn("Chat21Sender this is a direct message. Unimplemented method", message);
|
365
365
|
|
366
366
|
chat21.auth.setAdminToken(adminToken);
|
367
|
-
|
367
|
+
|
368
368
|
// send: function(sender_fullname, recipient_id, recipient_fullname, text, sender_id, attributes, type, metadata){
|
369
369
|
return chat21.messages.send(message.senderFullname, message.recipient,
|
370
|
-
|
370
|
+
message.recipientFullname, message.text, message.sender, message.attributes, message.type, message.metadata)
|
371
371
|
.then(function(data){
|
372
372
|
winston.verbose("Chat21Sender send sent: "+ JSON.stringify(data));
|
373
373
|
|
@@ -383,13 +383,54 @@ class Chat21Handler {
|
|
383
383
|
});
|
384
384
|
|
385
385
|
}).catch(function(err) {
|
386
|
-
winston.error("Chat21
|
386
|
+
winston.error("Chat21 send direct err", err);
|
387
387
|
chat21Event.emit('message.sent.error', err);
|
388
388
|
});
|
389
389
|
|
390
390
|
|
391
391
|
|
392
|
-
}
|
392
|
+
}
|
393
|
+
|
394
|
+
else if (message &&
|
395
|
+
message.status === MessageConstants.CHAT_MESSAGE_STATUS.SENDING &&
|
396
|
+
message.channel_type == MessageConstants.CHANNEL_TYPE.GROUP &&
|
397
|
+
message.channel.name == ChannelConstants.CHAT21) {
|
398
|
+
|
399
|
+
// winston.warn("Chat21Sender this is a group message. Unimplemented method", message);
|
400
|
+
|
401
|
+
chat21.auth.setAdminToken(adminToken);
|
402
|
+
|
403
|
+
var timestamp = Date.now();
|
404
|
+
// var timestamp = undefined;
|
405
|
+
if (message.attributes && message.attributes.clienttimestamp) {
|
406
|
+
timestamp = message.attributes.clienttimestamp;
|
407
|
+
}
|
408
|
+
|
409
|
+
|
410
|
+
return chat21.messages.sendToGroup(message.senderFullname, message.recipient,
|
411
|
+
message.recipientFullname, message.text, message.sender, message.attributes, message.type, message.metadata, timestamp)
|
412
|
+
.then(function(data){
|
413
|
+
winston.verbose("Chat21Sender send sent: "+ JSON.stringify(data));
|
414
|
+
|
415
|
+
|
416
|
+
// chat21.conversations.stopTyping(message.recipient,message.sender);
|
417
|
+
|
418
|
+
chat21Event.emit('message.sent', data);
|
419
|
+
|
420
|
+
messageService.changeStatus(message._id, MessageConstants.CHAT_MESSAGE_STATUS.DELIVERED) .then(function(upMessage){
|
421
|
+
winston.debug("Chat21 message sent ", upMessage.toObject());
|
422
|
+
}).catch(function(err) {
|
423
|
+
winston.error("Error Chat21 message sent with id: "+message._id, err);
|
424
|
+
});
|
425
|
+
|
426
|
+
}).catch(function(err) {
|
427
|
+
winston.error("Chat21 sendToGroup err", err);
|
428
|
+
chat21Event.emit('message.sent.error', err);
|
429
|
+
});
|
430
|
+
|
431
|
+
|
432
|
+
|
433
|
+
} else {
|
393
434
|
winston.error("Chat21Sender this is not a group o direct message", message);
|
394
435
|
return;
|
395
436
|
}
|
@@ -815,6 +856,8 @@ class Chat21Handler {
|
|
815
856
|
|
816
857
|
return chat21.groups.create(group.name, groupMembers, undefined, group_id).then(function(data) {
|
817
858
|
winston.verbose("Chat21 group created: " + JSON.stringify(data));
|
859
|
+
// TODO ritorna success anche se
|
860
|
+
// verbose: Chat21 group created: {"success":false,"err":{"message":"Channel closed","stack":"IllegalOperationError: Channel closed\n at ConfirmChannel.<anonymous> (/usr/src/app/node_modules/amqplib/lib/channel.js:160:11)\n at ConfirmChannel.Channel.publish (/usr/src/app/node_modules/amqplib/lib/callback_model.js:171:17)\n at ConfirmChannel.publish (/usr/src/app/node_modules/amqplib/lib/callback_model.js:301:36)\n at Chat21Api.publish (/usr/src/app/chat21Api/index.js:1028:29)\n at Chat21Api.sendMessageRaw (/usr/src/app/chat21Api/index.js:762:14)\n at Chat21Api.sendGroupWelcomeMessage (/usr/src/app/chat21Api/index.js:205:14)\n at /usr/src/app/chat21Api/index.js:99:22\n at /usr/src/app/chat21Api/index.js:234:17\n at /usr/src/app/chatdb/index.js:77:9\n at executeCallback (/usr/src/app/node_modules/mongodb/lib/operations/execute_operation.js:70:5)\n at updateCallback (/usr/src/app/node_modules/mongodb/lib/operations/update_one.js:41:3)\n at /usr/src/app/node_modules/mongodb/lib/operations/update_one.js:24:64\n at handleCallback (/usr/src/app/node_modules/mongodb/lib/utils.js:128:55)\n at /usr/src/app/node_modules/mongodb/lib/operations/common_functions.js:378:5\n at handler (/usr/src/app/node_modules/mongodb/lib/core/sdam/topology.js:913:24)","stackAtStateChange":"Stack capture: Socket error\n at Connection.C.onSocketError (/usr/src/app/node_modules/amqplib/lib/connection.js:354:13)\n at Connection.emit (events.js:314:20)\n at Socket.go (/usr/src/app/node_modules/amqplib/lib/connection.js:481:12)\n at Socket.emit (events.js:314:20)\n at emitReadable_ (_stream_readable.js:557:12)\n at processTicksAndRejections (internal/process/task_queues.js:83:21)"}}
|
818
861
|
chat21Event.emit('group.create', data);
|
819
862
|
}).catch(function(err) {
|
820
863
|
winston.error("Error creating chat21 group ", err);
|