refactor(api): extract workspace list into layered application service (#39822)

Co-authored-by: WH-2099 <wh2099@pm.me>
This commit is contained in:
Byron.wang
2026-08-05 02:36:16 +00:00
committed by GitHub
co-authored by WH-2099
parent 143bc121da
commit 896e5e20c0
15 changed files with 612 additions and 246 deletions
@@ -0,0 +1,44 @@
"""Composition root for application services used by transport adapters."""
from dataclasses import dataclass
from typing import cast
from flask import Flask, current_app
from sqlalchemy.orm import Session, sessionmaker
from core.db.session_factory import get_session_maker
from repositories.workspace_query_repository import WorkspaceQueryRepository
from services.workspace_query_compat import LegacyWorkspacePlanGateway
from services.workspace_query_service import WorkspaceQueryService
_EXTENSION_KEY = "application_services"
@dataclass(frozen=True, slots=True)
class ApplicationServices:
workspace_queries: WorkspaceQueryService
def build_application_services(
*,
database_client: sessionmaker[Session],
) -> ApplicationServices:
return ApplicationServices(
workspace_queries=WorkspaceQueryService(
workspaces=WorkspaceQueryRepository(
client=database_client,
),
plans=LegacyWorkspacePlanGateway(),
)
)
def init_app(app: Flask) -> None:
app.extensions[_EXTENSION_KEY] = build_application_services(
database_client=get_session_maker(),
)
def application_services() -> ApplicationServices:
"""Return the application services bound to the current Flask app."""
return cast(ApplicationServices, current_app.extensions[_EXTENSION_KEY])