From 8628595590a083079ff12239c5a7d9aef8b74c80 Mon Sep 17 00:00:00 2001
From: Jens Langhammer <jens.langhammer@beryju.org>
Date: Sun, 18 Apr 2021 17:15:19 +0200
Subject: [PATCH] website: add API Browser

Signed-off-by: Jens Langhammer <jens.langhammer@beryju.org>
---
 website/docusaurus.config.js |   6 ++
 website/package-lock.json    | 172 +++++++++++++++++++++++++++++++++++
 website/package.json         |   1 +
 website/src/pages/api.jsx    |  29 ++++++
 website/static/swagger.yaml  |   1 +
 5 files changed, 209 insertions(+)
 create mode 100644 website/src/pages/api.jsx
 create mode 120000 website/static/swagger.yaml

diff --git a/website/docusaurus.config.js b/website/docusaurus.config.js
index a0bb5d41a..c60f9e09a 100644
--- a/website/docusaurus.config.js
+++ b/website/docusaurus.config.js
@@ -21,6 +21,12 @@ module.exports = {
                     label: "Docs",
                     position: "left",
                 },
+                {
+                    to: "api/",
+                    activeBasePath: "api",
+                    label: "API",
+                    position: "left",
+                },
                 {
                     href: "https://github.com/beryju/authentik",
                     label: "GitHub",
diff --git a/website/package-lock.json b/website/package-lock.json
index 775fac061..0d8b1b39d 100644
--- a/website/package-lock.json
+++ b/website/package-lock.json
@@ -140,6 +140,14 @@
                 "@algolia/requester-common": "4.8.6"
             }
         },
+        "@apitools/openapi-parser": {
+            "version": "0.0.7",
+            "resolved": "https://registry.npmjs.org/@apitools/openapi-parser/-/openapi-parser-0.0.7.tgz",
+            "integrity": "sha512-Bm+GmJ/HIJoNpcwEUSEF9Zh1SqTQ+LsPEK9u5EznVuvoYvVv+dyOWL5/UOAibkNF+wHv7uWS57+NICogPMwzMw==",
+            "requires": {
+                "swagger-client": "^3.13.1"
+            }
+        },
         "@babel/code-frame": {
             "version": "7.10.4",
             "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz",
@@ -4478,6 +4486,11 @@
             "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz",
             "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ=="
         },
+        "asynckit": {
+            "version": "0.4.0",
+            "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
+            "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k="
+        },
         "at-least-node": {
             "version": "1.0.0",
             "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz",
@@ -4809,6 +4822,11 @@
             "resolved": "https://registry.npmjs.org/base16/-/base16-1.0.0.tgz",
             "integrity": "sha1-4pf2DX7BAUp6lxo568ipjAtoHnA="
         },
+        "base64-arraybuffer": {
+            "version": "0.2.0",
+            "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.2.0.tgz",
+            "integrity": "sha512-7emyCsu1/xiBXgQZrscw/8KPRT44I4Yq9Pe6EGs3aPRTsWuggML1/1DTuZUuIaJPIm1FTDUVXl4x/yW8s0kQDQ=="
+        },
         "base64-js": {
             "version": "1.5.1",
             "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
@@ -5074,6 +5092,11 @@
                 "node-releases": "^1.1.66"
             }
         },
+        "btoa": {
+            "version": "1.2.1",
+            "resolved": "https://registry.npmjs.org/btoa/-/btoa-1.2.1.tgz",
+            "integrity": "sha512-SB4/MIGlsiVkMcHmT+pSmIPoNDoHg+7cMzmt3Uxt628MTz2487DKSqK/fuhFBrkuqrYv5UCEnACpF4dTFNKc/g=="
+        },
         "buffer": {
             "version": "4.9.2",
             "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz",
@@ -5656,6 +5679,14 @@
             "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.1.tgz",
             "integrity": "sha512-puCDz0CzydiSYOrnXpz/PKd69zRrribezjtE9yd4zvytoRc8+RY/KJPvtPFKZS3E3wP6neGyMe0vOTlHO5L3Pw=="
         },
