美文网首页
一个简单的graphql orm库实现

一个简单的graphql orm库实现

作者: 草珊瑚_6557 | 来源:发表于2020-02-27 15:44 被阅读0次
/*
* @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;
};

相关文章

网友评论

      本文标题:一个简单的graphql orm库实现

      本文链接:https://www.haomeiwen.com/subject/affxhhtx.html