import common from "../common-webhook.mjs";
import {
GOOGLE_DRIVE_NOTIFICATION_ADD,
GOOGLE_DRIVE_NOTIFICATION_CHANGE,
GOOGLE_DRIVE_NOTIFICATION_UPDATE,
} from "../../constants.mjs";
export default {
...common,
key: "google_drive-new-or-modified-folders",
name: "New or Modified Folders",
description: "Emit new event any time any folder in your linked Google Drive is added, modified, or deleted",
version: "0.1.0",
type: "source",
dedupe: "unique",
methods: {
...common.methods,
_getLastModifiedTimeForFile(fileId) {
return this.db.get(fileId);
},
_setModifiedTimeForFile(fileId, modifiedTime) {
this.db.set(fileId, modifiedTime);
},
getUpdateTypes() {
return [
GOOGLE_DRIVE_NOTIFICATION_ADD,
GOOGLE_DRIVE_NOTIFICATION_CHANGE,
GOOGLE_DRIVE_NOTIFICATION_UPDATE,
];
},
generateMeta(data, ts) {
const {
id: fileId,
name: summary,
} = data;
return {
id: `${fileId}-${ts}`,
summary,
ts,
};
},
async processChanges(changedFiles, headers) {
const files = changedFiles.filter(
(file) => file.mimeType === "application/vnd.google-apps.folder",
);
for (const file of files) {
const fileInfo = await this.googleDrive.getFile(file.id);
const lastModifiedTimeForFile = this._getLastModifiedTimeForFile(file.id);
const modifiedTime = Date.parse(fileInfo.modifiedTime);
if (lastModifiedTimeForFile == modifiedTime) continue;
const metadata = await this.googleDrive.getFileMetadata(`${headers["x-goog-resource-uri"]}&fields=*`);
const eventToEmit = {
file,
...metadata,
change: {
state: headers["x-goog-resource-state"],
resourceURI: headers["x-goog-resource-uri"],
changed: headers["x-goog-changed"],
},
};
const meta = this.generateMeta(file, modifiedTime);
this.$emit(eventToEmit, meta);
this._setModifiedTimeForFile(file.id, modifiedTime);
}
},
},
};