1
0
mirror of https://github.com/f4exb/sdrangel.git synced 2024-11-25 09:18:54 -05:00

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

This commit is contained in:
f4exb 2018-01-24 18:17:13 +01:00
parent 3d77c9af9b
commit 4a442e97e7
28 changed files with 2165 additions and 11 deletions

View File

@ -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>

Binary file not shown.

After

Width:  |  Height:  |  Size: 445 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

View File

@ -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>

View File

@ -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

View File

@ -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

View File

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

View File

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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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"

View File

@ -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

View File

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

File diff suppressed because it is too large Load Diff

View File

@ -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>

Binary file not shown.

After

Width:  |  Height:  |  Size: 72 KiB

View File

@ -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);

View File

@ -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);
}

View File

@ -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' {} \;