import common from "../common-webhook.mjs";
import { GOOGLE_DRIVE_NOTIFICATION_CHANGE } from "../../common/constants.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.2",
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);
}
}
},
},
};