Skip to content

Commit

Permalink
Modified for Swagger-spec 2.0 and Swagger-php 2.0;
Browse files Browse the repository at this point in the history
Added support for OAuth2 in Swagger-ui;
  • Loading branch information
tralves committed Aug 12, 2015
1 parent b14d5ff commit 51dcc28
Show file tree
Hide file tree
Showing 4 changed files with 169 additions and 149 deletions.
7 changes: 7 additions & 0 deletions public/css/screen.css
Original file line number Diff line number Diff line change
Expand Up @@ -1277,3 +1277,10 @@
text-align: center;
padding-top: 10px;
}
#oauth2-settings {
margin-top: 10px;
}
#oauth2-settings .note {
font-size: smaller;
color: #919191;
}
39 changes: 10 additions & 29 deletions src/Jlapp/Swaggervel/routes.php
Original file line number Diff line number Diff line change
@@ -1,7 +1,5 @@
<?php

use Swagger\Swagger;

Route::any(Config::get('swaggervel.doc-route').'/{page?}', function($page='api-docs.json') {
$filePath = Config::get('swaggervel.doc-dir') . "/{$page}";

Expand Down Expand Up @@ -36,34 +34,12 @@
$defaultSwaggerVersion = Config::get('swaggervel.default-swagger-version');
$excludeDirs = Config::get('swaggervel.excludes');

$swagger = new Swagger($appDir, $excludeDirs);

$resourceList = $swagger->getResourceList(array(
'output' => 'array',
'apiVersion' => $defaultApiVersion,
'swaggerVersion' => $defaultSwaggerVersion,
));
$resourceOptions = array(
'output' => 'json',
'defaultSwaggerVersion' => $resourceList['swaggerVersion'],
'defaultBasePath' => $defaultBasePath
);

$output = array();
foreach ($swagger->getResourceNames() as $resourceName) {
$json = $swagger->getResource($resourceName, $resourceOptions);
$resourceName = str_replace(DIRECTORY_SEPARATOR, '-', ltrim($resourceName, DIRECTORY_SEPARATOR));
$output[$resourceName] = $json;
}
$swagger = \Swagger\scan($appDir, [
'exclude' => $excludeDirs
]);

$filename = $docDir . '/api-docs.json';
file_put_contents($filename, Swagger::jsonEncode($resourceList, true));

foreach ($output as $name => $json) {
$name = str_replace(DIRECTORY_SEPARATOR, '-', ltrim($name, DIRECTORY_SEPARATOR));
$filename = $docDir . '/'.$name . '.json';
file_put_contents($filename, $json);
}
file_put_contents($filename, $swagger);
}
}

Expand All @@ -79,7 +55,12 @@
$response = response()->view('swaggervel::index', array(
'secure' => Request::secure(),
'urlToDocs' => url(Config::get('swaggervel.doc-route')),
'requestHeaders' => Config::get('swaggervel.requestHeaders') )
'requestHeaders' => Config::get('swaggervel.requestHeaders'),
'clientId' => Input::get("client_id"),
'clientSecret' => Input::get("client_secret"),
'realm' => Input::get("realm"),
'appName' => Input::get("appName"),
)
);

//need the / at the end to avoid CORS errors on Homestead systems.
Expand Down
9 changes: 5 additions & 4 deletions src/config/swaggervel.php
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@
| Absolute path to directory containing the swagger annotations are stored.
|--------------------------------------------------------------------------
*/
"app-dir" => "app",
"app-dir" => "modules/Api",

/*
|--------------------------------------------------------------------------
Expand All @@ -37,7 +37,8 @@
storage_path(),
base_path()."/tests",
base_path()."/resources/views",
base_path()."/config"
base_path()."/config",
base_path()."/vendor"
),

/*
Expand All @@ -54,14 +55,14 @@
| Edit to set the api's version number
|--------------------------------------------------------------------------
*/
"default-api-version" => "",
"default-api-version" => "v1",

