runline 0.2.0 → 0.2.2
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 +1 -1
- package/dist/plugins/actionNetwork/src/index.js +118 -25
- package/dist/plugins/activeCampaign/src/index.js +184 -38
- package/dist/plugins/adalo/src/index.js +40 -8
- package/dist/plugins/affinity/src/index.js +100 -20
- package/dist/plugins/agileCrm/src/index.js +115 -27
- package/dist/plugins/airtable/src/index.js +94 -19
- package/dist/plugins/airtop/src/index.js +266 -62
- package/dist/plugins/apiTemplateIo/src/index.js +25 -5
- package/dist/plugins/asana/src/index.js +195 -41
- package/dist/plugins/autopilot/src/index.js +39 -8
- package/dist/plugins/bambooHr/src/index.js +109 -22
- package/dist/plugins/bannerbear/src/index.js +36 -8
- package/dist/plugins/baserow/src/index.js +35 -7
- package/dist/plugins/beeminder/src/index.js +198 -40
- package/dist/plugins/bitly/src/index.js +46 -10
- package/dist/plugins/bitwarden/src/index.js +167 -36
- package/dist/plugins/box/src/index.js +172 -37
- package/dist/plugins/brandfetch/src/index.js +5 -1
- package/dist/plugins/brevo/src/index.js +136 -29
- package/dist/plugins/bubble/src/index.js +76 -17
- package/dist/plugins/chargebee/src/index.js +35 -7
- package/dist/plugins/circleci/src/index.js +50 -10
- package/dist/plugins/ciscoWebex/src/index.js +131 -27
- package/dist/plugins/clearbit/src/index.js +76 -17
- package/dist/plugins/clickup/src/index.js +500 -107
- package/dist/plugins/clockify/src/index.js +229 -47
- package/dist/plugins/cloudflare/src/index.js +28 -6
- package/dist/plugins/cockpit/src/index.js +54 -12
- package/dist/plugins/coda/src/index.js +81 -19
- package/dist/plugins/coingecko/src/index.js +157 -33
- package/dist/plugins/contentful/src/index.js +85 -17
- package/dist/plugins/convertkit/src/index.js +74 -18
- package/dist/plugins/copper/src/index.js +59 -11
- package/dist/plugins/cortex/src/index.js +55 -13
- package/dist/plugins/currents/src/index.js +310 -71
- package/dist/plugins/customerIo/src/index.js +112 -23
- package/dist/plugins/databricks/src/index.js +549 -115
- package/dist/plugins/deepl/src/index.js +26 -6
- package/dist/plugins/demio/src/index.js +56 -11
- package/dist/plugins/dhl/src/index.js +16 -3
- package/dist/plugins/discord/src/index.js +141 -31
- package/dist/plugins/discourse/src/index.js +136 -31
- package/dist/plugins/disqus/src/index.js +96 -20
- package/dist/plugins/docker/src/index.js +20 -4
- package/dist/plugins/drift/src/index.js +19 -5
- package/dist/plugins/dropbox/src/index.js +139 -30
- package/dist/plugins/dropcontact/src/index.js +21 -4
- package/dist/plugins/egoi/src/index.js +61 -15
- package/dist/plugins/elasticsearch/src/index.js +59 -13
- package/dist/plugins/emelia/src/index.js +95 -19
- package/dist/plugins/erpnext/src/index.js +74 -15
- package/dist/plugins/facebookGraph/src/index.js +52 -11
- package/dist/plugins/freshdesk/src/index.js +220 -48
- package/dist/plugins/freshservice/src/index.js +39 -9
- package/dist/plugins/freshworksCrm/src/index.js +58 -12
- package/dist/plugins/getresponse/src/index.js +87 -18
- package/dist/plugins/ghost/src/index.js +114 -26
- package/dist/plugins/github/src/index.js +483 -109
- package/dist/plugins/gitlab/src/index.js +193 -45
- package/dist/plugins/gong/src/index.js +68 -14
- package/dist/plugins/gotify/src/index.js +43 -9
- package/dist/plugins/gotowebinar/src/index.js +233 -47
- package/dist/plugins/grafana/src/index.js +92 -21
- package/dist/plugins/graphql/src/index.js +38 -8
- package/dist/plugins/grist/src/index.js +52 -10
- package/dist/plugins/hackernews/src/index.js +32 -6
- package/dist/plugins/halopsa/src/index.js +131 -26
- package/dist/plugins/harvest/src/index.js +182 -42
- package/dist/plugins/helpscout/src/index.js +153 -31
- package/dist/plugins/highlevel/src/index.js +291 -58
- package/dist/plugins/homeAssistant/src/index.js +124 -26
- package/dist/plugins/hubspot/src/index.js +163 -29
- package/dist/plugins/humanticAi/src/index.js +54 -5
- package/dist/plugins/hunter/src/index.js +21 -4
- package/dist/plugins/intercom/src/index.js +95 -20
- package/dist/plugins/iterable/src/index.js +96 -20
- package/dist/plugins/jenkins/src/index.js +75 -17
- package/dist/plugins/jira/src/index.js +193 -43
- package/dist/plugins/keap/src/index.js +222 -56
- package/dist/plugins/kobotoolbox/src/index.js +113 -25
- package/dist/plugins/lemlist/src/index.js +79 -18
- package/dist/plugins/linear/src/index.js +86 -19
- package/dist/plugins/lingvanex/src/index.js +38 -8
- package/dist/plugins/linkedin/src/index.js +37 -8
- package/dist/plugins/lonescale/src/index.js +41 -9
- package/dist/plugins/magento/src/index.js +98 -27
- package/dist/plugins/mailcheck/src/index.js +11 -2
- package/dist/plugins/mailchimp/src/index.js +193 -42
- package/dist/plugins/mailerlite/src/index.js +61 -12
- package/dist/plugins/mailgun/src/index.js +39 -7
- package/dist/plugins/mailjet/src/index.js +141 -30
- package/dist/plugins/mandrill/src/index.js +67 -14
- package/dist/plugins/marketstack/src/index.js +56 -10
- package/dist/plugins/matrix/src/index.js +97 -20
- package/dist/plugins/mattermost/src/index.js +124 -26
- package/dist/plugins/mautic/src/index.js +129 -26
- package/dist/plugins/medium/src/index.js +64 -13
- package/dist/plugins/messagebird/src/index.js +80 -15
- package/dist/plugins/metabase/src/index.js +57 -12
- package/dist/plugins/misp/src/index.js +135 -33
- package/dist/plugins/mocean/src/index.js +33 -7
- package/dist/plugins/monday/src/index.js +97 -23
- package/dist/plugins/monicaCrm/src/index.js +112 -23
- package/dist/plugins/msg91/src/index.js +11 -2
- package/dist/plugins/nasa/src/index.js +108 -21
- package/dist/plugins/netlify/src/index.js +28 -6
- package/dist/plugins/netscalerAdc/src/index.js +144 -29
- package/dist/plugins/nextcloud/src/index.js +103 -20
- package/dist/plugins/nocodb/src/index.js +57 -11
- package/dist/plugins/notion/src/index.js +148 -37
- package/dist/plugins/npm/src/index.js +59 -12
- package/dist/plugins/odoo/src/index.js +102 -20
- package/dist/plugins/okta/src/index.js +50 -10
- package/dist/plugins/oneSimpleApi/src/index.js +84 -17
- package/dist/plugins/onfleet/src/index.js +139 -32
- package/dist/plugins/openThesaurus/src/index.js +46 -9
- package/dist/plugins/openweathermap/src/index.js +31 -6
- package/dist/plugins/oura/src/index.js +36 -7
- package/dist/plugins/paddle/src/index.js +80 -17
- package/dist/plugins/pagerduty/src/index.js +53 -12
- package/dist/plugins/paypal/src/index.js +51 -11
- package/dist/plugins/peekalink/src/index.js +12 -3
- package/dist/plugins/phantombuster/src/index.js +39 -8
- package/dist/plugins/philipsHue/src/index.js +64 -13
- package/dist/plugins/pipedrive/src/index.js +167 -45
- package/dist/plugins/plivo/src/index.js +43 -8
- package/dist/plugins/postbin/src/index.js +9 -2
- package/dist/plugins/posthog/src/index.js +50 -13
- package/dist/plugins/profitwell/src/index.js +24 -5
- package/dist/plugins/pushbullet/src/index.js +45 -9
- package/dist/plugins/pushcut/src/index.js +31 -6
- package/dist/plugins/pushover/src/index.js +51 -10
- package/dist/plugins/quickbase/src/index.js +66 -13
- package/dist/plugins/quickbooks/src/index.js +86 -19
- package/dist/plugins/quickchart/src/index.js +35 -7
- package/dist/plugins/raindrop/src/index.js +54 -13
- package/dist/plugins/reddit/src/index.js +73 -18
- package/dist/plugins/rocketchat/src/index.js +47 -9
- package/dist/plugins/rundeck/src/index.js +26 -5
- package/dist/plugins/salesforce/src/index.js +161 -31
- package/dist/plugins/salesmate/src/index.js +75 -16
- package/dist/plugins/securityScorecard/src/index.js +73 -15
- package/dist/plugins/segment/src/index.js +21 -4
- package/dist/plugins/sendgrid/src/index.js +102 -24
- package/dist/plugins/sendy/src/index.js +54 -11
- package/dist/plugins/sentry/src/index.js +174 -34
- package/dist/plugins/servicenow/src/index.js +120 -27
- package/dist/plugins/shopify/src/index.js +53 -12
- package/dist/plugins/signl4/src/index.js +16 -3
- package/dist/plugins/slack/src/index.js +407 -105
- package/dist/plugins/sms77/src/index.js +26 -5
- package/dist/plugins/splunk/src/index.js +186 -45
- package/dist/plugins/spotify/src/index.js +265 -66
- package/dist/plugins/stackby/src/index.js +18 -6
- package/dist/plugins/storyblok/src/index.js +57 -11
- package/dist/plugins/strapi/src/index.js +63 -12
- package/dist/plugins/strava/src/index.js +58 -13
- package/dist/plugins/stripe/src/index.js +143 -30
- package/dist/plugins/supabase/src/index.js +49 -10
- package/dist/plugins/syncromsp/src/index.js +245 -67
- package/dist/plugins/tapfiliate/src/index.js +57 -14
- package/dist/plugins/telegram/src/index.js +202 -39
- package/dist/plugins/thehive/src/index.js +271 -66
- package/dist/plugins/thehiveProject/src/index.js +457 -89
- package/dist/plugins/todoist/src/index.js +326 -77
- package/dist/plugins/travisci/src/index.js +35 -8
- package/dist/plugins/trello/src/index.js +204 -46
- package/dist/plugins/twake/src/index.js +10 -2
- package/dist/plugins/twilio/src/index.js +56 -11
- package/dist/plugins/twist/src/index.js +241 -48
- package/dist/plugins/twitter/src/index.js +128 -30
- package/dist/plugins/unleashedSoftware/src/index.js +30 -6
- package/dist/plugins/uplead/src/index.js +9 -2
- package/dist/plugins/uproc/src/index.js +31 -6
- package/dist/plugins/uptimerobot/src/index.js +119 -25
- package/dist/plugins/urlscanio/src/index.js +25 -6
- package/dist/plugins/vero/src/index.js +68 -13
- package/dist/plugins/vonage/src/index.js +32 -6
- package/dist/plugins/wekan/src/index.js +297 -52
- package/dist/plugins/woocommerce/src/index.js +57 -12
- package/dist/plugins/wordpress/src/index.js +94 -18
- package/dist/plugins/xero/src/index.js +79 -13
- package/dist/plugins/yourls/src/index.js +33 -6
- package/dist/plugins/zammad/src/index.js +139 -36
- package/dist/plugins/zendesk/src/index.js +201 -48
- package/dist/plugins/zoho/src/index.js +88 -21
- package/dist/plugins/zoom/src/index.js +41 -7
- package/dist/plugins/zulip/src/index.js +101 -20
- package/package.json +1 -1
|
@@ -7,7 +7,13 @@ async function apiRequest(apiKey, method, endpoint, body, qs) {
|
|
|
7
7
|
url.searchParams.set(k, String(v));
|
|
8
8
|
}
|
|
9
9
|
}
|
|
10
|
-
const init = {
|
|
10
|
+
const init = {
|
|
11
|
+
method,
|
|
12
|
+
headers: {
|
|
13
|
+
Authorization: `Bearer ${apiKey}`,
|
|
14
|
+
"Content-Type": "application/json",
|
|
15
|
+
},
|
|
16
|
+
};
|
|
11
17
|
if (body !== undefined)
|
|
12
18
|
init.body = JSON.stringify(body);
|
|
13
19
|
const res = await fetch(url.toString(), init);
|
|
@@ -15,35 +21,68 @@ async function apiRequest(apiKey, method, endpoint, body, qs) {
|
|
|
15
21
|
throw new Error(`SendGrid error ${res.status}: ${await res.text()}`);
|
|
16
22
|
const text = await res.text();
|
|
17
23
|
const headers = {};
|
|
18
|
-
res.headers.forEach((v, k) => {
|
|
24
|
+
res.headers.forEach((v, k) => {
|
|
25
|
+
headers[k] = v;
|
|
26
|
+
});
|
|
19
27
|
return { data: text ? JSON.parse(text) : {}, headers };
|
|
20
28
|
}
|
|
21
29
|
export default function sendgrid(rl) {
|
|
22
30
|
rl.setName("sendgrid");
|
|
23
31
|
rl.setVersion("0.1.0");
|
|
24
32
|
rl.setConnectionSchema({
|
|
25
|
-
apiKey: {
|
|
33
|
+
apiKey: {
|
|
34
|
+
type: "string",
|
|
35
|
+
required: true,
|
|
36
|
+
description: "SendGrid API key",
|
|
37
|
+
env: "SENDGRID_API_KEY",
|
|
38
|
+
},
|
|
26
39
|
});
|
|
27
40
|
const key = (ctx) => ctx.connection.config.apiKey;
|
|
28
41
|
// ── Mail ────────────────────────────────────────────
|
|
29
42
|
rl.registerAction("mail.send", {
|
|
30
43
|
description: "Send an email via SendGrid",
|
|
31
44
|
inputSchema: {
|
|
32
|
-
to: {
|
|
45
|
+
to: {
|
|
46
|
+
type: "string",
|
|
47
|
+
required: true,
|
|
48
|
+
description: "Recipient email(s), comma-separated",
|
|
49
|
+
},
|
|
33
50
|
from: { type: "string", required: true, description: "Sender email" },
|
|
34
51
|
fromName: { type: "string", required: false },
|
|
35
52
|
subject: { type: "string", required: true },
|
|
36
|
-
contentType: {
|
|
53
|
+
contentType: {
|
|
54
|
+
type: "string",
|
|
55
|
+
required: false,
|
|
56
|
+
description: "text/plain or text/html (default text/plain)",
|
|
57
|
+
},
|
|
37
58
|
content: { type: "string", required: true, description: "Email body" },
|
|
38
|
-
cc: {
|
|
39
|
-
|
|
59
|
+
cc: {
|
|
60
|
+
type: "string",
|
|
61
|
+
required: false,
|
|
62
|
+
description: "CC emails, comma-separated",
|
|
63
|
+
},
|
|
64
|
+
bcc: {
|
|
65
|
+
type: "string",
|
|
66
|
+
required: false,
|
|
67
|
+
description: "BCC emails, comma-separated",
|
|
68
|
+
},
|
|
40
69
|
replyTo: { type: "string", required: false },
|
|
41
|
-
templateId: {
|
|
42
|
-
|
|
70
|
+
templateId: {
|
|
71
|
+
type: "string",
|
|
72
|
+
required: false,
|
|
73
|
+
description: "Dynamic template ID (overrides subject/content)",
|
|
74
|
+
},
|
|
75
|
+
dynamicTemplateData: {
|
|
76
|
+
type: "object",
|
|
77
|
+
required: false,
|
|
78
|
+
description: "Template variables",
|
|
79
|
+
},
|
|
43
80
|
},
|
|
44
81
|
async execute(input, ctx) {
|
|
45
82
|
const p = input;
|
|
46
|
-
const toList = p.to
|
|
83
|
+
const toList = p.to
|
|
84
|
+
.split(",")
|
|
85
|
+
.map((e) => ({ email: e.trim() }));
|
|
47
86
|
const personalization = { to: toList };
|
|
48
87
|
const body = {
|
|
49
88
|
personalizations: [personalization],
|
|
@@ -56,14 +95,22 @@ export default function sendgrid(rl) {
|
|
|
56
95
|
}
|
|
57
96
|
else {
|
|
58
97
|
personalization.subject = p.subject;
|
|
59
|
-
body.content = [
|
|
98
|
+
body.content = [
|
|
99
|
+
{ type: p.contentType ?? "text/plain", value: p.content },
|
|
100
|
+
];
|
|
60
101
|
}
|
|
61
102
|
if (p.cc)
|
|
62
|
-
personalization.cc = p.cc
|
|
103
|
+
personalization.cc = p.cc
|
|
104
|
+
.split(",")
|
|
105
|
+
.map((e) => ({ email: e.trim() }));
|
|
63
106
|
if (p.bcc)
|
|
64
|
-
personalization.bcc = p.bcc
|
|
107
|
+
personalization.bcc = p.bcc
|
|
108
|
+
.split(",")
|
|
109
|
+
.map((e) => ({ email: e.trim() }));
|
|
65
110
|
if (p.replyTo)
|
|
66
|
-
body.reply_to_list = p.replyTo
|
|
111
|
+
body.reply_to_list = p.replyTo
|
|
112
|
+
.split(",")
|
|
113
|
+
.map((e) => ({ email: e.trim() }));
|
|
67
114
|
const { headers } = await apiRequest(key(ctx), "POST", "/mail/send", body);
|
|
68
115
|
return { messageId: headers["x-message-id"] ?? null };
|
|
69
116
|
},
|
|
@@ -73,7 +120,11 @@ export default function sendgrid(rl) {
|
|
|
73
120
|
description: "Get a contact by ID or email",
|
|
74
121
|
inputSchema: {
|
|
75
122
|
contactId: { type: "string", required: false },
|
|
76
|
-
email: {
|
|
123
|
+
email: {
|
|
124
|
+
type: "string",
|
|
125
|
+
required: false,
|
|
126
|
+
description: "Email (searches if no contactId)",
|
|
127
|
+
},
|
|
77
128
|
},
|
|
78
129
|
async execute(input, ctx) {
|
|
79
130
|
const p = input;
|
|
@@ -89,7 +140,11 @@ export default function sendgrid(rl) {
|
|
|
89
140
|
rl.registerAction("contact.list", {
|
|
90
141
|
description: "List contacts (optionally with SGQL query)",
|
|
91
142
|
inputSchema: {
|
|
92
|
-
query: {
|
|
143
|
+
query: {
|
|
144
|
+
type: "string",
|
|
145
|
+
required: false,
|
|
146
|
+
description: "SGQL query filter",
|
|
147
|
+
},
|
|
93
148
|
limit: { type: "number", required: false },
|
|
94
149
|
},
|
|
95
150
|
async execute(input, ctx) {
|
|
@@ -103,7 +158,8 @@ export default function sendgrid(rl) {
|
|
|
103
158
|
body.query = p.query;
|
|
104
159
|
}
|
|
105
160
|
const { data } = await apiRequest(key(ctx), method, endpoint, Object.keys(body).length ? body : undefined);
|
|
106
|
-
let result = (data.result ??
|
|
161
|
+
let result = (data.result ??
|
|
162
|
+
[]);
|
|
107
163
|
if (p.limit)
|
|
108
164
|
result = result.slice(0, p.limit);
|
|
109
165
|
return result;
|
|
@@ -112,8 +168,16 @@ export default function sendgrid(rl) {
|
|
|
112
168
|
rl.registerAction("contact.upsert", {
|
|
113
169
|
description: "Create or update contacts",
|
|
114
170
|
inputSchema: {
|
|
115
|
-
contacts: {
|
|
116
|
-
|
|
171
|
+
contacts: {
|
|
172
|
+
type: "object",
|
|
173
|
+
required: true,
|
|
174
|
+
description: "Array of contact objects [{email, first_name?, last_name?, ...}]",
|
|
175
|
+
},
|
|
176
|
+
listIds: {
|
|
177
|
+
type: "object",
|
|
178
|
+
required: false,
|
|
179
|
+
description: "Array of list IDs to add contacts to",
|
|
180
|
+
},
|
|
117
181
|
},
|
|
118
182
|
async execute(input, ctx) {
|
|
119
183
|
const p = input;
|
|
@@ -127,7 +191,11 @@ export default function sendgrid(rl) {
|
|
|
127
191
|
rl.registerAction("contact.delete", {
|
|
128
192
|
description: "Delete contacts by IDs",
|
|
129
193
|
inputSchema: {
|
|
130
|
-
ids: {
|
|
194
|
+
ids: {
|
|
195
|
+
type: "string",
|
|
196
|
+
required: true,
|
|
197
|
+
description: "Comma-separated contact IDs",
|
|
198
|
+
},
|
|
131
199
|
},
|
|
132
200
|
async execute(input, ctx) {
|
|
133
201
|
const { ids } = input;
|
|
@@ -140,7 +208,9 @@ export default function sendgrid(rl) {
|
|
|
140
208
|
description: "Create a contact list",
|
|
141
209
|
inputSchema: { name: { type: "string", required: true } },
|
|
142
210
|
async execute(input, ctx) {
|
|
143
|
-
const { data } = await apiRequest(key(ctx), "POST", "/marketing/lists", {
|
|
211
|
+
const { data } = await apiRequest(key(ctx), "POST", "/marketing/lists", {
|
|
212
|
+
name: input.name,
|
|
213
|
+
});
|
|
144
214
|
return data;
|
|
145
215
|
},
|
|
146
216
|
});
|
|
@@ -157,7 +227,8 @@ export default function sendgrid(rl) {
|
|
|
157
227
|
inputSchema: { limit: { type: "number", required: false } },
|
|
158
228
|
async execute(input, ctx) {
|
|
159
229
|
const { data } = await apiRequest(key(ctx), "GET", "/marketing/lists");
|
|
160
|
-
let result = (data.result ??
|
|
230
|
+
let result = (data.result ??
|
|
231
|
+
[]);
|
|
161
232
|
if (input?.limit)
|
|
162
233
|
result = result.slice(0, input.limit);
|
|
163
234
|
return result;
|
|
@@ -165,7 +236,10 @@ export default function sendgrid(rl) {
|
|
|
165
236
|
});
|
|
166
237
|
rl.registerAction("list.update", {
|
|
167
238
|
description: "Update a list name",
|
|
168
|
-
inputSchema: {
|
|
239
|
+
inputSchema: {
|
|
240
|
+
listId: { type: "string", required: true },
|
|
241
|
+
name: { type: "string", required: true },
|
|
242
|
+
},
|
|
169
243
|
async execute(input, ctx) {
|
|
170
244
|
const p = input;
|
|
171
245
|
const { data } = await apiRequest(key(ctx), "PATCH", `/marketing/lists/${p.listId}`, { name: p.name });
|
|
@@ -176,7 +250,11 @@ export default function sendgrid(rl) {
|
|
|
176
250
|
description: "Delete a list",
|
|
177
251
|
inputSchema: {
|
|
178
252
|
listId: { type: "string", required: true },
|
|
179
|
-
deleteContacts: {
|
|
253
|
+
deleteContacts: {
|
|
254
|
+
type: "boolean",
|
|
255
|
+
required: false,
|
|
256
|
+
description: "Also delete contacts in list",
|
|
257
|
+
},
|
|
180
258
|
},
|
|
181
259
|
async execute(input, ctx) {
|
|
182
260
|
const p = input;
|
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
function getConn(ctx) {
|
|
2
2
|
const c = ctx.connection.config;
|
|
3
|
-
return {
|
|
3
|
+
return {
|
|
4
|
+
url: c.url.replace(/\/$/, ""),
|
|
5
|
+
apiKey: c.apiKey,
|
|
6
|
+
};
|
|
4
7
|
}
|
|
5
8
|
async function apiRequest(conn, endpoint, body) {
|
|
6
9
|
body.api_key = conn.apiKey;
|
|
@@ -21,8 +24,18 @@ export default function sendy(rl) {
|
|
|
21
24
|
rl.setName("sendy");
|
|
22
25
|
rl.setVersion("0.1.0");
|
|
23
26
|
rl.setConnectionSchema({
|
|
24
|
-
url: {
|
|
25
|
-
|
|
27
|
+
url: {
|
|
28
|
+
type: "string",
|
|
29
|
+
required: true,
|
|
30
|
+
description: "Sendy installation URL",
|
|
31
|
+
env: "SENDY_URL",
|
|
32
|
+
},
|
|
33
|
+
apiKey: {
|
|
34
|
+
type: "string",
|
|
35
|
+
required: true,
|
|
36
|
+
description: "Sendy API key",
|
|
37
|
+
env: "SENDY_API_KEY",
|
|
38
|
+
},
|
|
26
39
|
});
|
|
27
40
|
rl.registerAction("campaign.create", {
|
|
28
41
|
description: "Create (and optionally send) an email campaign",
|
|
@@ -32,10 +45,26 @@ export default function sendy(rl) {
|
|
|
32
45
|
replyTo: { type: "string", required: true },
|
|
33
46
|
title: { type: "string", required: true },
|
|
34
47
|
subject: { type: "string", required: true },
|
|
35
|
-
htmlText: {
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
48
|
+
htmlText: {
|
|
49
|
+
type: "string",
|
|
50
|
+
required: true,
|
|
51
|
+
description: "HTML content of the email",
|
|
52
|
+
},
|
|
53
|
+
sendCampaign: {
|
|
54
|
+
type: "boolean",
|
|
55
|
+
required: false,
|
|
56
|
+
description: "Send immediately (default false)",
|
|
57
|
+
},
|
|
58
|
+
brandId: {
|
|
59
|
+
type: "string",
|
|
60
|
+
required: false,
|
|
61
|
+
description: "Brand ID (required if not sending)",
|
|
62
|
+
},
|
|
63
|
+
listIds: {
|
|
64
|
+
type: "string",
|
|
65
|
+
required: false,
|
|
66
|
+
description: "Comma-separated list IDs",
|
|
67
|
+
},
|
|
39
68
|
plainText: { type: "string", required: false },
|
|
40
69
|
trackOpens: { type: "boolean", required: false },
|
|
41
70
|
trackClicks: { type: "boolean", required: false },
|
|
@@ -43,8 +72,12 @@ export default function sendy(rl) {
|
|
|
43
72
|
async execute(input, ctx) {
|
|
44
73
|
const p = input;
|
|
45
74
|
const body = {
|
|
46
|
-
from_name: p.fromName,
|
|
47
|
-
|
|
75
|
+
from_name: p.fromName,
|
|
76
|
+
from_email: p.fromEmail,
|
|
77
|
+
reply_to: p.replyTo,
|
|
78
|
+
title: p.title,
|
|
79
|
+
subject: p.subject,
|
|
80
|
+
html_text: p.htmlText,
|
|
48
81
|
send_campaign: p.sendCampaign ? 1 : 0,
|
|
49
82
|
};
|
|
50
83
|
if (p.brandId)
|
|
@@ -114,7 +147,10 @@ export default function sendy(rl) {
|
|
|
114
147
|
},
|
|
115
148
|
async execute(input, ctx) {
|
|
116
149
|
const { email, listId } = input;
|
|
117
|
-
const resp = await apiRequest(getConn(ctx), "/unsubscribe", {
|
|
150
|
+
const resp = await apiRequest(getConn(ctx), "/unsubscribe", {
|
|
151
|
+
email,
|
|
152
|
+
list: listId,
|
|
153
|
+
});
|
|
118
154
|
if (resp === "1")
|
|
119
155
|
return { success: true };
|
|
120
156
|
throw new Error(`Sendy unsubscribe error: ${resp}`);
|
|
@@ -129,7 +165,14 @@ export default function sendy(rl) {
|
|
|
129
165
|
async execute(input, ctx) {
|
|
130
166
|
const { email, listId } = input;
|
|
131
167
|
const resp = await apiRequest(getConn(ctx), "/api/subscribers/subscription-status.php", { email, list_id: listId });
|
|
132
|
-
const valid = [
|
|
168
|
+
const valid = [
|
|
169
|
+
"Subscribed",
|
|
170
|
+
"Unsubscribed",
|
|
171
|
+
"Unconfirmed",
|
|
172
|
+
"Bounced",
|
|
173
|
+
"Soft bounced",
|
|
174
|
+
"Complained",
|
|
175
|
+
];
|
|
133
176
|
if (valid.includes(resp))
|
|
134
177
|
return { status: resp };
|
|
135
178
|
throw new Error(`Sendy status error: ${resp}`);
|