feat: endpoint management

This commit is contained in:
Yeuoly 2024-09-26 12:49:00 +08:00
parent 153dc5b3f3
commit ea497f828f
No known key found for this signature in database
GPG Key ID: A66E7E320FB19F61
7 changed files with 268 additions and 10 deletions

View File

@ -1,9 +1,12 @@
from flask_restful import Resource
from flask_login import current_user
from flask_restful import Resource, reqparse
from werkzeug.exceptions import Forbidden
from controllers.console import api
from controllers.console.setup import setup_required
from controllers.console.wraps import account_initialization_required
from libs.login import login_required
from services.plugin.endpoint_service import EndpointService
class EndpointCreateApi(Resource):
@ -11,7 +14,24 @@ class EndpointCreateApi(Resource):
@login_required
@account_initialization_required
def post(self):
pass
user = current_user
if not user.is_admin_or_owner:
raise Forbidden()
parser = reqparse.RequestParser()
parser.add_argument("plugin_unique_identifier", type=str, required=True)
parser.add_argument("settings", type=dict, required=True)
args = parser.parse_args()
plugin_unique_identifier = args["plugin_unique_identifier"]
settings = args["settings"]
return EndpointService.create_endpoint(
tenant_id=user.current_tenant_id,
user_id=user.id,
plugin_unique_identifier=plugin_unique_identifier,
settings=settings,
)
class EndpointListApi(Resource):
@ -19,7 +39,12 @@ class EndpointListApi(Resource):
@login_required
@account_initialization_required
def get(self):
pass
user = current_user
return EndpointService.list_endpoints(
tenant_id=user.current_tenant_id,
user_id=user.id,
)
class EndpointDeleteApi(Resource):
@ -27,7 +52,17 @@ class EndpointDeleteApi(Resource):
@login_required
@account_initialization_required
def post(self):
pass
user = current_user
parser = reqparse.RequestParser()
parser.add_argument("endpoint_id", type=str, required=True)
args = parser.parse_args()
endpoint_id = args["endpoint_id"]
return EndpointService.delete_endpoint(
tenant_id=user.current_tenant_id, user_id=user.id, endpoint_id=endpoint_id
)
class EndpointUpdateApi(Resource):
@ -35,7 +70,22 @@ class EndpointUpdateApi(Resource):
@login_required
@account_initialization_required
def post(self):
pass
user = current_user
parser = reqparse.RequestParser()
parser.add_argument("endpoint_id", type=str, required=True)
parser.add_argument("settings", type=dict, required=True)
args = parser.parse_args()
endpoint_id = args["endpoint_id"]
settings = args["settings"]
return EndpointService.update_endpoint(
tenant_id=user.current_tenant_id,
user_id=user.id,
endpoint_id=endpoint_id,
settings=settings,
)
class EndpointEnableApi(Resource):
@ -43,7 +93,17 @@ class EndpointEnableApi(Resource):
@login_required
@account_initialization_required
def post(self):
pass
user = current_user
parser = reqparse.RequestParser()
parser.add_argument("endpoint_id", type=str, required=True)
args = parser.parse_args()
endpoint_id = args["endpoint_id"]
return EndpointService.enable_endpoint(
tenant_id=user.current_tenant_id, user_id=user.id, endpoint_id=endpoint_id
)
class EndpointDisableApi(Resource):
@ -51,7 +111,17 @@ class EndpointDisableApi(Resource):
@login_required
@account_initialization_required
def post(self):
pass
user = current_user
parser = reqparse.RequestParser()
parser.add_argument("endpoint_id", type=str, required=True)
args = parser.parse_args()
endpoint_id = args["endpoint_id"]
return EndpointService.disable_endpoint(
tenant_id=user.current_tenant_id, user_id=user.id, endpoint_id=endpoint_id
)
api.add_resource(EndpointCreateApi, "/workspaces/current/endpoints/create")
@ -59,4 +129,4 @@ api.add_resource(EndpointListApi, "/workspaces/current/endpoints/list")
api.add_resource(EndpointDeleteApi, "/workspaces/current/endpoints/delete")
api.add_resource(EndpointUpdateApi, "/workspaces/current/endpoints/update")
api.add_resource(EndpointEnableApi, "/workspaces/current/endpoints/enable")
api.add_resource(EndpointDisableApi, "/workspaces/current/endpoints/disable")
api.add_resource(EndpointDisableApi, "/workspaces/current/endpoints/disable")

View File

@ -0,0 +1,9 @@
from datetime import datetime
from pydantic import BaseModel
class BasePluginEntity(BaseModel):
id: str
created_at: datetime
updated_at: datetime

View File

@ -0,0 +1,11 @@
from datetime import datetime
from core.plugin.entities.base import BasePluginEntity
class EndpointEntity(BasePluginEntity):
settings: dict
hook_id: str
tenant_id: str
plugin_id: str
expired_at: datetime

View File

@ -0,0 +1,10 @@
from core.plugin.entities.base import BasePluginEntity
class PluginEntity(BasePluginEntity):
name: str
plugin_id: str
plugin_unique_identifier: str
tenant_id: str
endpoints_setups: int
endpoints_active: int

View File

