Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
31 changes: 31 additions & 0 deletions components/veedea/actions/list-campaigns/list-campaigns.mjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
import veedea from "../../veedea.app.mjs";

export default {
key: "veedea-list-campaigns",
name: "List Campaigns",
description: "Get the list of campaigns created in the Veedea Dashboard. [See the documentation](https://veedea.com/api/doc)",
version: "0.0.1",
type: "action",
props: {
veedea,
maxResults: {
propDefinition: [
veedea,
"maxResults",
],
},
},
async run({ $ }) {
const token = await this.veedea.getToken();
const campaigns = await this.veedea.getPaginatedResources({
fn: this.veedea.listCampaigns,
args: {
$,
token,
},
max: this.maxResults,
});
$.export("$summary", `Successfully retrieved ${campaigns.length} campaigns`);
return campaigns;
},
};
40 changes: 40 additions & 0 deletions components/veedea/actions/list-leads/list-leads.mjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
import veedea from "../../veedea.app.mjs";

export default {
key: "veedea-list-leads",
name: "List Leads",
description: "Get a list of leads in a campaign. [See the documentation](https://veedea.com/api/doc)",
version: "0.0.1",
type: "action",
props: {
veedea,
campaignId: {
propDefinition: [
veedea,
"campaignId",
],
},
maxResults: {
propDefinition: [
veedea,
"maxResults",
],
},
},
async run({ $ }) {
const token = await this.veedea.getToken();
const leads = await this.veedea.getPaginatedResources({
fn: this.veedea.listLeads,
args: {
$,
token,
params: {
campaign_id: this.campaignId,
},
},
max: this.maxResults,
});
$.export("$summary", `Successfully retrieved ${leads.length} leads`);
return leads;
},
};
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
import veedea from "../../veedea.app.mjs";

export default {
key: "veedea-list-product-purchases",
name: "List Product Purchases",
description: "Retrieves a list of leads who purchased products through the specified campaign. [See the documentation](https://veedea.com/api/doc)",
version: "0.0.1",
type: "action",
props: {
veedea,
campaignId: {
propDefinition: [
veedea,
"campaignId",
],
},
maxResults: {
propDefinition: [
veedea,
"maxResults",
],
},
},
async run({ $ }) {
const token = await this.veedea.getToken();
const productPurchases = await this.veedea.getPaginatedResources({
fn: this.veedea.listProductPurchases,
args: {
$,
token,
params: {
campaign_id: this.campaignId,
},
},
max: this.maxResults,
});
$.export("$summary", `Successfully retrieved ${productPurchases.length} product purchases`);
return productPurchases;
},
};
7 changes: 5 additions & 2 deletions components/veedea/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@pipedream/veedea",
"version": "0.0.1",
"version": "0.1.0",
"description": "Pipedream Veedea Components",
"main": "veedea.app.mjs",
"keywords": [
Expand All @@ -11,5 +11,8 @@
"author": "Pipedream <[email protected]> (https://pipedream.com/)",
"publishConfig": {
"access": "public"
},
"dependencies": {
"@pipedream/platform": "^3.1.0"
}
}
}
88 changes: 88 additions & 0 deletions components/veedea/sources/common/base.mjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,88 @@
import {
DEFAULT_POLLING_SOURCE_TIMER_INTERVAL, ConfigurationError,
} from "@pipedream/platform";
import veedea from "../../veedea.app.mjs";

