UNPKG

@couleetech/n8n-nodes-enlightenedmsp

Version:

n8n node for EnlightenedMSP ticketing and workflow automation

499 lines (498 loc) 20.1 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.SearchTicket = void 0; const GraphqlBase_1 = require("./GraphqlBase"); const DEFAULT_FIELDS = `id title status ticketNumber description priority dueDateTime createDate completedDate assignedResourceID queueID resolution`; class SearchTicketGraphql extends GraphqlBase_1.GraphqlBase { async searchTickets(variables) { const query = ` query SearchAutotaskTickets( $page: Int $limit: Int $search: String $title: StringProp $status: NumberProp $priority: NumberProp $assignedResourceID: NumberProp $queueID: NumberProp $dueDateTime: TimeQueryProp $createDate: TimeQueryProp $completedDate: TimeQueryProp $archived: BooleanProp $order: SortTicketsArgs ) { findAutotaskTicketsPaginated( page: $page limit: $limit search: $search title: $title status: $status priority: $priority assignedResourceID: $assignedResourceID queueID: $queueID dueDateTime: $dueDateTime createDate: $createDate completedDate: $completedDate archived: $archived order: $order ) { data { ${variables.fields || DEFAULT_FIELDS} } totalCount page limit } } `; return this.executeGraphql(query, variables); } } class SearchTicket { constructor() { this.description = { displayName: 'Search Tickets', name: 'searchTicket', icon: 'file:enlightenedmsp.svg', group: ['transform'], version: 1, description: 'Search for tickets in EnlightenedMSP', defaults: { name: 'Search Tickets', }, inputs: ["main"], outputs: ["main", "ai_tool"], outputNames: ['Output', 'Tool'], credentials: [ { name: 'enlightenedMspGraphql', required: true, }, ], codex: { categories: ['AI'], subcategories: { AI: ['Tools'], }, resources: { primaryDocumentation: [ { url: 'https://docs.n8n.io/integrations/builtin/cluster-nodes/sub-nodes/n8n-nodes-langchain.searchticket/', }, ], }, }, properties: [ { displayName: 'Search Text', name: 'search', type: 'string', default: '', description: 'Search text to filter tickets', }, { displayName: 'Status', name: 'statusFilter', type: 'fixedCollection', default: {}, options: [ { displayName: 'Filter', name: 'filter', values: [ { displayName: 'Operation', name: 'operation', type: 'options', options: [ { name: 'Equals', value: 'equals', }, { name: 'Not Equals', value: 'notEquals', }, ], default: 'equals', typeOptions: { minWidth: '100px', display: 'inline', }, }, { displayName: 'Value', name: 'value', type: 'number', default: 0, typeOptions: { minWidth: '100px', display: 'inline', }, }, ], }, ], }, { displayName: 'Priority', name: 'priority', type: 'number', default: 0, description: 'Filter by ticket priority', }, { displayName: 'Assigned Resource ID', name: 'assignedResourceID', type: 'number', default: 0, description: 'Filter by assigned resource ID', }, { displayName: 'Queue ID', name: 'queueID', type: 'number', default: 0, description: 'Filter by queue ID', }, { displayName: 'Due Date Range', name: 'dueDateRange', type: 'fixedCollection', default: {}, options: [ { displayName: 'Date Range', name: 'dateRange', values: [ { displayName: 'From', name: 'from', type: 'dateTime', default: '', }, { displayName: 'To', name: 'to', type: 'dateTime', default: '', }, ], }, ], }, { displayName: 'Created Date Range', name: 'createDateRange', type: 'fixedCollection', default: {}, options: [ { displayName: 'Date Range', name: 'dateRange', values: [ { displayName: 'From', name: 'from', type: 'dateTime', default: '', }, { displayName: 'To', name: 'to', type: 'dateTime', default: '', }, ], }, ], }, { displayName: 'Completed Date Range', name: 'completedDateRange', type: 'fixedCollection', default: {}, options: [ { displayName: 'Date Range', name: 'dateRange', values: [ { displayName: 'From', name: 'from', type: 'dateTime', default: '', }, { displayName: 'To', name: 'to', type: 'dateTime', default: '', }, ], }, ], }, { displayName: 'Include Archived', name: 'archived', type: 'boolean', default: false, description: 'Whether to include archived tickets', }, { displayName: 'Sort By', name: 'sortBy', type: 'options', options: [ { name: 'Ticket Number', value: 'ticketNumber', }, { name: 'Due Date', value: 'dueDateTime', }, { name: 'Created Date', value: 'createDate', }, { name: 'Completed Date', value: 'completedDate', }, { name: 'Priority', value: 'priority', }, { name: 'Status', value: 'status', }, ], default: 'ticketNumber', description: 'Field to sort results by', }, { displayName: 'Sort Order', name: 'sortOrder', type: 'options', options: [ { name: 'Ascending', value: 'ASC', }, { name: 'Descending', value: 'DESC', }, ], default: 'DESC', description: 'Sort order for the results', }, { displayName: 'Page', name: 'page', type: 'number', default: 1, description: 'Page number for pagination', }, { displayName: 'Limit', name: 'limit', type: 'number', default: 10, description: 'Number of results per page', }, { displayName: 'Data Selection', name: 'dataSelection', type: 'string', typeOptions: { rows: 8, }, default: DEFAULT_FIELDS, required: false, noDataExpression: true, description: 'Fields to return in the response. Leave empty to use default fields.', placeholder: `Example fields: id title status ticketNumber description`, }, { displayName: 'Title', name: 'titleFilter', type: 'fixedCollection', default: {}, options: [ { displayName: 'Filter', name: 'filter', values: [ { displayName: 'Operation', name: 'operation', type: 'options', options: [ { name: 'Equals', value: 'equals', }, { name: 'Not Equals', value: 'notEquals', }, { name: 'Contains', value: 'contains', }, { name: 'Not Contains', value: 'notContains', }, ], default: 'equals', typeOptions: { minWidth: '100px', display: 'inline', }, }, { displayName: 'Value', name: 'value', type: 'string', default: '', typeOptions: { minWidth: '100px', display: 'inline', }, }, ], }, ], }, ], }; } async execute() { const items = this.getInputData(); const returnData = []; const length = items.length; const { endpoint, apiKey } = await GraphqlBase_1.GraphqlBase.getCredentials(this); const searchTicketGraphql = new SearchTicketGraphql(endpoint, apiKey); for (let i = 0; i < length; i++) { try { const search = this.getNodeParameter('search', i); const statusFilter = this.getNodeParameter('statusFilter', i, {}); const priority = this.getNodeParameter('priority', i); const assignedResourceID = this.getNodeParameter('assignedResourceID', i); const queueID = this.getNodeParameter('queueID', i); const dueDateRange = this.getNodeParameter('dueDateRange', i, {}); const createDateRange = this.getNodeParameter('createDateRange', i, {}); const completedDateRange = this.getNodeParameter('completedDateRange', i, {}); const archived = this.getNodeParameter('archived', i); const sortBy = this.getNodeParameter('sortBy', i); const sortOrder = this.getNodeParameter('sortOrder', i); const page = this.getNodeParameter('page', i); const limit = this.getNodeParameter('limit', i); const dataSelection = this.getNodeParameter('dataSelection', i, DEFAULT_FIELDS); const titleFilter = this.getNodeParameter('titleFilter', i, {}); const variables = { page, limit, search: search || undefined, fields: dataSelection, archived: { eq: archived }, order: { [sortBy]: sortOrder }, }; if (statusFilter.filter) { variables.status = statusFilter.filter.operation === 'equals' ? { eq: statusFilter.filter.value } : { not: statusFilter.filter.value }; } if (titleFilter.filter) { switch (titleFilter.filter.operation) { case 'equals': variables.title = { eq: titleFilter.filter.value }; break; case 'notEquals': variables.title = { not: titleFilter.filter.value }; break; case 'contains': variables.title = { like: titleFilter.filter.value }; break; case 'notContains': variables.title = { notlike: titleFilter.filter.value }; break; } } if (priority) { variables.priority = { eq: priority }; } if (assignedResourceID) { variables.assignedResourceID = { eq: assignedResourceID }; } if (queueID) { variables.queueID = { eq: queueID }; } if (dueDateRange === null || dueDateRange === void 0 ? void 0 : dueDateRange.dateRange) { variables.dueDateTime = { gte: new Date(dueDateRange.dateRange.from), lte: new Date(dueDateRange.dateRange.to), }; } if (createDateRange === null || createDateRange === void 0 ? void 0 : createDateRange.dateRange) { variables.createDate = { gte: new Date(createDateRange.dateRange.from), lte: new Date(createDateRange.dateRange.to), }; } if (completedDateRange === null || completedDateRange === void 0 ? void 0 : completedDateRange.dateRange) { variables.completedDate = { gte: new Date(completedDateRange.dateRange.from), lte: new Date(completedDateRange.dateRange.to), }; } const result = await searchTicketGraphql.searchTickets(variables); returnData.push({ json: result.findAutotaskTicketsPaginated, }); } catch (error) { if (this.continueOnFail()) { returnData.push({ json: { error: error.message, }, }); continue; } throw error; } } const aiToolData = returnData.map(item => ({ json: { tickets: item.json.data, totalCount: item.json.totalCount, page: item.json.page, limit: item.json.limit, }, })); return [returnData, aiToolData]; } } exports.SearchTicket = SearchTicket;