sources/new-or-modified-comments/new-or-modified-comments.mjs
import { GOOGLE_DRIVE_NOTIFICATION_CHANGE } from "../../common/constants.mjs"; import common from "../common-webhook.mjs"; export default { ...common, key: "google_drive-new-or-modified-comments", name: "New or Modified Comments (Instant)", description: "Emit new event when a comment is created or modified in the selected file", version: "1.0.10", type: "source", dedupe: "unique", props: { ...common.props, fileId: { propDefinition: [ common.props.googleDrive, "fileId", (c) => ({ drive: c.drive, }), ], description: "The file to watch for comments", }, }, hooks: { async deploy() { await this.processChanges([ { id: this.fileId, }, ]); }, async activate() { await common.hooks.activate.bind(this)(); this._setInitTime(Date.now()); }, async deactivate() { await common.hooks.deactivate.bind(this)(); this._setInitTime(null); }, }, methods: { ...common.methods, _getInitTime() { return this.db.get("initTime"); }, _setInitTime(initTime) { this.db.set("initTime", initTime); }, _getLastCommentTimeForFile(fileId) { return this.db.get(fileId) || this._getInitTime(); }, _updateLastCommentTimeForFile(fileId, commentTime) { this.db.set(fileId, commentTime); }, getUpdateTypes() { return [ GOOGLE_DRIVE_NOTIFICATION_CHANGE, ]; }, generateMeta(data, headers) { const { id: commentId, content: summary, modifiedTime: tsString, } = data; const ts = Date.parse(tsString); const eventId = headers && headers["x-goog-message-number"]; return { id: `${commentId}-${eventId || ts}`, summary, ts, }; }, getChanges(headers) { if (!headers) { return { change: { }, }; } return { change: { state: headers["x-goog-resource-state"], resourceURI: headers["x-goog-resource-uri"], changed: headers["x-goog-changed"], }, }; }, async processChanges(changedFiles, headers) { const changes = this.getChanges(headers); if (changedFiles?.length) { changedFiles = changedFiles.filter(({ id }) => id === this.fileId); } for (const file of changedFiles) { const lastCommentTimeForFile = this._getLastCommentTimeForFile(file.id); let maxModifiedTime = lastCommentTimeForFile; const commentsStream = this.googleDrive.listComments( file.id, lastCommentTimeForFile, ); for await (const comment of commentsStream) { const commentTime = Date.parse(comment.modifiedTime); if (commentTime <= lastCommentTimeForFile) { continue; } const eventToEmit = { comment, ...changes, }; const meta = this.generateMeta(comment, headers); this.$emit(eventToEmit, meta); maxModifiedTime = Math.max(maxModifiedTime, commentTime); this._updateLastCommentTimeForFile(file.id, maxModifiedTime); } } }, }, };