/*
|--------------------------------------------------------------------------
| Edit to set the swagger version number
|--------------------------------------------------------------------------
*/
"default-swagger-version" => "1.2",
"default-swagger-version" => "2.0",

/*
|--------------------------------------------------------------------------
Expand Down
263 changes: 147 additions & 116 deletions src/views/index.blade.php
Original file line number Diff line number Diff line change
Expand Up @@ -7,121 +7,152 @@
?>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Swagger UI</title>
<link rel="icon" type="image/png" href="vendor/swaggervel/images/favicon-32x32.png" sizes="32x32" />
<link rel="icon" type="image/png" href="vendor/swaggervel/images/favicon-16x16.png" sizes="16x16" />
<link href='vendor/swaggervel/css/typography.css' media='screen' rel='stylesheet' type='text/css'/>
<link href='vendor/swaggervel/css/reset.css' media='screen' rel='stylesheet' type='text/css'/>
<link href='vendor/swaggervel/css/screen.css' media='screen' rel='stylesheet' type='text/css'/>
<link href='vendor/swaggervel/css/reset.css' media='print' rel='stylesheet' type='text/css'/>
<link href='vendor/swaggervel/css/print.css' media='print' rel='stylesheet' type='text/css'/>
<script src='vendor/swaggervel/lib/jquery-1.8.0.min.js' type='text/javascript'></script>
<script src='vendor/swaggervel/lib/jquery.slideto.min.js' type='text/javascript'></script>
<script src='vendor/swaggervel/lib/jquery.wiggle.min.js' type='text/javascript'></script>
<script src='vendor/swaggervel/lib/jquery.ba-bbq.min.js' type='text/javascript'></script>
<script src='vendor/swaggervel/lib/handlebars-2.0.0.js' type='text/javascript'></script>
<script src='vendor/swaggervel/lib/underscore-min.js' type='text/javascript'></script>
<script src='vendor/swaggervel/lib/backbone-min.js' type='text/javascript'></script>
<script src='vendor/swaggervel/swagger-ui.js' type='text/javascript'></script>
<script src='vendor/swaggervel/lib/highlight.7.3.pack.js' type='text/javascript'></script>
<script src='vendor/swaggervel/lib/marked.js' type='text/javascript'></script>

<script src='vendor/swaggervel/lib/swagger-oauth.js' type='text/javascript'></script>

<!-- Some basic translations -->
<!-- <script src='lang/translator.js' type='text/javascript'></script> -->
<!-- <script src='lang/ru.js' type='text/javascript'></script> -->
<!-- <script src='lang/en.js' type='text/javascript'></script> -->

<script type="text/javascript">
$(function () {
var url = window.location.search.match(/url=([^&]+)/);
if (url && url.length > 1) {
url = decodeURIComponent(url[1]);
} else {
url = "http://petstore.swagger.io/v2/swagger.json";
}
// Pre load translate...
if(window.SwaggerTranslator) {
window.SwaggerTranslator.translate();
}
window.swaggerUi = new SwaggerUi({
url: url,
dom_id: "swagger-ui-container",
supportedSubmitMethods: ['get', 'post', 'put', 'delete', 'patch'],
onComplete: function(swaggerApi, swaggerUi){
if(typeof initOAuth == "function") {
initOAuth({
clientId: "your-client-id",
clientSecret: "your-client-secret",
realm: "your-realms",
appName: "your-app-name",
scopeSeparator: ","
<head>
<meta charset="UTF-8">
<title>Swagger UI</title>
<link rel="icon" type="image/png" href="vendor/swaggervel/images/favicon-32x32.png" sizes="32x32" />
<link rel="icon" type="image/png" href="vendor/swaggervel/images/favicon-16x16.png" sizes="16x16" />
<link href='vendor/swaggervel/css/typography.css' media='screen' rel='stylesheet' type='text/css'/>
<link href='vendor/swaggervel/css/reset.css' media='screen' rel='stylesheet' type='text/css'/>
<link href='vendor/swaggervel/css/screen.css' media='screen' rel='stylesheet' type='text/css'/>
<link href='vendor/swaggervel/css/reset.css' media='print' rel='stylesheet' type='text/css'/>
<link href='vendor/swaggervel/css/print.css' media='print' rel='stylesheet' type='text/css'/>
<script src='vendor/swaggervel/lib/jquery-1.8.0.min.js' type='text/javascript'></script>
<script src='vendor/swaggervel/lib/jquery.slideto.min.js' type='text/javascript'></script>
<script src='vendor/swaggervel/lib/jquery.wiggle.min.js' type='text/javascript'></script>
<script src='vendor/swaggervel/lib/jquery.ba-bbq.min.js' type='text/javascript'></script>
<script src='vendor/swaggervel/lib/handlebars-2.0.0.js' type='text/javascript'></script>
<script src='vendor/swaggervel/lib/underscore-min.js' type='text/javascript'></script>
<script src='vendor/swaggervel/lib/backbone-min.js' type='text/javascript'></script>
<script src='vendor/swaggervel/swagger-ui.js' type='text/javascript'></script>
<script src='vendor/swaggervel/lib/highlight.7.3.pack.js' type='text/javascript'></script>
<script src='vendor/swaggervel/lib/marked.js' type='text/javascript'></script>

<script src='vendor/swaggervel/lib/swagger-oauth.js' type='text/javascript'></script>

<!-- Some basic translations -->
<!-- <script src='lang/translator.js' type='text/javascript'></script> -->
<!-- <script src='lang/ru.js' type='text/javascript'></script> -->
<!-- <script src='lang/en.js' type='text/javascript'></script> -->

<script type="text/javascript">
function log() {
if ('console' in window) {
console.log.apply(console, arguments);
}
}
$(function () {
var url = window.location.search.match(/url=([^&]+)/);
if (url && url.length > 1) {
url = decodeURIComponent(url[1]);
} else {
url = "{!! $urlToDocs !!}";
}
// Pre load translate...
if (window.SwaggerTranslator) {
window.SwaggerTranslator.translate();
}
window.swaggerUi = new SwaggerUi({
url: url,
dom_id: "swagger-ui-container",
supportedSubmitMethods: ['get', 'post', 'put', 'delete', 'patch'],
onComplete: function (swaggerApi, swaggerUi) {
log("Loaded SwaggerUI");
@if (isset($requestHeaders))
@foreach($requestHeaders as $requestKey => $requestValue)
window.authorizations.add("{!!$requestKey!!}", new ApiKeyAuthorization("{!!$requestKey!!}", "{!!$requestValue!!}", "header"));
@endforeach
@endif
if (typeof initOAuth == "function") {
initOAuth({
clientId: "{!! $clientId !!}"||"my-client-id",
clientSecret: "{!! $clientSecret !!}"||"_",
realm: "{!! $realm !!}"||"_",
appName: "{!! $appName !!}"||"_",
scopeSeparator: ","
});
window.oAuthRedirectUrl = "{{ url('vendor/swaggervel/o2c.html') }}";
$('#clientId').html("{!! $clientId !!}"||"my-client-id");
$('#redirectUrl').html(window.oAuthRedirectUrl);
}
if (window.SwaggerTranslator) {
window.SwaggerTranslator.translate();
}
$('pre code').each(function (i, e) {
hljs.highlightBlock(e)
});
addApiKeyAuthorization();
},
onFailure: function (data) {
log("Unable to Load SwaggerUI");
},
docExpansion: "none",
apisSorter: "alpha",
showRequestHeaders: false
});
function addApiKeyAuthorization() {
var key = encodeURIComponent($('#input_apiKey')[0].value);
if (key && key.trim() != "") {
var apiKeyAuth = new SwaggerClient.ApiKeyAuthorization("api_key", key, "query");
window.swaggerUi.api.clientAuthorizations.add("api_key", apiKeyAuth);
log("added key " + key);
}
}
$('#input_apiKey').change(addApiKeyAuthorization);
$('#init-oauth').click(function(){
if (typeof initOAuth == "function") {
initOAuth({
clientId: $('#input_clientId').val()||"my-client-id",
clientSecret: $('#input_clientSecret').val()||"_",
realm: $('#input_realm').val()||"_",
appName: $('#input_appName').val()||"_",
scopeSeparator: ","
});
}
});
window.swaggerUi.load();
});
}
if(window.SwaggerTranslator) {
window.SwaggerTranslator.translate();
}
$('pre code').each(function(i, e) {
hljs.highlightBlock(e)
});
addApiKeyAuthorization();
},
onFailure: function(data) {
log("Unable to Load SwaggerUI");
},
docExpansion: "none",
apisSorter: "alpha",
showRequestHeaders: false
});
function addApiKeyAuthorization(){
var key = encodeURIComponent($('#input_apiKey')[0].value);
if(key && key.trim() != "") {
var apiKeyAuth = new SwaggerClient.ApiKeyAuthorization("api_key", key, "query");
window.swaggerUi.api.clientAuthorizations.add("api_key", apiKeyAuth);
log("added key " + key);
}
}
$('#input_apiKey').change(addApiKeyAuthorization);
// if you have an apiKey you would like to pre-populate on the page for demonstration purposes...
/*
var apiKey = "myApiKeyXXXX123456789";
$('#input_apiKey').val(apiKey);
*/
window.swaggerUi.load();
function log() {
if ('console' in window) {
console.log.apply(console, arguments);
}
}
});
</script>
</head>

