@pipedream/highlevel_oauth 0.1.0 → 0.2.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/actions/add-contact-to-campaign/add-contact-to-campaign.mjs +36 -0
- package/actions/common/{common.mjs → common-contacts.mjs} +4 -14
- package/actions/create-contact/create-contact.mjs +2 -2
- package/actions/update-contact/update-contact.mjs +2 -2
- package/actions/upsert-contact/upsert-contact.mjs +2 -2
- package/common/base.mjs +19 -0
- package/highlevel_oauth.app.mjs +44 -5
- package/package.json +2 -2
- package/sources/common/base-polling.mjs +25 -0
- package/sources/new-contact-created/new-contact-created.mjs +50 -0
- package/sources/new-contact-created/test-event.mjs +35 -0
- package/sources/new-form-submission/new-form-submission.mjs +59 -0
- package/sources/new-form-submission/test-event.mjs +59 -0
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import common from "../../common/base.mjs";
|
|
2
|
+
|
|
3
|
+
export default {
|
|
4
|
+
...common,
|
|
5
|
+
key: "highlevel_oauth-add-contact-to-campaign",
|
|
6
|
+
name: "Add Contact to Campaign",
|
|
7
|
+
description: "Adds an existing contact to a campaign. [See the documentation](https://highlevel.stoplight.io/docs/integrations/ecf9b5b45deaf-add-contact-to-campaign)",
|
|
8
|
+
version: "0.0.1",
|
|
9
|
+
type: "action",
|
|
10
|
+
props: {
|
|
11
|
+
...common.props,
|
|
12
|
+
contactId: {
|
|
13
|
+
propDefinition: [
|
|
14
|
+
common.props.app,
|
|
15
|
+
"contactId",
|
|
16
|
+
],
|
|
17
|
+
},
|
|
18
|
+
campaignId: {
|
|
19
|
+
propDefinition: [
|
|
20
|
+
common.props.app,
|
|
21
|
+
"campaignId",
|
|
22
|
+
],
|
|
23
|
+
},
|
|
24
|
+
},
|
|
25
|
+
async run({ $ }) {
|
|
26
|
+
const response = await this.app.addContactToCampaign({
|
|
27
|
+
$,
|
|
28
|
+
contactId: this.contactId,
|
|
29
|
+
campaignId: this.campaignId,
|
|
30
|
+
});
|
|
31
|
+
if (response?.succeded) {
|
|
32
|
+
$.export("$summary", `Successfully added contact to campaign with ID: ${this.campaignId}`);
|
|
33
|
+
}
|
|
34
|
+
return response;
|
|
35
|
+
},
|
|
36
|
+
};
|
|
@@ -1,13 +1,10 @@
|
|
|
1
|
-
import { ConfigurationError } from "@pipedream/platform";
|
|
2
1
|
import { parseObjectEntries } from "../../common/utils.mjs";
|
|
3
|
-
import
|
|
2
|
+
import common from "../../common/base.mjs";
|
|
4
3
|
|
|
5
4
|
export default {
|
|
5
|
+
...common,
|
|
6
6
|
props: {
|
|
7
|
-
|
|
8
|
-
...app,
|
|
9
|
-
reloadProps: true,
|
|
10
|
-
},
|
|
7
|
+
...common.props,
|
|
11
8
|
name: {
|
|
12
9
|
type: "string",
|
|
13
10
|
label: "Name",
|
|
@@ -34,15 +31,8 @@ export default {
|
|
|
34
31
|
optional: true,
|
|
35
32
|
},
|
|
36
33
|
},
|
|
37
|
-
async additionalProps() {
|
|
38
|
-
const locationId = this.app.getLocationId();
|
|
39
|
-
if (!locationId) {
|
|
40
|
-
throw new ConfigurationError("This component requires you to authenticate as a **location**, not as an agency/company. *(`locationId` field is missing from `$auth`)*");
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
return {};
|
|
44
|
-
},
|
|
45
34
|
methods: {
|
|
35
|
+
...common.methods,
|
|
46
36
|
getData(useLocation = true) {
|
|
47
37
|
const {
|
|
48
38
|
app, additionalOptions, locationId, ...data
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import common from "../common/common.mjs";
|
|
1
|
+
import common from "../common/common-contacts.mjs";
|
|
2
2
|
|
|
3
3
|
const {
|
|
4
4
|
props: {
|
|
@@ -11,7 +11,7 @@ export default {
|
|
|
11
11
|
key: "highlevel_oauth-create-contact",
|
|
12
12
|
name: "Create Contact",
|
|
13
13
|
description: "Creates a new contact on HighLevel. [See the documentation](https://highlevel.stoplight.io/docs/integrations/4c8362223c17b-create-contact)",
|
|
14
|
-
version: "0.0.
|
|
14
|
+
version: "0.0.2",
|
|
15
15
|
type: "action",
|
|
16
16
|
props: {
|
|
17
17
|
app,
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import common from "../common/common.mjs";
|
|
1
|
+
import common from "../common/common-contacts.mjs";
|
|
2
2
|
|
|
3
3
|
const {
|
|
4
4
|
props: {
|
|
@@ -11,7 +11,7 @@ export default {
|
|
|
11
11
|
key: "highlevel_oauth-update-contact",
|
|
12
12
|
name: "Update Contact",
|
|
13
13
|
description: "Updates a selected contact on HighLevel. [See the documentation](https://highlevel.stoplight.io/docs/integrations/9ce5a739d4fb9-update-contact)",
|
|
14
|
-
version: "0.0.
|
|
14
|
+
version: "0.0.2",
|
|
15
15
|
type: "action",
|
|
16
16
|
props: {
|
|
17
17
|
app,
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import common from "../common/common.mjs";
|
|
1
|
+
import common from "../common/common-contacts.mjs";
|
|
2
2
|
|
|
3
3
|
const {
|
|
4
4
|
props: {
|
|
@@ -11,7 +11,7 @@ export default {
|
|
|
11
11
|
key: "highlevel_oauth-upsert-contact",
|
|
12
12
|
name: "Upsert Contact",
|
|
13
13
|
description: "Creates or updates a contact on HighLevel. [See the documentation](https://highlevel.stoplight.io/docs/integrations/f71bbdd88f028-upsert-contact)",
|
|
14
|
-
version: "0.0.
|
|
14
|
+
version: "0.0.2",
|
|
15
15
|
type: "action",
|
|
16
16
|
props: {
|
|
17
17
|
app,
|
package/common/base.mjs
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { ConfigurationError } from "@pipedream/platform";
|
|
2
|
+
import app from "../highlevel_oauth.app.mjs";
|
|
3
|
+
|
|
4
|
+
export default {
|
|
5
|
+
props: {
|
|
6
|
+
app: {
|
|
7
|
+
...app,
|
|
8
|
+
reloadProps: true,
|
|
9
|
+
},
|
|
10
|
+
},
|
|
11
|
+
async additionalProps() {
|
|
12
|
+
const locationId = this.app.getLocationId();
|
|
13
|
+
if (!locationId) {
|
|
14
|
+
throw new ConfigurationError("This component requires you to authenticate as a **location**, not as an agency/company. *(`locationId` field is missing from `$auth`)*");
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
return {};
|
|
18
|
+
},
|
|
19
|
+
};
|
package/highlevel_oauth.app.mjs
CHANGED
|
@@ -31,6 +31,24 @@ export default {
|
|
|
31
31
|
}));
|
|
32
32
|
},
|
|
33
33
|
},
|
|
34
|
+
campaignId: {
|
|
35
|
+
type: "string",
|
|
36
|
+
label: "Campaign ID",
|
|
37
|
+
description: "The ID of the campaign to add contact to",
|
|
38
|
+
async options() {
|
|
39
|
+
const { campaigns } = await this.listCampaigns({
|
|
40
|
+
params: {
|
|
41
|
+
locationId: this.getLocationId(),
|
|
42
|
+
},
|
|
43
|
+
});
|
|
44
|
+
return campaigns?.map(({
|
|
45
|
+
id: value, name: label,
|
|
46
|
+
}) => ({
|
|
47
|
+
label,
|
|
48
|
+
value,
|
|
49
|
+
})) || [];
|
|
50
|
+
},
|
|
51
|
+
},
|
|
34
52
|
},
|
|
35
53
|
methods: {
|
|
36
54
|
getLocationId() {
|
|
@@ -39,7 +57,7 @@ export default {
|
|
|
39
57
|
_baseUrl() {
|
|
40
58
|
return "https://services.leadconnectorhq.com";
|
|
41
59
|
},
|
|
42
|
-
|
|
60
|
+
_makeRequest({
|
|
43
61
|
$ = this,
|
|
44
62
|
headers,
|
|
45
63
|
...otherOpts
|
|
@@ -54,14 +72,14 @@ export default {
|
|
|
54
72
|
...otherOpts,
|
|
55
73
|
});
|
|
56
74
|
},
|
|
57
|
-
|
|
75
|
+
createContact(args = {}) {
|
|
58
76
|
return this._makeRequest({
|
|
59
77
|
method: "POST",
|
|
60
78
|
url: "/contacts/",
|
|
61
79
|
...args,
|
|
62
80
|
});
|
|
63
81
|
},
|
|
64
|
-
|
|
82
|
+
updateContact({
|
|
65
83
|
contactId, ...args
|
|
66
84
|
}) {
|
|
67
85
|
return this._makeRequest({
|
|
@@ -70,18 +88,39 @@ export default {
|
|
|
70
88
|
...args,
|
|
71
89
|
});
|
|
72
90
|
},
|
|
73
|
-
|
|
91
|
+
upsertContact(args = {}) {
|
|
74
92
|
return this._makeRequest({
|
|
75
93
|
method: "POST",
|
|
76
94
|
url: "/contacts/upsert",
|
|
77
95
|
...args,
|
|
78
96
|
});
|
|
79
97
|
},
|
|
80
|
-
|
|
98
|
+
searchContacts(args = {}) {
|
|
81
99
|
return this._makeRequest({
|
|
82
100
|
url: "/contacts/",
|
|
83
101
|
...args,
|
|
84
102
|
});
|
|
85
103
|
},
|
|
104
|
+
listCampaigns(args = {}) {
|
|
105
|
+
return this._makeRequest({
|
|
106
|
+
url: "/campaigns/",
|
|
107
|
+
...args,
|
|
108
|
+
});
|
|
109
|
+
},
|
|
110
|
+
listFormSubmissions(args = {}) {
|
|
111
|
+
return this._makeRequest({
|
|
112
|
+
url: "/forms/submissions",
|
|
113
|
+
...args,
|
|
114
|
+
});
|
|
115
|
+
},
|
|
116
|
+
addContactToCampaign({
|
|
117
|
+
contactId, campaignId, ...args
|
|
118
|
+
}) {
|
|
119
|
+
return this._makeRequest({
|
|
120
|
+
method: "POST",
|
|
121
|
+
url: `/contacts/${contactId}/campaigns/${campaignId}`,
|
|
122
|
+
...args,
|
|
123
|
+
});
|
|
124
|
+
},
|
|
86
125
|
},
|
|
87
126
|
};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@pipedream/highlevel_oauth",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.2.0",
|
|
4
4
|
"description": "Pipedream HighLevel (OAuth) Components",
|
|
5
5
|
"main": "highlevel_oauth.app.mjs",
|
|
6
6
|
"keywords": [
|
|
@@ -13,6 +13,6 @@
|
|
|
13
13
|
"access": "public"
|
|
14
14
|
},
|
|
15
15
|
"dependencies": {
|
|
16
|
-
"@pipedream/platform": "^
|
|
16
|
+
"@pipedream/platform": "^3.0.3"
|
|
17
17
|
}
|
|
18
18
|
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import common from "../../common/base.mjs";
|
|
2
|
+
import { DEFAULT_POLLING_SOURCE_TIMER_INTERVAL } from "@pipedream/platform";
|
|
3
|
+
|
|
4
|
+
export default {
|
|
5
|
+
...common,
|
|
6
|
+
props: {
|
|
7
|
+
...common.props,
|
|
8
|
+
db: "$.service.db",
|
|
9
|
+
timer: {
|
|
10
|
+
type: "$.interface.timer",
|
|
11
|
+
default: {
|
|
12
|
+
intervalSeconds: DEFAULT_POLLING_SOURCE_TIMER_INTERVAL,
|
|
13
|
+
},
|
|
14
|
+
},
|
|
15
|
+
},
|
|
16
|
+
methods: {
|
|
17
|
+
...common.methods,
|
|
18
|
+
_getLastDate() {
|
|
19
|
+
return this.db.get("lastDate");
|
|
20
|
+
},
|
|
21
|
+
_setLastDate(lastDate) {
|
|
22
|
+
this.db.set("lastDate", lastDate);
|
|
23
|
+
},
|
|
24
|
+
},
|
|
25
|
+
};
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import common from "../common/base-polling.mjs";
|
|
2
|
+
import sampleEmit from "./test-event.mjs";
|
|
3
|
+
|
|
4
|
+
export default {
|
|
5
|
+
...common,
|
|
6
|
+
key: "highlevel_oauth-new-contact-created",
|
|
7
|
+
name: "New Contact Created",
|
|
8
|
+
description: "Emit new event when a new contact is created. [See the documentation](https://highlevel.stoplight.io/docs/integrations/ab55933a57f6f-get-contacts)",
|
|
9
|
+
version: "0.0.1",
|
|
10
|
+
type: "source",
|
|
11
|
+
dedupe: "unique",
|
|
12
|
+
methods: {
|
|
13
|
+
...common.methods,
|
|
14
|
+
generateMeta(contact) {
|
|
15
|
+
return {
|
|
16
|
+
id: contact.id,
|
|
17
|
+
summary: `New Contact ID: ${contact.id}`,
|
|
18
|
+
ts: Date.parse(contact.dateAdded),
|
|
19
|
+
};
|
|
20
|
+
},
|
|
21
|
+
},
|
|
22
|
+
async run() {
|
|
23
|
+
const results = [];
|
|
24
|
+
const params = {
|
|
25
|
+
limit: 100,
|
|
26
|
+
startAfter: this._getLastDate(),
|
|
27
|
+
locationId: this.app.getLocationId(),
|
|
28
|
+
};
|
|
29
|
+
let total;
|
|
30
|
+
|
|
31
|
+
do {
|
|
32
|
+
const {
|
|
33
|
+
contacts, meta,
|
|
34
|
+
} = await this.app.searchContacts({
|
|
35
|
+
params,
|
|
36
|
+
});
|
|
37
|
+
results.push(...contacts);
|
|
38
|
+
params.startAfter = meta?.startAfter;
|
|
39
|
+
total = meta?.total;
|
|
40
|
+
} while (results.length < total);
|
|
41
|
+
|
|
42
|
+
this._setLastDate(params.startAfter);
|
|
43
|
+
|
|
44
|
+
results.forEach((contact) => {
|
|
45
|
+
const meta = this.generateMeta(contact);
|
|
46
|
+
this.$emit(contact, meta);
|
|
47
|
+
});
|
|
48
|
+
},
|
|
49
|
+
sampleEmit,
|
|
50
|
+
};
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
export default {
|
|
2
|
+
"id": "jLxz55idEps7XRAgsWMz",
|
|
3
|
+
"locationId": "t8lsEHvfdlZugCobd4t7",
|
|
4
|
+
"contactName": "(example) casey morgan",
|
|
5
|
+
"firstName": "(example) casey",
|
|
6
|
+
"lastName": "morgan",
|
|
7
|
+
"firstNameRaw": "(Example) Casey",
|
|
8
|
+
"lastNameRaw": "Morgan",
|
|
9
|
+
"companyName": "(Example) Dunder Mifflin",
|
|
10
|
+
"email": null,
|
|
11
|
+
"phone": "+16541234567",
|
|
12
|
+
"dnd": false,
|
|
13
|
+
"dndSettings": {},
|
|
14
|
+
"type": "lead",
|
|
15
|
+
"source": null,
|
|
16
|
+
"assignedTo": null,
|
|
17
|
+
"city": null,
|
|
18
|
+
"state": null,
|
|
19
|
+
"postalCode": null,
|
|
20
|
+
"address1": null,
|
|
21
|
+
"dateAdded": "2025-04-04T16:00:08.369Z",
|
|
22
|
+
"dateUpdated": "2025-04-04T16:00:12.888Z",
|
|
23
|
+
"dateOfBirth": null,
|
|
24
|
+
"businessId": "67f001fe6b2c160e6f140161",
|
|
25
|
+
"tags": [
|
|
26
|
+
"high priority",
|
|
27
|
+
"follow-up"
|
|
28
|
+
],
|
|
29
|
+
"followers": [],
|
|
30
|
+
"country": "US",
|
|
31
|
+
"website": null,
|
|
32
|
+
"timezone": null,
|
|
33
|
+
"additionalEmails": [],
|
|
34
|
+
"customFields": []
|
|
35
|
+
}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import common from "../common/base-polling.mjs";
|
|
2
|
+
import sampleEmit from "./test-event.mjs";
|
|
3
|
+
|
|
4
|
+
export default {
|
|
5
|
+
...common,
|
|
6
|
+
key: "highlevel_oauth-new-form-submission",
|
|
7
|
+
name: "New Form Submission",
|
|
8
|
+
description: "Emit new event when a new form submission is created. [See the documentation](https://highlevel.stoplight.io/docs/integrations/a6114bd7685d1-get-forms-submissions)",
|
|
9
|
+
version: "0.0.1",
|
|
10
|
+
type: "source",
|
|
11
|
+
dedupe: "unique",
|
|
12
|
+
methods: {
|
|
13
|
+
...common.methods,
|
|
14
|
+
generateMeta(submission) {
|
|
15
|
+
return {
|
|
16
|
+
id: submission.id,
|
|
17
|
+
summary: `New Submission ID: ${submission.id}`,
|
|
18
|
+
ts: Date.parse(submission.createdAt),
|
|
19
|
+
};
|
|
20
|
+
},
|
|
21
|
+
},
|
|
22
|
+
async run() {
|
|
23
|
+
const lastDate = this._getLastDate();
|
|
24
|
+
let maxDate = lastDate;
|
|
25
|
+
|
|
26
|
+
const results = [];
|
|
27
|
+
const params = {
|
|
28
|
+
limit: 100,
|
|
29
|
+
page: 1,
|
|
30
|
+
startAt: lastDate,
|
|
31
|
+
locationId: this.app.getLocationId(),
|
|
32
|
+
};
|
|
33
|
+
let total;
|
|
34
|
+
|
|
35
|
+
do {
|
|
36
|
+
const {
|
|
37
|
+
submissions = [], meta,
|
|
38
|
+
} = await this.app.listFormSubmissions({
|
|
39
|
+
params,
|
|
40
|
+
});
|
|
41
|
+
for (const submission of submissions) {
|
|
42
|
+
results.push(submission);
|
|
43
|
+
if (!maxDate || Date.parse(submission.createdAt) > Date.parse(maxDate)) {
|
|
44
|
+
maxDate = submission.createdAt.slice(0, 10);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
total = meta?.total;
|
|
48
|
+
params.page++;
|
|
49
|
+
} while (results.length < total);
|
|
50
|
+
|
|
51
|
+
this._setLastDate(maxDate);
|
|
52
|
+
|
|
53
|
+
results.forEach((submission) => {
|
|
54
|
+
const meta = this.generateMeta(submission);
|
|
55
|
+
this.$emit(submission, meta);
|
|
56
|
+
});
|
|
57
|
+
},
|
|
58
|
+
sampleEmit,
|
|
59
|
+
};
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
export default {
|
|
2
|
+
"id": "67f029b5735c5378f6ba3b8a",
|
|
3
|
+
"contactId": "2N41CyHhuw4dUROfablK",
|
|
4
|
+
"formId": "AhRYrvMdMFRmZ7GxDlDS",
|
|
5
|
+
"name": "",
|
|
6
|
+
"email": "email@email.com",
|
|
7
|
+
"others": {
|
|
8
|
+
"first_name": "",
|
|
9
|
+
"last_name": "",
|
|
10
|
+
"phone": "",
|
|
11
|
+
"email": "email@email.com",
|
|
12
|
+
"terms_and_conditions": "By checking this box, I consent to receive transactional messages related to my account, orders, or services I have requested. These messages may include appointment reminders, order confirmations, and account notifications among others. Message frequency may vary. Message & Data rates may apply.Reply HELP for help or STOP to opt-out.; By checking this box, I consent to receive marketing and promotional messages, including special offers, discounts, new product updates among others. Message frequency may vary. Message & Data rates may apply. Reply HELP for help or STOP to opt-out.",
|
|
13
|
+
"formId": "AhRYrvMdMFRmZ7GxDlDS",
|
|
14
|
+
"location_id": "t8lsEHvfdlZugCobd4t7",
|
|
15
|
+
"sessionId": "59cdf305-4ac2-402d-bdbd-6e1e99be33cc",
|
|
16
|
+
"eventData": {
|
|
17
|
+
"source": "Direct traffic",
|
|
18
|
+
"referrer": "https://app.gohighlevel.com",
|
|
19
|
+
"adSource": "",
|
|
20
|
+
"page": {
|
|
21
|
+
"url": "https://link.apisystem.tech/widget/form/AhRYrvMdMFRmZ7GxDlDS",
|
|
22
|
+
"title": ""
|
|
23
|
+
},
|
|
24
|
+
"timestamp": 1743792563661,
|
|
25
|
+
"contactSessionIds": {
|
|
26
|
+
"ids": [
|
|
27
|
+
"59cdf305-4ac2-402d-bdbd-6e1e99be33cc"
|
|
28
|
+
]
|
|
29
|
+
},
|
|
30
|
+
"fbp": "",
|
|
31
|
+
"fbc": "",
|
|
32
|
+
"type": "page-visit",
|
|
33
|
+
"parentId": "AhRYrvMdMFRmZ7GxDlDS",
|
|
34
|
+
"pageVisitType": "form",
|
|
35
|
+
"domain": "link.apisystem.tech",
|
|
36
|
+
"version": "v3",
|
|
37
|
+
"parentName": "Form 0",
|
|
38
|
+
"fingerprint": null,
|
|
39
|
+
"documentURL": "https://link.apisystem.tech/widget/form/AhRYrvMdMFRmZ7GxDlDS",
|
|
40
|
+
"fbEventId": "024451af-ea45-4e6e-8b83-3385fb5eaff1",
|
|
41
|
+
"medium": "form",
|
|
42
|
+
"mediumId": "AhRYrvMdMFRmZ7GxDlDS"
|
|
43
|
+
},
|
|
44
|
+
"Timezone": "America/Detroit (GMT-04:00)",
|
|
45
|
+
"fieldsOriSequance": [
|
|
46
|
+
"first_name",
|
|
47
|
+
"last_name",
|
|
48
|
+
"phone",
|
|
49
|
+
"email",
|
|
50
|
+
"terms_and_conditions",
|
|
51
|
+
"button",
|
|
52
|
+
"header"
|
|
53
|
+
],
|
|
54
|
+
"submissionId": "4e3e3cef-2ed9-421e-b939-2200e68ec3e8",
|
|
55
|
+
"signatureHash": "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",
|
|
56
|
+
"ip": "47.225.143.157"
|
|
57
|
+
},
|
|
58
|
+
"createdAt": "2025-04-04T18:49:25.568Z"
|
|
59
|
+
}
|