@ -1,5 +1,104 @@
from core.plugin.entities.endpoint import EndpointEntity
from core.plugin.manager.base import BasePluginManager
class PluginEndpointManager(BasePluginManager):
pass
def create_endpoint(self, tenant_id: str, user_id: str, plugin_unique_identifier: str, settings: dict):
"""
Create an endpoint for the given plugin.
Errors will be raised if any error occurs.
"""
self._request_with_plugin_daemon_response(
"POST",
f"plugin/{tenant_id}/endpoint/setup",
dict,
headers={
"Content-Type": "application/json",
},
data={
"user_id": user_id,
"plugin_unique_identifier": plugin_unique_identifier,
"settings": settings,
},
)
def list_endpoints(self, tenant_id: str, user_id: str):
"""
List all endpoints for the given tenant and user.
"""
return self._request_with_plugin_daemon_response(
"GET",
f"plugin/{tenant_id}/endpoint/list",
list[EndpointEntity],
params={"page": 1, "page_size": 256},
)
def list_plugin_endpoints(self, tenant_id: str, user_id: str, plugin_unique_identifier: str):
"""
List all endpoints for the given tenant, user and plugin.
"""
return self._request_with_plugin_daemon_response(
"GET",
f"plugin/{tenant_id}/endpoint/list/plugin",
list[EndpointEntity],
headers={
"Content-Type": "application/json",
},
data={
"plugin_unique_identifier": plugin_unique_identifier,
},
)
def update_endpoint(self, tenant_id: str, user_id: str, endpoint_id: str, settings: dict):
"""
Update the settings of the given endpoint.
"""
self._request_with_plugin_daemon_response(
"POST",
f"plugin/{tenant_id}/endpoint/update",
dict,
data={
"endpoint_id": endpoint_id,
"settings": settings,
},
)
def delete_endpoint(self, tenant_id: str, user_id: str, endpoint_id: str):
"""
Delete the given endpoint.
"""
self._request_with_plugin_daemon_response(
"DELETE",
f"plugin/{tenant_id}/endpoint/remove",
dict,
data={
"endpoint_id": endpoint_id,
},
)
def enable_endpoint(self, tenant_id: str, user_id: str, endpoint_id: str):
"""
Enable the given endpoint.
"""
self._request_with_plugin_daemon_response(
"POST",
f"plugin/{tenant_id}/endpoint/enable",
dict,
data={
"endpoint_id": endpoint_id,
},
)
def disable_endpoint(self, tenant_id: str, user_id: str, endpoint_id: str):
"""
Disable the given endpoint.
"""
self._request_with_plugin_daemon_response(
"POST",
f"plugin/{tenant_id}/endpoint/disable",
dict,
data={
"endpoint_id": endpoint_id,
},
)

View File

@ -1,5 +1,6 @@
from collections.abc import Generator
from core.plugin.entities.plugin import PluginEntity
from core.plugin.entities.plugin_daemon import InstallPluginMessage
from core.plugin.manager.base import BasePluginManager
@ -12,6 +13,14 @@ class PluginInstallationManager(BasePluginManager):
"GET", f"plugin/{tenant_id}/fetch/identifier", bool, params={"plugin_unique_identifier": identifier}
)
def list_plugins(self, tenant_id: str) -> list[PluginEntity]:
return self._request_with_plugin_daemon_response(
"GET",
f"plugin/{tenant_id}/management/list",
list[PluginEntity],
params={"page": 1, "page_size": 256},
)
def install_from_pkg(self, tenant_id: str, pkg: bytes) -> Generator[InstallPluginMessage, None, None]:
"""
Install a plugin from a package.

View File

@ -1,2 +1,52 @@
from core.plugin.manager.endpoint import PluginEndpointManager
class EndpointService:
pass
@classmethod
def create_endpoint(cls, tenant_id: str, user_id: str, plugin_unique_identifier: str, settings: dict):
return PluginEndpointManager().create_endpoint(
tenant_id=tenant_id,
user_id=user_id,
plugin_unique_identifier=plugin_unique_identifier,
settings=settings,
)
@classmethod
def list_endpoints(cls, tenant_id: str, user_id: str):
return PluginEndpointManager().list_endpoints(
tenant_id=tenant_id,
user_id=user_id,
)
@classmethod
def update_endpoint(cls, tenant_id: str, user_id: str, endpoint_id: str, settings: dict):
return PluginEndpointManager().update_endpoint(
tenant_id=tenant_id,
user_id=user_id,
endpoint_id=endpoint_id,
settings=settings,
)
@classmethod
def delete_endpoint(cls, tenant_id: str, user_id: str, endpoint_id: str):
return PluginEndpointManager().delete_endpoint(
tenant_id=tenant_id,
user_id=user_id,
endpoint_id=endpoint_id,
)
@classmethod
def enable_endpoint(cls, tenant_id: str, user_id: str, endpoint_id: str):
return PluginEndpointManager().enable_endpoint(
tenant_id=tenant_id,
user_id=user_id,
endpoint_id=endpoint_id,
)
@classmethod
def disable_endpoint(cls, tenant_id: str, user_id: str, endpoint_id: str):
return PluginEndpointManager().disable_endpoint(
tenant_id=tenant_id,
user_id=user_id,
endpoint_id=endpoint_id,
)