integrate Swagger UI
This commit is contained in:
parent
c26cffc249
commit
a8d9667d54
|
@ -5,3 +5,4 @@ $__autoload['ApiKey'] = dirname(__FILE__).'/inc/class.rest.key.php';
|
|||
$__autoload['restAuth'] = dirname(__FILE__).'/inc/class.rest.auth.php';
|
||||
$__autoload['RestQuery'] = dirname(__FILE__).'/inc/class.rest.query.php';
|
||||
$__autoload['RestQueryGetBlogs'] = dirname(__FILE__).'/inc/class.rest.query.get.blogs.php';
|
||||
$__autoload['RestQueryGetSpecs'] = dirname(__FILE__).'/inc/class.rest.query.get.specs.php';
|
39
_public.php
39
_public.php
|
@ -12,6 +12,14 @@ class rest extends dcUrlHandlers
|
|||
self::p404();
|
||||
return;
|
||||
}
|
||||
error_log($args);
|
||||
|
||||
//exception pour la documentation
|
||||
if($args == "documentation"){
|
||||
include (dirname(__FILE__).'/documentation/swagger-ui-dist/index.php');
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
//coors headers
|
||||
if($core->blog->settings->rest->rest_send_cors_headers){
|
||||
|
@ -21,26 +29,29 @@ class rest extends dcUrlHandlers
|
|||
}
|
||||
header('Content-Type: application/json');
|
||||
|
||||
//user authentification (facultative at this step)
|
||||
$apiKey = rest::get_api_key_sended();
|
||||
|
||||
$user = false;
|
||||
if($apiKey){
|
||||
$user = new restAuth($core);
|
||||
;
|
||||
|
||||
|
||||
//test:
|
||||
if($user->checkUser('','',$apiKey) === false){
|
||||
error_log("wrong key");
|
||||
|
||||
}else{
|
||||
error_log($user->userID());
|
||||
}
|
||||
|
||||
|
||||
|
||||
header(RestQuery::get_full_code_header(403));
|
||||
echo json_encode(array(
|
||||
"error" => "Wrong API Key",
|
||||
"code" => 403
|
||||
));
|
||||
return;
|
||||
}
|
||||
}
|
||||
private function get_api_key_sended(){
|
||||
|
||||
$r = new RestQuery($_SERVER['REQUEST_METHOD'],$args,$user);
|
||||
header($r->response_code);
|
||||
echo json_encode($r->response_message);
|
||||
|
||||
}
|
||||
|
||||
private function get_api_key_sended()
|
||||
{
|
||||
//to do: test it on nginx
|
||||
$headers = apache_request_headers();
|
||||
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;
|
||||
}
|
||||
|
||||
|
||||
$this->user_id = $rs->user_id;
|
||||
$this->user_change_pwd = (boolean) $rs->user_change_pwd;
|
||||
$this->user_admin = (boolean) $rs->user_super;
|
||||
|
|
|
@ -2,7 +2,17 @@
|
|||
|
||||
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,41 +5,46 @@ class RestQuery{
|
|||
public $response_message; //array
|
||||
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
|
||||
switch($httpMethod){
|
||||
case "get":
|
||||
if($args='blogs'){
|
||||
|
||||
|
||||
case "GET":
|
||||
if($args == 'blogs'){
|
||||
$queryObj = new RestQueryGetBlogs($user);
|
||||
break;
|
||||
}elseif($args == 'specs'){
|
||||
$queryObj = new RestQueryGetSpecs($user);
|
||||
break;
|
||||
}
|
||||
|
||||
break;
|
||||
case "POST":
|
||||
|
||||
break;
|
||||
case "post":
|
||||
|
||||
break;
|
||||
case "put":
|
||||
case "PUT":
|
||||
|
||||
break;
|
||||
|
||||
case "patch":
|
||||
case "PATCH":
|
||||
|
||||
break;
|
||||
|
||||
case "delete":
|
||||
case "DELETE":
|
||||
|
||||
break;
|
||||
default:
|
||||
$this->response_code = RestQuery::get_full_code_header(400);
|
||||
$this->response_message = array(
|
||||
"error":"Unrecoknized method",
|
||||
"code":400
|
||||
"error" => "Unrecoknized method",
|
||||
"code" => 400
|
||||
);
|
||||
return;
|
||||
break;
|
||||
}
|
||||
|
||||
$this->response_code = $queryObj->response_code;
|
||||
$this->response_message = $queryObj->response_message;
|
||||
|
||||
}
|
||||
|
||||
public function get_full_code_header($code){
|
||||
|
|
|
@ -59,6 +59,8 @@ if(!empty($_POST['resetApiKey'])){
|
|||
<title>Rest API config</title>
|
||||
</head>
|
||||
<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>
|
||||
<?php echo $apiKey-> get_dc_admin_form($core->auth->userID()); ?>
|
||||
|
||||
|
@ -66,7 +68,6 @@ if(!empty($_POST['resetApiKey'])){
|
|||
//Seulement si administrateur:
|
||||
if($core->auth->isSuperAdmin()):
|
||||
?>
|
||||
|
||||
<h2><?php echo __('Rest API configuration'); ?></h2>
|
||||
<form method="post" action="<?php http::getSelfURI(); ?>">
|
||||
<p>
|
||||
|
|
Loading…
Reference in New Issue
Block a user