This is an automated email from the ASF dual-hosted git repository.

kaxilnaik pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/airflow.git


The following commit(s) were added to refs/heads/main by this push:
     new 39a16c0c4d9 Reorganize ``api_fastapi`` folder into apps (#43062)
39a16c0c4d9 is described below

commit 39a16c0c4d90ca374e0b025d8b64cf911d555f24
Author: Kaxil Naik <[email protected]>
AuthorDate: Wed Oct 16 13:37:36 2024 +0100

    Reorganize ``api_fastapi`` folder into apps (#43062)
---
 .pre-commit-config.yaml                            |  2 +-
 airflow/api_fastapi/app.py                         | 79 ++--------------------
 airflow/api_fastapi/{db => common}/__init__.py     |  0
 .../api_fastapi/{openapi => common/db}/__init__.py |  0
 airflow/api_fastapi/{ => common}/db/common.py      |  2 +-
 airflow/api_fastapi/{ => common}/db/dags.py        |  0
 airflow/api_fastapi/{ => common}/parameters.py     |  0
 airflow/api_fastapi/{routes => common}/router.py   |  0
 .../api_fastapi/{routes => core_api}/__init__.py   |  0
 airflow/api_fastapi/{ => core_api}/app.py          | 61 ++---------------
 .../{serializers => core_api/openapi}/__init__.py  |  0
 .../{ => core_api}/openapi/exceptions.py           |  0
 .../{ => core_api}/openapi/v1-generated.yaml       |  2 +-
 .../api_fastapi/core_api}/routes/__init__.py       |  0
 .../{ => core_api}/routes/public/__init__.py       | 12 ++--
 .../{ => core_api}/routes/public/connections.py    | 13 ++--
 .../{ => core_api}/routes/public/dag_run.py        |  8 +--
 .../{ => core_api}/routes/public/dags.py           | 12 ++--
 .../{ => core_api}/routes/public/monitor.py        |  4 +-
 .../{ => core_api}/routes/public/variables.py      |  8 +--
 .../{ => core_api}/routes/ui/__init__.py           |  6 +-
 .../api_fastapi/{ => core_api}/routes/ui/assets.py |  4 +-
 .../{ => core_api}/routes/ui/dashboard.py          | 10 +--
 .../api_fastapi/core_api/serializers}/__init__.py  |  0
 .../{ => core_api}/serializers/connections.py      |  0
 .../{ => core_api}/serializers/dag_run.py          |  0
 .../api_fastapi/{ => core_api}/serializers/dags.py |  0
 .../{ => core_api}/serializers/dashboard.py        |  0
 .../{ => core_api}/serializers/monitor.py          |  0
 .../{ => core_api}/serializers/variables.py        |  0
 airflow/ui/package.json                            |  2 +-
 contributing-docs/17_adding_api_endpoints.rst      |  6 +-
 .../in_container/run_update_fastapi_api_spec.py    |  2 +-
 .../{routes/ui => core_api}/__init__.py            |  0
 .../api_fastapi/core_api/routes}/__init__.py       |  0
 .../core_api/routes/public}/__init__.py            |  0
 .../routes/public/test_connections.py              |  0
 .../{ => core_api}/routes/public/test_dag_run.py   |  0
 .../{ => core_api}/routes/public/test_dags.py      |  4 +-
 .../{ => core_api}/routes/public/test_monitor.py   |  0
 .../{ => core_api}/routes/public/test_variables.py |  0
 .../api_fastapi/core_api/routes/ui}/__init__.py    |  0
 .../{ => core_api}/routes/ui/test_assets.py        |  0
 .../{ => core_api}/routes/ui/test_dashboard.py     |  0
 44 files changed, 62 insertions(+), 175 deletions(-)

diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml
index fe4315fafc2..467f0e44d80 100644
--- a/.pre-commit-config.yaml
+++ b/.pre-commit-config.yaml
@@ -136,7 +136,7 @@ repos:
           - --fuzzy-match-generates-todo
       - id: insert-license
         name: Add license for all YAML files except Helm templates
-        exclude: 
^\.github/.*$|^.*/.*_vendor/|^chart/templates/.*|.*/reproducible_build.yaml$|^airflow/api_fastapi/openapi/v1-generated.yaml$|^.*/pnpm-lock.yaml$
+        exclude: 
^\.github/.*$|^.*/.*_vendor/|^chart/templates/.*|.*/reproducible_build.yaml$|^airflow/api_fastapi/core_api/openapi/v1-generated.yaml$|^.*/pnpm-lock.yaml$
         types: [yaml]
         files: \.ya?ml$
         args:
diff --git a/airflow/api_fastapi/app.py b/airflow/api_fastapi/app.py
index 912b8496dd6..ffe13bec0fa 100644
--- a/airflow/api_fastapi/app.py
+++ b/airflow/api_fastapi/app.py
@@ -17,40 +17,25 @@
 from __future__ import annotations
 
 import logging
