1+ import json
2+ from pathlib import Path
3+ from aiohttp import web
4+ from typing import Dict , Any
5+ from .constants import (
6+ FLOWS_PATH , CORE_PATH , LINKER_PATH , FLOW_PATH , APP_CONFIGS , FLOWMSG ,FLOWS_CONFIG_FILE , logger
7+ )
8+ from .route_manager import RouteManager
9+ from .api_handlers import (
10+ list_themes_handler , get_theme_css_handler , flow_version_handler ,
11+ apps_handler , extension_node_map_handler ,
12+ install_package_handler , update_package_handler , uninstall_package_handler ,
13+ installed_custom_nodes_handler , preview_flow_handler ,
14+ reset_preview_handler , create_flow_handler , update_flow_handler , delete_flow_handler
15+ )
16+
17+ class FlowManager :
18+ @staticmethod
19+ def setup_app_routes (app : web .Application ) -> None :
20+ try :
21+ FlowManager ._setup_flows_routes (app )
22+
23+ FlowManager ._setup_core_routes (app )
24+
25+ FlowManager ._setup_api_routes (app )
26+
27+ FlowManager ._setup_additional_routes (app )
28+
29+ except Exception as e :
30+ logger .error (f"{ FLOWMSG } : Failed to set up routes: { e } " )
31+
32+ @staticmethod
33+ def _setup_flows_routes (app : web .Application ) -> None :
34+ for flow_dir in filter (lambda d : d .is_dir (), FLOWS_PATH .iterdir ()):
35+ conf_file = flow_dir / FLOWS_CONFIG_FILE
36+ if not conf_file .is_file ():
37+ # logger.warning(f"{FLOWMSG}: Config file not found in {flow_dir}")
38+ continue
39+
40+ conf = FlowManager ._load_config (conf_file )
41+ flow_url = conf .get ('url' )
42+ if not flow_url :
43+ logger .warning (f"{ FLOWMSG } : Missing 'url' in config for { flow_dir } " )
44+ continue
45+
46+ app .add_routes (RouteManager .create_routes (f"flow/{ flow_url } " , flow_dir ))
47+ APP_CONFIGS .append (conf )
48+
49+ @staticmethod
50+ def _setup_core_routes (app : web .Application ) -> None :
51+ if CORE_PATH .is_dir ():
52+ app .router .add_get ('/core/css/themes/list' , list_themes_handler )
53+ app .router .add_get ('/core/css/themes/{filename}' , get_theme_css_handler )
54+ app .router .add_static ('/core/' , path = CORE_PATH , name = 'core' )
55+
56+ @staticmethod
57+ def _setup_api_routes (app : web .Application ) -> None :
58+ api_routes = [
59+ (f'/flow/api/apps' , 'GET' , apps_handler ),
60+ (f'/flow/api/extension-node-map' , 'GET' , extension_node_map_handler ),
61+ (f'/flow/api/install-package' , 'POST' , install_package_handler ),
62+ (f'/flow/api/update-package' , 'POST' , update_package_handler ),
63+ (f'/flow/api/uninstall-package' , 'POST' , uninstall_package_handler ),
64+ (f'/flow/api/flow-version' , 'GET' , flow_version_handler ),
65+ (f'/flow/api/installed-custom-nodes' , 'GET' , installed_custom_nodes_handler ),
66+ (f'/flow/api/preview-flow' , 'POST' , preview_flow_handler ),
67+ (f'/flow/api/reset-preview' , 'POST' , reset_preview_handler ),
68+ (f'/flow/api/create-flow' , 'POST' , create_flow_handler ),
69+ (f'/flow/api/update-flow' , 'POST' , update_flow_handler ),
70+ (f'/flow/api/delete-flow' , 'DELETE' , delete_flow_handler ),
71+ ]
72+
73+ for path , method , handler in api_routes :
74+ if method == 'GET' :
75+ app .router .add_get (path , handler )
76+ elif method == 'POST' :
77+ app .router .add_post (path , handler )
78+ elif method == 'DELETE' :
79+ app .router .add_delete (path , handler )
80+
81+ @staticmethod
82+ def _setup_additional_routes (app : web .Application ) -> None :
83+ if LINKER_PATH .is_dir ():
84+ app .add_routes (RouteManager .create_routes ('flow/linker' , LINKER_PATH ))
85+ if FLOW_PATH .is_dir ():
86+ app .add_routes (RouteManager .create_routes ('flow' , FLOW_PATH ))
87+
88+ @staticmethod
89+ def _load_config (conf_file : Path ) -> Dict [str , Any ]:
90+ try :
91+ with conf_file .open ('r' ) as f :
92+ return json .load (f )
93+ except json .JSONDecodeError as e :
94+ logger .error (f"{ FLOWMSG } : Invalid JSON in { conf_file } : { e } " )
95+ return {}
96+ except Exception as e :
97+ logger .error (f"{ FLOWMSG } : Error loading config from { conf_file } : { e } " )
98+ return {}
0 commit comments