From 6c0de7d3b1fe22aebba76fd234f768a18d7d0c3f Mon Sep 17 00:00:00 2001 From: Michelle Bergeron Date: Mon, 30 Jun 2025 11:14:21 -0400 Subject: [PATCH 1/7] new sources --- components/google_chat/package.json | 4 +- .../google_chat/sources/common/base.mjs | 104 ++++++++++++++++++ .../new-command-used/new-command-used.mjs | 31 ++++++ .../new-mention-received.mjs | 32 ++++++ .../new-message-in-space.mjs | 17 +++ 5 files changed, 186 insertions(+), 2 deletions(-) create mode 100644 components/google_chat/sources/common/base.mjs create mode 100644 components/google_chat/sources/new-command-used/new-command-used.mjs create mode 100644 components/google_chat/sources/new-mention-received/new-mention-received.mjs create mode 100644 components/google_chat/sources/new-message-in-space/new-message-in-space.mjs diff --git a/components/google_chat/package.json b/components/google_chat/package.json index 41abbd08f7579..6fd6411578f8b 100644 --- a/components/google_chat/package.json +++ b/components/google_chat/package.json @@ -1,6 +1,6 @@ { "name": "@pipedream/google_chat", - "version": "0.0.2", + "version": "0.1.0", "description": "Pipedream Google Chat Components", "main": "google_chat.app.mjs", "keywords": [ @@ -13,6 +13,6 @@ "access": "public" }, "dependencies": { - "@pipedream/platform": "^1.5.1" + "@pipedream/platform": "^3.1.0" } } diff --git a/components/google_chat/sources/common/base.mjs b/components/google_chat/sources/common/base.mjs new file mode 100644 index 0000000000000..a6a60ef250f5a --- /dev/null +++ b/components/google_chat/sources/common/base.mjs @@ -0,0 +1,104 @@ +import googleChat from "../../google_chat.app.mjs"; +import { + DEFAULT_POLLING_SOURCE_TIMER_INTERVAL, ConfigurationError, +} from "@pipedream/platform"; + +export default { + props: { + googleChat, + db: "$.service.db", + timer: { + type: "$.interface.timer", + default: { + intervalSeconds: DEFAULT_POLLING_SOURCE_TIMER_INTERVAL, + }, + }, + spaceId: { + propDefinition: [ + googleChat, + "spaceId", + ], + }, + }, + methods: { + _getLastTs() { + return this.db.get("lastTs"); + }, + _setLastTs(ts) { + this.db.set("lastTs", ts); + }, + async *paginateMessages(max) { + const lastTs = this._getLastTs(); + let next, count = 0; + const params = { + filter: lastTs + ? `createTime > "${lastTs}"` + : undefined, + orderBy: "createTime DESC", + }; + + do { + const { + messages, nextPageToken, + } = await this.googleChat.listMessages({ + spaceId: this.spaceId, + params, + }); + + if (!messages.length) { + return; + } + + for (const message of messages) { + yield message; + if (max && count >= max) { + return; + } + } + + next = nextPageToken; + params.pageToken = next; + } while (next); + }, + async getPaginatedMessages(max) { + const messages = []; + for await (const message of this.paginateMessages(max)) { + messages.push(message); + } + return messages; + }, + isRelevant() { + return true; + }, + generateMeta(message) { + return { + id: message.name, + summary: this.getSummary(message), + ts: Date.parse(message.createTime), + }; + }, + async processEvent(max) { + const messages = await this.getPaginatedMessages(max); + + const relevantMessages = messages.filter((message) => this.isRelevant(message)); + + this._setLastTs(relevantMessages[0].createTime); + + relevantMessages.reverse().forEach((message) => { + const meta = this.generateMeta(message); + this.$emit(message, meta); + }); + }, + getSummary() { + throw new ConfigurationError("getSummary is not implemented"); + }, + }, + hooks: { + async deploy() { + await this.processEvent(25); + }, + }, + async run() { + await this.processEvent(); + }, +}; diff --git a/components/google_chat/sources/new-command-used/new-command-used.mjs b/components/google_chat/sources/new-command-used/new-command-used.mjs new file mode 100644 index 0000000000000..0a724ab3939c9 --- /dev/null +++ b/components/google_chat/sources/new-command-used/new-command-used.mjs @@ -0,0 +1,31 @@ +import common from "../common/base.mjs"; + +export default { + ...common, + key: "google_chat-new-command-used", + name: "New Command Used", + description: "Emit new event when a new command is used in a space. [See the documentation](https://developers.google.com/workspace/chat/api/reference/rest/v1/spaces.messages/list)", + version: "0.0.1", + type: "source", + dedupe: "unique", + props: { + ...common.props, + command: { + type: "string", + label: "Command", + description: "The command to emit events for.", + }, + }, + methods: { + ...common.methods, + isRelevant(message) { + const command = this.command.startsWith("/") + ? this.command + : `/${this.command}`; + return message.text.startsWith(command); + }, + getSummary(message) { + return `New Command Used in Message: ${message.text.slice(0, 50)}`; + }, + }, +}; diff --git a/components/google_chat/sources/new-mention-received/new-mention-received.mjs b/components/google_chat/sources/new-mention-received/new-mention-received.mjs new file mode 100644 index 0000000000000..a6a85d666938a --- /dev/null +++ b/components/google_chat/sources/new-mention-received/new-mention-received.mjs @@ -0,0 +1,32 @@ +import common from "../common/base.mjs"; + +export default { + ...common, + key: "google_chat-new-mention-received", + name: "New Mention Received", + description: "Emit new event when a new mention is received in a space. [See the documentation](https://developers.google.com/workspace/chat/api/reference/rest/v1/spaces.messages/list)", + version: "0.0.1", + type: "source", + dedupe: "unique", + props: { + ...common.props, + memberId: { + propDefinition: [ + common.props.googleChat, + "memberId", + (c) => ({ + spaceId: c.spaceId, + }), + ], + }, + }, + methods: { + ...common.methods, + isRelevant(message) { + return message.formattedText.includes(``); + }, + getSummary(message) { + return `New Mention in Message: ${message.formattedText.slice(0, 50)}`; + }, + }, +}; diff --git a/components/google_chat/sources/new-message-in-space/new-message-in-space.mjs b/components/google_chat/sources/new-message-in-space/new-message-in-space.mjs new file mode 100644 index 0000000000000..0683d2a3c9e12 --- /dev/null +++ b/components/google_chat/sources/new-message-in-space/new-message-in-space.mjs @@ -0,0 +1,17 @@ +import common from "../common/base.mjs"; + +export default { + ...common, + key: "google_chat-new-message-in-space", + name: "New Message in Space", + description: "Emit new event when a new message is posted in a space. [See the documentation](https://developers.google.com/workspace/chat/api/reference/rest/v1/spaces.messages/list)", + version: "0.0.1", + type: "source", + dedupe: "unique", + methods: { + ...common.methods, + getSummary(message) { + return `New Message: ${message.text.slice(0, 50)}`; + }, + }, +}; From 7c57c348dea44fce08ba0d734c8a5ccd06606944 Mon Sep 17 00:00:00 2001 From: Michelle Bergeron Date: Mon, 30 Jun 2025 11:15:52 -0400 Subject: [PATCH 2/7] pnpm-lock.yaml --- pnpm-lock.yaml | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index fc97dde92332f..1d9c464501a9d 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1575,8 +1575,7 @@ importers: specifier: ^3.0.3 version: 3.0.3 - components/bitget: - specifiers: {} + components/bitget: {} components/bitly: dependencies: @@ -5495,8 +5494,8 @@ importers: components/google_chat: dependencies: '@pipedream/platform': - specifier: ^1.5.1 - version: 1.6.6 + specifier: ^3.1.0 + version: 3.1.0 components/google_chat_developer_app: {} @@ -6905,8 +6904,7 @@ importers: specifier: ^1.5.1 version: 1.6.6 - components/joggai: - specifiers: {} + components/joggai: {} components/join: {} From bf1292f873d6c7712b71e7dda321728c334800f4 Mon Sep 17 00:00:00 2001 From: Michelle Bergeron Date: Mon, 30 Jun 2025 11:17:26 -0400 Subject: [PATCH 3/7] pnpm-lock.yaml --- pnpm-lock.yaml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 1d9c464501a9d..ba2972e837d4f 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -15929,7 +15929,7 @@ importers: version: 3.1.7 ts-jest: specifier: ^29.2.5 - version: 29.2.5(@babel/core@7.26.0)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.0))(jest@29.7.0(@types/node@20.17.30)(babel-plugin-macros@3.1.0))(typescript@5.7.2) + version: 29.2.5(@babel/core@8.0.0-alpha.13)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@8.0.0-alpha.13))(jest@29.7.0(@types/node@20.17.30)(babel-plugin-macros@3.1.0))(typescript@5.7.2) tsup: specifier: ^8.3.6 version: 8.3.6(@microsoft/api-extractor@7.47.12(@types/node@20.17.30))(jiti@1.21.6)(postcss@8.4.49)(tsx@4.19.4)(typescript@5.7.2)(yaml@2.6.1) @@ -15972,7 +15972,7 @@ importers: version: 3.1.0 jest: specifier: ^29.1.2 - version: 29.7.0(@types/node@20.17.6)(babel-plugin-macros@3.1.0) + version: 29.7.0(@types/node@20.17.30)(babel-plugin-macros@3.1.0) type-fest: specifier: ^4.15.0 version: 4.27.0 @@ -49891,7 +49891,7 @@ snapshots: ts-interface-checker@0.1.13: {} - ts-jest@29.2.5(@babel/core@7.26.0)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.0))(jest@29.7.0(@types/node@20.17.30)(babel-plugin-macros@3.1.0))(typescript@5.7.2): + ts-jest@29.2.5(@babel/core@8.0.0-alpha.13)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@8.0.0-alpha.13))(jest@29.7.0(@types/node@20.17.30)(babel-plugin-macros@3.1.0))(typescript@5.7.2): dependencies: bs-logger: 0.2.6 ejs: 3.1.10 @@ -49905,10 +49905,10 @@ snapshots: typescript: 5.7.2 yargs-parser: 21.1.1 optionalDependencies: - '@babel/core': 7.26.0 + '@babel/core': 8.0.0-alpha.13 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - babel-jest: 29.7.0(@babel/core@7.26.0) + babel-jest: 29.7.0(@babel/core@8.0.0-alpha.13) ts-jest@29.2.5(@babel/core@8.0.0-alpha.13)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@8.0.0-alpha.13))(jest@29.7.0(@types/node@20.17.6)(babel-plugin-macros@3.1.0))(typescript@5.6.3): dependencies: From 6637782831ea345d2bf26c8de2be3414a8148165 Mon Sep 17 00:00:00 2001 From: Michelle Bergeron Date: Mon, 30 Jun 2025 11:18:21 -0400 Subject: [PATCH 4/7] pnpm-lock.yaml --- pnpm-lock.yaml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ba2972e837d4f..1d9c464501a9d 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -15929,7 +15929,7 @@ importers: version: 3.1.7 ts-jest: specifier: ^29.2.5 - version: 29.2.5(@babel/core@8.0.0-alpha.13)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@8.0.0-alpha.13))(jest@29.7.0(@types/node@20.17.30)(babel-plugin-macros@3.1.0))(typescript@5.7.2) + version: 29.2.5(@babel/core@7.26.0)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.0))(jest@29.7.0(@types/node@20.17.30)(babel-plugin-macros@3.1.0))(typescript@5.7.2) tsup: specifier: ^8.3.6 version: 8.3.6(@microsoft/api-extractor@7.47.12(@types/node@20.17.30))(jiti@1.21.6)(postcss@8.4.49)(tsx@4.19.4)(typescript@5.7.2)(yaml@2.6.1) @@ -15972,7 +15972,7 @@ importers: version: 3.1.0 jest: specifier: ^29.1.2 - version: 29.7.0(@types/node@20.17.30)(babel-plugin-macros@3.1.0) + version: 29.7.0(@types/node@20.17.6)(babel-plugin-macros@3.1.0) type-fest: specifier: ^4.15.0 version: 4.27.0 @@ -49891,7 +49891,7 @@ snapshots: ts-interface-checker@0.1.13: {} - ts-jest@29.2.5(@babel/core@8.0.0-alpha.13)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@8.0.0-alpha.13))(jest@29.7.0(@types/node@20.17.30)(babel-plugin-macros@3.1.0))(typescript@5.7.2): + ts-jest@29.2.5(@babel/core@7.26.0)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.0))(jest@29.7.0(@types/node@20.17.30)(babel-plugin-macros@3.1.0))(typescript@5.7.2): dependencies: bs-logger: 0.2.6 ejs: 3.1.10 @@ -49905,10 +49905,10 @@ snapshots: typescript: 5.7.2 yargs-parser: 21.1.1 optionalDependencies: - '@babel/core': 8.0.0-alpha.13 + '@babel/core': 7.26.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - babel-jest: 29.7.0(@babel/core@8.0.0-alpha.13) + babel-jest: 29.7.0(@babel/core@7.26.0) ts-jest@29.2.5(@babel/core@8.0.0-alpha.13)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@8.0.0-alpha.13))(jest@29.7.0(@types/node@20.17.6)(babel-plugin-macros@3.1.0))(typescript@5.6.3): dependencies: From 23caa141fe907e947d81784c78dd80a73f8a74ec Mon Sep 17 00:00:00 2001 From: Michelle Bergeron Date: Mon, 30 Jun 2025 11:29:34 -0400 Subject: [PATCH 5/7] fix pagination --- components/google_chat/sources/common/base.mjs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/google_chat/sources/common/base.mjs b/components/google_chat/sources/common/base.mjs index a6a60ef250f5a..5cc767e090e14 100644 --- a/components/google_chat/sources/common/base.mjs +++ b/components/google_chat/sources/common/base.mjs @@ -51,7 +51,7 @@ export default { for (const message of messages) { yield message; - if (max && count >= max) { + if (max && ++count >= max) { return; } } From d57c53175c689dd60e0d2a3565fd12f0f5a7ec9e Mon Sep 17 00:00:00 2001 From: Michelle Bergeron Date: Wed, 2 Jul 2025 11:06:37 -0400 Subject: [PATCH 6/7] update --- components/google_chat/sources/common/base.mjs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/components/google_chat/sources/common/base.mjs b/components/google_chat/sources/common/base.mjs index 5cc767e090e14..c2fd3c4712de3 100644 --- a/components/google_chat/sources/common/base.mjs +++ b/components/google_chat/sources/common/base.mjs @@ -82,6 +82,10 @@ export default { const relevantMessages = messages.filter((message) => this.isRelevant(message)); + if (!relevantMessages.length) { + return; + } + this._setLastTs(relevantMessages[0].createTime); relevantMessages.reverse().forEach((message) => { From 659857a293a656f2b995c24524b12ba6fa1a6768 Mon Sep 17 00:00:00 2001 From: Michelle Bergeron Date: Wed, 2 Jul 2025 11:08:15 -0400 Subject: [PATCH 7/7] update --- components/google_chat/sources/common/base.mjs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/google_chat/sources/common/base.mjs b/components/google_chat/sources/common/base.mjs index c2fd3c4712de3..ef825d372aed9 100644 --- a/components/google_chat/sources/common/base.mjs +++ b/components/google_chat/sources/common/base.mjs @@ -82,7 +82,7 @@ export default { const relevantMessages = messages.filter((message) => this.isRelevant(message)); - if (!relevantMessages.length) { + if (!relevantMessages?.length) { return; }