+        "combined-stream": {
+            "version": "1.0.8",
+            "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
+            "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
+            "requires": {
+                "delayed-stream": "~1.0.0"
+            }
+        },
         "comma-separated-tokens": {
             "version": "1.0.8",
             "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-1.0.8.tgz",
@@ -6829,6 +6860,11 @@
                 "slash": "^3.0.0"
             }
         },
+        "delayed-stream": {
+            "version": "1.0.0",
+            "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
+            "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk="
+        },
         "delegate": {
             "version": "3.2.0",
             "resolved": "https://registry.npmjs.org/delegate/-/delegate-3.2.0.tgz",
@@ -7553,6 +7589,11 @@
                 "picomatch": "^2.2.1"
             }
         },
+        "fast-json-patch": {
+            "version": "3.0.0-1",
+            "resolved": "https://registry.npmjs.org/fast-json-patch/-/fast-json-patch-3.0.0-1.tgz",
+            "integrity": "sha512-6pdFb07cknxvPzCeLsFHStEy+MysPJPgZQ9LbQ/2O67unQF93SNqfdSqnPPl71YMHX+AD8gbl7iuoGFzHEdDuw=="
+        },
         "fast-json-stable-stringify": {
             "version": "2.1.0",
             "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
@@ -7919,6 +7960,16 @@
                 }
             }
         },
+        "form-data": {
+            "version": "2.5.1",
+            "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz",
+            "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==",
+            "requires": {
+                "asynckit": "^0.4.0",
+                "combined-stream": "^1.0.6",
+                "mime-types": "^2.1.12"
+            }
+        },
         "forwarded": {
             "version": "0.1.2",
             "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz",
@@ -9245,6 +9296,14 @@
             "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
             "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8="
         },
+        "isomorphic-form-data": {
+            "version": "2.0.0",
+            "resolved": "https://registry.npmjs.org/isomorphic-form-data/-/isomorphic-form-data-2.0.0.tgz",
+            "integrity": "sha512-TYgVnXWeESVmQSg4GLVbalmQ+B4NPi/H4eWxqALKj63KsUrcu301YDjBqaOw3h+cbak7Na4Xyps3BiptHtxTfg==",
+            "requires": {
+                "form-data": "^2.3.2"
+            }
+        },
         "jest-worker": {
             "version": "26.6.2",
             "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz",
@@ -9398,6 +9457,19 @@
             "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz",
             "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA="
         },
+        "lit-element": {
+            "version": "2.4.0",
+            "resolved": "https://registry.npmjs.org/lit-element/-/lit-element-2.4.0.tgz",
+            "integrity": "sha512-pBGLglxyhq/Prk2H91nA0KByq/hx/wssJBQFiYqXhGDvEnY31PRGYf1RglVzyLeRysu0IHm2K0P196uLLWmwFg==",
+            "requires": {
+                "lit-html": "^1.1.1"
+            }
+        },
+        "lit-html": {
+            "version": "1.2.1",
+            "resolved": "https://registry.npmjs.org/lit-html/-/lit-html-1.2.1.tgz",
+            "integrity": "sha512-GSJHHXMGLZDzTRq59IUfL9FCdAlGfqNp/dEa7k7aBaaWD+JKaCjsAk9KYm2V12ItonVaYx2dprN66Zdm1AuBTQ=="
+        },
         "loader-runner": {
             "version": "2.4.0",
             "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz",
@@ -9607,6 +9679,11 @@
             "resolved": "https://registry.npmjs.org/markdown-escapes/-/markdown-escapes-1.0.4.tgz",
             "integrity": "sha512-8z4efJYk43E0upd0NbVXwgSTQs6cT3T06etieCMEg7dRbzCbxUCK/GHlX8mhHRDcp+OLlHkPKsvqQTCvsRl2cg=="
         },
