import boxhero from "../../boxhero.app.mjs";
import constants from "../../common/constants.mjs";
import { DEFAULT_POLLING_SOURCE_TIMER_INTERVAL } from "@pipedream/platform";
import sampleEmit from "./test-event.mjs";
export default {
key: "boxhero-new-transaction",
name: "New Transaction",
description: "Emit new event when a transaction occurs. [See the documentation](https://docs-en.boxhero-app.com/integrations-and-api/boxhero-api-reference#v1-txs)",
version: "0.0.1",
type: "source",
dedupe: "unique",
props: {
boxhero,
db: "$.service.db",
timer: {
type: "$.interface.timer",
default: {
intervalSeconds: DEFAULT_POLLING_SOURCE_TIMER_INTERVAL,
},
},
transactionType: {
type: "string",
label: "Transaction Type",
description: "Filter events by transaction type",
options: constants.TRANSACTION_TYPE,
optional: true,
},
},
hooks: {
async deploy() {
await this.processEvent(25);
},
},
methods: {
_getLastCreatedTs() {
return this.db.get("lastCreatedTs") || 0;
},
_setLastCreatedTs(lastCreatedTs) {
this.db.set("lastCreatedTs", lastCreatedTs);
},
emitEvent(transaction) {
const meta = this.generateMeta(transaction);
this.$emit(transaction, meta);
},
generateMeta(transaction) {
return {
id: transaction.id,
summary: `New Transaction ${transaction.id}`,
ts: Date.parse(transaction.created_at),
};
},
async getTeamMode() {
const { mode } = await this.boxhero.getTeam();
return mode;
},
async processEvent(max) {
const lastCreatedTs = this._getLastCreatedTs();
let maxTs = lastCreatedTs;
const teamMode = await this.getTeamMode();
const resourceFn = teamMode === 0
? this.boxhero.listBasicTransactions
: this.boxhero.listLocationTransactions;
const results = this.boxhero.paginate({
resourceFn,
params: this.transactionType
? {
type: this.transactionType,
}
: {},
max,
});
const transactions = [];
for await (const transaction of results) {
const ts = Date.parse(transaction.created_at);
if (ts > lastCreatedTs) {
transactions.push(transaction);
if (ts > maxTs) {
maxTs = ts;
}
}
}
transactions.reverse().forEach((transaction) => this.emitEvent(transaction));
this._setLastCreatedTs(maxTs);
},
},
async run() {
await this.processEvent();
},
sampleEmit,
};