mirror of
https://github.com/Abdulazizzn/n8n-enterprise-unlocked.git
synced 2025-12-18 02:21:13 +00:00
feat(Splunk Node): Overhaul (#9813)
This commit is contained in:
@@ -0,0 +1 @@
|
||||
export * from './rlc.description';
|
||||
@@ -0,0 +1,79 @@
|
||||
import type { INodeProperties } from 'n8n-workflow';
|
||||
|
||||
export const reportRLC: INodeProperties = {
|
||||
displayName: 'Report',
|
||||
name: 'reportId',
|
||||
type: 'resourceLocator',
|
||||
default: { mode: 'list', value: '' },
|
||||
required: true,
|
||||
modes: [
|
||||
{
|
||||
displayName: 'From List',
|
||||
name: 'list',
|
||||
type: 'list',
|
||||
placeholder: 'Select a report...',
|
||||
typeOptions: {
|
||||
searchListMethod: 'searchReports',
|
||||
searchable: true,
|
||||
},
|
||||
},
|
||||
{
|
||||
displayName: 'ID',
|
||||
name: 'id',
|
||||
type: 'string',
|
||||
placeholder: 'e.g. Errors%20in%20the%20last%20hour',
|
||||
},
|
||||
],
|
||||
};
|
||||
|
||||
export const searchJobRLC: INodeProperties = {
|
||||
displayName: 'Search Job',
|
||||
name: 'searchJobId',
|
||||
type: 'resourceLocator',
|
||||
default: { mode: 'list', value: '' },
|
||||
required: true,
|
||||
modes: [
|
||||
{
|
||||
displayName: 'From List',
|
||||
name: 'list',
|
||||
type: 'list',
|
||||
placeholder: 'Select a search job...',
|
||||
typeOptions: {
|
||||
searchListMethod: 'searchJobs',
|
||||
searchable: true,
|
||||
},
|
||||
},
|
||||
{
|
||||
displayName: 'ID',
|
||||
name: 'id',
|
||||
type: 'string',
|
||||
placeholder: 'e.g. 1718944376.178',
|
||||
},
|
||||
],
|
||||
};
|
||||
|
||||
export const userRLC: INodeProperties = {
|
||||
displayName: 'User',
|
||||
name: 'userId',
|
||||
type: 'resourceLocator',
|
||||
default: { mode: 'list', value: '' },
|
||||
required: true,
|
||||
modes: [
|
||||
{
|
||||
displayName: 'From List',
|
||||
name: 'list',
|
||||
type: 'list',
|
||||
placeholder: 'Select a user...',
|
||||
typeOptions: {
|
||||
searchListMethod: 'searchUsers',
|
||||
searchable: true,
|
||||
},
|
||||
},
|
||||
{
|
||||
displayName: 'ID',
|
||||
name: 'id',
|
||||
type: 'string',
|
||||
placeholder: 'e.g. admin',
|
||||
},
|
||||
],
|
||||
};
|
||||
24
packages/nodes-base/nodes/Splunk/v2/helpers/interfaces.ts
Normal file
24
packages/nodes-base/nodes/Splunk/v2/helpers/interfaces.ts
Normal file
@@ -0,0 +1,24 @@
|
||||
import type { IDataObject } from 'n8n-workflow';
|
||||
|
||||
export type SplunkCredentials = {
|
||||
authToken: string;
|
||||
baseUrl: string;
|
||||
allowUnauthorizedCerts: boolean;
|
||||
};
|
||||
|
||||
export type SplunkFeedResponse = {
|
||||
feed: {
|
||||
entry: IDataObject[] | IDataObject;
|
||||
};
|
||||
};
|
||||
|
||||
export type SplunkError = {
|
||||
response?: {
|
||||
messages?: {
|
||||
msg: {
|
||||
$: { type: string };
|
||||
_: string;
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
107
packages/nodes-base/nodes/Splunk/v2/helpers/utils.ts
Normal file
107
packages/nodes-base/nodes/Splunk/v2/helpers/utils.ts
Normal file
@@ -0,0 +1,107 @@
|
||||
import type { IExecuteFunctions, IDataObject } from 'n8n-workflow';
|
||||
|
||||
import { parseString } from 'xml2js';
|
||||
|
||||
import type { SplunkError, SplunkFeedResponse } from './interfaces';
|
||||
import { SPLUNK } from '../../v1/types';
|
||||
|
||||
function compactEntryContent(splunkObject: any): any {
|
||||
if (typeof splunkObject !== 'object') {
|
||||
return {};
|
||||
}
|
||||
|
||||
if (Array.isArray(splunkObject)) {
|
||||
return splunkObject.reduce((acc, cur) => {
|
||||
acc = { ...acc, ...compactEntryContent(cur) };
|
||||
return acc;
|
||||
}, {});
|
||||
}
|
||||
|
||||
if (splunkObject[SPLUNK.DICT]) {
|
||||
const obj = splunkObject[SPLUNK.DICT][SPLUNK.KEY];
|
||||
return { [splunkObject.$.name]: compactEntryContent(obj) };
|
||||
}
|
||||
|
||||
if (splunkObject[SPLUNK.LIST]) {
|
||||
const items = splunkObject[SPLUNK.LIST][SPLUNK.ITEM];
|
||||
return { [splunkObject.$.name]: items };
|
||||
}
|
||||
|
||||
if (splunkObject._) {
|
||||
return {
|
||||
[splunkObject.$.name]: splunkObject._,
|
||||
};
|
||||
}
|
||||
|
||||
return {
|
||||
[splunkObject.$.name]: '',
|
||||
};
|
||||
}
|
||||
|
||||
function formatEntryContent(content: any): any {
|
||||
return content[SPLUNK.DICT][SPLUNK.KEY].reduce((acc: any, cur: any) => {
|
||||
acc = { ...acc, ...compactEntryContent(cur) };
|
||||
return acc;
|
||||
}, {});
|
||||
}
|
||||
|
||||
export function formatEntry(entry: any, doNotFormatContent = false): any {
|
||||
const { content, link, ...rest } = entry;
|
||||
const formattedContent = doNotFormatContent ? content : formatEntryContent(content);
|
||||
const formattedEntry = { ...rest, ...formattedContent };
|
||||
|
||||
if (formattedEntry.id) {
|
||||
formattedEntry.entryUrl = formattedEntry.id;
|
||||
formattedEntry.id = formattedEntry.id.split('/').pop();
|
||||
}
|
||||
|
||||
return formattedEntry;
|
||||
}
|
||||
|
||||
export async function parseXml(xml: string) {
|
||||
return await new Promise((resolve, reject) => {
|
||||
parseString(xml, { explicitArray: false }, (error, result) => {
|
||||
error ? reject(error) : resolve(result);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
export function extractErrorDescription(rawError: SplunkError) {
|
||||
const messages = rawError.response?.messages;
|
||||
return messages ? { [messages.msg.$.type.toLowerCase()]: messages.msg._ } : rawError;
|
||||
}
|
||||
|
||||
export function toUnixEpoch(timestamp: string) {
|
||||
return Date.parse(timestamp) / 1000;
|
||||
}
|
||||
|
||||
export function formatFeed(responseData: SplunkFeedResponse) {
|
||||
const { entry: entries } = responseData.feed;
|
||||
|
||||
if (!entries) return [];
|
||||
|
||||
return Array.isArray(entries)
|
||||
? entries.map((entry) => formatEntry(entry))
|
||||
: [formatEntry(entries)];
|
||||
}
|
||||
|
||||
export function setReturnAllOrLimit(this: IExecuteFunctions, qs: IDataObject) {
|
||||
qs.count = this.getNodeParameter('returnAll', 0) ? 0 : this.getNodeParameter('limit', 0);
|
||||
}
|
||||
|
||||
export function populate(source: IDataObject, destination: IDataObject) {
|
||||
if (Object.keys(source).length) {
|
||||
Object.assign(destination, source);
|
||||
}
|
||||
}
|
||||
|
||||
export function getId(
|
||||
this: IExecuteFunctions,
|
||||
i: number,
|
||||
idType: 'userId' | 'searchJobId' | 'searchConfigurationId',
|
||||
endpoint: string,
|
||||
) {
|
||||
const id = this.getNodeParameter(idType, i) as string;
|
||||
|
||||
return id.includes(endpoint) ? id.split(endpoint).pop() : id;
|
||||
}
|
||||
Reference in New Issue
Block a user