@pipedream/zoom 0.3.6 → 0.5.0
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.
- package/README.md +21 -64
- package/actions/add-meeting-registrant/add-meeting-registrant.mjs +157 -108
- package/actions/add-webinar-registrant/add-webinar-registrant.mjs +157 -108
- package/actions/create-meeting/create-meeting.mjs +1 -1
- package/actions/create-user/create-user.mjs +1 -1
- package/actions/delete-user/delete-user.mjs +1 -1
- package/actions/get-meeting-details/get-meeting-details.mjs +1 -1
- package/actions/get-webinar-details/get-webinar-details.mjs +36 -22
- package/actions/list-channels/list-channels.mjs +1 -1
- package/actions/list-past-meeting-participants/list-past-meeting-participants.mjs +25 -23
- package/actions/list-past-webinar-qa/list-past-webinar-qa.mjs +1 -1
- package/actions/list-user-call-logs/list-user-call-logs.mjs +31 -0
- package/actions/list-webinar-participants-report/list-webinar-participants-report.mjs +68 -0
- package/actions/send-chat-message/send-chat-message.mjs +1 -1
- package/actions/update-meeting/update-meeting.mjs +1 -1
- package/actions/update-webinar/update-webinar.mjs +1 -1
- package/actions/view-user/view-user.mjs +1 -1
- package/common/constants.mjs +9 -0
- package/common/utils.mjs +20 -0
- package/package.json +3 -3
- package/sources/common/common.mjs +2 -2
- package/sources/common/constants.mjs +106 -104
- package/sources/custom-event/custom-event.mjs +13 -10
- package/sources/meeting-created/meeting-created.mjs +16 -10
- package/sources/meeting-deleted/meeting-deleted.mjs +13 -8
- package/sources/meeting-ended/meeting-ended.mjs +20 -12
- package/sources/meeting-started/meeting-started.mjs +17 -11
- package/sources/meeting-updated/meeting-updated.mjs +16 -10
- package/sources/phone-event/phone-event.mjs +12 -10
- package/sources/recording-completed/recording-completed.mjs +28 -19
- package/sources/webinar-created/webinar-created.mjs +16 -10
- package/sources/webinar-deleted/webinar-deleted.mjs +14 -9
- package/sources/webinar-ended/webinar-ended.mjs +19 -13
- package/sources/webinar-started/webinar-started.mjs +16 -10
- package/sources/webinar-updated/webinar-updated.mjs +16 -10
- package/zoom.app.mjs +277 -42
package/README.md
CHANGED
|
@@ -1,79 +1,36 @@
|
|
|
1
|
-
#
|
|
1
|
+
# Overview
|
|
2
|
+
The Zoom API lets you tap into a rich set of functionalities to enhance the video conferencing experience within your own app or workflow. With the Zoom API on Pipedream, you can automatically create meetings, manage users, send meeting notifications, and more, orchestrating these actions within a broader automation. This allows for seamless integration with other services, enabling both data collection and action triggers based on Zoom events.
|
|
2
3
|
|
|
3
|
-
|
|
4
|
+
**Pipedream [workflows](/workflows/) allow you to run any Node.js code that connects to the Zoom API**. Just [create a new workflow](https://pipedream.com/new), then add prebuilt Zoom [actions](/components#actions) (create a meeting, send a chat message, etc.) or [write your own code](/code/). These workflows can be triggered by HTTP requests, timers, email, or on any app-based event (new tweets, a Github PR, Zoom events, etc).
|
|
4
5
|
|
|
5
|
-
|
|
6
|
+
# Getting Started
|
|
6
7
|
|
|
7
|
-
|
|
8
|
+
1. First, sign up for Pipedream at [https://pipedream.com](https://pipedream.com).
|
|
9
|
+
2. Visit [https://pipedream.com/accounts](https://pipedream.com/accounts).
|
|
10
|
+
3. Click the button labeled **Click Here to Connect an App**.
|
|
11
|
+
4. Search for "Zoom" and select either **Zoom** or **Zoom Admin** ([see the differences below](#zoom-vs-zoom-admin-app)):
|
|
8
12
|
|
|
9
|
-
|
|
13
|
+
This will open up a new window prompting you to authorize Pipedream's access to your Zoom account. Once you authorize access, you should see your Zoom account listed among your apps.
|
|
10
14
|
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
- Serverless - No server or cloud resources to manage
|
|
14
|
-
- [Free](#pricing) - No fees for individual developers (see [limits](https://docs.pipedream.com/limits/))
|
|
15
|
+
1. [Create a new workflow](https://pipedream.com/new), [add a new step](/workflows/steps/), search for "Zoom" or "Zoom Admin". Once you've selected either app, you can choose to either "Run Node.js code" or select one of the prebuilt actions for performing common API operations.
|
|
16
|
+
2. At this stage, you'll be asked to link the Zoom account you connected above, authorizing the request to the Zoom API with your credentials.
|
|
15
17
|
|
|
16
|
-
|
|
18
|
+
## Zoom vs Zoom Admin app
|
|
17
19
|
|
|
18
|
-
|
|
20
|
+
Zoom users can be classified into two groups: non-admins and admins. Admins have account-level permissions that users do not, and Zoom has corresponding admin-level scopes that aren't relevant for normal users. Therefore, Pipedream exposes two apps — **Zoom** and **Zoom Admin** — to serve the two groups.
|
|
19
21
|
|
|
20
|
-
|
|
21
|
-
- [Meeting Created](https://pipedream.com/sources/new?app=zoom) - Emits an event each time a meeting is created where you're the host ([code](https://github.com/PipedreamHQ/pipedream/blob/master/components/zoom/meeting-created.js))
|
|
22
|
-
- [Meeting Deleted](https://pipedream.com/sources/new?app=zoom) - Emits an event each time a meeting is deleted where you're the host ([code](https://github.com/PipedreamHQ/pipedream/blob/master/components/zoom/meeting-deleted.js))
|
|
23
|
-
- [Meeting Ended](https://pipedream.com/sources/new?app=zoom) - Emits an event each time a meeting ends where you're the host ([code](https://github.com/PipedreamHQ/pipedream/blob/master/components/zoom/meeting-ended.js))
|
|
24
|
-
- [Meeting Started](https://pipedream.com/sources/new?app=zoom) - Emits an event each time a meeting starts where you're the host ([code](https://github.com/PipedreamHQ/pipedream/blob/master/components/zoom/meeting-started.js))
|
|
25
|
-
- [Meeting Updated](https://pipedream.com/sources/new?app=zoom) - Emits an event each time a meeting is updated where you're the host ([code](https://github.com/PipedreamHQ/pipedream/blob/master/components/zoom/meeting-updated.js))
|
|
26
|
-
- [Meeting Recording Completed](https://pipedream.com/sources?action=create&key=zoom-recording-completed&utm_source=github.com&utm_medium=referral&utm_campaign=zoom) - Emits an event each time a new recording completes for a meeting or webinar where you're the host ([code](https://github.com/PipedreamHQ/pipedream/blob/master/components/zoom/recording-completed.js))
|
|
27
|
-
- [Webinar Created](https://pipedream.com/sources/new?app=zoom) - Emits an event each time a webinar is created where you're the host ([code](https://github.com/PipedreamHQ/pipedream/blob/master/components/zoom/webinar-created.js))
|
|
28
|
-
- [Webinar Deleted](https://pipedream.com/sources/new?app=zoom) - Emits an event each time a webinar is deleted where you're the host ([code](https://github.com/PipedreamHQ/pipedream/blob/master/components/zoom/webinar-deleted.js))
|
|
29
|
-
- [Webinar Ended](https://pipedream.com/sources/new?app=zoom) - Emits an event each time a webinar ends where you're the host ([code](https://github.com/PipedreamHQ/pipedream/blob/master/components/zoom/webinar-ended.js))
|
|
30
|
-
- [Webinar Started](https://pipedream.com/sources/new?app=zoom) - Emits an event each time a webinar starts where you're the host ([code](https://github.com/PipedreamHQ/pipedream/blob/master/components/zoom/webinar-started.js))
|
|
31
|
-
- [Webinar Updated](https://pipedream.com/sources/new?app=zoom) - Emits an event each time a webinar is updated where you're the host ([code](https://github.com/PipedreamHQ/pipedream/blob/master/components/zoom/webinar-updated.js))
|
|
22
|
+
In the Zoom Marketplace, these apps are named [Pipedream](https://marketplace.zoom.us/apps/jGaV-kRrT3igAYnn-J5v2g), and [Pipedream for Zoom Admins](https://marketplace.zoom.us/apps/tZvUsiucR96SqtvfBsemXg), respectively.
|
|
32
23
|
|
|
33
|
-
|
|
24
|
+
Non-admins have [permissions](https://marketplace.zoom.us/docs/guides/authorization/permissions#user-managed-scopes) to manage standard Zoom resources in their account: meetings, webinars, recordings, and more. **If you're a non-admin, you'll want to use the Zoom app**.
|
|
34
25
|
|
|
35
|
-
|
|
36
|
-
pd deploy # prompts you to select a component and pass required options
|
|
37
|
-
```
|
|
26
|
+
Zoom admins have [permissions](https://marketplace.zoom.us/docs/guides/authorization/permissions#account-level-scopes) to manage account-level resources, like users and reports. They can also manage webinars and meetings across their organization. **If you're an admin and need to manage these resources via API, you'll want to use the Zoom Admin app**.
|
|
38
27
|
|
|
39
|
-
|
|
28
|
+
The [Zoom API docs on permissions](https://marketplace.zoom.us/docs/guides/authorization/permissions) provide detailed information on these permissions and their associated OAuth scopes.
|
|
40
29
|
|
|
41
|
-
|
|
30
|
+
# Example Use Cases
|
|
42
31
|
|
|
43
|
-
-
|
|
44
|
-
- Add steps to run [Node.js code](https://docs.pipedream.com/workflows/steps/code/) (using virtually any npm package) and [pre-built actions](https://docs.pipedream.com/workflows/steps/actions/).
|
|
45
|
-
- Steps are executed in the order they appear in your workflow.
|
|
46
|
-
- Data is shared between steps via [step exports](https://docs.pipedream.com/workflows/steps/#step-exports).
|
|
32
|
+
- **Automated Meeting Scheduling and Notifications**: With Pipedream, you can create a workflow that listens for upcoming calendar events in Google Calendar. Once it detects a new event labeled "Zoom Meeting," it can trigger the Zoom API to create a meeting and then automatically send custom email notifications with the meeting details to all the attendees using SendGrid.
|
|
47
33
|
|
|
48
|
-
|
|
34
|
+
- **Zoom Webinar Attendee Management**: Build a workflow where new sign-ups from an event management platform like Eventbrite trigger the addition of these attendees to a Zoom webinar. Post-webinar, send a follow-up email via Mailgun with a link to the webinar recording, which you can upload to a cloud storage platform like Dropbox.
|
|
49
35
|
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
**Example Zoom Workflows**
|
|
53
|
-
|
|
54
|
-
- [Save Zoom recordings to Amazon S3, then delete Zoom recording](https://pipedream.com/@dylburger/save-zoom-recordings-to-amazon-s3-p_PACKJG/readme)
|
|
55
|
-
|
|
56
|
-
For a deeper introduction to Pipedream and event sources, see the [root `README` in this repo](/README.md), the [component API](/COMPONENT-API.md), or the [docs](https://docs.pipedream.com/apps/zoom/).
|
|
57
|
-
|
|
58
|
-
## Other Popular API Integrations
|
|
59
|
-
|
|
60
|
-
- [Airtable](https://github.com/PipedreamHQ/pipedream/tree/master/components/airtable) ([deploy](https://pipedream.com/sources/new?app=airtable))
|
|
61
|
-
- [AWS](https://github.com/PipedreamHQ/pipedream/tree/master/components/aws) ([deploy](https://pipedream.com/sources/new?app=aws))
|
|
62
|
-
- [Dropbox](https://github.com/PipedreamHQ/pipedream/tree/master/components/dropbox) ([deploy](https://pipedream.com/sources/new?app=dropbox))
|
|
63
|
-
- [Github](https://github.com/PipedreamHQ/pipedream/tree/master/components/github) ([deploy](https://pipedream.com/sources/new?app=github))
|
|
64
|
-
- [Google Calendar](https://github.com/PipedreamHQ/pipedream/tree/master/components/google-calendar) ([deploy](https://pipedream.com/sources/new?app=google-calendar))
|
|
65
|
-
- [Google Drive](https://github.com/PipedreamHQ/pipedream/tree/master/components/google-drive) ([deploy](https://pipedream.com/sources/new?app=google-drive))
|
|
66
|
-
- [RSS](https://github.com/PipedreamHQ/pipedream/tree/master/components/rss) ([deploy](https://pipedream.com/sources/new?app=rss))
|
|
67
|
-
- [Twitter](https://github.com/PipedreamHQ/pipedream/tree/master/components/twitter) ([deploy](https://pipedream.com/sources/new?app=twitter))
|
|
68
|
-
|
|
69
|
-
## Pricing
|
|
70
|
-
|
|
71
|
-
Pipedream is currently free, subject to the [limits noted below](https://docs.pipedream.com/limits/). Paid tiers for higher volumes are coming soon.
|
|
72
|
-
|
|
73
|
-
If you exceed any of these limits, please [reach out](https://docs.pipedream.com/support/).
|
|
74
|
-
|
|
75
|
-
## Found a Bug? Have a Feature to suggest?
|
|
76
|
-
|
|
77
|
-
Before adding an issue, please search the [existing issues](https://github.com/PipedreamHQ/pipedream/issues) or [reach out to our team](https://docs.pipedream.com/support/) to see if a similar request already exists.
|
|
78
|
-
|
|
79
|
-
If an issue exists, please [add a reaction](https://help.github.com/en/github/collaborating-with-issues-and-pull-requests/about-conversations-on-github) or comment on your specific use case.
|
|
36
|
+
- **Meeting Analytics and Reporting**: Combine Zoom's meeting ended webhook with Pipedream's capabilities to create a workflow that captures meeting details upon conclusion. With this data, you can send a summary email to the host, update a Google Sheet with attendance information, and even push the data to a BI tool like Tableau for more in-depth analysis.
|
|
@@ -1,143 +1,192 @@
|
|
|
1
|
-
|
|
2
|
-
import { axios } from "@pipedream/platform";
|
|
1
|
+
import app from "../../zoom.app.mjs";
|
|
3
2
|
|
|
4
3
|
export default {
|
|
5
4
|
key: "zoom-add-meeting-registrant",
|
|
6
5
|
name: "Add Meeting Registrant",
|
|
7
|
-
description: "Registers a participant for a meeting.",
|
|
8
|
-
version: "0.
|
|
6
|
+
description: "Registers a participant for a meeting. [See the docs here](https://marketplace.zoom.us/docs/api-reference/zoom-api/methods/#operation/meetingRegistrantCreate)",
|
|
7
|
+
version: "0.3.1",
|
|
9
8
|
type: "action",
|
|
10
9
|
props: {
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
10
|
+
app,
|
|
11
|
+
meetingId: {
|
|
12
|
+
propDefinition: [
|
|
13
|
+
app,
|
|
14
|
+
"meetingId",
|
|
15
|
+
],
|
|
16
|
+
},
|
|
17
|
+
occurrenceIds: {
|
|
18
|
+
propDefinition: [
|
|
19
|
+
app,
|
|
20
|
+
"occurrenceIds",
|
|
21
|
+
],
|
|
23
22
|
},
|
|
24
23
|
email: {
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
24
|
+
propDefinition: [
|
|
25
|
+
app,
|
|
26
|
+
"email",
|
|
27
|
+
],
|
|
28
|
+
},
|
|
29
|
+
firstName: {
|
|
30
|
+
propDefinition: [
|
|
31
|
+
app,
|
|
32
|
+
"firstName",
|
|
33
|
+
],
|
|
34
|
+
},
|
|
35
|
+
lastName: {
|
|
36
|
+
propDefinition: [
|
|
37
|
+
app,
|
|
38
|
+
"lastName",
|
|
39
|
+
],
|
|
35
40
|
},
|
|
36
41
|
address: {
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
42
|
+
propDefinition: [
|
|
43
|
+
app,
|
|
44
|
+
"address",
|
|
45
|
+
],
|
|
40
46
|
},
|
|
41
47
|
city: {
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
48
|
+
propDefinition: [
|
|
49
|
+
app,
|
|
50
|
+
"city",
|
|
51
|
+
],
|
|
45
52
|
},
|
|
46
53
|
country: {
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
54
|
+
propDefinition: [
|
|
55
|
+
app,
|
|
56
|
+
"country",
|
|
57
|
+
],
|
|
50
58
|
},
|
|
51
59
|
zip: {
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
60
|
+
propDefinition: [
|
|
61
|
+
app,
|
|
62
|
+
"zip",
|
|
63
|
+
],
|
|
55
64
|
},
|
|
56
65
|
state: {
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
66
|
+
propDefinition: [
|
|
67
|
+
app,
|
|
68
|
+
"state",
|
|
69
|
+
],
|
|
60
70
|
},
|
|
61
71
|
phone: {
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
72
|
+
propDefinition: [
|
|
73
|
+
app,
|
|
74
|
+
"phone",
|
|
75
|
+
],
|
|
65
76
|
},
|
|
66
77
|
industry: {
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
78
|
+
propDefinition: [
|
|
79
|
+
app,
|
|
80
|
+
"industry",
|
|
81
|
+
],
|
|
70
82
|
},
|
|
71
83
|
org: {
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
84
|
+
propDefinition: [
|
|
85
|
+
app,
|
|
86
|
+
"org",
|
|
87
|
+
],
|
|
88
|
+
},
|
|
89
|
+
jobTitle: {
|
|
90
|
+
propDefinition: [
|
|
91
|
+
app,
|
|
92
|
+
"jobTitle",
|
|
93
|
+
],
|
|
94
|
+
},
|
|
95
|
+
purchasingTimeFrame: {
|
|
96
|
+
propDefinition: [
|
|
97
|
+
app,
|
|
98
|
+
"purchasingTimeFrame",
|
|
99
|
+
],
|
|
100
|
+
},
|
|
101
|
+
roleInPurchaseProcess: {
|
|
102
|
+
propDefinition: [
|
|
103
|
+
app,
|
|
104
|
+
"roleInPurchaseProcess",
|
|
105
|
+
],
|
|
106
|
+
},
|
|
107
|
+
noOfEmployees: {
|
|
108
|
+
propDefinition: [
|
|
109
|
+
app,
|
|
110
|
+
"noOfEmployees",
|
|
111
|
+
],
|
|
95
112
|
},
|
|
96
113
|
comments: {
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
114
|
+
propDefinition: [
|
|
115
|
+
app,
|
|
116
|
+
"comments",
|
|
117
|
+
],
|
|
118
|
+
},
|
|
119
|
+
customQuestions: {
|
|
120
|
+
propDefinition: [
|
|
121
|
+
app,
|
|
122
|
+
"customQuestions",
|
|
123
|
+
],
|
|
100
124
|
},
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
125
|
+
},
|
|
126
|
+
methods: {
|
|
127
|
+
addMeetingRegistrant({
|
|
128
|
+
meetingId, ...args
|
|
129
|
+
} = {}) {
|
|
130
|
+
return this.app.create({
|
|
131
|
+
path: `/meetings/${meetingId}/registrants`,
|
|
132
|
+
...args,
|
|
133
|
+
});
|
|
105
134
|
},
|
|
106
135
|
},
|
|
107
|
-
async run({
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
136
|
+
async run({ $: step }) {
|
|
137
|
+
const {
|
|
138
|
+
meetingId,
|
|
139
|
+
occurrenceIds,
|
|
140
|
+
email,
|
|
141
|
+
firstName,
|
|
142
|
+
lastName,
|
|
143
|
+
address,
|
|
144
|
+
city,
|
|
145
|
+
country,
|
|
146
|
+
zip,
|
|
147
|
+
state,
|
|
148
|
+
phone,
|
|
149
|
+
industry,
|
|
150
|
+
org,
|
|
151
|
+
jobTitle,
|
|
152
|
+
purchasingTimeFrame,
|
|
153
|
+
roleInPurchaseProcess,
|
|
154
|
+
noOfEmployees,
|
|
155
|
+
comments,
|
|
156
|
+
customQuestions,
|
|
157
|
+
} = this;
|
|
158
|
+
|
|
159
|
+
const response = await this.addMeetingRegistrant({
|
|
160
|
+
step,
|
|
161
|
+
meetingId,
|
|
112
162
|
params: {
|
|
113
|
-
occurrence_ids:
|
|
163
|
+
occurrence_ids: occurrenceIds,
|
|
114
164
|
},
|
|
115
165
|
data: {
|
|
116
|
-
email
|
|
117
|
-
first_name:
|
|
118
|
-
last_name:
|
|
119
|
-
address
|
|
120
|
-
city
|
|
121
|
-
country
|
|
122
|
-
zip
|
|
123
|
-
state
|
|
124
|
-
phone
|
|
125
|
-
industry
|
|
126
|
-
org
|
|
127
|
-
job_title:
|
|
128
|
-
purchasing_time_frame:
|
|
129
|
-
role_in_purchase_process:
|
|
130
|
-
no_of_employees:
|
|
131
|
-
comments
|
|
132
|
-
custom_questions: typeof
|
|
133
|
-
?
|
|
134
|
-
: JSON.parse(
|
|
135
|
-
},
|
|
136
|
-
headers: {
|
|
137
|
-
"Authorization": `Bearer ${this.zoom.$auth.oauth_access_token}`,
|
|
138
|
-
"Content-Type": "application/json",
|
|
166
|
+
email,
|
|
167
|
+
first_name: firstName,
|
|
168
|
+
last_name: lastName,
|
|
169
|
+
address,
|
|
170
|
+
city,
|
|
171
|
+
country,
|
|
172
|
+
zip,
|
|
173
|
+
state,
|
|
174
|
+
phone,
|
|
175
|
+
industry,
|
|
176
|
+
org,
|
|
177
|
+
job_title: jobTitle,
|
|
178
|
+
purchasing_time_frame: purchasingTimeFrame,
|
|
179
|
+
role_in_purchase_process: roleInPurchaseProcess,
|
|
180
|
+
no_of_employees: noOfEmployees,
|
|
181
|
+
comments,
|
|
182
|
+
custom_questions: typeof(customQuestions) === "undefined"
|
|
183
|
+
? customQuestions
|
|
184
|
+
: JSON.parse(customQuestions),
|
|
139
185
|
},
|
|
140
|
-
};
|
|
141
|
-
|
|
186
|
+
});
|
|
187
|
+
|
|
188
|
+
step.export("$summary", `Successfully added registrant to meeting with ID \`${response.id}\``);
|
|
189
|
+
|
|
190
|
+
return response;
|
|
142
191
|
},
|
|
143
192
|
};
|