Add measure operations

Signed-off-by: Bryan Frimin <bryan@getprobo.com>
This commit is contained in:
Bryan Frimin
2025-12-02 10:35:10 +01:00
parent 3be8ea7c03
commit c6276ebe73
14 changed files with 769 additions and 136 deletions

View File

@@ -0,0 +1,80 @@
import { parse, getOperationAST, type DocumentNode } from 'graphql';
import type { INodeProperties, IExecuteFunctions, INodeExecutionData } from 'n8n-workflow';
import { proboApiRequest } from '../../GenericFunctions';
export const description: INodeProperties[] = [
{
displayName: 'Query',
name: 'query',
type: 'string',
typeOptions: {
rows: 5,
},
displayOptions: {
show: {
resource: ['execute'],
},
},
default: '',
description:
'The complete GraphQL operation including operation name and variable declarations (e.g., "query GetUser($userId: ID!) { node(id: $userId) { id } }" or "mutation UpdateUser($input: UpdateUserInput!) { updateUser(input: $input) { id } }")',
required: true,
},
{
displayName: 'Variables',
name: 'variables',
type: 'json',
displayOptions: {
show: {
resource: ['execute'],
},
},
default: '{}',
description: 'GraphQL variables as JSON object',
},
];
export async function execute(
this: IExecuteFunctions,
itemIndex: number,
): Promise<INodeExecutionData> {
const query = this.getNodeParameter('query', itemIndex) as string;
const variablesParam = this.getNodeParameter('variables', itemIndex) as string;
let document: DocumentNode;
try {
document = parse(query);
} catch (error) {
throw new Error(
`Invalid GraphQL operation: ${error instanceof Error ? error.message : String(error)}`,
);
}
const operationAST = getOperationAST(document);
if (!operationAST) {
throw new Error('GraphQL operation must contain a query, mutation, or subscription');
}
if (!operationAST.name) {
throw new Error(
'GraphQL operation must have a name (e.g., "query GetUser { ... }" or "mutation UpdateUser { ... }")',
);
}
let variables = {};
if (variablesParam) {
try {
variables =
typeof variablesParam === 'string' ? JSON.parse(variablesParam) : variablesParam;
} catch (error) {
throw new Error(`Invalid JSON in Variables: ${error}`);
}
}
const responseData = await proboApiRequest.call(this, query, variables);
return {
json: responseData,
pairedItem: { item: itemIndex },
};
}

View File

@@ -0,0 +1,29 @@
import type { INodeProperties } from 'n8n-workflow';
import * as executeOp from './execute.operation';
export const description: INodeProperties[] = [
{
displayName: 'Operation',
name: 'operation',
type: 'options',
noDataExpression: true,
displayOptions: {
show: {
resource: ['execute'],
},
},
options: [
{
name: 'Execute',
value: 'execute',
description: 'Execute a GraphQL query or mutation',
action: 'Execute GraphQL',
},
],
default: 'execute',
},
...executeOp.description,
];
export { executeOp as execute };