<body class="swagger-section">
<div id='header'>
<div class="swagger-ui-wrap">
<a id="logo" href="http://swagger.io">swagger</a>
<form id='api_selector'>
<div class='input'><input placeholder="http://example.com/api" id="input_baseUrl" name="baseUrl" type="text"/></div>
<div class='input'><input placeholder="api_key" id="input_apiKey" name="apiKey" type="text"/></div>
<div class='input'><a id="explore" href="#" data-sw-translate>Explore</a></div>
</form>
</div>
</div>

<div id="message-bar" class="swagger-ui-wrap" data-sw-translate>&nbsp;</div>
<div id="swagger-ui-container" class="swagger-ui-wrap"></div>
</body>
</script>
</head>

<body class="swagger-section">
<div id='header'>
<div class="swagger-ui-wrap">
<a id="logo" href="http://swagger.io">swagger</a>
<form id='api_selector'>
<div class='input'><input placeholder="http://example.com/api" id="input_baseUrl" name="baseUrl" type="text"/></div>
<div class='input'><input placeholder="api_key" id="input_apiKey" name="apiKey" type="text"/></div>
<div class='input'><a id="explore" href="#" data-sw-translate>Explore</a></div>
</form>
</div>
</div>

<div id="oauth2-settings" class="swagger-ui-wrap">
<h2>OAuth2 settings</h2>
<input placeholder="Client Id" id="input_clientId" name="clientId" type="text" value="{!! $clientId !!}"/>
<input placeholder="Client Secret" id="input_clientSecret" name="clientSecret" type="text" value="{!! $clientSecret !!}"/>
<input placeholder="Realm" id="input_realm" name="realm" type="text" value="{!! $realm !!}"/>
<input placeholder="App Name" id="input_appName" name="appName" type="text" value="{!! $appName !!}"/>
<button id="init-oauth" href="#" data-sw-translate value="">Init OAuth</button>
<br/>
<span class="note">Configure OAuth2 Client with id="<span id="clientId"></span>" and redirect url="<span id="redirectUrl"></span>"</span>
</div>

<div id="message-bar" class="swagger-ui-wrap" data-sw-translate>&nbsp;</div>
<div id="swagger-ui-container" class="swagger-ui-wrap"></div>
</body>
</html>

0 comments on commit 51dcc28

Please sign in to comment.