UNPKG

@pipedream/twist

Version:

Pipedream Twist Components

172 lines (170 loc) 4.63 kB
import common from "../common/common.mjs"; import twist from "../../twist.app.mjs"; export default { ...common, name: "New Event (Instant)", version: "0.0.2", type: "source", key: "twist-new-event-instant", description: "Emit new event for any new updates in a workspace [See the docs here](https://developer.twist.com/v3/#outgoing-webhook)", props: { twist, db: "$.service.db", http: { type: "$.interface.http", customResponse: true, }, eventType: { propDefinition: [ twist, "eventType", ], reloadProps: true, }, }, async additionalProps() { const props = { workspace: { type: "string", label: "Workspace", description: "The workspace to watch for new events.", options: async () => { const workspaces = await this.twist.getWorkspaces({}); return workspaces.map((workspace) => ({ label: workspace.name, value: workspace.id, })); }, optional: this.eventType.includes("workspace"), }, }; if (this.eventType.includes("message")) { props.conversation = { type: "string", label: "Conversation", description: "The conversation to watch for new messages.", options: async () => { if (!this.workspace) { return [ { label: "No Conversations Found", value: "none", }, ]; } const conversations = await this.twist.getConversations({ workspace: this.workspace, }); return conversations.map((conversation) => ({ label: conversation.title || `Conversation ID ${conversation.id}`, value: conversation.id, })); }, }; } if (this.eventType.includes("thread") || this.eventType.includes("comment")) { props.channel = { type: "string", label: "Channel", description: "The channel to watch for new events.", options: async () => { if (!this.workspace) { return [ { label: "No Channels Found", value: "none", }, ]; } const channels = await this.twist.getChannels({ workspace: this.workspace, }); return channels.map((channel) => ({ label: channel.name, value: channel.id, })); }, }; } if (this.eventType.includes("comment")) { props.thread = { type: "string", label: "Thread", description: "The thread to watch for new events.", options: async () => { if (!this.channel) { return [ { label: "No Threads Found", value: "none", }, ]; } const threads = await this.twist.getThreads({ channel: this.channel, }); return threads.map((thread) => ({ label: thread.title, value: thread.id, })); }, }; } return props; }, methods: { ...common.methods, async getHistoricalEvents() { if (this.eventType.includes("workspace")) { return this.twist.getWorkspaces(); } if (this.eventType.includes("channel")) { return this.twist.getChannels({ workspace: this.workspace, }); } if (this.eventType.includes("thread")) { return this.twist.getThreads({ channel: this.channel, }); } if (this.eventType.includes("comment")) { return this.twist.getComments({ thread: this.thread, }); } if (this.eventType.includes("message")) { return this.twist.getConversationMessages({ conversation: this.conversation, }); } if (this.eventType.includes("group")) { return this.twist.getGroups({ workspace: this.workspace, }); } }, getHookActivationData() { return { target_url: this.http.endpoint, event: this.eventType, workspace_id: this.workspace, channel_id: this.channel, thread_id: this.thread, }; }, getMeta(body) { const { id, name: summary = "New Event", created = new Date(), } = body; const ts = Date.parse(created); return { id: `${id}${ts}`, summary, ts, }; }, }, };