initial commit
This commit is contained in:
commit
a9fe8d18fb
8 changed files with 204 additions and 0 deletions
1
README.md
Normal file
1
README.md
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
Project repo_7kT73R
|
||||||
5
expenses-pipeline-p_13CN51K/.workflow.state
Normal file
5
expenses-pipeline-p_13CN51K/.workflow.state
Normal file
|
|
@ -0,0 +1,5 @@
|
||||||
|
# DO NOT EDIT THIS FILE
|
||||||
|
---
|
||||||
|
schema: workflow.state/2022.04
|
||||||
|
id: p_13CN51K
|
||||||
|
|
||||||
31
expenses-pipeline-p_13CN51K/fetch_message/entry.js
Normal file
31
expenses-pipeline-p_13CN51K/fetch_message/entry.js
Normal file
|
|
@ -0,0 +1,31 @@
|
||||||
|
import { axios } from "@pipedream/platform";
|
||||||
|
export default defineComponent({
|
||||||
|
props: {
|
||||||
|
slack: {
|
||||||
|
type: "app",
|
||||||
|
app: "slack_bot",
|
||||||
|
}
|
||||||
|
},
|
||||||
|
async run({ steps, $ }) {
|
||||||
|
console.log("Auth:", JSON.stringify(this.slack.$auth)); // ← moved here
|
||||||
|
|
||||||
|
const response = await axios($, {
|
||||||
|
method: "GET",
|
||||||
|
url: "https://slack.com/api/conversations.history",
|
||||||
|
headers: {
|
||||||
|
Authorization: `Bearer ${this.slack.$auth.bot_token}`,
|
||||||
|
},
|
||||||
|
params: {
|
||||||
|
channel: steps.route_check.$return_value.fromChannel,
|
||||||
|
latest: steps.route_check.$return_value.messageTs,
|
||||||
|
limit: 1,
|
||||||
|
inclusive: true,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
console.log("Response:", JSON.stringify(response));
|
||||||
|
if (!response.ok) throw new Error(response.error);
|
||||||
|
return {
|
||||||
|
text: response.messages[0].text,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
});
|
||||||
26
expenses-pipeline-p_13CN51K/get_permalink/entry.js
Normal file
26
expenses-pipeline-p_13CN51K/get_permalink/entry.js
Normal file
|
|
@ -0,0 +1,26 @@
|
||||||
|
import { axios } from "@pipedream/platform";
|
||||||
|
export default defineComponent({
|
||||||
|
props: {
|
||||||
|
slack: {
|
||||||
|
type: "app",
|
||||||
|
app: "slack_bot",
|
||||||
|
}
|
||||||
|
},
|
||||||
|
async run({ steps, $ }) {
|
||||||
|
const response = await axios($, {
|
||||||
|
method: "GET",
|
||||||
|
url: "https://slack.com/api/chat.getPermalink",
|
||||||
|
headers: {
|
||||||
|
Authorization: `Bearer ${this.slack.$auth.bot_token}`,
|
||||||
|
},
|
||||||
|
params: {
|
||||||
|
channel: steps.route_check.$return_value.fromChannel,
|
||||||
|
message_ts: steps.route_check.$return_value.messageTs,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
if (!response.ok) throw new Error(response.error);
|
||||||
|
return {
|
||||||
|
permalink: response.permalink,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
});
|
||||||
47
expenses-pipeline-p_13CN51K/post_to_next_channel/entry.js
Normal file
47
expenses-pipeline-p_13CN51K/post_to_next_channel/entry.js
Normal file
|
|
@ -0,0 +1,47 @@
|
||||||
|
import { axios } from "@pipedream/platform";
|
||||||
|
export default defineComponent({
|
||||||
|
props: {
|
||||||
|
slack: {
|
||||||
|
type: "app",
|
||||||
|
app: "slack_bot",
|
||||||
|
}
|
||||||
|
},
|
||||||
|
async run({ steps, $ }) {
|
||||||
|
const { toChannel, label } = steps.route_check.$return_value;
|
||||||
|
const { permalink } = steps.get_permalink.$return_value;
|
||||||
|
// Strip old React instruction from copied text
|
||||||
|
let text = steps.fetch_message.$return_value.text;
|
||||||
|
text = text.replace(/_React_ :white_check_mark: _to advance to \w+_/g, '').trim();
|
||||||
|
// Determine next stage label for the React instruction
|
||||||
|
const nextStageMap = {
|
||||||
|
'C0APLSGABAB': 'Authorized',
|
||||||
|
'C0AQ09CDJH4': 'Matched',
|
||||||
|
'C0APYUM1JFP': null, // Final stage — no next instruction
|
||||||
|
};
|
||||||
|
const nextLabel = nextStageMap[toChannel];
|
||||||
|
const reactLine = nextLabel
|
||||||
|
? `\n\n_React_ :white_check_mark: _to advance to ${nextLabel}_`
|
||||||
|
: '';
|
||||||
|
const permalinkLine = toChannel === 'C0APLSGABAB'
|
||||||
|
? `\n\n📎 *Original Submission:* <${permalink}|View Original Message>`
|
||||||
|
: '';
|
||||||
|
const fullText = `${text}${permalinkLine}${reactLine}`;
|
||||||
|
const response = await axios($, {
|
||||||
|
method: "POST",
|
||||||
|
url: "https://slack.com/api/chat.postMessage",
|
||||||
|
headers: {
|
||||||
|
Authorization: `Bearer ${this.slack.$auth.bot_token}`,
|
||||||
|
"Content-Type": "application/json",
|
||||||
|
},
|
||||||
|
data: {
|
||||||
|
channel: toChannel,
|
||||||
|
text: fullText,
|
||||||
|
mrkdwn: true,
|
||||||
|
unfurl_links: false,
|
||||||
|
unfurl_media: false,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
if (!response.ok) throw new Error(response.error);
|
||||||
|
return { messageTs: response.ts };
|
||||||
|
}
|
||||||
|
});
|
||||||
27
expenses-pipeline-p_13CN51K/reply_on_original/entry.js
Normal file
27
expenses-pipeline-p_13CN51K/reply_on_original/entry.js
Normal file
|
|
@ -0,0 +1,27 @@
|
||||||
|
import { axios } from "@pipedream/platform";
|
||||||
|
export default defineComponent({
|
||||||
|
props: {
|
||||||
|
slack: {
|
||||||
|
type: "app",
|
||||||
|
app: "slack_bot",
|
||||||
|
}
|
||||||
|
},
|
||||||
|
async run({ steps, $ }) {
|
||||||
|
const { fromChannel, messageTs, label } = steps.route_check.$return_value;
|
||||||
|
const response = await axios($, {
|
||||||
|
method: "POST",
|
||||||
|
url: "https://slack.com/api/chat.postMessage",
|
||||||
|
headers: {
|
||||||
|
Authorization: `Bearer ${this.slack.$auth.bot_token}`,
|
||||||
|
"Content-Type": "application/json",
|
||||||
|
},
|
||||||
|
data: {
|
||||||
|
channel: fromChannel,
|
||||||
|
thread_ts: messageTs,
|
||||||
|
text: `➡️ Advanced to ${label}`,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
if (!response.ok) throw new Error(response.error);
|
||||||
|
return { success: true };
|
||||||
|
}
|
||||||
|
});
|
||||||
32
expenses-pipeline-p_13CN51K/route_check/entry.js
Normal file
32
expenses-pipeline-p_13CN51K/route_check/entry.js
Normal file
|
|
@ -0,0 +1,32 @@
|
||||||
|
export default defineComponent({
|
||||||
|
async run({ steps }) {
|
||||||
|
const reaction = steps.trigger.event.reaction;
|
||||||
|
const fromChannel = steps.trigger.event.item.channel;
|
||||||
|
const messageTs = steps.trigger.event.item.ts;
|
||||||
|
|
||||||
|
// Only proceed for ✅ reactions
|
||||||
|
if (reaction !== 'white_check_mark') {
|
||||||
|
return $end('Not a white_check_mark reaction — skipping');
|
||||||
|
}
|
||||||
|
|
||||||
|
// Map source channel to destination channel and label
|
||||||
|
const channelMap = {
|
||||||
|
'C0AQ2AWLNEN': { next: 'C0APLSGABAB', label: 'Processed' },
|
||||||
|
'C0APLSGABAB': { next: 'C0AQ09CDJH4', label: 'Authorized' },
|
||||||
|
'C0AQ09CDJH4': { next: 'C0APYUM1JFP', label: 'Matched' },
|
||||||
|
};
|
||||||
|
|
||||||
|
const route = channelMap[fromChannel];
|
||||||
|
|
||||||
|
if (!route) {
|
||||||
|
return $end('Reaction not in an expense channel — skipping');
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
fromChannel,
|
||||||
|
toChannel: route.next,
|
||||||
|
label: route.label,
|
||||||
|
messageTs,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
});
|
||||||
35
expenses-pipeline-p_13CN51K/workflow.yaml
Normal file
35
expenses-pipeline-p_13CN51K/workflow.yaml
Normal file
|
|
@ -0,0 +1,35 @@
|
||||||
|
schema: workflow/2022.04
|
||||||
|
name: Expenses Pipeline
|
||||||
|
settings:
|
||||||
|
error_notification: true
|
||||||
|
triggers:
|
||||||
|
- id: dc_DvudRW4
|
||||||
|
steps:
|
||||||
|
- namespace: route_check
|
||||||
|
runtime: nodejs20.x
|
||||||
|
uses: "./route_check/entry.js"
|
||||||
|
- namespace: fetch_message
|
||||||
|
runtime: nodejs20.x
|
||||||
|
uses: "./fetch_message/entry.js"
|
||||||
|
props:
|
||||||
|
slack:
|
||||||
|
authProvisionId: apn_86hW0ZZ
|
||||||
|
- namespace: get_permalink
|
||||||
|
runtime: nodejs20.x
|
||||||
|
uses: "./get_permalink/entry.js"
|
||||||
|
props:
|
||||||
|
slack:
|
||||||
|
authProvisionId: apn_86hW0ZZ
|
||||||
|
- namespace: post_to_next_channel
|
||||||
|
runtime: nodejs20.x
|
||||||
|
uses: "./post_to_next_channel/entry.js"
|
||||||
|
props:
|
||||||
|
slack:
|
||||||
|
authProvisionId: apn_86hW0ZZ
|
||||||
|
- namespace: reply_on_original
|
||||||
|
runtime: nodejs20.x
|
||||||
|
uses: "./reply_on_original/entry.js"
|
||||||
|
props:
|
||||||
|
slack:
|
||||||
|
authProvisionId: apn_86hW0ZZ
|
||||||
|
|
||||||
Loading…
Add table
Reference in a new issue