From 2096aa61e8cb04f6f6b5fb6be87c843bd64be9fc Mon Sep 17 00:00:00 2001 From: Yansong Zhang <916125788@qq.com> Date: Mon, 13 Oct 2025 15:12:44 +0800 Subject: [PATCH] fix: get app model without check tenant in trial --- api/controllers/console/app/wraps.py | 49 ++++++++++++++++++++++++ api/controllers/console/explore/trial.py | 8 ++-- 2 files changed, 53 insertions(+), 4 deletions(-) diff --git a/api/controllers/console/app/wraps.py b/api/controllers/console/app/wraps.py index 44aba01820..520955c247 100644 --- a/api/controllers/console/app/wraps.py +++ b/api/controllers/console/app/wraps.py @@ -21,6 +21,14 @@ def _load_app_model(app_id: str) -> App | None: ) return app_model +def _load_app_model_with_trial(app_id: str) -> App | None: + assert isinstance(current_user, Account) + app_model = ( + db.session.query(App) + .where(App.id == app_id, App.status == "normal") + .first() + ) + return app_model def get_app_model(view: Callable[P, R] | None = None, *, mode: Union[AppMode, list[AppMode], None] = None): def decorator(view_func: Callable[P, R]): @@ -61,3 +69,44 @@ def get_app_model(view: Callable[P, R] | None = None, *, mode: Union[AppMode, li return decorator else: return decorator(view) + + +def get_app_model_with_trial(view: Callable[P, R] | None = None, *, mode: Union[AppMode, list[AppMode], None] = None): + def decorator(view_func: Callable[P, R]): + @wraps(view_func) + def decorated_view(*args: P.args, **kwargs: P.kwargs): + if not kwargs.get("app_id"): + raise ValueError("missing app_id in path parameters") + + app_id = kwargs.get("app_id") + app_id = str(app_id) + + del kwargs["app_id"] + + app_model = _load_app_model_with_trial(app_id) + + if not app_model: + raise AppNotFoundError() + + app_mode = AppMode.value_of(app_model.mode) + + 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}") + + kwargs["app_model"] = app_model + + return view_func(*args, **kwargs) + + return decorated_view + + if view is None: + return decorator + else: + return decorator(view) \ No newline at end of file diff --git a/api/controllers/console/explore/trial.py b/api/controllers/console/explore/trial.py index afa3dedf43..cd45ae5645 100644 --- a/api/controllers/console/explore/trial.py +++ b/api/controllers/console/explore/trial.py @@ -20,7 +20,7 @@ from controllers.console.app.error import ( ProviderQuotaExceededError, UnsupportedAudioTypeError, ) -from controllers.console.app.wraps import get_app_model +from controllers.console.app.wraps import get_app_model_with_trial from controllers.console.explore.error import ( AppSuggestedQuestionsAfterAnswerDisabledError, NotChatAppError, @@ -380,7 +380,7 @@ class TrialSitApi(Resource): """Resource for trial app sites.""" @trial_feature_enable - @get_app_model + @get_app_model_with_trial @service_api_ns.marshal_with(build_site_model(service_api_ns)) def get(self, app_model): """Retrieve app site info. @@ -403,7 +403,7 @@ class TrialAppParameterApi(Resource): """Resource for app variables.""" @trial_feature_enable - @get_app_model + @get_app_model_with_trial @marshal_with(fields.parameters_fields) def get(self, app_model): """Retrieve app parameters.""" @@ -432,7 +432,7 @@ class TrialAppParameterApi(Resource): class AppApi(Resource): @trial_feature_enable - @get_app_model + @get_app_model_with_trial @marshal_with(app_detail_fields_with_site) def get(self, app_model): """Get app detail"""