@couleetech/n8n-nodes-enlightenedmsp
Version:
n8n node for EnlightenedMSP ticketing and workflow automation
499 lines (498 loc) • 20.1 kB
JavaScript
"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;