import segmentApp from "../../segment.app.mjs";
export default {
key: "segment-webhook-destination",
name: "Webhook Destination (Instant)",
description: "Send events to a webhook. Requires a Team or Business account.",
version: "0.0.2",
type: "source",
props: {
segmentApp,
db: "$.service.db",
http: {
type: "$.interface.http",
customResponse: true,
},
workspace: {
propDefinition: [
segmentApp,
"workspace",
],
},
source: {
propDefinition: [
segmentApp,
"source",
({ workspace }) => ({
workspace,
}),
],
},
name: {
type: "string",
label: "Name",
description: "Defines the display name of the Destination",
},
trigger: {
type: "string",
label: "Trigger",
description: "Destination FQL Statement. [Filter Query Language](https://segment.com/docs/api/public-api/fql/)",
optional: true,
default: "type = \"identify\" or type = \"track\" or type = \"group\"",
},
},
hooks: {
async activate() {
const { data } = await this.segmentApp.createDestination({
data: {
sourceId: this.source,
metadataId: await this.findMetadataId(),
name: this.name,
enabled: true,
connection_mode: "UNSPECIFIED",
settings: {},
},
});
const destinationId = data.destination.id;
this.setDestinationId(destinationId);
const response = await this.segmentApp.createDestinationSubscription({
destination: destinationId,
data: {
name: "Pipedream Webhook Subscription",
trigger: this.trigger,
actionId: await this.findActionId(destinationId),
enabled: true,
settings: {
method: "POST",
url: this.http.endpoint,
},
},
});
const subscriptionId = response.data.destinationSubscription.id;
this.setSubscriptionId(subscriptionId);
},
async deactivate() {
const destination = this.getDestinationId();
const subscription = this.getSubscriptionId();
await this.segmentApp.deleteDestinationSubscription({
destination,
subscription,
});
await this.segmentApp.deleteDestination({
destination,
});
},
},
methods: {
getDestination() {
return "actions-webhook";
},
setDestinationId(id) {
this.db.set("destinationId", id);
},
getDestinationId() {
return this.db.get("destinationId");
},
setSubscriptionId(id) {
this.db.set("subscriptionId", id);
},
getSubscriptionId() {
return this.db.get("subscriptionId");
},
async findDestinationMetadataId() {
const params = {
pagination: {
count: 200,
},
};
do {
const {
data: {
destinationsCatalog, pagination,
},
} = await this.segmentApp.getDestinationsCatalog({
params,
});
const destination = destinationsCatalog.find(({ slug }) => slug === this.getDestination());
if (destination) {
return destination.id;
}
params.pagination.cursor = pagination?.next;
} while (params.pagination.cursor);
},
async findMetadataId() {
const destinationMetadataId = await this.findDestinationMetadataId();
const { data: { destinationMetadata } } = await this.segmentApp.getDestinationMetadata({
destinationMetadataId,
});
if (!destinationMetadata?.id) {
throw new Error(`MetadataId for ${this.getDestination()} not found.`);
}
return destinationMetadata.id;
},
async findActionId(destination) {
const { data } = await this.segmentApp.getDestination({
destination,
});
return data.destination.metadata.actions[0].id;
},
},
async run(event) {
this.http.respond({
status: 200,
});
this.$emit(event, {
id: Date.now(),
summary: "Received event",
ts: Date.now(),
});
},
};