mirror of
https://github.com/langgenius/dify.git
synced 2026-10-04 13:47:55 +08:00
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:
1 parent
24c6815889
commit
635143cb88
91 files changed
+6962
-4576
No files matched your search
@@ -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
|
||||
Reference in new issue
Block a user