From 4c7487c768a5b18b8546abf46afd0ac1c479e6ba Mon Sep 17 00:00:00 2001 From: Leah Tacke genannt Unterberg <leah.tgu@pads.rwth-aachen.de> Date: Fri, 14 Mar 2025 15:44:47 +0100 Subject: [PATCH] factored out MitMDatasetIdentifier --- app/db/models.py | 5 +++ app/routes/definitions/requests.py | 10 +++++ app/routes/definitions/responses.py | 8 ++++ app/routes/definitions/router.py | 69 ++++++++++++++--------------- 4 files changed, 56 insertions(+), 36 deletions(-) diff --git a/app/db/models.py b/app/db/models.py index 9b4331a..07183a3 100644 --- a/app/db/models.py +++ b/app/db/models.py @@ -4,6 +4,7 @@ from uuid import UUID import pydantic from mitm_tooling.representation import Header, SQLRepresentationSchema, mk_sql_rep_schema from mitm_tooling.transformation.superset.common import SupersetDBConnectionInfo +from mitm_tooling.transformation.superset.definitions.mitm_dataset import MitMDatasetIdentifier from pydantic import AnyUrl, BaseModel from sqlmodel import SQLModel, Field @@ -33,6 +34,10 @@ class TrackedMitMDataset(SQLModel, table=True): sql_alchemy_uri: AnyUrl = Field(sa_type=StrType.wrap(AnyUrl)) mitm_header: Header = Field(sa_type=PydanticType.wrap(Header), repr=False) + @property + def identifier(self) -> MitMDatasetIdentifier: + return MitMDatasetIdentifier(dataset_name=self.dataset_name, uuid=self.uuid) + @property def superset_connection_info(self) -> SupersetDBConnectionInfo: return SupersetDBConnectionInfo(sql_alchemy_uri=self.sql_alchemy_uri, schema_name=self.schema_name) diff --git a/app/routes/definitions/requests.py b/app/routes/definitions/requests.py index e69de29..08cf67e 100644 --- a/app/routes/definitions/requests.py +++ b/app/routes/definitions/requests.py @@ -0,0 +1,10 @@ +import pydantic +from mitm_tooling.representation import Header +from mitm_tooling.transformation.superset.common import SupersetDBConnectionInfo +from mitm_tooling.transformation.superset.definitions.mitm_dataset import MitMDatasetIdentifier + + +class GenerateMitMDatasetDefinitionRequest(pydantic.BaseModel): + mitm_header: Header + dataset_identifier: MitMDatasetIdentifier + db_conn_info: SupersetDBConnectionInfo diff --git a/app/routes/definitions/responses.py b/app/routes/definitions/responses.py index e69de29..1869bc2 100644 --- a/app/routes/definitions/responses.py +++ b/app/routes/definitions/responses.py @@ -0,0 +1,8 @@ +from mitm_tooling.transformation.superset.definitions import SupersetMitMDatasetImport +from mitm_tooling.transformation.superset.definition_bundles import SupersetMitMDatasetBundle + +class MitMDatasetBundleResponse(SupersetMitMDatasetBundle): + pass + +class MitMDatasetImportResponse(SupersetMitMDatasetImport): + pass \ No newline at end of file diff --git a/app/routes/definitions/router.py b/app/routes/definitions/router.py index b169db7..ee64979 100644 --- a/app/routes/definitions/router.py +++ b/app/routes/definitions/router.py @@ -2,77 +2,74 @@ import io import logging from fastapi import APIRouter -from mitm_tooling.representation import Header from mitm_tooling.transformation.superset import write_superset_import_as_zip -from mitm_tooling.transformation.superset.common import SupersetDBConnectionInfo -from mitm_tooling.transformation.superset.definition_bundles import SupersetMitMDatasetBundle from starlette.responses import StreamingResponse from app.dependencies.orm import TrackedMitMDatasetDependency +from app.routes.definitions.requests import GenerateMitMDatasetDefinitionRequest +from app.routes.definitions.responses import MitMDatasetBundleResponse, MitMDatasetImportResponse router = APIRouter(prefix='/definitions', tags=['definitions']) logger = logging.getLogger(__name__) -from mitm_tooling.transformation.superset.definitions import SupersetMitMDatasetImport from mitm_tooling.transformation.superset.interface import mk_superset_mitm_dataset_bundle, \ mk_superset_visualization_bundle @router.post('/mitm_dataset') -def generate_mitm_dataset_bundle(dataset_name: str, - mitm_header: Header, - db_conn_info: SupersetDBConnectionInfo, - include_visualizations: bool = False) -> SupersetMitMDatasetBundle: - mitm_dataset_bundle = mk_superset_mitm_dataset_bundle(dataset_name, mitm_header, db_conn_info) +def generate_mitm_dataset_bundle(request: GenerateMitMDatasetDefinitionRequest, + include_visualizations: bool = False) -> MitMDatasetBundleResponse: + mitm_dataset_bundle = mk_superset_mitm_dataset_bundle(request.mitm_header, request.dataset_identifier, + request.db_conn_info) if include_visualizations: - mitm_dataset_bundle.visualization_bundle = mk_superset_visualization_bundle(mitm_header, + mitm_dataset_bundle.visualization_bundle = mk_superset_visualization_bundle(request.mitm_header, mitm_dataset_bundle.datasource_bundle) - return mitm_dataset_bundle + return MitMDatasetBundleResponse(**mitm_dataset_bundle.model_dump()) @router.post('/mitm_dataset/import') -def generate_mitm_dataset_import(dataset_name: str, - mitm_header: Header, - db_conn_info: SupersetDBConnectionInfo, - include_visualizations: bool = False) -> SupersetMitMDatasetImport: - return generate_mitm_dataset_bundle(dataset_name, mitm_header, db_conn_info, include_visualizations).to_import() +def generate_mitm_dataset_import(request: GenerateMitMDatasetDefinitionRequest, + include_visualizations: bool = False) -> MitMDatasetImportResponse: + return MitMDatasetImportResponse( + **generate_mitm_dataset_bundle(request, include_visualizations).to_import().model_dump()) @router.post('/mitm_dataset/import/zip', response_class=StreamingResponse, responses={200: {'content': {'application/zip': {}}}}) -def generate_mitm_dataset_import_zip(dataset_name: str, - mitm_header: Header, - db_conn_info: SupersetDBConnectionInfo, +def generate_mitm_dataset_import_zip(request: GenerateMitMDatasetDefinitionRequest, include_visualizations: bool = False) -> StreamingResponse: - assets = generate_mitm_dataset_bundle(dataset_name, mitm_header, db_conn_info, include_visualizations) + assets = generate_mitm_dataset_bundle(request, include_visualizations) bio = io.BytesIO() write_superset_import_as_zip(bio, assets) bio.seek(0) return StreamingResponse(bio, media_type='application/zip') -@router.get('/mitm_dataset/{uuid}/') -def generate_uploaded_mitm_dataset_bundle(uploaded_dataset: TrackedMitMDatasetDependency, - include_visualizations: bool = False) -> SupersetMitMDatasetBundle: - return generate_mitm_dataset_bundle(uploaded_dataset.dataset_name, uploaded_dataset.mitm_header, - uploaded_dataset.superset_connection_info, - include_visualizations=include_visualizations) +@router.get('/mitm_dataset/{uuid}') +def generate_tracked_mitm_dataset_bundle(tracked_dataset: TrackedMitMDatasetDependency, + include_visualizations: bool = False) -> MitMDatasetBundleResponse: + request = GenerateMitMDatasetDefinitionRequest(mitm_header=tracked_dataset.mitm_header, + dataset_identifier=tracked_dataset.dataset_identifier, + db_conn_info=tracked_dataset.db_conn_info) + return MitMDatasetBundleResponse( + **generate_mitm_dataset_bundle(request, + include_visualizations=include_visualizations).model_dump()) @router.get('/mitm_dataset/{uuid}/import') -def generate_uploaded_mitm_dataset_import(uploaded_dataset: TrackedMitMDatasetDependency, - include_visualizations: bool = False) -> SupersetMitMDatasetImport: - mitm_dataset_bundle = generate_uploaded_mitm_dataset_bundle(uploaded_dataset, - include_visualizations=include_visualizations) - return mitm_dataset_bundle.to_import() +def generate_tracked_mitm_dataset_import(tracked_dataset: TrackedMitMDatasetDependency, + include_visualizations: bool = False) -> MitMDatasetImportResponse: + mitm_dataset_bundle = generate_tracked_mitm_dataset_bundle(tracked_dataset, + include_visualizations=include_visualizations) + return MitMDatasetImportResponse(**mitm_dataset_bundle.to_import().model_dump()) @router.get('/mitm_dataset/{uuid}/import/zip', response_class=StreamingResponse, - responses={200: {'content': {'application/zip': {}}}}) -def generate_uploaded_mitm_dataset_import_zip(uploaded_dataset: TrackedMitMDatasetDependency, - include_visualizations: bool = False) -> StreamingResponse: - assets = generate_uploaded_mitm_dataset_import(uploaded_dataset, - include_visualizations=include_visualizations) + responses={200: {'content': {'application/zip': {}}}}) +def generate_tracked_mitm_dataset_import_zip(tracked_dataset: TrackedMitMDatasetDependency, + include_visualizations: bool = False) -> StreamingResponse: + assets = generate_tracked_mitm_dataset_import(tracked_dataset, + include_visualizations=include_visualizations) bio = io.BytesIO() write_superset_import_as_zip(bio, assets) bio.seek(0) -- GitLab