refactor(api): thin console app controllers and separate application boundaries (#42671)

Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
This commit is contained in:
Byron.wangandautofix-ci[bot] authored and GitHub committed 2026-09-24 06:17:38 +00:00
1 parent 24c6815889
commit 635143cb88
91 files changed
+6962 -4576

No files matched your search

+35 -55
View File
@@ -1,7 +1,9 @@
from __future__ import annotations
from http import HTTPStatus
from uuid import UUID
from flask_restx import Resource
from sqlalchemy.orm import Session
from werkzeug.exceptions import Forbidden
from constants.oauth_bearer import Scope
@@ -25,10 +27,12 @@ from controllers.openapi.auth.requirements import (
CheckWorkspaceRole,
)
from controllers.openapi.auth.subjects import AccountSubject
from extensions.ext_application_services import application_services
from extensions.ext_database import db
from machinery.context import RequestContext
from models.account import TenantAccountRole
from services.app_dsl_service import AppDslService, Import
from services.entities.dsl_entities import CheckDependenciesResult, ImportStatus
from services.app_dsl_service import AppDslService
from services.entities.dsl_entities import AppImportParams, CheckDependenciesResult, Import, ImportStatus
from services.errors.account import NoPermissionError
from services.errors.app import WorkflowNotFoundError
@@ -61,6 +65,7 @@ class AppDslImportApi(Resource):
"""
@endpoint(
account_context=True,
op="console_app.dsl.import",
kind=Kind.OBJECT,
summary="Import an app from DSL text or URL",
@@ -87,44 +92,27 @@ class AppDslImportApi(Resource):
),
body=AppDslImportPayload,
returns=(
(200, AppDslImportResponse, "Import completed"),
(202, AppDslImportResponse, "Import pending confirmation"),
(400, AppDslImportResponse, "Import failed"),
(HTTPStatus.OK, AppDslImportResponse, "Import completed"),
(HTTPStatus.ACCEPTED, AppDslImportResponse, "Import pending confirmation"),
(HTTPStatus.BAD_REQUEST, AppDslImportResponse, "Import failed"),
),
)
def post(self, ctx: Context, workspace_id: str, *, body: AppDslImportPayload):
account = ctx.account
with Session(db.engine, expire_on_commit=False) as session:
service = AppDslService(session)
try:
result = service.import_app(
account=account,
import_mode=body.mode,
yaml_content=body.yaml_content,
yaml_url=body.yaml_url,
name=body.name,
description=body.description,
icon_type=body.icon_type,
icon=body.icon,
icon_background=body.icon_background,
app_id=body.app_id,
)
except NoPermissionError as exc:
raise Forbidden(str(exc)) from exc
if result.status == ImportStatus.FAILED:
session.rollback()
else:
session.commit()
def post(self, ctx: RequestContext, workspace_id: str, *, body: AppDslImportPayload):
try:
result = application_services().apps.imports.import_app(
ctx, AppImportParams.model_validate(body.model_dump())
)
except NoPermissionError as exc:
raise Forbidden(str(exc)) from exc
response = _import_response(result, workspace_id=workspace_id)
match result.status:
case ImportStatus.FAILED:
return response, 400
return response, HTTPStatus.BAD_REQUEST
case ImportStatus.PENDING:
return response, 202
return response, HTTPStatus.ACCEPTED
case _:
return response, 200
return response, HTTPStatus.OK
@openapi_ns.route("/workspaces/<string:workspace_id>/apps/imports/<string:import_id>:confirm")
@@ -140,6 +128,7 @@ class AppDslImportConfirmApi(Resource):
"""
@endpoint(
account_context=True,
op="console_app.dsl.import_confirm",
kind=Kind.OBJECT,
summary="Confirm a pending DSL import",
@@ -151,25 +140,17 @@ class AppDslImportConfirmApi(Resource):
CheckRBACPermission(RBACCheck(RBACPermission.APP_IMPORT_EXPORT_DSL, Workspace())),
CheckWorkspaceRole(frozenset({TenantAccountRole.EDITOR, TenantAccountRole.ADMIN, TenantAccountRole.OWNER})),
),
returns=((200, Import, "Import confirmed"), (400, Import, "Import failed")),
returns=((HTTPStatus.OK, Import, "Import confirmed"), (HTTPStatus.BAD_REQUEST, Import, "Import failed")),
)
def post(self, ctx: Context, workspace_id: str, import_id: str):
account = ctx.account
with Session(db.engine, expire_on_commit=False) as session:
service = AppDslService(session)
try:
result = service.confirm_import(import_id=import_id, account=account)
except NoPermissionError as exc:
raise Forbidden(str(exc)) from exc
if result.status == ImportStatus.FAILED:
session.rollback()
else:
session.commit()
def post(self, ctx: RequestContext, workspace_id: str, import_id: str):
try:
result = application_services().apps.imports.confirm_import(ctx, import_id)
except NoPermissionError as exc:
raise Forbidden(str(exc)) from exc
if result.status == ImportStatus.FAILED:
return result, 400
return result, 200
return result, HTTPStatus.BAD_REQUEST
return result, HTTPStatus.OK
@openapi_ns.route("/apps/<string:app_id>/dsl")
@@ -231,6 +212,7 @@ class AppDslCheckDependenciesApi(Resource):
"""
@endpoint(
account_context=True,
op="console_app.dependencies.check",
kind=Kind.OBJECT,
summary="Check plugin dependencies of an app",
@@ -243,11 +225,9 @@ class AppDslCheckDependenciesApi(Resource):
CheckRBACPermission(RBACCheck(RBACPermission.APP_IMPORT_EXPORT_DSL, PlainApp())),
CheckWorkspaceRole(frozenset({TenantAccountRole.EDITOR, TenantAccountRole.ADMIN, TenantAccountRole.OWNER})),
),
returns=(200, CheckDependenciesResult, "Dependencies checked"),
returns=(HTTPStatus.OK, CheckDependenciesResult, "Dependencies checked"),
)
def get(self, ctx: Context, app_id: str):
with Session(db.engine, expire_on_commit=False) as session:
service = AppDslService(session)
result = service.check_dependencies(app_model=ctx.app)
def get(self, ctx: RequestContext, app_id: str):
result = application_services().apps.imports.check_dependencies(ctx, str(UUID(app_id)))
return result, 200
return result, HTTPStatus.OK