| 
									
										
										
										
											2024-04-08 18:51:46 +08:00
										 |  |  | from collections.abc import Callable | 
					
						
							|  |  |  | from functools import wraps | 
					
						
							|  |  |  | from typing import Optional, Union | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | from controllers.console.app.error import AppNotFoundError | 
					
						
							|  |  |  | from extensions.ext_database import db | 
					
						
							|  |  |  | from libs.login import current_user | 
					
						
							| 
									
										
										
										
											2024-12-20 14:12:29 +08:00
										 |  |  | from models import App, AppMode | 
					
						
							| 
									
										
										
										
											2024-04-08 18:51:46 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-12-24 18:38:51 +08:00
										 |  |  | def get_app_model(view: Optional[Callable] = None, *, mode: Union[AppMode, list[AppMode], None] = None): | 
					
						
							| 
									
										
										
										
											2024-04-08 18:51:46 +08:00
										 |  |  |     def decorator(view_func): | 
					
						
							|  |  |  |         @wraps(view_func) | 
					
						
							|  |  |  |         def decorated_view(*args, **kwargs): | 
					
						
							| 
									
										
										
										
											2024-08-26 15:29:10 +08:00
										 |  |  |             if not kwargs.get("app_id"): | 
					
						
							|  |  |  |                 raise ValueError("missing app_id in path parameters") | 
					
						
							| 
									
										
										
										
											2024-04-08 18:51:46 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-08-26 15:29:10 +08:00
										 |  |  |             app_id = kwargs.get("app_id") | 
					
						
							| 
									
										
										
										
											2024-04-08 18:51:46 +08:00
										 |  |  |             app_id = str(app_id) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-08-26 15:29:10 +08:00
										 |  |  |             del kwargs["app_id"] | 
					
						
							| 
									
										
										
										
											2024-04-08 18:51:46 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-08-26 15:29:10 +08:00
										 |  |  |             app_model = ( | 
					
						
							|  |  |  |                 db.session.query(App) | 
					
						
							|  |  |  |                 .filter(App.id == app_id, App.tenant_id == current_user.current_tenant_id, App.status == "normal") | 
					
						
							|  |  |  |                 .first() | 
					
						
							|  |  |  |             ) | 
					
						
							| 
									
										
										
										
											2024-04-08 18:51:46 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |             if not app_model: | 
					
						
							|  |  |  |                 raise AppNotFoundError() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             app_mode = AppMode.value_of(app_model.mode) | 
					
						
							|  |  |  |             if app_mode == AppMode.CHANNEL: | 
					
						
							|  |  |  |                 raise AppNotFoundError() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             if mode is not None: | 
					
						
							|  |  |  |                 if isinstance(mode, list): | 
					
						
							|  |  |  |                     modes = mode | 
					
						
							|  |  |  |                 else: | 
					
						
							|  |  |  |                     modes = [mode] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                 if app_mode not in modes: | 
					
						
							|  |  |  |                     mode_values = {m.value for m in modes} | 
					
						
							|  |  |  |                     raise AppNotFoundError(f"App mode is not in the supported list: {mode_values}") | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-08-26 15:29:10 +08:00
										 |  |  |             kwargs["app_model"] = app_model | 
					
						
							| 
									
										
										
										
											2024-04-08 18:51:46 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |             return view_func(*args, **kwargs) | 
					
						
							| 
									
										
										
										
											2024-08-26 15:29:10 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-04-08 18:51:46 +08:00
										 |  |  |         return decorated_view | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if view is None: | 
					
						
							|  |  |  |         return decorator | 
					
						
							|  |  |  |     else: | 
					
						
							|  |  |  |         return decorator(view) |