Skip to content

Commit b386b1e

Browse files
authored
New Components - veedea (#17188)
* new components * pnpm-lock.yaml
1 parent 15ff130 commit b386b1e

File tree

13 files changed

+454
-7
lines changed

13 files changed

+454
-7
lines changed
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
import veedea from "../../veedea.app.mjs";
2+
3+
export default {
4+
key: "veedea-list-campaigns",
5+
name: "List Campaigns",
6+
description: "Get the list of campaigns created in the Veedea Dashboard. [See the documentation](https://veedea.com/api/doc)",
7+
version: "0.0.1",
8+
type: "action",
9+
props: {
10+
veedea,
11+
maxResults: {
12+
propDefinition: [
13+
veedea,
14+
"maxResults",
15+
],
16+
},
17+
},
18+
async run({ $ }) {
19+
const token = await this.veedea.getToken();
20+
const campaigns = await this.veedea.getPaginatedResources({
21+
fn: this.veedea.listCampaigns,
22+
args: {
23+
$,
24+
token,
25+
},
26+
max: this.maxResults,
27+
});
28+
$.export("$summary", `Successfully retrieved ${campaigns.length} campaigns`);
29+
return campaigns;
30+
},
31+
};
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
import veedea from "../../veedea.app.mjs";
2+
3+
export default {
4+
key: "veedea-list-leads",
5+
name: "List Leads",
6+
description: "Get a list of leads in a campaign. [See the documentation](https://veedea.com/api/doc)",
7+
version: "0.0.1",
8+
type: "action",
9+
props: {
10+
veedea,
11+
campaignId: {
12+
propDefinition: [
13+
veedea,
14+
"campaignId",
15+
],
16+
},
17+
maxResults: {
18+
propDefinition: [
19+
veedea,
20+
"maxResults",
21+
],
22+
},
23+
},
24+
async run({ $ }) {
25+
const token = await this.veedea.getToken();
26+
const leads = await this.veedea.getPaginatedResources({
27+
fn: this.veedea.listLeads,
28+
args: {
29+
$,
30+
token,
31+
params: {
32+
campaign_id: this.campaignId,
33+
},
34+
},
35+
max: this.maxResults,
36+
});
37+
$.export("$summary", `Successfully retrieved ${leads.length} leads`);
38+
return leads;
39+
},
40+
};
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
import veedea from "../../veedea.app.mjs";
2+
3+
export default {
4+
key: "veedea-list-product-purchases",
5+
name: "List Product Purchases",
6+
description: "Retrieves a list of leads who purchased products through the specified campaign. [See the documentation](https://veedea.com/api/doc)",
7+
version: "0.0.1",
8+
type: "action",
9+
props: {
10+
veedea,
11+
campaignId: {
12+
propDefinition: [
13+
veedea,
14+
"campaignId",
15+
],
16+
},
17+
maxResults: {
18+
propDefinition: [
19+
veedea,
20+
"maxResults",
21+
],
22+
},
23+
},
24+
async run({ $ }) {
25+
const token = await this.veedea.getToken();
26+
const productPurchases = await this.veedea.getPaginatedResources({
27+
fn: this.veedea.listProductPurchases,
28+
args: {
29+
$,
30+
token,
31+
params: {
32+
campaign_id: this.campaignId,
33+
},
34+
},
35+
max: this.maxResults,
36+
});
37+
$.export("$summary", `Successfully retrieved ${productPurchases.length} product purchases`);
38+
return productPurchases;
39+
},
40+
};

components/veedea/package.json

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@pipedream/veedea",
3-
"version": "0.0.1",
3+
"version": "0.1.0",
44
"description": "Pipedream Veedea Components",
55
"main": "veedea.app.mjs",
66
"keywords": [
@@ -11,5 +11,8 @@
1111
"author": "Pipedream <[email protected]> (https://pipedream.com/)",
1212
"publishConfig": {
1313
"access": "public"
14+
},
15+
"dependencies": {
16+
"@pipedream/platform": "^3.1.0"
1417
}
15-
}
18+
}
Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
import {
2+
DEFAULT_POLLING_SOURCE_TIMER_INTERVAL, ConfigurationError,
3+
} from "@pipedream/platform";
4+
import veedea from "../../veedea.app.mjs";
5+
6+
export default {
7+
props: {
8+
veedea,
9+
db: "$.service.db",
10+
timer: {
11+
type: "$.interface.timer",
12+
default: {
13+
intervalSeconds: DEFAULT_POLLING_SOURCE_TIMER_INTERVAL,
14+
},
15+
},
16+
},
17+
methods: {
18+
_getLastTs() {
19+
return this.db.get("lastTs");
20+
},
21+
_setLastTs(ts) {
22+
this.db.set("lastTs", ts);
23+
},
24+
getTsField() {
25+
return null;
26+
},
27+
getArgs() {
28+
return {};
29+
},
30+
async processEvent(max) {
31+
const lastTs = this._getLastTs();
32+
const tsField = this.getTsField();
33+
const fn = this.getResourceFn();
34+
const args = this.getArgs();
35+
const token = await this.veedea.getToken();
36+
37+
const results = this.veedea.paginate({
38+
fn,
39+
args: {
40+
...args,
41+
token,
42+
},
43+
max,
44+
});
45+
46+
const items = [];
47+
for await (const item of results) {
48+
const ts = tsField
49+
? Date.parse(item[tsField])
50+
: null;
51+
if (!ts) {
52+
items.push(item);
53+
} else {
54+
if (ts > lastTs) {
55+
items.push(item);
56+
} else {
57+
break;
58+
}
59+
}
60+
}
61+
62+
if (!items.length) {
63+
return;
64+
}
65+
66+
this._setLastTs(Date.parse(items[0][tsField]));
67+
68+
items.reverse().forEach((item) => {
69+
const meta = this.generateMeta(item);
70+
this.$emit(item, meta);
71+
});
72+
},
73+
getResourceFn() {
74+
throw new ConfigurationError("getResourceFn is not implemented");
75+
},
76+
generateMeta() {
77+
throw new ConfigurationError("generateMeta is not implemented");
78+
},
79+
},
80+
hooks: {
81+
async deploy() {
82+
await this.processEvent(25);
83+
},
84+
},
85+
async run() {
86+
await this.processEvent();
87+
},
88+
};
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
import common from "../common/base.mjs";
2+
import sampleEmit from "./test-event.mjs";
3+
4+
export default {
5+
...common,
6+
key: "veedea-new-campaign-created",
7+
name: "New Campaign Created",
8+
description: "Emit new event when a new campaign is created.",
9+
version: "0.0.1",
10+
type: "source",
11+
dedupe: "unique",
12+
methods: {
13+
...common.methods,
14+
getResourceFn() {
15+
return this.veedea.listCampaigns;
16+
},
17+
generateMeta(item) {
18+
return {
19+
id: item.id,
20+
summary: `New Campaign Created: ${item.camp_name}`,
21+
ts: Date.now(),
22+
};
23+
},
24+
},
25+
sampleEmit,
26+
};
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
export default {
2+
"id": 11320,
3+
"camp_name": "My Campaign"
4+
}
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
import common from "../common/base.mjs";
2+
import sampleEmit from "./test-event.mjs";
3+
4+
export default {
5+
...common,
6+
key: "veedea-new-lead-created",
7+
name: "New Lead Created",
8+
description: "Emit new event when a new lead is created.",
9+
version: "0.0.1",
10+
type: "source",
11+
dedupe: "unique",
12+
props: {
13+
...common.props,
14+
campaignId: {
15+
propDefinition: [
16+
common.props.veedea,
17+
"campaignId",
18+
],
19+
},
20+
},
21+
methods: {
22+
...common.methods,
23+
getResourceFn() {
24+
return this.veedea.listLeads;
25+
},
26+
getTsField() {
27+
return "registerDate";
28+
},
29+
getArgs() {
30+
return {
31+
params: {
32+
campaignId: this.campaignId,
33+
},
34+
};
35+
},
36+
generateMeta(item) {
37+
return {
38+
id: item.id,
39+
summary: `New Lead Created: ${item.user_name}`,
40+
ts: Date.parse(item[this.getTsField()]),
41+
};
42+
},
43+
},
44+
sampleEmit,
45+
};
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
export default {
2+
campid: "330",
3+
user_name: "John Doe",
4+
user_email: "[email protected]",
5+
source: "",
6+
device: "",
7+
region: "",
8+
id: 26,
9+
registerDate: "2025-06-19T12:00:00Z",
10+
}
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
import common from "../common/base.mjs";
2+
import sampleEmit from "./test-event.mjs";
3+
4+
export default {
5+
...common,
6+
key: "veedea-new-product-purchase-created",
7+
name: "New Product Purchase Created",
8+
description: "Emit new event when a new product purchase is created.",
9+
version: "0.0.1",
10+
type: "source",
11+
dedupe: "unique",
12+
props: {
13+
...common.props,
14+
campaignId: {
15+
propDefinition: [
16+
common.props.veedea,
17+
"campaignId",
18+
],
19+
},
20+
},
21+
methods: {
22+
...common.methods,
23+
getResourceFn() {
24+
return this.veedea.listProductPurchases;
25+
},
26+
getTsField() {
27+
return "purchase_datetime";
28+
},
29+
getArgs() {
30+
return {
31+
params: {
32+
campaignId: this.campaignId,
33+
},
34+
};
35+
},
36+
generateMeta(item) {
37+
return {
38+
id: item.id,
39+
summary: `New Product Purchase Created: ${item.prod_name}`,
40+
ts: Date.parse(item[this.getTsField()]),
41+
};
42+
},
43+
},
44+
sampleEmit,
45+
};

0 commit comments

Comments
 (0)