diff --git a/packages/backend/package.json b/packages/backend/package.json index 9590711a..c0a79590 100644 --- a/packages/backend/package.json +++ b/packages/backend/package.json @@ -42,6 +42,7 @@ "dotenv": "^10.0.0", "express": "~4.16.1", "express-graphql": "^0.12.0", + "fast-xml-parser": "^4.0.11", "flickr-sdk": "3.10.0", "googleapis": "89.0.0", "graphql-middleware": "^6.1.15", @@ -134,4 +135,4 @@ "publishConfig": { "access": "public" } -} \ No newline at end of file +} diff --git a/packages/backend/src/apps/rss/assets/favicon.svg b/packages/backend/src/apps/rss/assets/favicon.svg new file mode 100644 index 00000000..ce961d24 --- /dev/null +++ b/packages/backend/src/apps/rss/assets/favicon.svg @@ -0,0 +1,6 @@ + \ No newline at end of file diff --git a/packages/backend/src/apps/rss/index.d.ts b/packages/backend/src/apps/rss/index.d.ts new file mode 100644 index 00000000..e69de29b diff --git a/packages/backend/src/apps/rss/index.ts b/packages/backend/src/apps/rss/index.ts new file mode 100644 index 00000000..6a145dd0 --- /dev/null +++ b/packages/backend/src/apps/rss/index.ts @@ -0,0 +1,13 @@ +import defineApp from '../../helpers/define-app'; + +export default defineApp({ + name: 'RSS', + key: 'rss', + iconUrl: '{BASE_URL}/apps/rss/assets/favicon.svg', + authDocUrl: 'https://automatisch.io/docs/connections/rss', + supportsConnections: false, + baseUrl: '', + apiBaseUrl: '', + primaryColor: 'ff8800', + beforeRequest: [], +}); diff --git a/packages/backend/src/apps/rss/triggers/new-items-in-feed/index.ts b/packages/backend/src/apps/rss/triggers/new-items-in-feed/index.ts new file mode 100644 index 00000000..71728f25 --- /dev/null +++ b/packages/backend/src/apps/rss/triggers/new-items-in-feed/index.ts @@ -0,0 +1,33 @@ +import defineTrigger from '../../../../helpers/define-trigger'; +import newItemsInFeed from './new-items-in-feed'; + +export default defineTrigger({ + name: 'New items in feed', + key: 'newItemsInFeed', + description: 'Triggers on new RSS feed items.', + pollInterval: 15, + substeps: [ + { + key: 'chooseTrigger', + name: 'Set up trigger', + arguments: [ + { + label: 'Feed URL', + key: 'feedUrl', + type: 'string', + required: true, + description: 'Paste your publicly accessible RSS URL here.', + variables: false, + }, + ], + }, + { + key: 'testStep', + name: 'Test trigger', + }, + ], + + async run($) { + await newItemsInFeed($); + }, +}); diff --git a/packages/backend/src/apps/rss/triggers/new-items-in-feed/new-items-in-feed.ts b/packages/backend/src/apps/rss/triggers/new-items-in-feed/new-items-in-feed.ts new file mode 100644 index 00000000..6111929d --- /dev/null +++ b/packages/backend/src/apps/rss/triggers/new-items-in-feed/new-items-in-feed.ts @@ -0,0 +1,24 @@ +import { IGlobalVariable } from '@automatisch/types'; +import { XMLParser } from 'fast-xml-parser';[] + +const newItemsInFeed = async ($: IGlobalVariable) => { + const { data } = await $.http.get($.step.parameters.feedUrl as string); + const parser = new XMLParser(); + const parsedData = parser.parse(data); + + for (const item of parsedData.rss.channel.item) { + if ($.flow.isAlreadyProcessed(item.guid)) + return; + + const dataItem = { + raw: item, + meta: { + internalId: item.guid + } + } + + $.pushTriggerItem(dataItem); + } +}; + +export default newItemsInFeed; diff --git a/packages/backend/src/graphql/schema.graphql b/packages/backend/src/graphql/schema.graphql index baf388c7..e8c208f6 100644 --- a/packages/backend/src/graphql/schema.graphql +++ b/packages/backend/src/graphql/schema.graphql @@ -155,13 +155,14 @@ enum AvailableAppsEnumType { github gitlab postgresql + rss + scheduler + slack smtp twilio twitch twitter typeform - slack - scheduler } type Connection { diff --git a/packages/docs/pages/connections/rss.md b/packages/docs/pages/connections/rss.md new file mode 100644 index 00000000..ce12caac --- /dev/null +++ b/packages/docs/pages/connections/rss.md @@ -0,0 +1,3 @@ +# RSS + +RSS is a built-in app shipped with Automatisch, and it doesn't need to talk with any other external service to run. So there are no additional steps to use the RSS app. diff --git a/packages/web/src/components/AddAppConnection/index.tsx b/packages/web/src/components/AddAppConnection/index.tsx index 4f4f9bf7..fb0428be 100644 --- a/packages/web/src/components/AddAppConnection/index.tsx +++ b/packages/web/src/components/AddAppConnection/index.tsx @@ -88,15 +88,17 @@ export default function AddAppConnection(props: AddAppConnectionProps): React.Re {hasConnection ? formatMessage('app.reconnectConnection') : formatMessage('app.addConnection')} - - {formatMessage( - 'addAppConnection.callToDocs', - { - appName: name, - docsLink: generateDocsLink(authDocUrl) - } - )} - + {authDocUrl && ( + + {formatMessage( + 'addAppConnection.callToDocs', + { + appName: name, + docsLink: generateDocsLink(authDocUrl) + } + )} + + )} {errorMessage && ( diff --git a/yarn.lock b/yarn.lock index 8f68f483..c3332848 100644 --- a/yarn.lock +++ b/yarn.lock @@ -9302,6 +9302,13 @@ fast-text-encoding@^1.0.0: resolved "https://registry.yarnpkg.com/fast-text-encoding/-/fast-text-encoding-1.0.3.tgz#ec02ac8e01ab8a319af182dae2681213cfe9ce53" integrity sha512-dtm4QZH9nZtcDt8qJiOH9fcQd1NAgi+K1O2DbE6GG1PPCK/BWfOH3idCTRQ4ImXRUOyopDEgDEnVEE7Y/2Wrig== +fast-xml-parser@^4.0.11: + version "4.0.11" + resolved "https://registry.yarnpkg.com/fast-xml-parser/-/fast-xml-parser-4.0.11.tgz#42332a9aca544520631c8919e6ea871c0185a985" + integrity sha512-4aUg3aNRR/WjQAcpceODG1C3x3lFANXRo8+1biqfieHmg9pyMt7qB4lQV/Ta6sJCTbA5vfD8fnA8S54JATiFUA== + dependencies: + strnum "^1.0.5" + fastest-levenshtein@^1.0.7: version "1.0.12" resolved "https://registry.yarnpkg.com/fastest-levenshtein/-/fastest-levenshtein-1.0.12.tgz#9990f7d3a88cc5a9ffd1f1745745251700d497e2" @@ -17155,6 +17162,11 @@ strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== +strnum@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/strnum/-/strnum-1.0.5.tgz#5c4e829fe15ad4ff0d20c3db5ac97b73c9b072db" + integrity sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA== + strong-log-transformer@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/strong-log-transformer/-/strong-log-transformer-2.1.0.tgz#0f5ed78d325e0421ac6f90f7f10e691d6ae3ae10"