+        "marked": {
+            "version": "2.0.3",
+            "resolved": "https://registry.npmjs.org/marked/-/marked-2.0.3.tgz",
+            "integrity": "sha512-5otztIIcJfPc2qGTN8cVtOJEjNJZ0jwa46INMagrYfk0EvqtRuEHLsEe0LrFS0/q+ZRKT0+kXK7P2T1AN5lWRA=="
+        },
         "md5.js": {
             "version": "1.3.5",
             "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz",
@@ -14613,6 +14690,11 @@
             "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz",
             "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA="
         },
+        "querystring-browser": {
+            "version": "1.0.4",
+            "resolved": "https://registry.npmjs.org/querystring-browser/-/querystring-browser-1.0.4.tgz",
+            "integrity": "sha1-8uNYgYQKgZvHsb9Zf68JeeZiLcY="
+        },
         "querystring-es3": {
             "version": "0.2.1",
             "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz",
@@ -14645,6 +14727,19 @@
             "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
             "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg=="
         },
+        "rapidoc": {
+            "version": "9.0.0",
+            "resolved": "https://registry.npmjs.org/rapidoc/-/rapidoc-9.0.0.tgz",
+            "integrity": "sha512-ZZwUdzKLz6NtYdK92hwlwoG38aH3UMDbvwSk/o2crnDD21g909PRHvzSd3CxJqB8qbLAnU73LQmaxunQStzrXg==",
+            "requires": {
+                "@apitools/openapi-parser": "^0.0.7",
+                "base64-arraybuffer": "^0.2.0",
+                "lit-element": "2.4.0",
+                "lit-html": "1.2.1",
+                "marked": "^2.0.1",
+                "prismjs": "^1.23.0"
+            }
+        },
         "raw-body": {
             "version": "2.4.0",
             "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz",
@@ -15932,6 +16027,33 @@
                 "rechoir": "^0.6.2"
             }
         },
+        "side-channel": {
+            "version": "1.0.4",
+            "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz",
+            "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==",
+            "requires": {
+                "call-bind": "^1.0.0",
+                "get-intrinsic": "^1.0.2",
+                "object-inspect": "^1.9.0"
+            },
+            "dependencies": {
+                "get-intrinsic": {
+                    "version": "1.1.1",
+                    "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz",
+                    "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==",
+                    "requires": {
+                        "function-bind": "^1.1.1",
+                        "has": "^1.0.3",
+                        "has-symbols": "^1.0.1"
+                    }
+                },
+                "object-inspect": {
+                    "version": "1.10.2",
+                    "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.10.2.tgz",
+                    "integrity": "sha512-gz58rdPpadwztRrPjZE9DZLOABUpTGdcANUgOwBFO1C+HZZhePoP83M65WGDmbpwFYJSWqavbl4SgDn4k8RYTA=="
+                }
+            }
+        },
         "signal-exit": {
             "version": "3.0.3",
             "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz",
@@ -16686,6 +16808,51 @@
                 }
             }
         },
