feat: persist ingest flow in postgres
Tests / test (push) Failing after 1m16s
Tests / lint (push) Failing after 34s

This commit is contained in:
Xiaoxia AI
2026-06-15 19:34:47 +08:00
parent 7f416700de
commit 99e72cdcba
16 changed files with 161 additions and 78 deletions
@@ -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)