from __future__ import annotations from sqlmodel import Session, col, select from domain.modelling.scenario import Scenario from infrastructure.postgres.modelling import ScenarioModel from repositories.scenario.scenario_repository import ScenarioRepository class ScenarioPostgresRepository(ScenarioRepository): """Reads the live ``scenario`` table (via the ``ScenarioModel`` mirror) and maps each row to the thin domain ``Scenario`` the Modelling stage uses (ADR-0017). The legacy file-path / aggregate columns are not read.""" def __init__(self, session: Session) -> None: self._session = session def get_many(self, scenario_ids: list[int]) -> list[Scenario]: rows = self._session.exec( select(ScenarioModel).where(col(ScenarioModel.id).in_(scenario_ids)) ).all() by_id: dict[int, ScenarioModel] = { row.id: row for row in rows if row.id is not None } scenarios: list[Scenario] = [] for scenario_id in scenario_ids: row = by_id.get(scenario_id) if row is None: raise ValueError(f"no scenario with id {scenario_id}") scenarios.append(row.to_domain()) return scenarios