+        "swagger-client": {
+            "version": "3.13.2",
+            "resolved": "https://registry.npmjs.org/swagger-client/-/swagger-client-3.13.2.tgz",
+            "integrity": "sha512-kamtyXtmbZiA2C5YTVqJYgoPJgzqtM5RbeP23Rt/YPYjMArTKZ2fjx1UTsI0aSbws0GluU5pVHiGp8YMciSUfw==",
+            "requires": {
+                "@babel/runtime-corejs3": "^7.11.2",
+                "btoa": "^1.2.1",
+                "buffer": "^6.0.3",
+                "cookie": "~0.4.1",
+                "cross-fetch": "^3.0.6",
+                "deep-extend": "~0.6.0",
+                "fast-json-patch": "^3.0.0-1",
+                "isomorphic-form-data": "~2.0.0",
+                "js-yaml": "^3.14.0",
+                "lodash": "^4.17.19",
+                "qs": "^6.9.4",
+                "querystring-browser": "^1.0.4",
+                "traverse": "~0.6.6",
+                "url": "~0.11.0"
+            },
+            "dependencies": {
+                "buffer": {
+                    "version": "6.0.3",
+                    "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz",
+                    "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==",
+                    "requires": {
+                        "base64-js": "^1.3.1",
+                        "ieee754": "^1.2.1"
+                    }
+                },
+                "cookie": {
+                    "version": "0.4.1",
+                    "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz",
+                    "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA=="
+                },
+                "qs": {
+                    "version": "6.10.1",
+                    "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.1.tgz",
+                    "integrity": "sha512-M528Hph6wsSVOBiYUnGf+K/7w0hNshs/duGsNXPUCLH5XAqjEtiPGwNONLV0tBH8NoGb0mvD5JubnUTrujKDTg==",
+                    "requires": {
+                        "side-channel": "^1.0.4"
+                    }
+                }
+            }
+        },
         "tapable": {
             "version": "1.1.3",
             "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz",
@@ -17015,6 +17182,11 @@
             "resolved": "https://registry.npmjs.org/totalist/-/totalist-1.1.0.tgz",
             "integrity": "sha512-gduQwd1rOdDMGxFG1gEvhV88Oirdo2p+KjoYFU7k2g+i7n6AFFbDQ5kMPUsW0pNbfQsB/cwXvT1i4Bue0s9g5g=="
         },
+        "traverse": {
+            "version": "0.6.6",
+            "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.6.6.tgz",
+            "integrity": "sha1-y99WD9e5r2MlAv7UD5GMFX6pcTc="
+        },
         "trim": {
             "version": "0.0.1",
             "resolved": "https://registry.npmjs.org/trim/-/trim-0.0.1.tgz",
diff --git a/website/package.json b/website/package.json
index de73555c4..f2e2bb39e 100644
--- a/website/package.json
+++ b/website/package.json
@@ -16,6 +16,7 @@
         "@mdx-js/react": "^1.6.22",
         "clsx": "^1.1.1",
         "postcss": "^8.2.10",
+        "rapidoc": "^9.0.0",
         "react": "^17.0.2",
         "react-before-after-slider": "^1.0.4",
         "react-dom": "^17.0.2",
diff --git a/website/src/pages/api.jsx b/website/src/pages/api.jsx
new file mode 100644
index 000000000..dcab20fa2
--- /dev/null
+++ b/website/src/pages/api.jsx
@@ -0,0 +1,29 @@
+import React from "react";
+import Layout from "@theme/Layout";
+import useDocusaurusContext from "@docusaurus/useDocusaurusContext";
+import useBaseUrl from "@docusaurus/useBaseUrl";
+import "rapidoc";
+
+function APIBrowser() {
+    const context = useDocusaurusContext();
+    const { siteConfig = {} } = context;
+    return (
+        <Layout title="API Browser" description={siteConfig.tagline}>
+            <rapi-doc
+                spec-url={useBaseUrl("swagger.yaml")}
+                allow-try="false"
+                show-header="false"
+                theme="dark"
+                render-style="view"
+                primary-color="#fd4b2d"
+                allow-spec-url-load="false"
+                allow-spec-file-load="false">
+                <div slot="logo">
+                    <img src={useBaseUrl("img/icon_top_brand.svg")}  />
+                </div>
+            </rapi-doc>
+        </Layout>
+    );
+}
+
+export default APIBrowser;
diff --git a/website/static/swagger.yaml b/website/static/swagger.yaml
new file mode 120000
index 000000000..722379674
--- /dev/null
+++ b/website/static/swagger.yaml
@@ -0,0 +1 @@
+../../swagger.yaml
\ No newline at end of file