import readwise from "../../readwise.app.mjs";
import { DEFAULT_POLLING_SOURCE_TIMER_INTERVAL } from "@pipedream/platform";
export default {
key: "readwise-new-highlights",
name: "New Highlights",
description: "Emit new Highlight",
version: "0.0.5",
type: "source",
dedupe: "unique",
props: {
readwise,
db: "$.service.db",
timer: {
label: "Polling interval",
description: "Pipedream will poll the Readwise API on this schedule",
type: "$.interface.timer",
default: {
intervalSeconds: DEFAULT_POLLING_SOURCE_TIMER_INTERVAL,
},
},
bookId: {
propDefinition: [
readwise,
"bookId",
],
optional: true,
},
},
hooks: {
async activate() {
await this.processHighlighs({
book_id: this.bookId,
page_size: 25,
});
},
},
methods: {
_getLastHighlightedAt() {
return this.db.get("lastHighlightedAt");
},
_setLastHighlightedAt(lastHighlightedAt) {
this.db.set("lastHighlightedAt", lastHighlightedAt);
},
async retrieveTicket(id) {
return this.readwise.retrieveTicket({
id,
});
},
async processHighlighs(params) {
const { results: events } = await this.readwise.listHighlights({
params,
});
for (const event of events) {
this.emitEvent(await this.readwise.getHighlight({
highlightId: event.id,
}));
}
},
async processEvent() {
const lastHighlightedAt = this._getLastHighlightedAt();
await this.processHighlighs({
book_id: this.bookId,
highlighted_at__gt: lastHighlightedAt,
});
},
emitEvent(event, lastHighlightedAt = null) {
lastHighlightedAt = lastHighlightedAt || this._getLastHighlightedAt();
if (!lastHighlightedAt || (new Date(event.highlighted_at) > new Date(lastHighlightedAt)))
this._setLastHighlightedAt(event.highlighted_at);
const ts = Date.parse(event.highlighted_at);
this.$emit(event, {
id: `${event.id}_${ts}`,
ts,
summary: `New highlight: ${event.id}`,
});
},
},
async run() {
console.log("Raw received event:");
return this.processEvent();
},
};