from __future__ import annotations from typing import List from sqlalchemy import ( ForeignKey, String, ) from sqlalchemy.orm import ( Mapped, mapped_column, relationship, ) from app.adapters.db.orm import Model class GlobalParticipant(Model): __tablename__ = "global_participant" id: Mapped[str] = mapped_column(String, primary_key=True) name: Mapped[str] = mapped_column(String) assets: Mapped[List[Asset]] = relationship( back_populates="global_participant", default_factory=list, lazy="select" ) class Asset(Model): """ Represents a digital asset, which is linked to a GlobalParticipant. """ __tablename__ = "asset" # --- Columns --- id: Mapped[str] = mapped_column(String, primary_key=True) external_id: Mapped[str] = mapped_column(String) type: Mapped[str] = mapped_column(String) s3_key: Mapped[str] = mapped_column(String) global_participant_id: Mapped[str] = mapped_column( ForeignKey("global_participant.id"), init=False, ) global_participant: Mapped[GlobalParticipant] = relationship( back_populates="assets" ) asset_meta_data: Mapped[AssetMetaData] = relationship( back_populates="asset", uselist=False ) class AssetMetaData(Model): """ Represents a digital asset metadata, which is linked to a Asset. """ __tablename__ = "asset_meta_data" # --- Columns --- asset_id: Mapped[str] = mapped_column( String, ForeignKey("asset.id"), primary_key=True ) asset_name: Mapped[str] = mapped_column(String) asset: Mapped[Asset] = relationship(back_populates="asset_meta_data", init=False)