import type { IExecuteFunctions, INodeExecutionData, INodeType, INodeTypeDescription, } from 'n8n-workflow'; import { executeObsidianCommand } from '../../shared/ObsidianApiClient'; import { buildArgs } from './argBuilders'; import { nodeDescription } from './description'; import { outputForResult } from './output'; export class ObsidianApi implements INodeType { description: INodeTypeDescription = nodeDescription; async execute(this: IExecuteFunctions): Promise { const items = this.getInputData(); const returnData: INodeExecutionData[] = []; for (let itemIndex = 0; itemIndex < items.length; itemIndex++) { try { const resource = this.getNodeParameter('resource', itemIndex) as string; const operation = this.getNodeParameter('operation', itemIndex) as string; const additionalFields = this.getNodeParameter('additionalFields', itemIndex, {}) as Record; const vault = String(additionalFields.vault || ''); const timeout = Number(additionalFields.timeout ?? 60); const args = buildArgs(this, resource, operation, itemIndex, additionalFields); const result = await executeObsidianCommand(this, itemIndex, args, { vault, timeout }); returnData.push(outputForResult(result, resource, operation, itemIndex)); } catch (error) { if (this.continueOnFail()) { const message = error instanceof Error ? error.message : String(error); const resource = this.getNodeParameter('resource', itemIndex, '') as string; const operation = this.getNodeParameter('operation', itemIndex, '') as string; const failure = resource === 'property' ? { ok: false, operation, path: this.getNodeParameter('propertyPath', itemIndex, '') as string, property: this.getNodeParameter('propertyName', itemIndex, '') as string, value: this.getNodeParameter('propertyValue', itemIndex, '') as string, type: this.getNodeParameter('propertyType', itemIndex, '') as string, error: message, } : { ok: false, error: message }; returnData.push({ json: failure, pairedItem: { item: itemIndex } }); continue; } throw error; } } return [returnData]; } }