From 374a930745b000769f515349c8cbe656a66f1354 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mose=20M=C3=BCller?= Date: Mon, 2 Dec 2024 14:57:23 +0100 Subject: [PATCH] reduces complexity of create_api_application method --- .../server/web_server/api/v1/application.py | 112 ++++++++++-------- 1 file changed, 65 insertions(+), 47 deletions(-) diff --git a/src/pydase/server/web_server/api/v1/application.py b/src/pydase/server/web_server/api/v1/application.py index 1139da6..ff3cc7a 100644 --- a/src/pydase/server/web_server/api/v1/application.py +++ b/src/pydase/server/web_server/api/v1/application.py @@ -24,57 +24,75 @@ STATUS_OK = 200 STATUS_FAILED = 400 +async def _get_value( + state_manager: StateManager, request: aiohttp.web.Request +) -> aiohttp.web.Response: + logger.info("Handle api request: %s", request) + + access_path = request.rel_url.query["access_path"] + + status = STATUS_OK + try: + result = get_value(state_manager, access_path) + except Exception as e: + logger.exception(e) + result = dump(e) + status = STATUS_FAILED + return aiohttp.web.json_response(result, status=status) + + +async def _update_value( + state_manager: StateManager, request: aiohttp.web.Request +) -> aiohttp.web.Response: + data: UpdateDict = await request.json() + + try: + update_value(state_manager, data) + + return aiohttp.web.json_response() + except Exception as e: + logger.exception(e) + return aiohttp.web.json_response(dump(e), status=STATUS_FAILED) + + +async def _trigger_method( + state_manager: StateManager, request: aiohttp.web.Request +) -> aiohttp.web.Response: + data: TriggerMethodDict = await request.json() + + method = get_object_attr_from_path(state_manager.service, data["access_path"]) + + try: + if inspect.iscoroutinefunction(method): + method_return = await trigger_async_method( + state_manager=state_manager, data=data + ) + else: + method_return = trigger_method(state_manager=state_manager, data=data) + + return aiohttp.web.json_response(method_return) + + except Exception as e: + logger.exception(e) + return aiohttp.web.json_response(dump(e), status=STATUS_FAILED) + + def create_api_application(state_manager: StateManager) -> aiohttp.web.Application: api_application = aiohttp.web.Application( middlewares=(aiohttp_middlewares.error.error_middleware(),) ) - async def _get_value(request: aiohttp.web.Request) -> aiohttp.web.Response: - logger.info("Handle api request: %s", request) - - access_path = request.rel_url.query["access_path"] - - status = STATUS_OK - try: - result = get_value(state_manager, access_path) - except Exception as e: - logger.exception(e) - result = dump(e) - status = STATUS_FAILED - return aiohttp.web.json_response(result, status=status) - - async def _update_value(request: aiohttp.web.Request) -> aiohttp.web.Response: - data: UpdateDict = await request.json() - - try: - update_value(state_manager, data) - - return aiohttp.web.json_response() - except Exception as e: - logger.exception(e) - return aiohttp.web.json_response(dump(e), status=STATUS_FAILED) - - async def _trigger_method(request: aiohttp.web.Request) -> aiohttp.web.Response: - data: TriggerMethodDict = await request.json() - - method = get_object_attr_from_path(state_manager.service, data["access_path"]) - - try: - if inspect.iscoroutinefunction(method): - method_return = await trigger_async_method( - state_manager=state_manager, data=data - ) - else: - method_return = trigger_method(state_manager=state_manager, data=data) - - return aiohttp.web.json_response(method_return) - - except Exception as e: - logger.exception(e) - return aiohttp.web.json_response(dump(e), status=STATUS_FAILED) - - api_application.router.add_get("/get_value", _get_value) - api_application.router.add_put("/update_value", _update_value) - api_application.router.add_put("/trigger_method", _trigger_method) + api_application.router.add_get( + "/get_value", + lambda request: _get_value(state_manager=state_manager, request=request), + ) + api_application.router.add_put( + "/update_value", + lambda request: _update_value(state_manager=state_manager, request=request), + ) + api_application.router.add_put( + "/trigger_method", + lambda request: _trigger_method(state_manager=state_manager, request=request), + ) return api_application