/*
* @desc 参考example。把js对象转换成graphql语法的语句
* @param {object} arg - 待转换的gql语句对象
object格式参考example
* @returns {string} - 符合graphql语法的字符串
* @example
const data = {
schema: 'tenant_config',
input: {
productKey: 'basePrd',
sceneKey: 'feConfigRobot',
},
output: {
code: '',
message: '',
data: {
config: '',
},
},
};
let gqlStr = gql(data);
-> "{tenant_config(productKey: \"basePrd\", sceneKey: \"feConfigRobot\"){code message data{config}}}"
// input参数嵌套的object结构,建议JSON.stringify化。
const jiuding_data = {
schema: 'jiuding_correct_status',
input: {
securityCaseId: 'e6s4l4aXNybqbA4mYWBPsA',
operation: 'writeJudgement',
businessParam: JSON.stringify({
appName: 'aaa',
})
},
output: {
data: {
status: '',
time: '',
comment: ''
},
message: '',
success: ''
}
}
gqlStr = gql(jiuding_data);
-> "{jiuding_correct_status(securityCaseId: "e6s4l4aXNybqbA4mYWBPsA",operation: "writeJudgement",businessParam: "%7B%22appName%22%3A%22aaa%22%7D"){data{status time comment }message success }}"
// 发送graphql查询请求
$.ajax({
url: 'http://graphql服务器地址/gql/',
dataType: 'json',
method: 'post',
data: {
'query': gqlStr
},
});
*/
export function gql(...argument): string {
// 参数个数检测
if (argument.length === 0) {
throw 'gql function need arguments';
}
const arg: any = argument[0];
// 非空字段检测
const argName = ['schema', 'input', 'output'];
argName.forEach(key => {
if (!arg[key]) {
throw `gql function need field ${key}`;
}
});
const { schema, input, output } = arg;
const inputTemplate = [];
const outputTemplate = [];
const travelsalOutput = output => {
const keyArr = Object.keys(output);
for (const key of keyArr) {
const val = output[key];
if (typeof (val) === 'string') {
outputTemplate.push(`${key} `);
}
if (typeof (val) === 'object') {
outputTemplate.push(`${key}{`);
travelsalOutput(val);
outputTemplate.push(`}`);
}
}
};
const getInputTemplate = input => {
const inputKeyArr = Object.keys(input);
for (const inputKey of inputKeyArr) {
inputTemplate.push(`${inputKey}: "${encodeURIComponent(input[inputKey])}"`);
}
}
getInputTemplate(input);
travelsalOutput(output);
const inputStr = inputTemplate.join(',');
const outputStr = outputTemplate.join('');
const gelTemplate = `{${schema}(${inputStr}){${outputStr}}}`;
return gelTemplate;
};
网友评论