mirror of
https://github.com/n8n-io/n8n.git
synced 2024-11-09 22:24:05 -08:00
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:
parent
83762e051d
commit
689360ee06
|
@ -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/"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
|
@ -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;
|
||||
}
|
||||
}
|
|
@ -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",
|
||||
|
|
Loading…
Reference in a new issue