feat(RSS Feed Trigger Node): Add RSS feed trigger node (#7386)

Github issue / Community forum post (link here to close automatically):
https://community.n8n.io/t/rss-trigger/14203
This commit is contained in:
Jon 2023-10-19 08:49:18 +01:00 committed by GitHub
parent 83762e051d
commit 689360ee06
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 103 additions and 0 deletions

View file

@ -0,0 +1,13 @@
{
"node": "n8n-nodes-base.rssFeedReadTrigger",
"nodeVersion": "1.0",
"codexVersion": "1.0",
"categories": ["Core Nodes"],
"resources": {
"primaryDocumentation": [
{
"url": "https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.rssfeedreadtrigger/"
}
]
}
}

View file

@ -0,0 +1,89 @@
import type {
IDataObject,
INodeExecutionData,
INodeType,
INodeTypeDescription,
IPollFunctions,
} from 'n8n-workflow';
import { NodeOperationError } from 'n8n-workflow';
import Parser from 'rss-parser';
import moment from 'moment';
export class RssFeedReadTrigger implements INodeType {
description: INodeTypeDescription = {
displayName: 'RSS Feed Trigger',
name: 'rssFeedReadTrigger',
icon: 'fa:rss',
group: ['trigger'],
version: 1,
description: 'Starts a workflow when an RSS feed is updated',
subtitle: '={{$parameter["event"]}}',
defaults: {
name: 'RSS Feed Trigger',
color: '#b02020',
},
polling: true,
inputs: [],
outputs: ['main'],
properties: [
{
displayName: 'Feed URL',
name: 'feedUrl',
type: 'string',
default: 'https://blog.n8n.io/rss/',
required: true,
description: 'URL of the RSS feed to poll',
},
],
};
async poll(this: IPollFunctions): Promise<INodeExecutionData[][] | null> {
const pollData = this.getWorkflowStaticData('node');
const feedUrl = this.getNodeParameter('feedUrl') as string;
const now = moment().utc().format();
const startDate = (pollData.lastTimeChecked as string) || now;
const endDate = now;
if (!feedUrl) {
throw new NodeOperationError(this.getNode(), 'The parameter "URL" has to be set!');
}
const parser = new Parser();
let feed: Parser.Output<IDataObject>;
try {
feed = await parser.parseURL(feedUrl);
} catch (error) {
if (error.code === 'ECONNREFUSED') {
throw new NodeOperationError(
this.getNode(),
`It was not possible to connect to the URL. Please make sure the URL "${feedUrl}" it is valid!`,
);
}
throw new NodeOperationError(this.getNode(), error as Error);
}
const returnData: IDataObject[] = [];
if (feed.items) {
if (this.getMode() === 'manual') {
return [this.helpers.returnJsonArray(feed.items[0])];
}
feed.items.forEach((item) => {
if (Date.parse(item.isoDate as string) >= Date.parse(startDate)) {
returnData.push(item);
}
});
}
pollData.lastTimeChecked = endDate;
if (Array.isArray(returnData) && returnData.length !== 0) {
return [this.helpers.returnJsonArray(returnData)];
}
return null;
}
}

View file

@ -684,6 +684,7 @@
"dist/nodes/RespondToWebhook/RespondToWebhook.node.js",
"dist/nodes/Rocketchat/Rocketchat.node.js",
"dist/nodes/RssFeedRead/RssFeedRead.node.js",
"dist/nodes/RssFeedRead/RssFeedReadTrigger.node.js",
"dist/nodes/Rundeck/Rundeck.node.js",
"dist/nodes/S3/S3.node.js",
"dist/nodes/Salesforce/Salesforce.node.js",