import { DEFAULT_POLLING_SOURCE_TIMER_INTERVAL } from "@pipedream/platform";
import coda from "../../coda.app.mjs";
export default {
key: "coda-row-created",
name: "New Row Created",
description: "Emit new event for every created / updated row in a table. [See the documentation.](https://coda.io/developers/apis/v1#tag/Rows/operation/listRows)",
type: "source",
version: "0.0.4",
dedupe: "unique",
props: {
coda,
db: "$.service.db",
timer: {
type: "$.interface.timer",
default: {
intervalSeconds: DEFAULT_POLLING_SOURCE_TIMER_INTERVAL,
},
},
docId: {
propDefinition: [
coda,
"docId",
],
},
tableId: {
propDefinition: [
coda,
"tableId",
(c) => ({
docId: c.docId,
}),
],
},
includeUpdates: {
type: "boolean",
label: "Include Updated Rows",
description: "Emit events for updates on existing rows?",
optional: true,
},
},
hooks: {
async deploy() {
const rows = await this.fetchRows(25);
this.emitEvents(rows.reverse());
},
},
methods: {
_getLastTs() {
return this.db.get("lastTs") || 0;
},
_setLastTs(lastTs) {
this.db.set("lastTs", lastTs);
},
getTsKey() {
return this.includeUpdates
? "updatedAt"
: "createdAt";
},
async fetchRows(maxResults) {
const rows = [];
const tsKey = this.getTsKey();
const lastTs = this._getLastTs();
let maxTs = lastTs;
let done = false;
const params = {
sortBy: tsKey,
};
while (true) {
const {
items = [],
nextPageToken,
} = await this.coda.findRow(
null,
this.docId,
this.tableId,
params,
);
for (const item of items) {
const ts = Date.parse(item[tsKey]);
if (ts > lastTs) {
rows.push(item);
if (ts > maxTs) {
maxTs = ts;
}
if (rows.length >= maxResults) {
done = true;
break;
}
}
else {
done = true;
}
}
params.pageToken = nextPageToken;
if (!nextPageToken || done) {
this._setLastTs(maxTs);
return rows;
}
}
},
rowSummary(row) {
const name = row.name && ` - ${row.name}` || "";
return `Row index: ${row.index}` + name;
},
emitEvents(events) {
for (const row of events) {
const id = this.includeUpdates
? `${row.id}-${row.updatedAt}`
: row.id;
this.$emit(row, {
id,
summary: this.rowSummary(row),
ts: row.updatedAt,
});
}
},
},
async run() {
const rows = await this.fetchRows();
this.emitEvents(rows.reverse());
},
};