feat: persist ingest flow in postgres
This commit is contained in:
@@ -1 +1,18 @@
|
||||
"""SQLAlchemy-based repository implementations."""
|
||||
|
||||
from .asset_library_repository import SQLAlchemyAssetLibraryRepository
|
||||
from .asset_repository import SQLAlchemyAssetRepository
|
||||
from .ingest_job_repository import SQLAlchemyIngestJobRepository
|
||||
from .project_repository import SQLAlchemyProjectRepository
|
||||
from .session import Base, build_engine, build_session_factory, initialize_database
|
||||
|
||||
__all__ = [
|
||||
"Base",
|
||||
"SQLAlchemyAssetLibraryRepository",
|
||||
"SQLAlchemyAssetRepository",
|
||||
"SQLAlchemyIngestJobRepository",
|
||||
"SQLAlchemyProjectRepository",
|
||||
"build_engine",
|
||||
"build_session_factory",
|
||||
"initialize_database",
|
||||
]
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
from sqlalchemy.orm import Session
|
||||
|
||||
from packages.domain import AssetLibrary, AssetLibraryKind
|
||||
from packages.adapters.sqlalchemy_impl.models import AssetLibraryModel
|
||||
from packages.domain import AssetLibrary, AssetLibraryKind
|
||||
|
||||
|
||||
class SQLAlchemyAssetLibraryRepository:
|
||||
@@ -15,14 +15,14 @@ class SQLAlchemyAssetLibraryRepository:
|
||||
models = query.all()
|
||||
return [
|
||||
AssetLibrary(
|
||||
id=m.id,
|
||||
workspace_id=m.workspace_id,
|
||||
project_id=m.project_id,
|
||||
name=m.name,
|
||||
kind=AssetLibraryKind(m.kind),
|
||||
created_at=m.created_at,
|
||||
id=model.id,
|
||||
workspace_id=model.workspace_id,
|
||||
project_id=model.project_id,
|
||||
name=model.name,
|
||||
kind=AssetLibraryKind(model.kind),
|
||||
created_at=model.created_at,
|
||||
)
|
||||
for m in models
|
||||
for model in models
|
||||
]
|
||||
|
||||
def create(self, library: AssetLibrary) -> AssetLibrary:
|
||||
|
||||
@@ -1,8 +1,9 @@
|
||||
import json
|
||||
|
||||
from sqlalchemy.orm import Session
|
||||
|
||||
from packages.domain import Asset
|
||||
from packages.adapters.sqlalchemy_impl.models import AssetModel
|
||||
from packages.domain import Asset
|
||||
|
||||
|
||||
class SQLAlchemyAssetRepository:
|
||||
@@ -13,17 +14,17 @@ class SQLAlchemyAssetRepository:
|
||||
models = self.session.query(AssetModel).filter(AssetModel.library_id == library_id).all()
|
||||
return [
|
||||
Asset(
|
||||
id=m.id,
|
||||
workspace_id=m.workspace_id,
|
||||
project_id=m.project_id,
|
||||
library_id=m.library_id,
|
||||
name=m.name,
|
||||
storage_key=m.storage_key,
|
||||
mime_type=m.mime_type,
|
||||
metadata=json.loads(m.metadata_json),
|
||||
created_at=m.created_at,
|
||||
id=model.id,
|
||||
workspace_id=model.workspace_id,
|
||||
project_id=model.project_id,
|
||||
library_id=model.library_id,
|
||||
name=model.name,
|
||||
storage_key=model.storage_key,
|
||||
mime_type=model.mime_type,
|
||||
metadata=json.loads(model.metadata_json),
|
||||
created_at=model.created_at,
|
||||
)
|
||||
for m in models
|
||||
for model in models
|
||||
]
|
||||
|
||||
def create(self, asset: Asset) -> Asset:
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
from sqlalchemy.orm import Session
|
||||
|
||||
from packages.domain import IngestJob, IngestJobStatus
|
||||
from packages.adapters.sqlalchemy_impl.models import IngestJobModel
|
||||
from packages.domain import IngestJob, IngestJobStatus
|
||||
|
||||
|
||||
class SQLAlchemyIngestJobRepository:
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
from sqlalchemy.orm import Session
|
||||
|
||||
from packages.domain import Project
|
||||
from packages.adapters.sqlalchemy_impl.models import ProjectModel
|
||||
from packages.domain import Project
|
||||
|
||||
|
||||
class SQLAlchemyProjectRepository:
|
||||
@@ -12,13 +12,13 @@ class SQLAlchemyProjectRepository:
|
||||
models = self.session.query(ProjectModel).filter(ProjectModel.workspace_id == workspace_id).all()
|
||||
return [
|
||||
Project(
|
||||
id=m.id,
|
||||
workspace_id=m.workspace_id,
|
||||
name=m.name,
|
||||
description=m.description,
|
||||
created_at=m.created_at,
|
||||
id=model.id,
|
||||
workspace_id=model.workspace_id,
|
||||
name=model.name,
|
||||
description=model.description,
|
||||
created_at=model.created_at,
|
||||
)
|
||||
for m in models
|
||||
for model in models
|
||||
]
|
||||
|
||||
def create(self, project: Project) -> Project:
|
||||
|
||||
@@ -0,0 +1,46 @@
|
||||
from __future__ import annotations
|
||||
|
||||
from sqlalchemy import create_engine
|
||||
from sqlalchemy.orm import Session, sessionmaker
|
||||
|
||||
from packages.adapters.sqlalchemy_impl.models import Base
|
||||
|
||||
|
||||
def build_engine(
|
||||
database_url: str,
|
||||
*,
|
||||
pool_size: int = 20,
|
||||
max_overflow: int = 40,
|
||||
pool_timeout: int = 30,
|
||||
pool_recycle: int = 3600,
|
||||
):
|
||||
return create_engine(
|
||||
database_url,
|
||||
pool_size=pool_size,
|
||||
max_overflow=max_overflow,
|
||||
pool_timeout=pool_timeout,
|
||||
pool_recycle=pool_recycle,
|
||||
)
|
||||
|
||||
|
||||
def build_session_factory(
|
||||
database_url: str,
|
||||
*,
|
||||
pool_size: int = 20,
|
||||
max_overflow: int = 40,
|
||||
pool_timeout: int = 30,
|
||||
pool_recycle: int = 3600,
|
||||
):
|
||||
engine = build_engine(
|
||||
database_url,
|
||||
pool_size=pool_size,
|
||||
max_overflow=max_overflow,
|
||||
pool_timeout=pool_timeout,
|
||||
pool_recycle=pool_recycle,
|
||||
)
|
||||
session_factory = sessionmaker(autocommit=False, autoflush=False, bind=engine)
|
||||
return engine, session_factory
|
||||
|
||||
|
||||
def initialize_database(engine) -> None:
|
||||
Base.metadata.create_all(bind=engine)
|
||||
Reference in New Issue
Block a user