This commit is contained in:
parent
71aa7282b5
commit
8e9b7d5e3e
@ -1,10 +1,34 @@
|
|||||||
//nolint:gochecknoglobals,golint,stylecheck
|
//nolint:gochecknoglobals,golint,stylecheck
|
||||||
package web
|
package web
|
||||||
|
|
||||||
import "embed"
|
import (
|
||||||
|
"embed"
|
||||||
|
"io/fs"
|
||||||
|
"net/http"
|
||||||
|
|
||||||
|
"github.com/rs/zerolog/log"
|
||||||
|
)
|
||||||
|
|
||||||
//go:embed files
|
//go:embed files
|
||||||
var Files embed.FS
|
var files embed.FS
|
||||||
|
|
||||||
|
var Files = sub(files, "files")
|
||||||
|
|
||||||
//go:embed templates
|
//go:embed templates
|
||||||
var Templates embed.FS
|
var Templates embed.FS
|
||||||
|
|
||||||
|
//go:embed swagger-ui
|
||||||
|
var swaggerUI embed.FS
|
||||||
|
|
||||||
|
var SwaggerUI = sub(swaggerUI, "swagger-ui")
|
||||||
|
|
||||||
|
func sub(f embed.FS, dir string) http.FileSystem {
|
||||||
|
fsys, err := fs.Sub(f, dir)
|
||||||
|
if err != nil {
|
||||||
|
log.Error().Err(err).Str("dir", dir).Msg("could not sub into dir")
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
return http.FS(fsys)
|
||||||
|
}
|
||||||
|
BIN
assets/web/swagger-ui/favicon-16x16.png
Normal file
BIN
assets/web/swagger-ui/favicon-16x16.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 665 B |
BIN
assets/web/swagger-ui/favicon-32x32.png
Normal file
BIN
assets/web/swagger-ui/favicon-32x32.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 628 B |
62
assets/web/swagger-ui/index.html
Normal file
62
assets/web/swagger-ui/index.html
Normal file
@ -0,0 +1,62 @@
|
|||||||
|
<!-- HTML for static distribution bundle build -->
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8" />
|
||||||
|
<title>Swagger UI</title>
|
||||||
|
<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>
|
||||||
|
<div id="swagger-ui"></div>
|
||||||
|
|
||||||
|
<script src="./swagger-ui-bundle.js" charset="UTF-8"></script>
|
||||||
|
<script src="./swagger-ui-standalone-preset.js" charset="UTF-8"></script>
|
||||||
|
<script>
|
||||||
|
window.onload = function () {
|
||||||
|
// Begin Swagger UI call region
|
||||||
|
const ui = SwaggerUIBundle({
|
||||||
|
url: "./schnutibox.swagger.json",
|
||||||
|
dom_id: "#swagger-ui",
|
||||||
|
deepLinking: true,
|
||||||
|
presets: [SwaggerUIBundle.presets.apis, SwaggerUIStandalonePreset],
|
||||||
|
plugins: [SwaggerUIBundle.plugins.DownloadUrl],
|
||||||
|
layout: "StandaloneLayout",
|
||||||
|
});
|
||||||
|
// End Swagger UI call region
|
||||||
|
|
||||||
|
window.ui = ui;
|
||||||
|
};
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
</html>
|
75
assets/web/swagger-ui/oauth2-redirect.html
Normal file
75
assets/web/swagger-ui/oauth2-redirect.html
Normal file
@ -0,0 +1,75 @@
|
|||||||
|
<!doctype html>
|
||||||
|
<html lang="en-US">
|
||||||
|
<head>
|
||||||
|
<title>Swagger UI: OAuth2 Redirect</title>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<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.schema.get("flow") === "authorization_code"
|
||||||
|
) && !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 {
|
||||||
|
let oauthErrorMsg;
|
||||||
|
if (qp.error) {
|
||||||
|
oauthErrorMsg = "["+qp.error+"]: " +
|
||||||
|
(qp.error_description ? qp.error_description+ ". " : "no accessCode received from the server. ") +
|
||||||
|
(qp.error_uri ? "More info: "+qp.error_uri : "");
|
||||||
|
}
|
||||||
|
|
||||||
|
oauth2.errCb({
|
||||||
|
authId: oauth2.auth.name,
|
||||||
|
source: "auth",
|
||||||
|
level: "error",
|
||||||
|
message: oauthErrorMsg || "[Authorization failed]: no accessCode received from the server"
|
||||||
|
});
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
oauth2.callback({auth: oauth2.auth, token: qp, isValid: isValid, redirectUrl: redirectUrl});
|
||||||
|
}
|
||||||
|
window.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
window.addEventListener('DOMContentLoaded', function () {
|
||||||
|
run();
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
</html>
|
106
assets/web/swagger-ui/schnutibox.swagger.json
Normal file
106
assets/web/swagger-ui/schnutibox.swagger.json
Normal file
@ -0,0 +1,106 @@
|
|||||||
|
{
|
||||||
|
"swagger": "2.0",
|
||||||
|
"info": {
|
||||||
|
"title": "schnutibox.proto",
|
||||||
|
"version": "version not set"
|
||||||
|
},
|
||||||
|
"tags": [
|
||||||
|
{
|
||||||
|
"name": "IdentifierService"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"consumes": [
|
||||||
|
"application/json"
|
||||||
|
],
|
||||||
|
"produces": [
|
||||||
|
"application/json"
|
||||||
|
],
|
||||||
|
"paths": {
|
||||||
|
"/v1/identify": {
|
||||||
|
"post": {
|
||||||
|
"operationId": "IdentifierService_Identify",
|
||||||
|
"responses": {
|
||||||
|
"200": {
|
||||||
|
"description": "A successful response.",
|
||||||
|
"schema": {
|
||||||
|
"$ref": "#/definitions/v1IdentifyResponse"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"default": {
|
||||||
|
"description": "An unexpected error response.",
|
||||||
|
"schema": {
|
||||||
|
"$ref": "#/definitions/rpcStatus"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"parameters": [
|
||||||
|
{
|
||||||
|
"name": "body",
|
||||||
|
"in": "body",
|
||||||
|
"required": true,
|
||||||
|
"schema": {
|
||||||
|
"$ref": "#/definitions/v1IdentifyRequest"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"tags": [
|
||||||
|
"IdentifierService"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"definitions": {
|
||||||
|
"protobufAny": {
|
||||||
|
"type": "object",
|
||||||
|
"properties": {
|
||||||
|
"typeUrl": {
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"value": {
|
||||||
|
"type": "string",
|
||||||
|
"format": "byte"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"rpcStatus": {
|
||||||
|
"type": "object",
|
||||||
|
"properties": {
|
||||||
|
"code": {
|
||||||
|
"type": "integer",
|
||||||
|
"format": "int32"
|
||||||
|
},
|
||||||
|
"message": {
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"details": {
|
||||||
|
"type": "array",
|
||||||
|
"items": {
|
||||||
|
"$ref": "#/definitions/protobufAny"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"v1IdentifyRequest": {
|
||||||
|
"type": "object",
|
||||||
|
"properties": {
|
||||||
|
"id": {
|
||||||
|
"type": "string"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"v1IdentifyResponse": {
|
||||||
|
"type": "object",
|
||||||
|
"properties": {
|
||||||
|
"name": {
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"uris": {
|
||||||
|
"type": "array",
|
||||||
|
"items": {
|
||||||
|
"type": "string"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
3
assets/web/swagger-ui/swagger-ui-bundle.js
Normal file
3
assets/web/swagger-ui/swagger-ui-bundle.js
Normal file
File diff suppressed because one or more lines are too long
1
assets/web/swagger-ui/swagger-ui-bundle.js.map
Normal file
1
assets/web/swagger-ui/swagger-ui-bundle.js.map
Normal file
File diff suppressed because one or more lines are too long
3
assets/web/swagger-ui/swagger-ui-es-bundle-core.js
Normal file
3
assets/web/swagger-ui/swagger-ui-es-bundle-core.js
Normal file
File diff suppressed because one or more lines are too long
1
assets/web/swagger-ui/swagger-ui-es-bundle-core.js.map
Normal file
1
assets/web/swagger-ui/swagger-ui-es-bundle-core.js.map
Normal file
File diff suppressed because one or more lines are too long
3
assets/web/swagger-ui/swagger-ui-es-bundle.js
Normal file
3
assets/web/swagger-ui/swagger-ui-es-bundle.js
Normal file
File diff suppressed because one or more lines are too long
1
assets/web/swagger-ui/swagger-ui-es-bundle.js.map
Normal file
1
assets/web/swagger-ui/swagger-ui-es-bundle.js.map
Normal file
File diff suppressed because one or more lines are too long
3
assets/web/swagger-ui/swagger-ui-standalone-preset.js
Normal file
3
assets/web/swagger-ui/swagger-ui-standalone-preset.js
Normal file
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
4
assets/web/swagger-ui/swagger-ui.css
Normal file
4
assets/web/swagger-ui/swagger-ui.css
Normal file
File diff suppressed because one or more lines are too long
1
assets/web/swagger-ui/swagger-ui.css.map
Normal file
1
assets/web/swagger-ui/swagger-ui.css.map
Normal file
File diff suppressed because one or more lines are too long
3
assets/web/swagger-ui/swagger-ui.js
Normal file
3
assets/web/swagger-ui/swagger-ui.js
Normal file
File diff suppressed because one or more lines are too long
1
assets/web/swagger-ui/swagger-ui.js.map
Normal file
1
assets/web/swagger-ui/swagger-ui.js.map
Normal file
File diff suppressed because one or more lines are too long
@ -4,8 +4,8 @@
|
|||||||
<meta charset=utf-8>
|
<meta charset=utf-8>
|
||||||
<title>schnutibox</title>
|
<title>schnutibox</title>
|
||||||
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,300italic,700,700italic">
|
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,300italic,700,700italic">
|
||||||
<link rel="stylesheet" href="/static/files/normalize.css">
|
<link rel="stylesheet" href="/static/normalize.css">
|
||||||
<link rel="stylesheet" href="/static/files/milligram.css">
|
<link rel="stylesheet" href="/static/milligram.css">
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<div class="container">
|
<div class="container">
|
||||||
|
@ -12,3 +12,7 @@ plugins:
|
|||||||
- name: grpc-gateway
|
- name: grpc-gateway
|
||||||
out: pkg/api/v1
|
out: pkg/api/v1
|
||||||
opt: paths=source_relative
|
opt: paths=source_relative
|
||||||
|
|
||||||
|
- name: openapiv2
|
||||||
|
# out: api/openapiv2
|
||||||
|
out: assets/web/swagger-ui
|
||||||
|
@ -99,15 +99,23 @@ func Run(command *cobra.Command, args []string) {
|
|||||||
|
|
||||||
// Define http handlers.
|
// Define http handlers.
|
||||||
mux := http.NewServeMux()
|
mux := http.NewServeMux()
|
||||||
mux.Handle("/", logginghandler.Handler(http.HandlerFunc(root)))
|
|
||||||
mux.Handle("/log", logginghandler.Handler(http.HandlerFunc(sselog.LogHandler)))
|
mux.Handle("/", http.HandlerFunc(root))
|
||||||
|
|
||||||
|
mux.Handle("/log", http.HandlerFunc(sselog.LogHandler))
|
||||||
|
|
||||||
mux.Handle(
|
mux.Handle(
|
||||||
"/static/",
|
"/static/",
|
||||||
logginghandler.Handler(
|
http.StripPrefix("/static/", http.FileServer(assets.Files)),
|
||||||
http.StripPrefix("/static/", http.FileServer(http.FS(assets.Files))),
|
|
||||||
),
|
|
||||||
)
|
)
|
||||||
|
|
||||||
|
mux.Handle(
|
||||||
|
"/swagger-ui/",
|
||||||
|
http.StripPrefix("/swagger-ui/", http.FileServer(assets.SwaggerUI)),
|
||||||
|
)
|
||||||
|
|
||||||
mux.Handle("/metrics", promhttp.Handler())
|
mux.Handle("/metrics", promhttp.Handler())
|
||||||
|
|
||||||
mux.Handle("/api/", http.StripPrefix("/api", gw(grpcServer, lh)))
|
mux.Handle("/api/", http.StripPrefix("/api", gw(grpcServer, lh)))
|
||||||
|
|
||||||
// Serving http.
|
// Serving http.
|
||||||
|
Loading…
Reference in New Issue
Block a user