Web API: re-organize online documentation and integrate Swagger-UI

pull/136/head
f4exb 2018-01-24 18:17:13 +01:00
rodzic 3d77c9af9b
commit 4a442e97e7
28 zmienionych plików z 2165 dodań i 11 usunięć

Wyświetl plik

@ -1,5 +1,27 @@
<RCC>
<qresource prefix="/">
<file>index.html</file>
<file>webapi/doc/html2/index.html</file>
<file>webapi/doc/swagger/swagger.yaml</file>
<file>webapi/doc/swagger/include/CWKeyer.yaml</file>
<file>webapi/doc/swagger/include/FileSource.yaml</file>
<file>webapi/doc/swagger/include/HackRF.yaml</file>
<file>webapi/doc/swagger/include/LimeSdr.yaml</file>
<file>webapi/doc/swagger/include/NFMDemod.yaml</file>
<file>webapi/doc/swagger/include/NFMMod.yaml</file>
<file>webapi/doc/swagger/include/RtlSdr.yaml</file>
<file>webapi/doc/swagger-ui/swagger-ui.js.map</file>
<file>webapi/doc/swagger-ui/swagger-ui.js</file>
<file>webapi/doc/swagger-ui/swagger-ui.css.map</file>
<file>webapi/doc/swagger-ui/swagger-ui.css</file>
<file>webapi/doc/swagger-ui/swagger-ui-standalone-preset.js.map</file>
<file>webapi/doc/swagger-ui/swagger-ui-standalone-preset.js</file>
<file>webapi/doc/swagger-ui/swagger-ui-bundle.js.map</file>
<file>webapi/doc/swagger-ui/swagger-ui-bundle.js</file>
<file>webapi/doc/swagger-ui/oauth2-redirect.html</file>
<file>webapi/doc/swagger-ui/index.html</file>
<file>webapi/doc/swagger-ui/favicon-32x32.png</file>
<file>webapi/doc/swagger-ui/favicon-16x16.png</file>
<file>webapi/index.html</file>
<file>webapi/sdrangel_logo.png</file>
</qresource>
</RCC>
</RCC>

Plik binarny nie jest wyświetlany.

Po

Szerokość:  |  Wysokość:  |  Rozmiar: 445 B

Plik binarny nie jest wyświetlany.

Po

Szerokość:  |  Wysokość:  |  Rozmiar: 1.1 KiB

Wyświetl plik

@ -0,0 +1,96 @@
<!-- 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="./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="./swagger-ui-bundle.js"> </script>
<script src="./swagger-ui-standalone-preset.js"> </script>
<script>
window.onload = function() {
// Build a system
const ui = SwaggerUIBundle({
url: window.location.protocol + "//" + window.location.host + "/doc/swagger/swagger.yaml",
validatorUrl: window.location.protocol + "//" + window.location.host + "/doc/swagger/swagger.yaml",
dom_id: '#swagger-ui',
deepLinking: true,
presets: [
SwaggerUIBundle.presets.apis,
SwaggerUIStandalonePreset
],
plugins: [
SwaggerUIBundle.plugins.DownloadUrl
],
layout: "StandaloneLayout"
})
window.ui = ui
}
</script>
</body>
</html>

Wyświetl plik

@ -0,0 +1,60 @@
<!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 redirectUrl = oauth2.redirectUrl;
var isValid, qp, arr;
if (/code|token|error/.test(window.location.hash)) {
qp = window.location.hash.substring(1);
} else {
qp = 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.schema.get("flow") === "authorizationCode"
) && !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({auth: oauth2.auth, redirectUrl: redirectUrl});
} 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, redirectUrl: redirectUrl});
}
window.close();
}
</script>

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

Wyświetl plik

@ -0,0 +1 @@
{"version":3,"sources":[],"names":[],"mappings":"","file":"swagger-ui.css","sourceRoot":""}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

Wyświetl plik

@ -0,0 +1,12 @@
CWKeyerSettings:
properties:
sampleRate:
type: integer
wpm:
type: integer
mode:
type: integer
text:
type: string
loop:
type: integer

Wyświetl plik

@ -0,0 +1,5 @@
FileSourceSettings:
description: FileSource
properties:
fileName:
type: string

Wyświetl plik