-import os
-from pathlib import Path
-from typing import cast
 
-from fastapi import FastAPI, Request
+from fastapi import FastAPI
 from fastapi.middleware.cors import CORSMiddleware
-from fastapi.responses import HTMLResponse
-from fastapi.staticfiles import StaticFiles
-from fastapi.templating import Jinja2Templates
 
-from airflow.settings import AIRFLOW_PATH
-from airflow.www.extensions.init_dagbag import get_dag_bag
+from airflow.api_fastapi.core_api.app import init_dag_bag, init_plugins, 
init_views
 
 log = logging.getLogger(__name__)
 
 app: FastAPI | None = None
 
 
-def init_dag_bag(app: FastAPI) -> None:
-    """
-    Create global DagBag for the FastAPI application.
-
-    To access it use ``request.app.state.dag_bag``.
-    """
-    app.state.dag_bag = get_dag_bag()
-
-
-def create_app() -> FastAPI:
+def create_app(apps: list[str] | None = None) -> FastAPI:
     from airflow.configuration import conf
 
     app = FastAPI(
+        title="Airflow API",
         description="Airflow API. All endpoints located under ``/public`` can 
be used safely, are stable and backward compatible. "
         "Endpoints located under ``/ui`` are dedicated to the UI and are 
subject to breaking change "
-        "depending on the need of the frontend. Users should not rely on those 
but use the public ones instead."
+        "depending on the need of the frontend. Users should not rely on those 
but use the public ones instead.",
     )
 
     init_dag_bag(app)
@@ -75,60 +60,6 @@ def create_app() -> FastAPI:
     return app
 
 
-def init_views(app: FastAPI) -> None:
-    """Init views by registering the different routers."""
-    from airflow.api_fastapi.routes.public import public_router
-    from airflow.api_fastapi.routes.ui import ui_router
-
-    app.include_router(ui_router)
-    app.include_router(public_router)
-
-    dev_mode = os.environ.get("DEV_MODE", False) == "true"
-
-    directory = Path(AIRFLOW_PATH) / ("airflow/ui/dev" if dev_mode else 
"airflow/ui/dist")
-
-    # During python tests or when the backend is run without having the 
frontend build
-    # those directories might not exist. App should not fail initializing in 
those scenarios.
-    Path(directory).mkdir(exist_ok=True)
-
-    templates = Jinja2Templates(directory=directory)
-
-    app.mount(
-        "/static",
-        StaticFiles(
-            directory=directory,
-            html=True,
-        ),
-        name="webapp_static_folder",
-    )
-
-    @app.get("/webapp/{rest_of_path:path}", response_class=HTMLResponse, 
include_in_schema=False)
-    def webapp(request: Request, rest_of_path: str):
-        return templates.TemplateResponse("/index.html", {"request": request}, 
media_type="text/html")
-
-
-def init_plugins(app: FastAPI) -> None:
-    """Integrate FastAPI app plugins."""
-    from airflow import plugins_manager
-
-    plugins_manager.initialize_fastapi_plugins()
-
-    # After calling initialize_fastapi_plugins, fastapi_apps cannot be None 
anymore.
-    for subapp_dict in cast(list, plugins_manager.fastapi_apps):
-        name = subapp_dict.get("name")
-        subapp = subapp_dict.get("app")
-        if subapp is None:
-            log.error("'app' key is missing for the fastapi app: %s", name)
-            continue
-        url_prefix = subapp_dict.get("url_prefix")
-        if url_prefix is None:
-            log.error("'url_prefix' key is missing for the fastapi app: %s", 
name)
-            continue
-
-        log.debug("Adding subapplication %s under prefix %s", name, url_prefix)
-        app.mount(url_prefix, subapp)
-
-
 def cached_app(config=None, testing=False) -> FastAPI:
     """Return cached instance of Airflow UI app."""
     global app
diff --git a/airflow/api_fastapi/db/__init__.py 
b/airflow/api_fastapi/common/__init__.py
similarity index 100%
copy from airflow/api_fastapi/db/__init__.py
copy to airflow/api_fastapi/common/__init__.py
diff --git a/airflow/api_fastapi/openapi/__init__.py 
b/airflow/api_fastapi/common/db/__init__.py
similarity index 100%
rename from airflow/api_fastapi/openapi/__init__.py
rename to airflow/api_fastapi/common/db/__init__.py
diff --git a/airflow/api_fastapi/db/common.py 
b/airflow/api_fastapi/common/db/common.py
similarity index 97%
rename from airflow/api_fastapi/db/common.py
rename to airflow/api_fastapi/common/db/common.py
index f611eaa64f0..3feb3ba5995 100644
--- a/airflow/api_fastapi/db/common.py
+++ b/airflow/api_fastapi/common/db/common.py
@@ -26,7 +26,7 @@ if TYPE_CHECKING:
     from sqlalchemy.orm import Session
     from sqlalchemy.sql import Select
 
