integrate Swagger UI
This commit is contained in:
parent
c26cffc249
commit
a8d9667d54
|
@ -4,4 +4,5 @@ global $__autoload;
|
||||||
$__autoload['ApiKey'] = dirname(__FILE__).'/inc/class.rest.key.php';
|
$__autoload['ApiKey'] = dirname(__FILE__).'/inc/class.rest.key.php';
|
||||||
$__autoload['restAuth'] = dirname(__FILE__).'/inc/class.rest.auth.php';
|
$__autoload['restAuth'] = dirname(__FILE__).'/inc/class.rest.auth.php';
|
||||||
$__autoload['RestQuery'] = dirname(__FILE__).'/inc/class.rest.query.php';
|
$__autoload['RestQuery'] = dirname(__FILE__).'/inc/class.rest.query.php';
|
||||||
$__autoload['RestQueryGetBlogs'] = dirname(__FILE__).'/inc/class.rest.query.get.blogs.php';
|
$__autoload['RestQueryGetBlogs'] = dirname(__FILE__).'/inc/class.rest.query.get.blogs.php';
|
||||||
|
$__autoload['RestQueryGetSpecs'] = dirname(__FILE__).'/inc/class.rest.query.get.specs.php';
|
37
_public.php
37
_public.php
|
@ -12,7 +12,15 @@ class rest extends dcUrlHandlers
|
||||||
self::p404();
|
self::p404();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
error_log($args);
|
||||||
|
|
||||||
|
//exception pour la documentation
|
||||||
|
if($args == "documentation"){
|
||||||
|
include (dirname(__FILE__).'/documentation/swagger-ui-dist/index.php');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
//coors headers
|
//coors headers
|
||||||
if($core->blog->settings->rest->rest_send_cors_headers){
|
if($core->blog->settings->rest->rest_send_cors_headers){
|
||||||
header('Access-Control-Allow-Origin: *');
|
header('Access-Control-Allow-Origin: *');
|
||||||
|
@ -21,26 +29,29 @@ class rest extends dcUrlHandlers
|
||||||
}
|
}
|
||||||
header('Content-Type: application/json');
|
header('Content-Type: application/json');
|
||||||
|
|
||||||
|
//user authentification (facultative at this step)
|
||||||
$apiKey = rest::get_api_key_sended();
|
$apiKey = rest::get_api_key_sended();
|
||||||
|
$user = false;
|
||||||
if($apiKey){
|
if($apiKey){
|
||||||
$user = new restAuth($core);
|
$user = new restAuth($core);
|
||||||
;
|
|
||||||
|
|
||||||
|
|
||||||
//test:
|
|
||||||
if($user->checkUser('','',$apiKey) === false){
|
if($user->checkUser('','',$apiKey) === false){
|
||||||
error_log("wrong key");
|
header(RestQuery::get_full_code_header(403));
|
||||||
|
echo json_encode(array(
|
||||||
}else{
|
"error" => "Wrong API Key",
|
||||||
error_log($user->userID());
|
"code" => 403
|
||||||
|
));
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$r = new RestQuery($_SERVER['REQUEST_METHOD'],$args,$user);
|
||||||
|
header($r->response_code);
|
||||||
|
echo json_encode($r->response_message);
|
||||||
|
|
||||||
}
|
}
|
||||||
private function get_api_key_sended(){
|
|
||||||
|
private function get_api_key_sended()
|
||||||
|
{
|
||||||
//to do: test it on nginx
|
//to do: test it on nginx
|
||||||
$headers = apache_request_headers();
|
$headers = apache_request_headers();
|
||||||
if(isset($headers['x_dc_key'])){
|
if(isset($headers['x_dc_key'])){
|
||||||
|
|
BIN
documentation/swagger-ui-dist/favicon-16x16.png
Normal file
BIN
documentation/swagger-ui-dist/favicon-16x16.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 445 B |
BIN
documentation/swagger-ui-dist/favicon-32x32.png
Normal file
BIN
documentation/swagger-ui-dist/favicon-32x32.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 1.1 KiB |
93
documentation/swagger-ui-dist/index.php
Normal file
93
documentation/swagger-ui-dist/index.php
Normal file
|
@ -0,0 +1,93 @@
|
||||||
|
<!-- HTML for static distribution bundle build -->
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<title>Swagger UI</title>
|
||||||
|
<link href="https://fonts.googleapis.com/css?family=Open+Sans:400,700|Source+Code+Pro:300,600|Titillium+Web:400,600,700" rel="stylesheet">
|
||||||
|
<link rel="stylesheet" type="text/css" href="index.php?pf=rest/documentation/swagger-ui-dist/swagger-ui.css" >
|
||||||
|
<link rel="icon" type="image/png" href="./favicon-32x32.png" sizes="32x32" />
|
||||||
|
<link rel="icon" type="image/png" href="./favicon-16x16.png" sizes="16x16" />
|
||||||
|
<style>
|
||||||
|
html
|
||||||
|
{
|
||||||
|
box-sizing: border-box;
|
||||||
|
overflow: -moz-scrollbars-vertical;
|
||||||
|
overflow-y: scroll;
|
||||||
|
}
|
||||||
|
*,
|
||||||
|
*:before,
|
||||||
|
*:after
|
||||||
|
{
|
||||||
|
box-sizing: inherit;
|
||||||
|
}
|
||||||
|
|
||||||
|
body {
|
||||||
|
margin:0;
|
||||||
|
background: #fafafa;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body>
|
||||||
|
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" style="position:absolute;width:0;height:0">
|
||||||
|
<defs>
|
||||||
|
<symbol viewBox="0 0 20 20" id="unlocked">
|
||||||
|
<path d="M15.8 8H14V5.6C14 2.703 12.665 1 10 1 7.334 1 6 2.703 6 5.6V6h2v-.801C8 3.754 8.797 3 10 3c1.203 0 2 .754 2 2.199V8H4c-.553 0-1 .646-1 1.199V17c0 .549.428 1.139.951 1.307l1.197.387C5.672 18.861 6.55 19 7.1 19h5.8c.549 0 1.428-.139 1.951-.307l1.196-.387c.524-.167.953-.757.953-1.306V9.199C17 8.646 16.352 8 15.8 8z"></path>
|
||||||
|
</symbol>
|
||||||
|
|
||||||
|
<symbol viewBox="0 0 20 20" id="locked">
|
||||||
|
<path d="M15.8 8H14V5.6C14 2.703 12.665 1 10 1 7.334 1 6 2.703 6 5.6V8H4c-.553 0-1 .646-1 1.199V17c0 .549.428 1.139.951 1.307l1.197.387C5.672 18.861 6.55 19 7.1 19h5.8c.549 0 1.428-.139 1.951-.307l1.196-.387c.524-.167.953-.757.953-1.306V9.199C17 8.646 16.352 8 15.8 8zM12 8H8V5.199C8 3.754 8.797 3 10 3c1.203 0 2 .754 2 2.199V8z"/>
|
||||||
|
</symbol>
|
||||||
|
|
||||||
|
<symbol viewBox="0 0 20 20" id="close">
|
||||||
|
<path d="M14.348 14.849c-.469.469-1.229.469-1.697 0L10 11.819l-2.651 3.029c-.469.469-1.229.469-1.697 0-.469-.469-.469-1.229 0-1.697l2.758-3.15-2.759-3.152c-.469-.469-.469-1.228 0-1.697.469-.469 1.228-.469 1.697 0L10 8.183l2.651-3.031c.469-.469 1.228-.469 1.697 0 .469.469.469 1.229 0 1.697l-2.758 3.152 2.758 3.15c.469.469.469 1.229 0 1.698z"/>
|
||||||
|
</symbol>
|
||||||
|
|
||||||
|
<symbol viewBox="0 0 20 20" id="large-arrow">
|
||||||
|
<path d="M13.25 10L6.109 2.58c-.268-.27-.268-.707 0-.979.268-.27.701-.27.969 0l7.83 7.908c.268.271.268.709 0 .979l-7.83 7.908c-.268.271-.701.27-.969 0-.268-.269-.268-.707 0-.979L13.25 10z"/>
|
||||||
|
</symbol>
|
||||||
|
|
||||||
|
<symbol viewBox="0 0 20 20" id="large-arrow-down">
|
||||||
|
<path d="M17.418 6.109c.272-.268.709-.268.979 0s.271.701 0 .969l-7.908 7.83c-.27.268-.707.268-.979 0l-7.908-7.83c-.27-.268-.27-.701 0-.969.271-.268.709-.268.979 0L10 13.25l7.418-7.141z"/>
|
||||||
|
</symbol>
|
||||||
|
|
||||||
|
|
||||||
|
<symbol viewBox="0 0 24 24" id="jump-to">
|
||||||
|
<path d="M19 7v4H5.83l3.58-3.59L8 6l-6 6 6 6 1.41-1.41L5.83 13H21V7z"/>
|
||||||
|
</symbol>
|
||||||
|
|
||||||
|
<symbol viewBox="0 0 24 24" id="expand">
|
||||||
|
<path d="M10 18h4v-2h-4v2zM3 6v2h18V6H3zm3 7h12v-2H6v2z"/>
|
||||||
|
</symbol>
|
||||||
|
|
||||||
|
</defs>
|
||||||
|
</svg>
|
||||||
|
|
||||||
|
<div id="swagger-ui"></div>
|
||||||
|
|
||||||
|
<script src="index.php?pf=rest/documentation/swagger-ui-dist/swagger-ui-bundle.js"> </script>
|
||||||
|
<script src="index.php?pf=rest/documentation/swagger-ui-dist/swagger-ui-standalone-preset.js"> </script>
|
||||||
|
<script>
|
||||||
|
window.onload = function() {
|
||||||
|
// Build a system
|
||||||
|
const ui = SwaggerUIBundle({
|
||||||
|
url: "<?php echo $core->blog->url.$core->url->getBase('rest'); ?>/specs",
|
||||||
|
dom_id: '#swagger-ui',
|
||||||
|
presets: [
|
||||||
|
SwaggerUIBundle.presets.apis,
|
||||||
|
SwaggerUIStandalonePreset
|
||||||
|
],
|
||||||
|
plugins: [
|
||||||
|
SwaggerUIBundle.plugins.DownloadUrl
|
||||||
|
],
|
||||||
|
layout: "StandaloneLayout"
|
||||||
|
})
|
||||||
|
|
||||||
|
window.ui = ui
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
|
||||||
|
</html>
|
53
documentation/swagger-ui-dist/oauth2-redirect.html
Normal file
53
documentation/swagger-ui-dist/oauth2-redirect.html
Normal file
|
@ -0,0 +1,53 @@
|
||||||
|
<!doctype html>
|
||||||
|
<html lang="en-US">
|
||||||
|
<body onload="run()">
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
|
<script>
|
||||||
|
'use strict';
|
||||||
|
function run () {
|
||||||
|
var oauth2 = window.opener.swaggerUIRedirectOauth2;
|
||||||
|
var sentState = oauth2.state;
|
||||||
|
var isValid, qp, arr;
|
||||||
|
|
||||||
|
qp = (window.location.hash || location.search).substring(1);
|
||||||
|
|
||||||
|
arr = qp.split("&")
|
||||||
|
arr.forEach(function (v,i,_arr) { _arr[i] = '"' + v.replace('=', '":"') + '"';})
|
||||||
|
qp = qp ? JSON.parse('{' + arr.join() + '}',
|
||||||
|
function (key, value) {
|
||||||
|
return key === "" ? value : decodeURIComponent(value)
|
||||||
|
}
|
||||||
|
) : {}
|
||||||
|
|
||||||
|
isValid = qp.state === sentState
|
||||||
|
|
||||||
|
if (oauth2.auth.schema.get("flow") === "accessCode" && !oauth2.auth.code) {
|
||||||
|
if (!isValid) {
|
||||||
|
oauth2.errCb({
|
||||||
|
authId: oauth2.auth.name,
|
||||||
|
source: "auth",
|
||||||
|
level: "warning",
|
||||||
|
message: "Authorization may be unsafe, passed state was changed in server Passed state wasn't returned from auth server"
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
if (qp.code) {
|
||||||
|
delete oauth2.state;
|
||||||
|
oauth2.auth.code = qp.code;
|
||||||
|
oauth2.callback(oauth2.auth);
|
||||||
|
} else {
|
||||||
|
oauth2.errCb({
|
||||||
|
authId: oauth2.auth.name,
|
||||||
|
source: "auth",
|
||||||
|
level: "error",
|
||||||
|
message: "Authorization failed: no accessCode received from the server"
|
||||||
|
});
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
oauth2.callback({auth: oauth2.auth, token: qp, isValid: isValid});
|
||||||
|
}
|
||||||
|
window.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
</script>
|
106
documentation/swagger-ui-dist/swagger-ui-bundle.js
Normal file
106
documentation/swagger-ui-dist/swagger-ui-bundle.js
Normal file
File diff suppressed because one or more lines are too long
1
documentation/swagger-ui-dist/swagger-ui-bundle.js.map
Normal file
1
documentation/swagger-ui-dist/swagger-ui-bundle.js.map
Normal file
|
@ -0,0 +1 @@
|
||||||
|
{"version":3,"file":"swagger-ui-bundle.js","sources":["webpack:///swagger-ui-bundle.js"],"mappings":"AAAA;AAu/FA;AA6+FA;;;;;;;;;;;;;;;;;;;;;;;;;;AAmTA;;;;;;AAoIA;AAi7FA;AAmtCA;AAi0IA;AA2pJA;AA+uFA;AA2rGA;AAgiFA;AA0rFA;AAk9CA;AA2hDA;AA4rCA;AAi6EA;;;;;AA2gCA;AA02JA;;;;;;;;;;;;;;AAuyEA;AA4mIA;AAquJA;AAwsHA;AA2mGA;AAiiEA;AAq4DA;AA+2DA;AAqlBA;;;;;;AAilFA;AAs1FA;;;;;AAy3CA;AA2qFA;AAw2CA;AAwkCA;AAs/CA;AA4kFA;AAy1FA;;;;;;;;;AAm5CA;AA2zIA;AAk4DA;AAolDA","sourceRoot":""}
|
File diff suppressed because one or more lines are too long
|
@ -0,0 +1 @@
|
||||||
|
{"version":3,"file":"swagger-ui-standalone-preset.js","sources":["webpack:///swagger-ui-standalone-preset.js"],"mappings":"AAAA;;;;;AA4QA;AAitGA","sourceRoot":""}
|
2
documentation/swagger-ui-dist/swagger-ui.css
Normal file
2
documentation/swagger-ui-dist/swagger-ui.css
Normal file
File diff suppressed because one or more lines are too long
1
documentation/swagger-ui-dist/swagger-ui.css.map
Normal file
1
documentation/swagger-ui-dist/swagger-ui.css.map
Normal file
|
@ -0,0 +1 @@
|
||||||
|
{"version":3,"file":"swagger-ui.css","sources":[],"mappings":"","sourceRoot":""}
|
15
documentation/swagger-ui-dist/swagger-ui.js
Normal file
15
documentation/swagger-ui-dist/swagger-ui.js
Normal file
File diff suppressed because one or more lines are too long
1
documentation/swagger-ui-dist/swagger-ui.js.map
Normal file
1
documentation/swagger-ui-dist/swagger-ui.js.map
Normal file
|
@ -0,0 +1 @@
|
||||||
|
{"version":3,"file":"swagger-ui.js","sources":["webpack:///swagger-ui.js"],"mappings":"AAAA;;;;;;AAwxCA;AAoyHA;AAuxHA;AAy4FA;AA2sCA;AAmgCA;AA0iCA;AA+3BA","sourceRoot":""}
|
1208
documentation/swagger.json
Normal file
1208
documentation/swagger.json
Normal file
File diff suppressed because it is too large
Load Diff
|
@ -61,7 +61,6 @@ class restAuth extends dcAuth
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
$this->user_id = $rs->user_id;
|
$this->user_id = $rs->user_id;
|
||||||
$this->user_change_pwd = (boolean) $rs->user_change_pwd;
|
$this->user_change_pwd = (boolean) $rs->user_change_pwd;
|
||||||
$this->user_admin = (boolean) $rs->user_super;
|
$this->user_admin = (boolean) $rs->user_super;
|
||||||
|
|
|
@ -2,9 +2,19 @@
|
||||||
|
|
||||||
class RestQueryGetBlogs
|
class RestQueryGetBlogs
|
||||||
{
|
{
|
||||||
public function __construct($apiKey){
|
public $response_code;
|
||||||
|
public $response_message; //array
|
||||||
|
|
||||||
|
public function __construct($user){
|
||||||
|
if($user === false){
|
||||||
|
//need To be authentified
|
||||||
|
$this->response_code = 403;
|
||||||
|
$this->response_message = array('code' => 403, 'error' => 'get Blogs methods requires to be authentified');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
//error_log(json_encode($user->findUserBlog()));
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
23
inc/class.rest.query.get.specs.php
Normal file
23
inc/class.rest.query.get.specs.php
Normal file
|
@ -0,0 +1,23 @@
|
||||||
|
<?php
|
||||||
|
class RestQueryGetSpecs
|
||||||
|
{
|
||||||
|
|
||||||
|
public $response_code;
|
||||||
|
public $response_message; //array
|
||||||
|
|
||||||
|
public function __construct($user){
|
||||||
|
global $core;
|
||||||
|
$this->response_code = 200;
|
||||||
|
|
||||||
|
$specs = json_decode(file_get_contents(dirname(__FILE__).'/../documentation/swagger.json'),true);
|
||||||
|
//change some parameters
|
||||||
|
$url = parse_url($core->blog->url.$core->url->getBase('rest'));
|
||||||
|
$specs['host'] = $url['host'];
|
||||||
|
$specs['schemes'] = $url['scheme'];
|
||||||
|
preg_match('/https?:\/\/[^\/]*(\/.*)/',$core->blog->url.$core->url->getBase('rest'),$end);
|
||||||
|
$specs['basePath'] = $end[1];
|
||||||
|
$this->response_message = $specs;
|
||||||
|
return;
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
|
@ -5,44 +5,49 @@ class RestQuery{
|
||||||
public $response_message; //array
|
public $response_message; //array
|
||||||
private $queryObj;
|
private $queryObj;
|
||||||
|
|
||||||
public function __construct($httpMethod,$args,$apiKey = ''){
|
public function __construct($httpMethod,$args,$user){
|
||||||
|
error_log($httpMethod." ".$args);
|
||||||
//définir la methode API (pas HTML) appelée
|
//définir la methode API (pas HTML) appelée
|
||||||
switch($httpMethod){
|
switch($httpMethod){
|
||||||
case "get":
|
case "GET":
|
||||||
if($args='blogs'){
|
if($args == 'blogs'){
|
||||||
|
$queryObj = new RestQueryGetBlogs($user);
|
||||||
|
break;
|
||||||
|
}elseif($args == 'specs'){
|
||||||
|
$queryObj = new RestQueryGetSpecs($user);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
break;
|
||||||
|
case "POST":
|
||||||
|
|
||||||
break;
|
break;
|
||||||
case "post":
|
case "PUT":
|
||||||
|
|
||||||
break;
|
|
||||||
case "put":
|
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case "patch":
|
case "PATCH":
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case "delete":
|
case "DELETE":
|
||||||
|
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
$this->response_code = RestQuery::get_full_code_header(400);
|
$this->response_code = RestQuery::get_full_code_header(400);
|
||||||
$this->response_message = array(
|
$this->response_message = array(
|
||||||
"error":"Unrecoknized method",
|
"error" => "Unrecoknized method",
|
||||||
"code":400
|
"code" => 400
|
||||||
);
|
);
|
||||||
|
return;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$this->response_code = $queryObj->response_code;
|
||||||
|
$this->response_message = $queryObj->response_message;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public function get_full_code_header($code){
|
public function get_full_code_header($code){
|
||||||
static $codes = array(
|
static $codes = array(
|
||||||
100 =>"Continue",
|
100 =>"Continue",
|
||||||
101 =>"Switching Protocols",
|
101 =>"Switching Protocols",
|
||||||
|
|
|
@ -59,6 +59,8 @@ if(!empty($_POST['resetApiKey'])){
|
||||||
<title>Rest API config</title>
|
<title>Rest API config</title>
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
|
<h2>Documentation</h2>
|
||||||
|
<p><a href="<?php echo $core->blog->url."rest/documentation"; ?>">Go to the Swagger documentation</a></p>
|
||||||
<h2><?php echo __('Your API key');?></h2>
|
<h2><?php echo __('Your API key');?></h2>
|
||||||
<?php echo $apiKey-> get_dc_admin_form($core->auth->userID()); ?>
|
<?php echo $apiKey-> get_dc_admin_form($core->auth->userID()); ?>
|
||||||
|
|
||||||
|
@ -66,7 +68,6 @@ if(!empty($_POST['resetApiKey'])){
|
||||||
//Seulement si administrateur:
|
//Seulement si administrateur:
|
||||||
if($core->auth->isSuperAdmin()):
|
if($core->auth->isSuperAdmin()):
|
||||||
?>
|
?>
|
||||||
|
|
||||||
<h2><?php echo __('Rest API configuration'); ?></h2>
|
<h2><?php echo __('Rest API configuration'); ?></h2>
|
||||||
<form method="post" action="<?php http::getSelfURI(); ?>">
|
<form method="post" action="<?php http::getSelfURI(); ?>">
|
||||||
<p>
|
<p>
|
||||||
|
|
Loading…
Reference in New Issue
Block a user