import { message } from 'antd'; import URL from 'url'; import _ from 'underscore'; const GenerateSchema = require('generate-schema/src/schemas/json.js'); import { json_parse } from '../../common/utils.js'; function postman(importDataModule) { var folders = []; function parseUrl(url) { return URL.parse(url); } function checkInterRepeat(interData) { let obj = {}; let arr = []; for (let item in interData) { // console.log(interData[item].url + "-" + interData[item].method); if (!obj[interData[item].url + '-' + interData[item].method + '-' + interData[item].method]) { arr.push(interData[item]); obj[ interData[item].url + '-' + interData[item].method + '-' + interData[item].method ] = true; } } return arr; } function handleReq_query(query) { let res = []; if (query && query.length) { for (let item in query) { res.push({ name: query[item].key, desc: query[item].description, // example: query[item].value, value: query[item].value, required: query[item].enabled ? '1' : '0' }); } } return res; } function handleReq_headers(headers) { let res = []; if (headers && headers.length) { for (let item in headers) { res.push({ name: headers[item].key, desc: headers[item].description, value: headers[item].value, required: headers[item].enabled ? '1' : '0' }); } } return res; } function handleReq_body_form(body_form) { let res = []; if (body_form && body_form.length) { for (let item in body_form) { res.push({ name: body_form[item].key, // example: body_form[item].value, value: body_form[item].value, type: body_form[item].type, required: body_form[item].enabled ? '1' : '0', desc: body_form[item].description }); } } return res; } function handlePath(path) { path = parseUrl(path).pathname; path = decodeURIComponent(path); if (!path) return ''; path = path.replace(/\{\{.*\}\}/g, ''); if (path[0] != '/') { path = '/' + path; } return path; } function run(res) { try { res = JSON.parse(res); let interData = res.requests; let interfaceData = { apis: [], cats: [] }; interData = checkInterRepeat.bind(this)(interData); if (res.folders && Array.isArray(res.folders)) { res.folders.forEach(tag => { interfaceData.cats.push({ name: tag.name, desc: tag.description }); }); } if (_.find(res.folders, item => item.collectionId === res.id)) { folders = res.folders; } if (interData && interData.length) { for (let item in interData) { let data = importPostman.bind(this)(interData[item]); interfaceData.apis.push(data); } } return interfaceData; } catch (e) { message.error('文件格式必须为JSON'); } } function importPostman(data, key) { let reflect = { //数据字段映射关系 title: 'name', path: 'url', method: 'method', desc: 'description', req_query: 'queryParams', req_headers: 'headerData', req_params: '', req_body_type: 'dataMode', req_body_form: 'data', req_body_other: 'rawModeData', res_body: 'text', res_body_type: 'language' }; let allKey = [ 'title', 'path', 'catname', 'method', 'desc', 'req_query', 'req_headers', 'req_body_type', 'req_body_form', 'req_body_other', 'res' ]; key = key || allKey; let res = {}; try { for (let item in key) { item = key[item]; if (item === 'req_query') { res[item] = handleReq_query.bind(this)(data[reflect[item]]); } else if (item === 'req_headers') { res[item] = handleReq_headers.bind(this)(data[reflect[item]]); } else if (item === 'req_body_form') { res[item] = handleReq_body_form.bind(this)(data[reflect[item]]); } else if (item === 'req_body_type') { if (data[reflect[item]] === 'urlencoded' || data[reflect[item]] === 'params') { res[item] = 'form'; } else { if (_.isString(data.headers) && data.headers.indexOf('application/json') > -1) { res[item] = 'json'; } else { res[item] = 'raw'; } } } else if (item === 'req_body_other') { if (_.isString(data.headers) && data.headers.indexOf('application/json') > -1) { res.req_body_is_json_schema = true; res[item] = transformJsonToSchema(data[reflect[item]]); } else { res[item] = data[reflect[item]]; } } else if (item === 'path') { res[item] = handlePath.bind(this)(data[reflect[item]]); if (res[item] && res[item].indexOf('/:') > -1) { let params = res[item].substr(res[item].indexOf('/:') + 2).split('/:'); // res[item] = res[item].substr(0,res[item].indexOf("/:")); let arr = []; for (let i in params) { arr.push({ name: params[i], desc: '' }); } res['req_params'] = arr; } } else if (item === 'title') { let path = handlePath.bind(this)(data[reflect['path']]); if (data[reflect[item]].indexOf(path) > -1) { res[item] = path; if (res[item] && res[item].indexOf('/:') > -1) { res[item] = res[item].substr(0, res[item].indexOf('/:')); } } else { res[item] = data[reflect[item]]; } } else if (item === 'catname') { let found = folders.filter(item => { return item.id === data.folder; }); res[item] = found && Array.isArray(found) && found.length > 0 ? found[0].name : null; } else if (item === 'res') { let response = handleResponses(data['responses']); if (response) { (res['res_body'] = response['res_body']), (res['res_body_type'] = response['res_body_type']); } } else { res[item] = data[reflect[item]]; } } } catch (err) { console.log(err.message); message.error(`${err.message}, 导入的postman格式有误`); } return res; } const handleResponses = data => { if (data && data.length) { let res = data[0]; let response = {}; response['res_body_type'] = res.language === 'json' ? 'json' : 'raw'; // response['res_body'] = res.language === 'json' ? transformJsonToSchema(res.text): res.text; if (res.language === 'json') { response['res_body_is_json_schema'] = true; response['res_body'] = transformJsonToSchema(res.text); } else { response['res_body'] = res.text; } return response; } return null; }; const transformJsonToSchema = json => { json = json || {}; let jsonData = json_parse(json); jsonData = GenerateSchema(jsonData); let schemaData = JSON.stringify(jsonData); return schemaData; }; if (!importDataModule || typeof importDataModule !== 'object') { console.error('obj参数必需是一个对象'); return null; } importDataModule.postman = { name: 'Postman', run: run, desc: '注意:只支持json格式数据' }; } module.exports = function() { this.bindHook('import_data', postman); };