let res = {
res_body: '{"$schema":"http://json-schema.org/draft-04/schema#","type":"object","properties":{"data":{"type":"object","properties":{"modifyPassword":{"type":"object","properties":{"messages":{"type":"string"},"field_3":{"type":"object","properties":{"field_4":{"type":"string"}}},"field_5":{"type":"array","items":{"type":"string"}},"field_11":{"type":"array","items":{"type":"object","properties":{"field_12":{"type":"string"}},"required":["field_12"]}}},"required":["field_2","field_5","field_11"]}}}}}',
res_body_is_json_schema: true,
res_body_type: "json"
}
let req = {
req_body_is_json_schema: true,
req_body_other: '{"$schema":"http://json-schema.org/draft-04/schema#","type":"object","properties":{"config":{"type":"object","properties":{"field_1":{"type":"string"}},"description":"@Config@","required":["field_1"]},"password":{"type":"string"},"user":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"}},"required":["id"]},"description":"@User@"}},"required":["config","user","password"]}',
req_body_type: "json"
}
let schema = {res, req}
let data = {
a1: 'a1',
a2: 'a2',
a3: {
a31: {
a311: 'a311'
},
a32: 'a32'
},
a4:{
a41: 'a41'
},
a5: 'a5'
}
let name = '/api/v1/graphql/test'
/**
* schema:{res, req} 请求和响应的schema
* interfaceName: 接口名字
* opera: 操作类型
*/
const JSONSchema2Graphql = (schema, interfaceName, opera) => {
opera = opera || 'query';
let queryStr = '';
queryStr = `${opera} ${interfaceName}`;
const genReqStr = (param) => {
const keys = Object.keys(param);
keys.forEach(key => {
let reg = /@(.*)@/;
let graphqlType, baseType, finType;
if(param[key].type === 'object' || param[key].type === 'array'){
if(!param[key].description){
throw new Error(`请在字段描述中给字段${key}设置graphql类型!`);
}
if(!reg.test(param[key].description)){
throw new Error(`请在字段描述中按照@className@的格式为字段${key}设置graphql类型!`);
}
graphqlType = reg.exec(param[key].description)[1];
}
baseType = param[key].type;
finType = baseType === 'object' ? graphqlType : baseType;
if(baseType !== 'array'){
queryStr = `${queryStr} $${key}: ${finType}, `;
}else{
queryStr = `${queryStr} $${key}: [${graphqlType}], `;
}
});
queryStr = queryStr.substring(0, queryStr.length - 2);
}
const genInterfaceStr = (params) => {
const keys = Object.keys(params);
keys.forEach(key => {
queryStr = `${queryStr} ${key}: $${key}, `;
});
queryStr = queryStr.substring(0, queryStr.length - 2);
}
const genResStr = (res) => {
const keys = Object.keys(res);
keys.forEach(key => {
if(res[key].type !== 'object' && res[key].type !== 'array'){
queryStr = `${queryStr}${key} `;
}
if(res[key].type === 'object'){
queryStr = `${queryStr} ${key}{`;
if(res[key].properties && Object.keys(res[key].properties).length > 0){
genResStr(res[key].properties);
}
queryStr = `${queryStr}}`;
}
if(res[key].type === 'array'){
queryStr = `${queryStr} ${key}`;
if(res[key].items && res[key].items.type === 'object'){
queryStr = `${queryStr}{`;
genResStr(res[key].items.properties);
queryStr = `${queryStr}}`;
}
//多维数组-暂不考虑
/*else if(res[key].items && res[key].items.type === 'array'){
queryStr = `${queryStr}{`;
//genResStr(res[key].items.properties);
queryStr = `${queryStr}}`;
}*/
}
});
}
let reqObject = JSON.parse(schema.req.req_body_other);
let resObject = JSON.parse(schema.res.res_body);
//如果有请求参数
if(schema.req.req_body_is_json_schema && schema.req.req_body_type === 'json' && reqObject.properties && Object.keys(reqObject.properties).length > 0){
//生成自接口别名字符串部分+形参
queryStr = `${queryStr}(`;
genReqStr(reqObject.properties);
queryStr = `${queryStr})`;
//生成真实接口字符串部分
queryStr = `${queryStr}{`;
queryStr = `${queryStr} ${interfaceName}`;
//生成真实接口形参字符串
queryStr = `${queryStr}(`;
genInterfaceStr(reqObject.properties);
queryStr = `${queryStr})`;
//queryStr = `${queryStr}}`;
}
//如果有返回参数
if(schema.res.res_body_is_json_schema && schema.res.res_body_type === 'json' && resObject.properties && Object.keys(resObject.properties).length > 0){
if(!resObject.properties.data){
throw new Error(`graphq类型接口必须在返回参数的第一级设置data字段!`);
}
if(!resObject.properties.data.properties['modifyPassword']){
throw new Error(`graphq类型接口返回参数data下面必须要有以接口名作为key的字段!`);
}
queryStr = `${queryStr}{`;
genResStr(resObject.properties.data.properties['modifyPassword'].properties);
queryStr = `${queryStr}}`;
}
return queryStr;
}
console.log(JSONSchema2Graphql(schema, 'testAPI', 'mutation'));
//console.log(JSON2Graphql(data, schema, name, 'mutation'));
console