Files
2024-12-29 09:19:07 +02:00

108 lines
4.6 KiB
Python

import json
from pathlib import Path
from aiohttp import web
from typing import Dict, Any
from .constants import (
FLOWS_PATH, CORE_PATH, LINKER_PATH, FLOW_PATH, APP_CONFIGS, FLOWMSG,FLOWS_CONFIG_FILE, logger
)
from .route_manager import RouteManager
from .api_handlers import (
list_themes_handler, get_theme_css_handler, flow_version_handler,
apps_handler, extension_node_map_handler,
install_package_handler, update_package_handler, uninstall_package_handler,
installed_custom_nodes_handler, preview_flow_handler,
reset_preview_handler, create_flow_handler, update_flow_handler, delete_flow_handler,
set_model_preview_handler,
clear_model_preview_handler,
list_model_previews_handler,
get_model_preview_handler
)
class FlowManager:
@staticmethod
def setup_app_routes(app: web.Application) -> None:
try:
FlowManager._setup_flows_routes(app)
FlowManager._setup_core_routes(app)
FlowManager._setup_api_routes(app)
FlowManager._setup_additional_routes(app)
except Exception as e:
logger.error(f"{FLOWMSG}: Failed to set up routes: {e}")
@staticmethod
def _setup_flows_routes(app: web.Application) -> None:
for flow_dir in filter(lambda d: d.is_dir(), FLOWS_PATH.iterdir()):
conf_file = flow_dir / FLOWS_CONFIG_FILE
if not conf_file.is_file():
# logger.warning(f"{FLOWMSG}: Config file not found in {flow_dir}")
continue
conf = FlowManager._load_config(conf_file)
flow_url = conf.get('url')
if not flow_url:
logger.warning(f"{FLOWMSG}: Missing 'url' in config for {flow_dir}")
continue
app.add_routes(RouteManager.create_routes(f"flow/{flow_url}", flow_dir))
APP_CONFIGS.append(conf)
@staticmethod
def _setup_core_routes(app: web.Application) -> None:
if CORE_PATH.is_dir():
app.router.add_get('/core/css/themes/list', list_themes_handler)
app.router.add_get('/core/css/themes/{filename}', get_theme_css_handler)
app.router.add_static('/core/', path=CORE_PATH, name='core')
@staticmethod
def _setup_api_routes(app: web.Application) -> None:
api_routes = [
(f'/flow/api/apps', 'GET', apps_handler),
(f'/flow/api/extension-node-map', 'GET', extension_node_map_handler),
(f'/flow/api/install-package', 'POST', install_package_handler),
(f'/flow/api/update-package', 'POST', update_package_handler),
(f'/flow/api/uninstall-package', 'POST', uninstall_package_handler),
(f'/flow/api/flow-version', 'GET', flow_version_handler),
(f'/flow/api/installed-custom-nodes', 'GET', installed_custom_nodes_handler),
(f'/flow/api/preview-flow', 'POST', preview_flow_handler),
(f'/flow/api/reset-preview', 'POST', reset_preview_handler),
(f'/flow/api/create-flow', 'POST', create_flow_handler),
(f'/flow/api/update-flow', 'POST', update_flow_handler),
(f'/flow/api/delete-flow', 'DELETE', delete_flow_handler),
(f'/flow/api/model-preview', 'POST', set_model_preview_handler),
(f'/flow/api/model-preview', 'DELETE', clear_model_preview_handler),
(f'/flow/api/model-previews', 'POST', list_model_previews_handler),
(f'/flow/api/model-preview', 'GET', get_model_preview_handler),
]
for path, method, handler in api_routes:
if method == 'GET':
app.router.add_get(path, handler)
elif method == 'POST':
app.router.add_post(path, handler)
elif method == 'DELETE':
app.router.add_delete(path, handler)
@staticmethod
def _setup_additional_routes(app: web.Application) -> None:
if LINKER_PATH.is_dir():
app.add_routes(RouteManager.create_routes('flow/linker', LINKER_PATH))
if FLOW_PATH.is_dir():
app.add_routes(RouteManager.create_routes('flow', FLOW_PATH))
@staticmethod
def _load_config(conf_file: Path) -> Dict[str, Any]:
try:
with conf_file.open('r') as f:
return json.load(f)
except json.JSONDecodeError as e:
logger.error(f"{FLOWMSG}: Invalid JSON in {conf_file}: {e}")
return {}
except Exception as e:
logger.error(f"{FLOWMSG}: Error loading config from {conf_file}: {e}")
return {}