from backend.db.models.houses import Houses, Areas from sqlalchemy.orm import Session from backend.schemas.house import HouseCreate, HouseUpdate, AreaUpdate class RepositoryHouses: def __init__(self): self.houses = Houses() self.areas = Areas() def get_all(self, skip: int = 0, limit: int = 100): return self.houses.query.filter_by(deleted_at=None).offset(skip*limit).limit(limit).all() def get_all_areas(self, house_id: str, skip: int = 0, limit: int = 100): return self.areas.query.filter_by(deleted_at=None, house_id=house_id).offset(skip).limit(limit).all() def get_count_all(self): return self.houses.query.filter_by(deleted_at=None).count() def get_by_id(self, house_id: str): return self.houses.query.filter_by(id=house_id).one() def create(self, db: Session, house: HouseCreate): try: areas = getattr(house, "areas") db_house = Houses(**house.dict(exclude={"areas"})) for area in areas: db_house.areas.append(Areas(**area.dict())) db.add(db_house) db.commit() except Exception: db.rollback() raise db.refresh(db_house) return db_house def update_area(self, db: Session, areas: list[AreaUpdate], house_id: str): db_house = self.get_by_id(house_id) if not db_house: return None try: db_areaId = [area.id for area in db_house.areas] area_update_id = [area.id for area in areas if area.id is not None] area_delete_id = [area_id for area_id in db_areaId if area_id not in area_update_id] if area_delete_id: self.areas.query.where(Areas.id.in_(area_delete_id)).delete() for area in areas: area_obj = Areas(**area.dict(), house_id=house_id) db.merge(area_obj) # areaList = [dict(**area.dict(), house_id=house_id) for area in areas] # db.execute(update(Areas), areaList) # self.areas.query.update(areaList) db.commit() except Exception: db.rollback() raise def update(self, db: Session, house: HouseUpdate): db_house = self.get_by_id(house.id) if not db_house: return None try: self.houses.query.where(Houses.id == house.id).update(house.dict(exclude={"id", 'areas'}, exclude_unset=True, exclude_none=True)) db.commit() self.update_area(db, house.areas, house.id) except Exception: db.rollback() raise db.refresh(db_house) return db_house def delete(self, db: Session, house_id: str): pass