export default {
props: {
veedea,
db: "$.service.db",
timer: {
type: "$.interface.timer",
default: {
intervalSeconds: DEFAULT_POLLING_SOURCE_TIMER_INTERVAL,
},
},
},
methods: {
_getLastTs() {
return this.db.get("lastTs");
},
_setLastTs(ts) {
this.db.set("lastTs", ts);
},
getTsField() {
return null;
},
getArgs() {
return {};
},
async processEvent(max) {
const lastTs = this._getLastTs();
const tsField = this.getTsField();
const fn = this.getResourceFn();
const args = this.getArgs();
const token = await this.veedea.getToken();

const results = this.veedea.paginate({
fn,
args: {
...args,
token,
},
max,
});

const items = [];
for await (const item of results) {
const ts = tsField
? Date.parse(item[tsField])
: null;
if (!ts) {
items.push(item);
} else {
if (ts > lastTs) {
items.push(item);
} else {
break;
}
}
}

if (!items.length) {
return;
}

this._setLastTs(Date.parse(items[0][tsField]));

items.reverse().forEach((item) => {
const meta = this.generateMeta(item);
this.$emit(item, meta);
});
},
getResourceFn() {
throw new ConfigurationError("getResourceFn is not implemented");
},
generateMeta() {
throw new ConfigurationError("generateMeta is not implemented");
},
},
hooks: {
async deploy() {
await this.processEvent(25);
},
},
async run() {
await this.processEvent();
},
};
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
import common from "../common/base.mjs";
import sampleEmit from "./test-event.mjs";

export default {
...common,
key: "veedea-new-campaign-created",
name: "New Campaign Created",
description: "Emit new event when a new campaign is created.",
version: "0.0.1",
type: "source",
dedupe: "unique",
methods: {
...common.methods,
getResourceFn() {
return this.veedea.listCampaigns;
},
generateMeta(item) {
return {
id: item.id,
summary: `New Campaign Created: ${item.camp_name}`,
ts: Date.now(),
};
},
},
sampleEmit,
};
4 changes: 4 additions & 0 deletions components/veedea/sources/new-campaign-created/test-event.mjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
export default {
"id": 11320,
"camp_name": "My Campaign"
}
45 changes: 45 additions & 0 deletions components/veedea/sources/new-lead-created/new-lead-created.mjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
import common from "../common/base.mjs";
import sampleEmit from "./test-event.mjs";

export default {
...common,
key: "veedea-new-lead-created",
name: "New Lead Created",
description: "Emit new event when a new lead is created.",
version: "0.0.1",
type: "source",
dedupe: "unique",
props: {
...common.props,
campaignId: {
propDefinition: [
common.props.veedea,
"campaignId",
],
},
},
methods: {
...common.methods,
getResourceFn() {
return this.veedea.listLeads;
},
getTsField() {
return "registerDate";
},
getArgs() {
return {
params: {
campaignId: this.campaignId,
},
};
},
generateMeta(item) {
return {
id: item.id,
summary: `New Lead Created: ${item.user_name}`,
ts: Date.parse(item[this.getTsField()]),
};
},
},
sampleEmit,
};
10 changes: 10 additions & 0 deletions components/veedea/sources/new-lead-created/test-event.mjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
export default {
campid: "330",
user_name: "John Doe",
user_email: "[email protected]",
source: "",
device: "",
region: "",
id: 26,
registerDate: "2025-06-19T12:00:00Z",
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
import common from "../common/base.mjs";
import sampleEmit from "./test-event.mjs";

export default {
...common,
key: "veedea-new-product-purchase-created",
name: "New Product Purchase Created",
description: "Emit new event when a new product purchase is created.",
version: "0.0.1",
type: "source",
dedupe: "unique",
props: {
...common.props,
campaignId: {
propDefinition: [
common.props.veedea,
"campaignId",
],
},
},
methods: {
...common.methods,
getResourceFn() {
return this.veedea.listProductPurchases;
},
getTsField() {
return "purchase_datetime";
},
getArgs() {
return {
params: {
campaignId: this.campaignId,
},
};
},
generateMeta(item) {
return {
id: item.id,
summary: `New Product Purchase Created: ${item.prod_name}`,
ts: Date.parse(item[this.getTsField()]),
};
},
},
sampleEmit,
};
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
export default {
id: 37,
camp_name: "My Campaign",
prod_name: "Product Name",
prod_price: "5.00",
prod_method: "paypal",
prod_txs_id: "1234567890",
cus_name: "John Doe",
cus_email: "[email protected]",
purchase_datetime: "2025-06-19T12:00:00Z",
}
Loading
Loading