diff --git a/backend/endpoints/responses/platform.py b/backend/endpoints/responses/platform.py index 5164a343f..0e16d3512 100644 --- a/backend/endpoints/responses/platform.py +++ b/backend/endpoints/responses/platform.py @@ -8,12 +8,12 @@ class PlatformSchema(BaseModel): id: int slug: str fs_slug: str + name: str + rom_count: int igdb_id: Optional[int] = None sgdb_id: Optional[int] = None moby_id: Optional[int] = None - name: str logo_path: Optional[str] = "" - rom_count: int firmware: list[FirmwareSchema] = Field(default_factory=list) class Config: diff --git a/backend/handler/database/platforms_handler.py b/backend/handler/database/platforms_handler.py index ff613a6cb..9e76d16f3 100644 --- a/backend/handler/database/platforms_handler.py +++ b/backend/handler/database/platforms_handler.py @@ -1,5 +1,5 @@ from sqlalchemy import delete, or_, select -from sqlalchemy.orm import Session +from sqlalchemy.orm import Session, selectinload from decorators.database import begin_session from models.platform import Platform @@ -13,14 +13,27 @@ class DBPlatformsHandler(DBBaseHandler): def add_platform( self, platform: Platform, session: Session = None ) -> Platform | None: - return session.merge(platform) + session.merge(platform) + session.flush() + + return session.scalar( + select(Platform) + .options(selectinload(Platform.roms).load_only(Rom.id)) + .filter_by(id=platform.id) + .limit(1) + ) @begin_session def get_platforms( self, id: int = None, session: Session = None ) -> list[Platform] | Platform | None: return ( - session.scalar(select(Platform).filter_by(id=id).limit(1)) + session.scalar( + select(Platform) + .options(selectinload(Platform.roms).load_only(Rom.id)) + .filter_by(id=id) + .limit(1) + ) if id else ( session.scalars(select(Platform).order_by(Platform.name.asc())) @@ -33,7 +46,12 @@ class DBPlatformsHandler(DBBaseHandler): def get_platform_by_fs_slug( self, fs_slug: str, session: Session = None ) -> Platform | None: - return session.scalar(select(Platform).filter_by(fs_slug=fs_slug).limit(1)) + return session.scalar( + select(Platform) + .options(selectinload(Platform.roms).load_only(Rom.id)) + .filter_by(fs_slug=fs_slug) + .limit(1) + ) @begin_session def delete_platform(self, id: int, session: Session = None) -> int: diff --git a/backend/models/platform.py b/backend/models/platform.py index 60ca152c5..7f2ee4eb7 100644 --- a/backend/models/platform.py +++ b/backend/models/platform.py @@ -18,6 +18,7 @@ class Platform(BaseModel): name: str = Column(String(length=400)) logo_path: str = Column(String(length=1000), default="") + roms: Mapped[set[Rom]] = relationship("Rom", back_populates="platform") firmware: Mapped[set[Firmware]] = relationship( "Firmware", lazy="selectin", back_populates="platform" )