@ -0,0 +1,52 @@
HackRFInputSettings:
description: HackRF
properties:
centerFrequency:
type: integer
format: int64
LOppmTenths:
type: integer
bandwidth:
type: integer
lnaGain:
type: integer
vgaGain:
type: integer
log2Decim:
type: integer
fcPos:
description: 0=Infra 1=Supra 2=Center
type: integer
devSampleRate:
type: integer
biasT:
type: integer
lnaExt:
type: integer
dcBlock:
type: integer
iqCorrection:
type: integer
linkTxFrequency:
type: integer
HackRFOutputSettings:
description: HackRF
properties:
centerFrequency:
type: integer
format: int64
LOppmTenths:
type: integer
bandwidth:
type: integer
vgaGain:
type: integer
log2Interp:
type: integer
devSampleRate:
type: integer
biasT:
type: integer
lnaExt:
type: integer

Wyświetl plik

@ -0,0 +1,74 @@
LimeSdrInputSettings:
description: LimeSDR
properties:
centerFrequency:
type: integer
format: int64
devSampleRate:
type: integer
log2HardDecim:
type: integer
dcBlock:
type: integer
iqCorrection:
type: integer
log2SoftDecim:
type: integer
lpfBW:
type: integer
lpfFIREnable:
type: integer
lpfFIRBW:
type: integer
gain:
type: integer
ncoEnable:
type: integer
ncoFrequency:
type: integer
antennaPath:
type: integer
gainMode:
type: integer
lnaGain:
type: integer
tiaGain:
type: integer
pgaGain:
type: integer
extClock:
type: integer
extClockFreq:
type: integer
LimeSdrOutputSettings:
description: LimeSDR
properties:
centerFrequency:
type: integer
format: int64
devSampleRate:
type: integer
log2HardInterp:
type: integer
log2SoftInterp:
type: integer
lpfBW:
type: integer
lpfFIREnable:
type: integer
lpfFIRBW:
type: integer
gain:
type: integer
ncoEnable:
type: integer
ncoFrequency:
type: integer
antennaPath:
type: integer
extClock:
type: integer
extClockFreq:
type: integer

Wyświetl plik

@ -0,0 +1,43 @@
NFMDemodSettings:
description: NFMDemod
properties:
inputFrequencyOffset:
type: integer
format: int64
rfBandwidth:
type: number
format: float
afBandwidth:
type: number
format: float
fmDeviation:
type: integer
squelchGate:
type: integer
deltaSquelch:
type: integer
squelch:
type: number
format: float
volume:
type: number
format: float
ctcssOn:
type: integer
audioMute:
type: integer
ctcssIndex:
type: integer
audioSampleRate:
type: integer
copyAudioToUDP:
type: integer
udpAddress:
type: string
udpPort:
type: integer
rgbColor:
type: integer
title:
type: string

Wyświetl plik

@ -0,0 +1,40 @@
NFMModSettings:
description: NFMMod
properties:
inputFrequencyOffset:
type: integer
format: int64
rfBandwidth:
type: number
format: float
afBandwidth:
type: number
format: float
fmDeviation:
type: number
format: float
toneFrequency:
type: number
format: float
volumeFactor:
type: number
format: float
audioSampleRate:
type: integer
channelMute:
type: integer
playLoop:
type: integer
ctcssOn:
type: integer
ctcssIndex:
type: integer
rgbColor:
type: integer
title:
type: string
modAFInput:
type: integer
cwKeyer:
$ref: "/doc/swagger/include/CWKeyer.yaml#/CWKeyerSettings"

Wyświetl plik

@ -0,0 +1,34 @@
RtlSdrSettings:
description: RTLSDR
properties:
devSampleRate:
type: integer
lowSampleRate:
type: integer
centerFrequency:
type: integer
format: int64
gain:
type: integer
loPpmCorrection:
type: integer
log2Decim:
type: integer
fcPos:
type: integer
dcBlock:
type: integer
iqImbalance:
type: integer
agc:
type: integer
noModMode:
type: integer
transverterMode:
type: integer
transverterDeltaFrequency:
type: integer
format: int64
rfBandwidth:
type: integer

Wyświetl plik

@ -0,0 +1,9 @@
User:
required:
- index
- name
properties:
index:
type: integer
name:
type: string

Wyświetl plik

