41 lines
2.4 KiB
TypeScript
41 lines
2.4 KiB
TypeScript
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};
|
|
};
|