From 5657f0d793924a832ca712982d5b5b0ec3a0b4e8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C4=B1dvan=20Akca?= Date: Tue, 16 Jan 2024 13:40:00 +0300 Subject: [PATCH] feat(disqus): add new comments trigger --- .../src/apps/disqus/dynamic-data/index.js | 3 + .../disqus/dynamic-data/list-forums/index.js | 36 ++++++++ packages/backend/src/apps/disqus/index.js | 4 + .../backend/src/apps/disqus/triggers/index.js | 3 + .../disqus/triggers/new-comments/index.js | 92 +++++++++++++++++++ packages/docs/pages/.vitepress/config.js | 5 +- packages/docs/pages/apps/disqus/triggers.md | 12 +++ packages/docs/pages/guide/available-apps.md | 1 + 8 files changed, 155 insertions(+), 1 deletion(-) create mode 100644 packages/backend/src/apps/disqus/dynamic-data/index.js create mode 100644 packages/backend/src/apps/disqus/dynamic-data/list-forums/index.js create mode 100644 packages/backend/src/apps/disqus/triggers/index.js create mode 100644 packages/backend/src/apps/disqus/triggers/new-comments/index.js create mode 100644 packages/docs/pages/apps/disqus/triggers.md diff --git a/packages/backend/src/apps/disqus/dynamic-data/index.js b/packages/backend/src/apps/disqus/dynamic-data/index.js new file mode 100644 index 00000000..3198aeed --- /dev/null +++ b/packages/backend/src/apps/disqus/dynamic-data/index.js @@ -0,0 +1,3 @@ +import listForums from './list-forums/index.js'; + +export default [listForums]; diff --git a/packages/backend/src/apps/disqus/dynamic-data/list-forums/index.js b/packages/backend/src/apps/disqus/dynamic-data/list-forums/index.js new file mode 100644 index 00000000..bb4298e6 --- /dev/null +++ b/packages/backend/src/apps/disqus/dynamic-data/list-forums/index.js @@ -0,0 +1,36 @@ +export default { + name: 'List forums', + key: 'listForums', + + async run($) { + const forums = { + data: [], + }; + + const params = { + limit: 100, + order: 'desc', + cursor: undefined, + }; + + let more; + do { + const { data } = await $.http.get('/3.0/users/listForums.json', { + params, + }); + params.cursor = data.cursor.next; + more = data.cursor.hasNext; + + if (data.response?.length) { + for (const forum of data.response) { + forums.data.push({ + value: forum.id, + name: forum.id, + }); + } + } + } while (more); + + return forums; + }, +}; diff --git a/packages/backend/src/apps/disqus/index.js b/packages/backend/src/apps/disqus/index.js index 8f3e31cc..43f59cdf 100644 --- a/packages/backend/src/apps/disqus/index.js +++ b/packages/backend/src/apps/disqus/index.js @@ -1,6 +1,8 @@ import defineApp from '../../helpers/define-app.js'; import addAuthHeader from './common/add-auth-header.js'; import auth from './auth/index.js'; +import dynamicData from './dynamic-data/index.js'; +import triggers from './triggers/index.js'; export default defineApp({ name: 'Disqus', @@ -13,4 +15,6 @@ export default defineApp({ supportsConnections: true, beforeRequest: [addAuthHeader], auth, + dynamicData, + triggers, }); diff --git a/packages/backend/src/apps/disqus/triggers/index.js b/packages/backend/src/apps/disqus/triggers/index.js new file mode 100644 index 00000000..533847a1 --- /dev/null +++ b/packages/backend/src/apps/disqus/triggers/index.js @@ -0,0 +1,3 @@ +import newComments from './new-comments/index.js'; + +export default [newComments]; diff --git a/packages/backend/src/apps/disqus/triggers/new-comments/index.js b/packages/backend/src/apps/disqus/triggers/new-comments/index.js new file mode 100644 index 00000000..119c8cf9 --- /dev/null +++ b/packages/backend/src/apps/disqus/triggers/new-comments/index.js @@ -0,0 +1,92 @@ +import defineTrigger from '../../../../helpers/define-trigger.js'; +import { URLSearchParams } from 'url'; + +export default defineTrigger({ + name: 'New comments', + key: 'newComments', + pollInterval: 15, + description: 'Triggers when a new comment is posted in a forum using Disqus.', + arguments: [ + { + label: 'Post Types', + key: 'postTypes', + type: 'dynamic', + required: false, + description: + 'Which posts should be considered for inclusion in the trigger?', + fields: [ + { + label: 'Type', + key: 'type', + type: 'dropdown', + required: false, + description: '', + variables: true, + options: [ + { label: 'Unapproved Posts', value: 'unapproved' }, + { label: 'Approved Posts', value: 'approved' }, + { label: 'Spam Posts', value: 'spam' }, + { label: 'Deleted Posts', value: 'deleted' }, + { label: 'Flagged Posts', value: 'flagged' }, + { label: 'Highlighted Posts', value: 'highlighted' }, + ], + }, + ], + }, + { + label: 'Forum', + key: 'forumId', + type: 'dropdown', + required: true, + description: 'Select the forum where you want comments to be triggered.', + variables: true, + source: { + type: 'query', + name: 'getDynamicData', + arguments: [ + { + name: 'key', + value: 'listForums', + }, + ], + }, + }, + ], + + async run($) { + const forumId = $.step.parameters.forumId; + const postTypes = $.step.parameters.postTypes; + const formattedCommentTypes = postTypes + .filter((type) => type.type !== '') + .map((type) => type.type); + + const params = new URLSearchParams({ + limit: '100', + forum: forumId, + }); + + if (formattedCommentTypes.length) { + formattedCommentTypes.forEach((type) => params.append('include', type)); + } + + let more; + do { + const { data } = await $.http.get( + `/3.0/posts/list.json?${params.toString()}` + ); + params.set('cursor', data.cursor.next); + more = data.cursor.hasNext; + + if (data.response?.length) { + for (const comment of data.response) { + $.pushTriggerItem({ + raw: comment, + meta: { + internalId: comment.id, + }, + }); + } + } + } while (more); + }, +}); diff --git a/packages/docs/pages/.vitepress/config.js b/packages/docs/pages/.vitepress/config.js index 2e79323b..981e6828 100644 --- a/packages/docs/pages/.vitepress/config.js +++ b/packages/docs/pages/.vitepress/config.js @@ -72,7 +72,10 @@ export default defineConfig({ text: 'Disqus', collapsible: true, collapsed: true, - items: [{ text: 'Connection', link: '/apps/disqus/connection' }], + items: [ + { text: 'Triggers', link: '/apps/disqus/triggers' }, + { text: 'Connection', link: '/apps/disqus/connection' }, + ], }, { text: 'Dropbox', diff --git a/packages/docs/pages/apps/disqus/triggers.md b/packages/docs/pages/apps/disqus/triggers.md new file mode 100644 index 00000000..6a2723b9 --- /dev/null +++ b/packages/docs/pages/apps/disqus/triggers.md @@ -0,0 +1,12 @@ +--- +favicon: /favicons/disqus.svg +items: + - name: New comments + desc: Triggers when a new comment is posted in a forum using Disqus. +--- + + + + diff --git a/packages/docs/pages/guide/available-apps.md b/packages/docs/pages/guide/available-apps.md index 90f8ba0a..b528745a 100644 --- a/packages/docs/pages/guide/available-apps.md +++ b/packages/docs/pages/guide/available-apps.md @@ -6,6 +6,7 @@ The following integrations are currently supported by Automatisch. - [DeepL](/apps/deepl/actions) - [Delay](/apps/delay/actions) - [Discord](/apps/discord/actions) +- [Disqus](/apps/disqus/triggers) - [Dropbox](/apps/dropbox/actions) - [Filter](/apps/filter/actions) - [Flickr](/apps/flickr/triggers)