-    from airflow.api_fastapi.parameters import BaseParam
+    from airflow.api_fastapi.common.parameters import BaseParam
 
 
 async def get_session() -> Session:
diff --git a/airflow/api_fastapi/db/dags.py 
b/airflow/api_fastapi/common/db/dags.py
similarity index 100%
rename from airflow/api_fastapi/db/dags.py
rename to airflow/api_fastapi/common/db/dags.py
diff --git a/airflow/api_fastapi/parameters.py 
b/airflow/api_fastapi/common/parameters.py
similarity index 100%
rename from airflow/api_fastapi/parameters.py
rename to airflow/api_fastapi/common/parameters.py
diff --git a/airflow/api_fastapi/routes/router.py 
b/airflow/api_fastapi/common/router.py
similarity index 100%
rename from airflow/api_fastapi/routes/router.py
rename to airflow/api_fastapi/common/router.py
diff --git a/airflow/api_fastapi/routes/__init__.py 
b/airflow/api_fastapi/core_api/__init__.py
similarity index 100%
rename from airflow/api_fastapi/routes/__init__.py
rename to airflow/api_fastapi/core_api/__init__.py
diff --git a/airflow/api_fastapi/app.py b/airflow/api_fastapi/core_api/app.py
similarity index 64%
copy from airflow/api_fastapi/app.py
copy to airflow/api_fastapi/core_api/app.py
index 912b8496dd6..f47a33227f3 100644
--- a/airflow/api_fastapi/app.py
+++ b/airflow/api_fastapi/core_api/app.py
@@ -21,19 +21,17 @@ import os
 from pathlib import Path
 from typing import cast
 
-from fastapi import FastAPI, Request
-from fastapi.middleware.cors import CORSMiddleware
-from fastapi.responses import HTMLResponse
-from fastapi.staticfiles import StaticFiles
-from fastapi.templating import Jinja2Templates
+from fastapi import FastAPI
+from starlette.requests import Request
+from starlette.responses import HTMLResponse
+from starlette.staticfiles import StaticFiles
+from starlette.templating import Jinja2Templates
 
 from airflow.settings import AIRFLOW_PATH
 from airflow.www.extensions.init_dagbag import get_dag_bag
 
 log = logging.getLogger(__name__)
 
