import type {NodeHandler} from '../../../types/bot/workflow/runtime.ts'; import type {WorkflowNodeTemplate} from '../../../types/bot/workflow/metadata.ts'; import {describe, failure_port, output, success_port} from '../metadata.ts'; import {assert_json, resolve_value} from '../runtime/value.ts'; export const config_template: WorkflowNodeTemplate = { name: 'query', version: '1.0.0', i18n: describe('查询数据', '解析命名参数后调用查询提供方,返回 JSON 数据,并可将结果保存到工作流变量。'), provider: 'query', config: [ {name: 'source', type: 'string', required: true, provider: 'query', max_length: 100, i18n: describe('查询来源', '选择查询提供方,标识由 1 至 100 个字母、数字、下划线或连字符组成,禁止保留名称。')}, {name: 'args', type: 'map', required: true, default: {}, i18n: describe('查询参数', '按名称提供参数;键为 1 至 100 个字母、数字、下划线或连字符,禁止保留名称。'), item: {name: 'argument', type: 'value_source', required: true, i18n: describe('参数值', '解析字面量或状态引用,将得到的 JSON 值传给对应名称的查询参数。')}}, {name: 'save_as', type: 'string', required: false, max_length: 100, i18n: describe('保存变量', '可选,将查询输出保存到 vars 中的此名称;名称为 1 至 100 个字母、数字、下划线或连字符,禁止保留名称。')}, ], output: output('json', '查询结果', '查询提供方返回的原始 JSON 值,与可选保存到 vars 的值相同。'), ports: [success_port, failure_port], }; export const execute: NodeHandler = async (node, state, signal, deps) => { if (node.type !== 'query') throw new Error('Expected a query node'); signal.throwIfAborted(); const args = Object.fromEntries(Object.entries(node.config.args) .map(([key, source]) => [key, resolve_value(source, state)])); assert_json(args); const output = await deps.query(node.config.source, args, signal); signal.throwIfAborted(); assert_json(output); const result = {status: 'success' as const, output}; if (node.config.save_as !== undefined) { const vars = {[node.config.save_as]: output}; assert_json(vars); return {port: 'success', result, vars}; } return {port: 'success', result}; };