diff --git a/.gitignore b/.gitignore index 717d048..beddf9f 100644 --- a/.gitignore +++ b/.gitignore @@ -23,5 +23,8 @@ tildes/static/js/tildes.js # don't track site icon files tildes/static/images/site-icons/*.png +# don't track the Swagger UI dist files copied into static dir +tildes/static/swagger-ui/ + # NodeJS dependencies tildes/node_modules/ diff --git a/ansible/playbook.yml b/ansible/playbook.yml index 6f2ae98..32484f8 100644 --- a/ansible/playbook.yml +++ b/ansible/playbook.yml @@ -38,6 +38,8 @@ - redis_module_cell - postgresql_redis_bridge - boussole + - nodejs + - swagger_ui - webassets - scripts - prometheus_node_exporter @@ -54,7 +56,6 @@ roles: - prometheus - java - - nodejs - development - hosts: prod diff --git a/ansible/roles/swagger_ui/meta/main.yml b/ansible/roles/swagger_ui/meta/main.yml new file mode 100644 index 0000000..07904f2 --- /dev/null +++ b/ansible/roles/swagger_ui/meta/main.yml @@ -0,0 +1,3 @@ +--- +dependencies: + - role: nodejs diff --git a/ansible/roles/swagger_ui/tasks/main.yml b/ansible/roles/swagger_ui/tasks/main.yml new file mode 100644 index 0000000..53b404f --- /dev/null +++ b/ansible/roles/swagger_ui/tasks/main.yml @@ -0,0 +1,8 @@ +--- +- name: Copy swagger-ui web assets from node package + copy: + src: "{{ app_dir }}/node_modules/swagger-ui/dist/" + dest: "{{ app_dir }}/static/swagger-ui/" + owner: "{{ app_username }}" + group: "{{ app_username }}" + mode: 0644 diff --git a/tildes/prospector.yaml b/tildes/prospector.yaml index df9408e..a597525 100644 --- a/tildes/prospector.yaml +++ b/tildes/prospector.yaml @@ -5,6 +5,7 @@ max-line-length: 88 ignore-paths: - alembic + - static/swagger-ui pep8: disable: diff --git a/tildes/static/swagger-ui-tildes/index.html b/tildes/static/swagger-ui-tildes/index.html new file mode 100644 index 0000000..fe2954f --- /dev/null +++ b/tildes/static/swagger-ui-tildes/index.html @@ -0,0 +1,54 @@ + + + + + Swagger UI + + + + + +
+ + + + window.onload = function() { + const uiConfig = ${ui_config}; + Object.assign(uiConfig, { + presets: [ + SwaggerUIBundle.presets.apis, + SwaggerUIStandalonePreset, + ], + plugins: [ + SwaggerUIBundle.plugins.DownloadUrl, + ], + }); + const oauthConfig = ${oauth_config}; + // Build a system + const ui = SwaggerUIBundle(uiConfig); + if (oauthConfig) { + ui.initOAuth(oauthConfig); + } + window.ui = ui; + } + + + diff --git a/tildes/tildes/routes.py b/tildes/tildes/routes.py index 47cd54f..4b257e6 100644 --- a/tildes/tildes/routes.py +++ b/tildes/tildes/routes.py @@ -17,6 +17,7 @@ from tildes.resources.user import user_by_username OPENAPI_YAML_FILE = "/opt/tildes/openapi_beta.yaml" +SWAGGER_UI_HTML_FILE = "/opt/tildes/static/swagger-ui-tildes/index.html" def includeme(config: Configurator) -> None: @@ -134,7 +135,9 @@ def includeme(config: Configurator) -> None: # Routes for the JSON API # We also provide a path for the full spec and the built-in swagger UI explorer config.pyramid_openapi3_spec(OPENAPI_YAML_FILE, route="/api/beta/openapi.yaml") - config.pyramid_openapi3_add_explorer(route="/api/beta/ui") + config.pyramid_openapi3_add_explorer( + route="/api/beta/ui", template=SWAGGER_UI_HTML_FILE + ) with config.route_prefix_context("/api/beta"): config.add_route("apibeta.topics", "/topics")