diff --git a/backend/app/db/functions/magic_plan_functions.py b/backend/app/db/functions/magic_plan_functions.py index 4a8d7940..f4cebfb7 100644 --- a/backend/app/db/functions/magic_plan_functions.py +++ b/backend/app/db/functions/magic_plan_functions.py @@ -4,7 +4,7 @@ from sqlalchemy import delete, select from sqlalchemy.dialects.postgresql import insert as pg_insert from sqlmodel import Session, col -from datatypes.magicplan.domain.models import Floor, Plan +from datatypes.magicplan.domain.models import Door, Floor, Plan, Room, Window from backend.app.db.models.magic_plan import ( MagicPlanDoorModel, MagicPlanFloorModel, @@ -17,7 +17,86 @@ from backend.app.db.models.magic_plan import ( def get_plan_by_uploaded_file_id( session: Session, uploaded_file_id: int ) -> Optional[Plan]: - raise NotImplementedError + plan_row = session.execute( + select(MagicPlanPlanModel).where( + col(MagicPlanPlanModel.uploaded_file_id) == uploaded_file_id + ) + ).scalar_one_or_none() + + if plan_row is None: + return None + + floor_rows = list( + session.execute( + select(MagicPlanFloorModel) + .where(col(MagicPlanFloorModel.magic_plan_plan_id) == plan_row.id) + .order_by(col(MagicPlanFloorModel.level)) + ).scalars() + ) + + return Plan( + uid=plan_row.magic_plan_uid if plan_row.magic_plan_uid is not None else "", + name=plan_row.name, + address=plan_row.address, + postcode=plan_row.postcode, + floors=[_to_floor(session, f) for f in floor_rows], + ) + + +def _to_floor(session: Session, row: MagicPlanFloorModel) -> Floor: + room_rows = list( + session.execute( + select(MagicPlanRoomModel).where( + col(MagicPlanRoomModel.magic_plan_floor_id) == row.id + ) + ).scalars() + ) + return Floor( + level=row.level, + name=None, + rooms=[_to_room(session, r) for r in room_rows], + ) + + +def _to_room(session: Session, row: MagicPlanRoomModel) -> Room: + window_rows = list( + session.execute( + select(MagicPlanWindowModel) + .where(col(MagicPlanWindowModel.magic_plan_room_id) == row.id) + .order_by( + col(MagicPlanWindowModel.magic_plan_room_id), + col(MagicPlanWindowModel.id), + ) + ).scalars() + ) + door_rows = list( + session.execute( + select(MagicPlanDoorModel).where( + col(MagicPlanDoorModel.magic_plan_room_id) == row.id + ) + ).scalars() + ) + return Room( + name=row.name if row.name is not None else "", + width_m=row.width_m if row.width_m is not None else 0.0, + length_m=row.length_m if row.length_m is not None else 0.0, + area_m2=row.area_m2 if row.area_m2 is not None else 0.0, + windows=[_to_window(w) for w in window_rows], + doors=[_to_door(d) for d in door_rows], + ) + + +def _to_window(row: MagicPlanWindowModel) -> Window: + return Window( + width_m=row.width_m if row.width_m is not None else 0.0, + height_m=row.height_m if row.height_m is not None else 0.0, + area_m2=row.area_m2 if row.area_m2 is not None else 0.0, + opening_type=row.opening_type if row.opening_type is not None else "", + ) + + +def _to_door(row: MagicPlanDoorModel) -> Door: + return Door(width_mm=row.width_mm if row.width_mm is not None else 0.0) def save_plan(session: Session, plan: Plan, uploaded_file_id: int) -> None: