UNPKG

@pipedream/coda

Version:

Pipedream Coda Components

128 lines (122 loc) 2.93 kB
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()); }, };