-app: FastAPI | None = None
-
 
 def init_dag_bag(app: FastAPI) -> None:
     """
@@ -44,41 +42,10 @@ def init_dag_bag(app: FastAPI) -> None:
     app.state.dag_bag = get_dag_bag()
 
 
-def create_app() -> FastAPI:
-    from airflow.configuration import conf
-
-    app = FastAPI(
-        description="Airflow API. All endpoints located under ``/public`` can 
be used safely, are stable and backward compatible. "
-        "Endpoints located under ``/ui`` are dedicated to the UI and are 
subject to breaking change "
-        "depending on the need of the frontend. Users should not rely on those 
but use the public ones instead."
-    )
-
-    init_dag_bag(app)
-
-    init_views(app)
-
-    init_plugins(app)
-
-    allow_origins = conf.getlist("api", "access_control_allow_origins")
-    allow_methods = conf.getlist("api", "access_control_allow_methods")
-    allow_headers = conf.getlist("api", "access_control_allow_headers")
-
-    if allow_origins or allow_methods or allow_headers:
-        app.add_middleware(
-            CORSMiddleware,
-            allow_origins=allow_origins,
-            allow_credentials=True,
-            allow_methods=allow_methods,
-            allow_headers=allow_headers,
-        )
-
-    return app
-
-
 def init_views(app: FastAPI) -> None:
     """Init views by registering the different routers."""
-    from airflow.api_fastapi.routes.public import public_router
-    from airflow.api_fastapi.routes.ui import ui_router
+    from airflow.api_fastapi.core_api.routes.public import public_router
+    from airflow.api_fastapi.core_api.routes.ui import ui_router
 
     app.include_router(ui_router)
     app.include_router(public_router)
@@ -127,17 +94,3 @@ def init_plugins(app: FastAPI) -> None:
 
         log.debug("Adding subapplication %s under prefix %s", name, url_prefix)
         app.mount(url_prefix, subapp)
-
-
-def cached_app(config=None, testing=False) -> FastAPI:
-    """Return cached instance of Airflow UI app."""
-    global app
-    if not app:
-        app = create_app()
-    return app
-
-
-def purge_cached_app() -> None:
-    """Remove the cached version of the app in global state."""
-    global app
-    app = None
diff --git a/airflow/api_fastapi/serializers/__init__.py 
b/airflow/api_fastapi/core_api/openapi/__init__.py
similarity index 100%
rename from airflow/api_fastapi/serializers/__init__.py
rename to airflow/api_fastapi/core_api/openapi/__init__.py
diff --git a/airflow/api_fastapi/openapi/exceptions.py 
b/airflow/api_fastapi/core_api/openapi/exceptions.py
similarity index 100%
rename from airflow/api_fastapi/openapi/exceptions.py
rename to airflow/api_fastapi/core_api/openapi/exceptions.py
diff --git a/airflow/api_fastapi/openapi/v1-generated.yaml 
b/airflow/api_fastapi/core_api/openapi/v1-generated.yaml
similarity index 99%
rename from airflow/api_fastapi/openapi/v1-generated.yaml
rename to airflow/api_fastapi/core_api/openapi/v1-generated.yaml
index 4b028c315f3..d7ee6340c66 100644
--- a/airflow/api_fastapi/openapi/v1-generated.yaml
+++ b/airflow/api_fastapi/core_api/openapi/v1-generated.yaml
@@ -1,6 +1,6 @@
 openapi: 3.1.0
 info:
-  title: FastAPI
+  title: Airflow API
   description: Airflow API. All endpoints located under ``/public`` can be 
used safely,
     are stable and backward compatible. Endpoints located under ``/ui`` are 
dedicated
     to the UI and are subject to breaking change depending on the need of the 
frontend.
diff --git a/tests/api_fastapi/routes/__init__.py 
b/airflow/api_fastapi/core_api/routes/__init__.py
similarity index 100%
rename from tests/api_fastapi/routes/__init__.py
rename to airflow/api_fastapi/core_api/routes/__init__.py
diff --git a/airflow/api_fastapi/routes/public/__init__.py 
b/airflow/api_fastapi/core_api/routes/public/__init__.py
similarity index 70%
rename from airflow/api_fastapi/routes/public/__init__.py
rename to airflow/api_fastapi/core_api/routes/public/__init__.py
index 01a9b7f2396..3d43a7bbb0e 100644
--- a/airflow/api_fastapi/routes/public/__init__.py
+++ b/airflow/api_fastapi/core_api/routes/public/__init__.py
@@ -17,12 +17,12 @@
 
 from __future__ import annotations
 
-from airflow.api_fastapi.routes.public.connections import connections_router
-from airflow.api_fastapi.routes.public.dag_run import dag_run_router
-from airflow.api_fastapi.routes.public.dags import dags_router
-from airflow.api_fastapi.routes.public.monitor import monitor_router
-from airflow.api_fastapi.routes.public.variables import variables_router
-from airflow.api_fastapi.routes.router import AirflowRouter
+from airflow.api_fastapi.common.router import AirflowRouter
+from airflow.api_fastapi.core_api.routes.public.connections import 
connections_router
+from airflow.api_fastapi.core_api.routes.public.dag_run import dag_run_router
+from airflow.api_fastapi.core_api.routes.public.dags import dags_router
+from airflow.api_fastapi.core_api.routes.public.monitor import monitor_router
+from airflow.api_fastapi.core_api.routes.public.variables import 
variables_router
 
 public_router = AirflowRouter(prefix="/public")
 
diff --git a/airflow/api_fastapi/routes/public/connections.py 
b/airflow/api_fastapi/core_api/routes/public/connections.py
similarity index 87%
rename from airflow/api_fastapi/routes/public/connections.py
rename to airflow/api_fastapi/core_api/routes/public/connections.py
index 76684835cf4..60898d2a63a 100644
--- a/airflow/api_fastapi/routes/public/connections.py
+++ b/airflow/api_fastapi/core_api/routes/public/connections.py
@@ -21,11 +21,14 @@ from sqlalchemy import select
 from sqlalchemy.orm import Session
 from typing_extensions import Annotated
 
-from airflow.api_fastapi.db.common import get_session, paginated_select
-from airflow.api_fastapi.openapi.exceptions import 
create_openapi_http_exception_doc
-from airflow.api_fastapi.parameters import QueryLimit, QueryOffset, SortParam
-from airflow.api_fastapi.routes.router import AirflowRouter
-from airflow.api_fastapi.serializers.connections import 
ConnectionCollectionResponse, ConnectionResponse
+from airflow.api_fastapi.common.db.common import get_session, paginated_select
+from airflow.api_fastapi.common.parameters import QueryLimit, QueryOffset, 
SortParam
+from airflow.api_fastapi.common.router import AirflowRouter
+from airflow.api_fastapi.core_api.openapi.exceptions import 
create_openapi_http_exception_doc
+from airflow.api_fastapi.core_api.serializers.connections import (
+    ConnectionCollectionResponse,
+    ConnectionResponse,
+)
 from airflow.models import Connection
 
 connections_router = AirflowRouter(tags=["Connection"], prefix="/connections")
diff --git a/airflow/api_fastapi/routes/public/dag_run.py 
b/airflow/api_fastapi/core_api/routes/public/dag_run.py
similarity index 88%
rename from airflow/api_fastapi/routes/public/dag_run.py
rename to airflow/api_fastapi/core_api/routes/public/dag_run.py
index 62e4d97a829..035d1b7fd7d 100644
--- a/airflow/api_fastapi/routes/public/dag_run.py
+++ b/airflow/api_fastapi/core_api/routes/public/dag_run.py
@@ -22,10 +22,10 @@ from sqlalchemy import select
 from sqlalchemy.orm import Session
 from typing_extensions import Annotated
 
-from airflow.api_fastapi.db.common import get_session
-from airflow.api_fastapi.openapi.exceptions import 
create_openapi_http_exception_doc
-from airflow.api_fastapi.routes.router import AirflowRouter
-from airflow.api_fastapi.serializers.dag_run import DAGRunResponse
+from airflow.api_fastapi.common.db.common import get_session
+from airflow.api_fastapi.common.router import AirflowRouter
+from airflow.api_fastapi.core_api.openapi.exceptions import 
create_openapi_http_exception_doc
+from airflow.api_fastapi.core_api.serializers.dag_run import DAGRunResponse
 from airflow.models import DagRun
 
 dag_run_router = AirflowRouter(tags=["DagRun"], 
prefix="/dags/{dag_id}/dagRuns")
diff --git a/airflow/api_fastapi/routes/public/dags.py 
b/airflow/api_fastapi/core_api/routes/public/dags.py
similarity index 94%
rename from airflow/api_fastapi/routes/public/dags.py
rename to airflow/api_fastapi/core_api/routes/public/dags.py
index d2b608e0517..81293211fc9 100644
--- a/airflow/api_fastapi/routes/public/dags.py
+++ b/airflow/api_fastapi/core_api/routes/public/dags.py
@@ -23,13 +23,12 @@ from sqlalchemy.orm import Session
 from typing_extensions import Annotated
 
 from airflow.api.common import delete_dag as delete_dag_module
-from airflow.api_fastapi.db.common import (
+from airflow.api_fastapi.common.db.common import (
     get_session,
     paginated_select,
 )
-from airflow.api_fastapi.db.dags import dags_select_with_latest_dag_run
-from airflow.api_fastapi.openapi.exceptions import 
create_openapi_http_exception_doc
-from airflow.api_fastapi.parameters import (
+from airflow.api_fastapi.common.db.dags import dags_select_with_latest_dag_run
+from airflow.api_fastapi.common.parameters import (
     QueryDagDisplayNamePatternSearch,
     QueryDagIdPatternSearch,
     QueryDagIdPatternSearchWithNone,
@@ -42,8 +41,9 @@ from airflow.api_fastapi.parameters import (
     QueryTagsFilter,
     SortParam,
 )
-from airflow.api_fastapi.routes.router import AirflowRouter
-from airflow.api_fastapi.serializers.dags import (
+from airflow.api_fastapi.common.router import AirflowRouter
+from airflow.api_fastapi.core_api.openapi.exceptions import 
create_openapi_http_exception_doc
+from airflow.api_fastapi.core_api.serializers.dags import (
     DAGCollectionResponse,
     DAGDetailsResponse,
     DAGPatchBody,
diff --git a/airflow/api_fastapi/routes/public/monitor.py 
b/airflow/api_fastapi/core_api/routes/public/monitor.py
similarity index 89%
rename from airflow/api_fastapi/routes/public/monitor.py
rename to airflow/api_fastapi/core_api/routes/public/monitor.py
index 30e8f1330a5..e5d746e15c2 100644
--- a/airflow/api_fastapi/routes/public/monitor.py
+++ b/airflow/api_fastapi/core_api/routes/public/monitor.py
@@ -18,8 +18,8 @@
 from __future__ import annotations
 
 from airflow.api.common.airflow_health import get_airflow_health
-from airflow.api_fastapi.routes.router import AirflowRouter
-from airflow.api_fastapi.serializers.monitor import HealthInfoSchema
+from airflow.api_fastapi.common.router import AirflowRouter
+from airflow.api_fastapi.core_api.serializers.monitor import HealthInfoSchema
 
 monitor_router = AirflowRouter(tags=["Monitor"], prefix="/monitor")
 
diff --git a/airflow/api_fastapi/routes/public/variables.py 
b/airflow/api_fastapi/core_api/routes/public/variables.py
similarity index 92%
rename from airflow/api_fastapi/routes/public/variables.py
rename to airflow/api_fastapi/core_api/routes/public/variables.py
index 61cd84c7004..3a46c519c92 100644
--- a/airflow/api_fastapi/routes/public/variables.py
+++ b/airflow/api_fastapi/core_api/routes/public/variables.py
@@ -21,10 +21,10 @@ from sqlalchemy import select
 from sqlalchemy.orm import Session
 from typing_extensions import Annotated
 
-from airflow.api_fastapi.db.common import get_session
-from airflow.api_fastapi.openapi.exceptions import 
create_openapi_http_exception_doc
-from airflow.api_fastapi.routes.router import AirflowRouter
-from airflow.api_fastapi.serializers.variables import VariableBody, 
VariableResponse
+from airflow.api_fastapi.common.db.common import get_session
+from airflow.api_fastapi.common.router import AirflowRouter
+from airflow.api_fastapi.core_api.openapi.exceptions import 
create_openapi_http_exception_doc
+from airflow.api_fastapi.core_api.serializers.variables import VariableBody, 
VariableResponse
 from airflow.models.variable import Variable
 
 variables_router = AirflowRouter(tags=["Variable"], prefix="/variables")
diff --git a/airflow/api_fastapi/routes/ui/__init__.py 
b/airflow/api_fastapi/core_api/routes/ui/__init__.py
similarity index 81%
rename from airflow/api_fastapi/routes/ui/__init__.py
rename to airflow/api_fastapi/core_api/routes/ui/__init__.py
index 2087549c98e..9cd16fcdd16 100644
--- a/airflow/api_fastapi/routes/ui/__init__.py
+++ b/airflow/api_fastapi/core_api/routes/ui/__init__.py
@@ -16,9 +16,9 @@
 # under the License.
 from __future__ import annotations
 
-from airflow.api_fastapi.routes.router import AirflowRouter
-from airflow.api_fastapi.routes.ui.assets import assets_router
-from airflow.api_fastapi.routes.ui.dashboard import dashboard_router
+from airflow.api_fastapi.common.router import AirflowRouter
+from airflow.api_fastapi.core_api.routes.ui.assets import assets_router
+from airflow.api_fastapi.core_api.routes.ui.dashboard import dashboard_router
 
 ui_router = AirflowRouter(prefix="/ui")
 
diff --git a/airflow/api_fastapi/routes/ui/assets.py 
b/airflow/api_fastapi/core_api/routes/ui/assets.py
similarity index 96%
rename from airflow/api_fastapi/routes/ui/assets.py
rename to airflow/api_fastapi/core_api/routes/ui/assets.py
index 31406b1b94d..b8a17c73984 100644
--- a/airflow/api_fastapi/routes/ui/assets.py
+++ b/airflow/api_fastapi/core_api/routes/ui/assets.py
@@ -22,8 +22,8 @@ from sqlalchemy import and_, func, select
 from sqlalchemy.orm import Session
 from typing_extensions import Annotated
 
-from airflow.api_fastapi.db.common import get_session
-from airflow.api_fastapi.routes.router import AirflowRouter
+from airflow.api_fastapi.common.db.common import get_session
+from airflow.api_fastapi.common.router import AirflowRouter
 from airflow.models import DagModel
 from airflow.models.asset import AssetDagRunQueue, AssetEvent, AssetModel, 
DagScheduleAssetReference
 
diff --git a/airflow/api_fastapi/routes/ui/dashboard.py 
b/airflow/api_fastapi/core_api/routes/ui/dashboard.py
similarity index 90%
rename from airflow/api_fastapi/routes/ui/dashboard.py
rename to airflow/api_fastapi/core_api/routes/ui/dashboard.py
index e7cec5fbf0e..e101ca78be7 100644
--- a/airflow/api_fastapi/routes/ui/dashboard.py
+++ b/airflow/api_fastapi/core_api/routes/ui/dashboard.py
@@ -23,17 +23,17 @@ from sqlalchemy import func, select
 from sqlalchemy.orm import Session
 from typing_extensions import Annotated
 
-from airflow.api_fastapi.openapi.exceptions import 
create_openapi_http_exception_doc
-from airflow.api_fastapi.parameters import DateTimeQuery
-from airflow.api_fastapi.serializers.dashboard import 
HistoricalMetricDataResponse
+from airflow.api_fastapi.common.parameters import DateTimeQuery
+from airflow.api_fastapi.core_api.openapi.exceptions import 
create_openapi_http_exception_doc
+from airflow.api_fastapi.core_api.serializers.dashboard import 
HistoricalMetricDataResponse
 from airflow.models.dagrun import DagRun, DagRunType
 from airflow.models.taskinstance import TaskInstance
 from airflow.utils.state import DagRunState, TaskInstanceState
 
 if TYPE_CHECKING:
     from sqlalchemy.orm import Session
-from airflow.api_fastapi.db.common import get_session
-from airflow.api_fastapi.routes.router import AirflowRouter
+from airflow.api_fastapi.common.db.common import get_session
+from airflow.api_fastapi.common.router import AirflowRouter
 from airflow.utils import timezone
 
 dashboard_router = AirflowRouter(tags=["Dashboard"])
diff --git a/tests/api_fastapi/routes/public/__init__.py 
b/airflow/api_fastapi/core_api/serializers/__init__.py
similarity index 100%
rename from tests/api_fastapi/routes/public/__init__.py
rename to airflow/api_fastapi/core_api/serializers/__init__.py
diff --git a/airflow/api_fastapi/serializers/connections.py 
b/airflow/api_fastapi/core_api/serializers/connections.py
similarity index 100%
rename from airflow/api_fastapi/serializers/connections.py
rename to airflow/api_fastapi/core_api/serializers/connections.py
diff --git a/airflow/api_fastapi/serializers/dag_run.py 
b/airflow/api_fastapi/core_api/serializers/dag_run.py
similarity index 100%
rename from airflow/api_fastapi/serializers/dag_run.py
rename to airflow/api_fastapi/core_api/serializers/dag_run.py
diff --git a/airflow/api_fastapi/serializers/dags.py 
b/airflow/api_fastapi/core_api/serializers/dags.py
similarity index 100%
rename from airflow/api_fastapi/serializers/dags.py
rename to airflow/api_fastapi/core_api/serializers/dags.py
diff --git a/airflow/api_fastapi/serializers/dashboard.py 
b/airflow/api_fastapi/core_api/serializers/dashboard.py
similarity index 100%
rename from airflow/api_fastapi/serializers/dashboard.py
rename to airflow/api_fastapi/core_api/serializers/dashboard.py
diff --git a/airflow/api_fastapi/serializers/monitor.py 
b/airflow/api_fastapi/core_api/serializers/monitor.py
similarity index 100%
rename from airflow/api_fastapi/serializers/monitor.py
rename to airflow/api_fastapi/core_api/serializers/monitor.py
diff --git a/airflow/api_fastapi/serializers/variables.py 
b/airflow/api_fastapi/core_api/serializers/variables.py
similarity index 100%
rename from airflow/api_fastapi/serializers/variables.py
rename to airflow/api_fastapi/core_api/serializers/variables.py
diff --git a/airflow/ui/package.json b/airflow/ui/package.json
index a7cf90bb573..c54c9af5bb2 100644
--- a/airflow/ui/package.json
+++ b/airflow/ui/package.json
@@ -11,7 +11,7 @@
     "lint:fix": "eslint --fix && tsc --p tsconfig.app.json",
     "format": "pnpm prettier --write .",
     "preview": "vite preview",
-    "codegen": "openapi-rq -i \"../api_fastapi/openapi/v1-generated.yaml\" -c 
axios --format prettier -o openapi-gen --operationId",
+    "codegen": "openapi-rq -i 
\"../api_fastapi/core_api/openapi/v1-generated.yaml\" -c axios --format 
prettier -o openapi-gen --operationId",
     "test": "vitest run",
     "coverage": "vitest run --coverage"
   },
diff --git a/contributing-docs/17_adding_api_endpoints.rst 
b/contributing-docs/17_adding_api_endpoints.rst
index 2a9ef9af7b0..05dccc72f18 100644
--- a/contributing-docs/17_adding_api_endpoints.rst
+++ b/contributing-docs/17_adding_api_endpoints.rst
@@ -26,7 +26,7 @@ This documentation outlines the steps required to add a new 
API endpoint in Apac
 Introduction
 ------------
 
-The source code for the RestAPI is located under ``api_fastapi``. Endpoints 
are located under ``api_fastapi/views`` and contains different types of 
endpoints. The main two are ``public`` and ``ui``.
+The source code for the RestAPI is located under ``api_fastapi/core_api``. 
Endpoints are located under ``api_fastapi/core_api/routes`` and contains 
different types of endpoints. The main two are ``public`` and ``ui``.
 Public endpoints are part of the public API, standardized, well documented and 
most importantly backward compatible. UI endpoints are custom endpoints made 
for the frontend that do not respect backward compatibility i.e they can be 
adapted at any time for UI needs.
 When adding an endpoint you should try as much as possible to make it reusable 
by the community, have a stable design in mind, standardized and therefore part 
of the public API. If this is not possible because the data types are too 
specific or subject to frequent change
 then adding it to the UI endpoints is more suitable.
@@ -35,7 +35,7 @@ then adding it to the UI endpoints is more suitable.
 Step 1: Implement the Endpoint Logic
 ------------------------------------
 1. Considering the details above decide whether your endpoints should be part 
of the ``public`` or ``ui`` interface.
-1. Navigate to the appropriate views directory in ``api_fastapi/views``.
+1. Navigate to the appropriate routes directory in 
``api_fastapi/core_api/routes``.
 2. Register a new route for your endpoint with the appropriate HTTP method, 
query params, permissions, body type, etc.
 3. Specify the appropriate Pydantic type in the return type annotation.
 
@@ -62,7 +62,7 @@ Step 2: Add tests for your Endpoints
 ------------------------------------
 1. Verify manually with a local API that the endpoint behaves as expected.
 2. Go to the test folder and initialize new tests.
-3. Implements extensives tests to validate query param, permissions, error 
handling etc.
+3. Implements extensive tests to validate query param, permissions, error 
handling etc.
 
 
 Step 3: Documentation
diff --git a/scripts/in_container/run_update_fastapi_api_spec.py 
b/scripts/in_container/run_update_fastapi_api_spec.py
index 5d31b0bee3f..b66587f7203 100644
--- a/scripts/in_container/run_update_fastapi_api_spec.py
+++ b/scripts/in_container/run_update_fastapi_api_spec.py
@@ -23,7 +23,7 @@ from airflow.api_fastapi.app import create_app
 
 app = create_app()
 
-OPENAPI_SPEC_FILE = "airflow/api_fastapi/openapi/v1-generated.yaml"
+OPENAPI_SPEC_FILE = "airflow/api_fastapi/core_api/openapi/v1-generated.yaml"
 
 
 # The persisted openapi spec will list all endpoints (public and ui), this
diff --git a/tests/api_fastapi/routes/ui/__init__.py 
b/tests/api_fastapi/core_api/__init__.py
similarity index 100%
rename from tests/api_fastapi/routes/ui/__init__.py
rename to tests/api_fastapi/core_api/__init__.py
diff --git a/airflow/api_fastapi/db/__init__.py 
b/tests/api_fastapi/core_api/routes/__init__.py
similarity index 100%
copy from airflow/api_fastapi/db/__init__.py
copy to tests/api_fastapi/core_api/routes/__init__.py
diff --git a/airflow/api_fastapi/db/__init__.py 
b/tests/api_fastapi/core_api/routes/public/__init__.py
similarity index 100%
copy from airflow/api_fastapi/db/__init__.py
copy to tests/api_fastapi/core_api/routes/public/__init__.py
diff --git a/tests/api_fastapi/routes/public/test_connections.py 
b/tests/api_fastapi/core_api/routes/public/test_connections.py
similarity index 100%
rename from tests/api_fastapi/routes/public/test_connections.py
rename to tests/api_fastapi/core_api/routes/public/test_connections.py
diff --git a/tests/api_fastapi/routes/public/test_dag_run.py 
b/tests/api_fastapi/core_api/routes/public/test_dag_run.py
similarity index 100%
rename from tests/api_fastapi/routes/public/test_dag_run.py
rename to tests/api_fastapi/core_api/routes/public/test_dag_run.py
diff --git a/tests/api_fastapi/routes/public/test_dags.py 
b/tests/api_fastapi/core_api/routes/public/test_dags.py
similarity index 98%
rename from tests/api_fastapi/routes/public/test_dags.py
rename to tests/api_fastapi/core_api/routes/public/test_dags.py
index 99ac939406f..1055000f425 100644
--- a/tests/api_fastapi/routes/public/test_dags.py
+++ b/tests/api_fastapi/core_api/routes/public/test_dags.py
@@ -293,7 +293,7 @@ class TestDagDetails(TestDagEndpoint):
             "description": None,
             "doc_md": "details",
             "end_date": None,
-            "fileloc": 
"/opt/airflow/tests/api_fastapi/routes/public/test_dags.py",
+            "fileloc": 
"/opt/airflow/tests/api_fastapi/core_api/routes/public/test_dags.py",
             "file_token": file_token,
             "has_import_errors": False,
             "has_task_concurrency_limits": True,
@@ -358,7 +358,7 @@ class TestGetDag(TestDagEndpoint):
             "dag_id": dag_id,
             "dag_display_name": dag_display_name,
             "description": None,
-            "fileloc": 
"/opt/airflow/tests/api_fastapi/routes/public/test_dags.py",
+            "fileloc": 
"/opt/airflow/tests/api_fastapi/core_api/routes/public/test_dags.py",
             "file_token": file_token,
             "is_paused": False,
             "is_active": True,
diff --git a/tests/api_fastapi/routes/public/test_monitor.py 
b/tests/api_fastapi/core_api/routes/public/test_monitor.py
similarity index 100%
rename from tests/api_fastapi/routes/public/test_monitor.py
rename to tests/api_fastapi/core_api/routes/public/test_monitor.py
diff --git a/tests/api_fastapi/routes/public/test_variables.py 
b/tests/api_fastapi/core_api/routes/public/test_variables.py
similarity index 100%
rename from tests/api_fastapi/routes/public/test_variables.py
rename to tests/api_fastapi/core_api/routes/public/test_variables.py
diff --git a/airflow/api_fastapi/db/__init__.py 
b/tests/api_fastapi/core_api/routes/ui/__init__.py
similarity index 100%
rename from airflow/api_fastapi/db/__init__.py
rename to tests/api_fastapi/core_api/routes/ui/__init__.py
diff --git a/tests/api_fastapi/routes/ui/test_assets.py 
b/tests/api_fastapi/core_api/routes/ui/test_assets.py
similarity index 100%
rename from tests/api_fastapi/routes/ui/test_assets.py
rename to tests/api_fastapi/core_api/routes/ui/test_assets.py
diff --git a/tests/api_fastapi/routes/ui/test_dashboard.py 
b/tests/api_fastapi/core_api/routes/ui/test_dashboard.py
similarity index 100%
rename from tests/api_fastapi/routes/ui/test_dashboard.py
rename to tests/api_fastapi/core_api/routes/ui/test_dashboard.py

Reply via email to