@ -0,0 +1,52 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN">
<html>
<head>
<title>SDRangel API documentation</title>
<style type="text/css">
body {
padding-left: 13em;
font-family: Helvetica, Geneva, Arial, SunSans-Regular, sans-serif;
color: black;
background-color: white }
h1 {
font-family: Helvetica, Geneva, Arial, SunSans-Regular, sans-serif;
color: #6086D3 }
ul.navbar {
list-style-type: none;
padding: 0;
margin: 0;
position: absolute;
top: 2em;
left: 1em;
width: 11em }
ul.navbar li {
background: #dddddd;
margin: 0.5em 0;
padding: 0.3em;
border-right: 1em solid black }
ul.navbar a {
text-decoration: none }
a:link {
color: #315db4 }
a:visited {
color: #315db4 }
</style>
</head>
<body>
<!-- Site navigation menu -->
<ul class="navbar">
<li><a href="doc/html2/index.html">Static HTML2 documentation</a>
<li><a href="doc/swagger-ui/index.html">Interactive Swagger UI documentation</a>
</ul>
<!-- Main content -->
<img src="sdrangel_logo.png" alt="SDRangel">
<h1>SDRangel API documentation</h1>
<p>Click on links on the left for various types of documentation</p>
</body>
</html>

Plik binarny nie jest wyświetlany.

Po

Szerokość:  |  Wysokość:  |  Rozmiar: 72 KiB

Wyświetl plik

@ -16,7 +16,7 @@
// along with this program. If not, see <http://www.gnu.org/licenses/>. //
///////////////////////////////////////////////////////////////////////////////////
//#include <QDirIterator>
#include <QDirIterator>
#include <QJsonDocument>
#include <QJsonArray>
@ -47,7 +47,7 @@ WebAPIRequestMapper::WebAPIRequestMapper(QObject* parent) :
m_adapter(0)
{
qtwebapp::HttpDocrootSettings docrootSettings;
docrootSettings.path = ":/";
docrootSettings.path = ":/webapi";
m_staticFileController = new qtwebapp::StaticFileController(docrootSettings, parent);
}
@ -119,11 +119,9 @@ void WebAPIRequestMapper::service(qtwebapp::HttpRequest& request, qtwebapp::Http
} else if (std::regex_match(pathStr, desc_match, WebAPIAdapterInterface::devicesetChannelSettingsURLRe)) {
devicesetChannelSettingsService(std::string(desc_match[1]), std::string(desc_match[2]), request, response);
}
else
else // serve static documentation pages
{
QByteArray path = "/index.html";
response.setStatus(400, "API URL does not exist");
m_staticFileController->service(path, response);
m_staticFileController->service(request, response);
}
// QDirIterator it(":", QDirIterator::Subdirectories);

Wyświetl plik

@ -11,8 +11,8 @@ AboutDialog::AboutDialog(const QString& apiHost, int apiPort, QWidget* parent) :
ui->build->setText(QString("Build info: Qt %1 %2 bits").arg(QT_VERSION_STR).arg(QT_POINTER_SIZE*8));
ui->dspBits->setText(QString("DSP Rx %1 bits Tx %2 bits").arg(SDR_RX_SAMP_SZ).arg(SDR_TX_SAMP_SZ));
ui->pid->setText(QString("PID: %1").arg(qApp->applicationPid()));
QString apiUrl = QString("http://%1:%2/sdrangel").arg(apiHost).arg(apiPort);
ui->restApiUrl->setText(QString("REST API base URL: <a href=\"%1\">%2</a>").arg(apiUrl).arg(apiUrl));
QString apiUrl = QString("http://%1:%2/").arg(apiHost).arg(apiPort);
ui->restApiUrl->setText(QString("REST API documentation: <a href=\"%1\">%2</a>").arg(apiUrl).arg(apiUrl));
ui->restApiUrl->setOpenExternalLinks(true);
}

Wyświetl plik

@ -5,4 +5,6 @@ SDRANGEL_SRC=/opt/build/sdrangel
${CODEGEN} generate -i api/swagger/swagger.yaml -l qt5cpp -c qt5cpp-config.json -o code/qt5
${CODEGEN} generate -i api/swagger/swagger.yaml -l html2 -c html2-config.json -o code/html2
cp -v code/html2/index.html ${SDRANGEL_SRC}/sdrbase/resources/
cp -v code/html2/index.html ${SDRANGEL_SRC}/sdrbase/resources/webapi/doc/html2
cp -av api/swagger/ ${SDRANGEL_SRC}/sdrbase/resources/webapi/doc
find ${SDRANGEL_SRC}/sdrbase/resources/webapi/doc/swagger -name \*.yaml -exec sed -i 's/http:\/\/localhost:8081\/api\/swagger\/include/\/doc\/swagger\/include/g' {} \;