<?php
|
|
namespace Api\Controller;
|
|
use Think\Controller;
|
|
class ImportSwaggerController extends BaseController {
|
|
|
|
|
|
public function import(){
|
|
$login_user = $this->checkLogin();
|
|
|
|
$json = file_get_contents($_FILES["file"]["tmp_name"]) ;
|
|
|
|
//$json = file_get_contents("../Public/swagger.json") ;//test
|
|
$json_array = json_decode($json ,1 );
|
|
unset($json);
|
|
if ($json_array['info']) {
|
|
$this->_fromSwaggerV2($json_array);
|
|
return ;
|
|
}
|
|
|
|
$this->sendError(10303);
|
|
}
|
|
|
|
private function _fromSwaggerV2($json_array){
|
|
|
|
$login_user = $this->checkLogin();
|
|
|
|
// TODO 这里需要检查下合法性。比如关键字检查/黑名单检查/字符串过滤
|
|
|
|
$from = I("from") ? I("from") : '' ;
|
|
$item_array = array(
|
|
"item_name" => $json_array['info']['title'] ? $json_array['info']['title'] : 'from swagger' ,
|
|
"item_type" => '1' ,
|
|
"item_description" => $json_array['info']['description'] ? $json_array['info']['description'] :'',
|
|
"password" => time().rand(),
|
|
"members" => array(),
|
|
"pages" =>array(
|
|
"pages" => array(),
|
|
"catalogs" => $this->_getAllTagsLogs($json_array)
|
|
)
|
|
) ;
|
|
$level = 2 ;
|
|
// $item_array['pages']['catalogs'][0]['pages'] = $this->_getPageByPaths($json_array);
|
|
$item_id = D("Item")->import( json_encode($item_array) , $login_user['uid'] );
|
|
|
|
//echo D("Item")->export(196053901215026 );
|
|
//echo json_encode($item_array);
|
|
$this->sendResult(array('item_id' => $item_id));
|
|
|
|
}
|
|
|
|
private function _getAllTagsLogs($json_array) {
|
|
$catalogsMap = array(
|
|
"fromSwagger" => array("cat_name" =>'from swagger', "pages" =>array())
|
|
);
|
|
$paths = $json_array['paths'] ;
|
|
foreach ($paths as $url => $value) {
|
|
foreach ($value as $method => $value2) {
|
|
$tags = isset($value2["tags"]) ? $value2["tags"] : array();
|
|
if ($tags == array()){
|
|
$page = $this->_requestToDoc($method, $url, $value2, $json_array);
|
|
if($page['page_title']){
|
|
$catalogsMap["fromSwagger"]["pages"][] = $page;
|
|
}
|
|
}else{
|
|
foreach ($tags as $tag){
|
|
if (!key_exists($tag, $catalogsMap)) {
|
|
$page = $this->_requestToDoc($method, $url, $value2, $json_array);
|
|
if ($page["page_title"] != "" && $page["page_content"] != ""){
|
|
$catalogsMap[$tag] = array("cat_name" => $tag, "pages" => array($page));
|
|
}
|
|
}else{
|
|
// 存在则page merge
|
|
$page = $this->_requestToDoc($method, $url, $value2, $json_array);
|
|
if ($page["page_title"] != "" && $page["page_content"] != ""){
|
|
$catalogsMap[$tag]["pages"][] = $page;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
$catalogs = array();
|
|
foreach ($catalogsMap as $key => $value){
|
|
$catalogs[] = $value;
|
|
}
|
|
return $catalogs;
|
|
}
|
|
|
|
private function _getPageByPaths($json_array){
|
|
$return = array() ;
|
|
$paths = $json_array['paths'] ;
|
|
foreach ($paths as $url => $value) {
|
|
foreach ($value as $method => $value2) {
|
|
$return[] = $this->_requestToDoc($method , $url , $value2 , $json_array);
|
|
}
|
|
}
|
|
return $return ;
|
|
|
|
}
|
|
|
|
private function _requestToDoc($method , $url , $request , $json_array){
|
|
$from = I("from") ? I("from") : '' ;
|
|
if($from == 'runapi'){
|
|
return $this->_requestToApi($method , $url , $request , $json_array);
|
|
//如果是来自runapi的导入请求,则已经return不再执行下面
|
|
}
|
|
$return = array() ;
|
|
$return['page_title'] = $request['summary'] ? $request['summary']: $request['operationId'] ;
|
|
$return['s_number'] = 99 ;
|
|
$return['page_comments'] = '' ;
|
|
|
|
$content = '
|
|
**简要描述:**
|
|
|
|
- '.$request['description'].'
|
|
|
|
**请求URL:**
|
|
- ` '.$url.' `
|
|
|
|
**请求方式:**
|
|
- '.$method.' ';
|
|
|
|
if ($request['header']) {
|
|
$content .='
|
|
|
|
**Header:**
|
|
|
|
|Header名|是否必选|类型|说明|
|
|
|:---- |:---|:----- |----- |'."\n";
|
|
foreach ($request['headerData'] as $key => $value) {
|
|
$content .= '|'.$value["key"].' | | text | '.$value["value"].' |'."\n";
|
|
}
|
|
}
|
|
|
|
if ($request['rawModeData']) {
|
|
$content .= '
|
|
|
|
|
|
**请求参数示例**
|
|
|
|
```
|
|
'.$request['rawModeData'].'
|
|
```
|
|
|
|
';
|
|
|
|
}
|
|
|
|
if ($request['parameters']) {
|
|
$content .='
|
|
|
|
**参数:**
|
|
|
|
|参数名|是否必选|类型|说明|
|
|
|:---- |:---|:----- |----- |'."\n";
|
|
foreach ($request['parameters'] as $key => $value) {
|
|
$content .= '|'.$value["name"].' | '.($value["required"] ? '是' : '否' ).' |'.$value["type"].' | '.$value["description"].' |'."\n";
|
|
}
|
|
}
|
|
|
|
if ($request['responses']['200']) {
|
|
|
|
$responses = $request['responses']['200'] ;
|
|
//如果返回信息是引用对象
|
|
if ($request['responses']['200']['schema'] && $request['responses']['200']['schema']['$ref'] ) {
|
|
$str_array = explode("/", $request['responses']['200']['schema']['$ref']) ;
|
|
if ($str_array[1] && $str_array[2]) {
|
|
$responses = $json_array[$str_array[1]][$str_array[2]] ;
|
|
$content .='
|
|
|
|
**返回参数说明:**
|
|
|
|
|参数名|类型|说明|
|
|
|:---- |:---|:----- |----- |'."\n";
|
|
foreach ($responses['properties'] as $key => $value) {
|
|
$content .= '|'.$key.'|'.$value["type"].' | '.$value["description"].' |'."\n";
|
|
}
|
|
|
|
}
|
|
|
|
}else{
|
|
//如果返回的是普通json
|
|
$content .= '
|
|
|
|
|
|
**返回示例**
|
|
|
|
```
|
|
|
|
'.$this->_indent_json(json_encode($responses)).'
|
|
|
|
```
|
|
|
|
';
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
$return['page_content'] = $content ;
|
|
return $return ;
|
|
|
|
}
|
|
|
|
private function _requestToApi($method , $url , $request , $json_array){
|
|
$return = array() ;
|
|
$return['page_title'] = $request['summary'] ? $request['summary']: $request['operationId'] ;
|
|
$return['s_number'] = 99 ;
|
|
$return['page_comments'] = '' ;
|
|
|
|
$content_array = array(
|
|
"info"=>array(
|
|
"from" => 'runapi' ,
|
|
"type" => 'api' ,
|
|
"title" => $request['summary'] ? $request['summary']: $request['operationId'] ,
|
|
"description" => $request['description'] ,
|
|
"method" => strtolower($method) ,
|
|
"url" => $url ,
|
|
"remark" => '' ,
|
|
),
|
|
"request" =>array(
|
|
"params"=> array(
|
|
'mode' => "formdata",
|
|
'json' => "",
|
|
'urlencoded' => array(),
|
|
'formdata' => array(),
|
|
),
|
|
"headers"=> array(),
|
|
"cookies"=> array(),
|
|
"auth"=> array(),
|
|
),
|
|
"response" =>array(),
|
|
"extend" =>array(),
|
|
);
|
|
|
|
if ($request['headerData']) {
|
|
$tmp_array = array();
|
|
foreach ($request['headerData'] as $key => $value) {
|
|
$content_array['request']['headers'][] = array(
|
|
"name" =>$value["key"],
|
|
"type" =>'string',
|
|
"value" =>$value["value"],
|
|
"require" =>'1',
|
|
"remark" =>'',
|
|
);
|
|
}
|
|
}
|
|
|
|
if ($request['parameters']) {
|
|
|
|
foreach ($request['parameters'] as $key => $value) {
|
|
$content_array['request']['params']['formdata'][] = array(
|
|
"name" =>$value["name"],
|
|
"type" =>'string',
|
|
"value" =>$value["value"],
|
|
"require" =>'1',
|
|
"remark" =>$value["description"],
|
|
);
|
|
}
|
|
}
|
|
|
|
$return['page_content'] = json_encode($content_array);
|
|
return $return ;
|
|
|
|
}
|
|
|
|
|
|
/**
|
|
* Indents a flat JSON string to make it more human-readable.
|
|
*
|
|
* @param string $json The original JSON string to process.
|
|
*
|
|
* @return string Indented version of the original JSON string.
|
|
*/
|
|
private function _indent_json($json) {
|
|
|
|
$result = '';
|
|
$pos = 0;
|
|
$strLen = strlen($json);
|
|
$indentStr = ' ';
|
|
$newLine = "\n";
|
|
$prevChar = '';
|
|
$outOfQuotes = true;
|
|
|
|
for ($i=0; $i<=$strLen; $i++) {
|
|
|
|
// Grab the next character in the string.
|
|
$char = substr($json, $i, 1);
|
|
|
|
// Are we inside a quoted string?
|
|
if ($char == '"' && $prevChar != '\\') {
|
|
$outOfQuotes = !$outOfQuotes;
|
|
|
|
// If this character is the end of an element,
|
|
// output a new line and indent the next line.
|
|
} else if(($char == '}' || $char == ']') && $outOfQuotes) {
|
|
$result .= $newLine;
|
|
$pos --;
|
|
for ($j=0; $j<$pos; $j++) {
|
|
$result .= $indentStr;
|
|
}
|
|
}
|
|
|
|
// Add the character to the result string.
|
|
$result .= $char;
|
|
|
|
// If the last character was the beginning of an element,
|
|
// output a new line and indent the next line.
|
|
if (($char == ',' || $char == '{' || $char == '[') && $outOfQuotes) {
|
|
$result .= $newLine;
|
|
if ($char == '{' || $char == '[') {
|
|
$pos ++;
|
|
}
|
|
|
|
for ($j = 0; $j < $pos; $j++) {
|
|
$result .= $indentStr;
|
|
}
|
|
}
|
|
|
|
$prevChar = $char;
|
|
}
|
|
|
|
return $result;
|
|
}
|
|
|
|
}
|