services/ui_backend_service/api/plugins.py (36 lines of code) (raw):
from services.utils import handle_exceptions, web_response
from ..plugins import list_plugins
class PluginsApi(object):
"""
Adds an Api endpoint for fetching UI plugins.
"""
def __init__(self, app):
app.router.add_route('GET', '/plugin', self.get_plugins)
app.router.add_route("GET", "/plugin/{plugin_name}", self.get_plugin)
app.router.add_route("GET", "/plugin/{plugin_name}/{filename:.+}", self.get_plugin_asset)
@handle_exceptions
async def get_plugins(self, request):
"""
---
description: List all plugins
tags:
- Plugin
produces:
- application/json
responses:
"200":
description: Returns list of all plugins
schema:
$ref: '#/definitions/ResponsesPluginList'
"405":
description: invalid HTTP Method
schema:
$ref: '#/definitions/ResponsesError405'
"""
plugins = []
for plugin in list_plugins():
plugins.append(dict(plugin))
return web_response(200, plugins)
@handle_exceptions
async def get_plugin(self, request):
"""
---
description: Get one plugin
tags:
- Plugin
parameters:
- $ref: '#/definitions/Params/Path/plugin_name'
produces:
- application/json
responses:
"200":
description: Returns one plugin
schema:
$ref: '#/definitions/ResponsesPlugin'
"405":
description: invalid HTTP Method
schema:
$ref: '#/definitions/ResponsesError405'
"""
plugin = _get_plugin_from_request(request)
if not plugin:
return web_response(404, "Plugin not found")
return web_response(200, dict(plugin))
@handle_exceptions
async def get_plugin_asset(self, request):
"""
---
description: Serve plugin asset
tags:
- Plugin
parameters:
- $ref: '#/definitions/Params/Path/plugin_name'
- $ref: '#/definitions/Params/Path/plugin_filename'
produces:
- application/json
responses:
"200":
description: Serve plugin asset, e.g. dist/index.html
"405":
description: invalid HTTP Method
schema:
$ref: '#/definitions/ResponsesError405'
"""
plugin = _get_plugin_from_request(request)
if not plugin:
return web_response(404, "Plugin not found")
filename = request.match_info.get("filename")
try:
return plugin.serve(filename)
except:
return web_response(500, "Internal server error")
def _get_plugin_from_request(request):
_plugins = list_plugins()
plugin_name = request.match_info.get("plugin_name")
for plugin in _plugins:
if plugin.name == plugin_name:
return plugin
return None