Skip to content

Commit 43ca975

Browse files
committed
init
1 parent cb22999 commit 43ca975

File tree

2 files changed

+152
-2
lines changed

2 files changed

+152
-2
lines changed

components/heroku/heroku.app.mjs

+82-2
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,89 @@
1+
import { axios } from "@pipedream/platform";
2+
13
export default {
24
type: "app",
35
app: "heroku",
4-
propDefinitions: {},
6+
propDefinitions: {
7+
appId: {
8+
type: "string",
9+
label: "App ID",
10+
description: "The ID of the app",
11+
async options() {
12+
const { data } = await this.listApps();
13+
return data.map((app) => ({
14+
label: app.name,
15+
value: app.id,
16+
}));
17+
},
18+
},
19+
entity: {
20+
type: "string[]",
21+
label: "Entity",
22+
description: "The entity to subscribe to",
23+
options: [
24+
"api:addon-attachment",
25+
"api:addon",
26+
"api:app",
27+
"api:build",
28+
"api:collaborator",
29+
"api:domain",
30+
"api:dyno",
31+
"api:formation",
32+
"api:release",
33+
"api:sni-endpoint",
34+
],
35+
},
36+
eventTypes: {
37+
type: "string[]",
38+
label: "Event Types",
39+
description: "The types of events to subscribe to",
40+
options: [
41+
"create",
42+
"destroy",
43+
"update",
44+
],
45+
},
46+
},
547
methods: {
6-
// this.$auth contains connected account data
48+
_baseUrl() {
49+
return "https://api.heroku.com";
50+
},
51+
async _makeRequest(opts = {}) {
52+
const {
53+
$ = this,
54+
method = "GET",
55+
path,
56+
headers,
57+
...otherOpts
58+
} = opts;
59+
return axios($, {
60+
...otherOpts,
61+
method,
62+
url: this._baseUrl() + path,
63+
headers: {
64+
...headers,
65+
"Authorization": `Bearer ${this.$auth.oauth_access_token}`,
66+
},
67+
});
68+
},
69+
async listApps() {
70+
return this._makeRequest({
71+
path: "/apps",
72+
});
73+
},
74+
async createWebhookSubscription(appId, entity) {
75+
return this._makeRequest({
76+
method: "POST",
77+
path: `/apps/${appId}/webhooks`,
78+
data: {
79+
include: entity,
80+
level: "notify",
81+
secret: "my_secret",
82+
url: "https://example.com/hooks",
83+
authorization: this.$auth.oauth_access_token,
84+
},
85+
});
86+
},
787
authKeys() {
888
console.log(Object.keys(this.$auth));
989
},
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
import heroku from "../../heroku.app.mjs";
2+
3+
export default {
4+
key: "heroku-new-webhook-event-instant",
5+
name: "New Webhook Event Instant",
6+
description: "Emit new event on each webhook event. [See the documentation](https://devcenter.heroku.com/categories/platform-api)",
7+
version: "0.0.{{ts}}",
8+
type: "source",
9+
dedupe: "unique",
10+
props: {
11+
heroku,
12+
http: {
13+
type: "$.interface.http",
14+
customResponse: false,
15+
},
16+
db: "$.service.db",
17+
appId: {
18+
propDefinition: [
19+
heroku,
20+
"appId",
21+
],
22+
},
23+
entity: {
24+
propDefinition: [
25+
heroku,
26+
"entity",
27+
],
28+
},
29+
eventTypes: {
30+
propDefinition: [
31+
heroku,
32+
"eventTypes",
33+
],
34+
},
35+
},
36+
hooks: {
37+
async activate() {
38+
const webhookId = await this.heroku.createWebhookSubscription(
39+
this.appId,
40+
this.entity,
41+
this.eventTypes,
42+
);
43+
this.db.set("webhookId", webhookId);
44+
},
45+
async deactivate() {
46+
const webhookId = this.db.get("webhookId");
47+
if (webhookId) {
48+
await this.heroku.deleteWebhookSubscription(webhookId);
49+
}
50+
},
51+
},
52+
async run(event) {
53+
const {
54+
body, headers,
55+
} = event;
56+
57+
// Validate the incoming webhook payload
58+
if (headers["heroku-webhook-hmac-sha256"] !== this.heroku.$auth.webhook_secret) {
59+
console.log("Invalid signature");
60+
return;
61+
}
62+
63+
// Emit the event
64+
this.$emit(body, {
65+
id: body.id,
66+
summary: `New event: ${body.event_type}`,
67+
ts: Date.parse(body.created_at),
68+
});
69+
},
70+
};

0 commit comments

Comments
 (0)