diff --git a/app/db/models.py b/app/db/models.py index 9b4331a3cf27d4cba4936fc2342546b441c3047a..07183a3e0c5c3c5bc1596f9015df06c90ed506fc 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 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..08cf67ebb9afa5d1e5285d27e97cfa750d47d0e3 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 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..1869bc23da2f9aa5918a2bd468c62c110e5309df 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 b169db7f0a6d8611cc0253e2a01d06cd056d95a2..ee649798be69d492f6579b7aa6c44a3347e450c6 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)