103 lines
2.7 KiB
Python
103 lines
2.7 KiB
Python
from app.repositories.location_repo import LocationRepository
|
|
from app.repositories.property_repo import PropertyRepository
|
|
from app.db.models.owner import Owner
|
|
from app.db.models.property import Property
|
|
|
|
|
|
class PropertyService:
|
|
|
|
@staticmethod
|
|
async def get_property_by_osm(session, osm_type, osm_id):
|
|
|
|
location = await LocationRepository.get_by_osm(
|
|
session, osm_type, osm_id
|
|
)
|
|
|
|
if not location:
|
|
return None
|
|
|
|
property = await PropertyRepository.get_by_location_id(
|
|
session, location.id
|
|
)
|
|
|
|
return property
|
|
|
|
@staticmethod
|
|
async def create_full_entry(session, location_data, owner_data, property_data):
|
|
|
|
async with session.begin():
|
|
|
|
# Check existing location
|
|
location = await LocationRepository.get_by_osm(
|
|
session,
|
|
location_data.osm_type,
|
|
location_data.osm_id
|
|
)
|
|
|
|
if not location:
|
|
location = await LocationRepository.create(
|
|
session,
|
|
location_data.dict()
|
|
)
|
|
|
|
# Check if property already exists for this location
|
|
existing_property = await PropertyRepository.get_by_location_id(
|
|
session,
|
|
location.id
|
|
)
|
|
|
|
if existing_property:
|
|
# return existing instead of crashing
|
|
return existing_property
|
|
|
|
# Create owner
|
|
owner = Owner(**owner_data.dict())
|
|
session.add(owner)
|
|
await session.flush()
|
|
|
|
# Create property
|
|
prop_data = property_data.dict()
|
|
prop_data["owner_id"] = owner.id
|
|
prop_data["location_id"] = location.id
|
|
|
|
property_obj = Property(**prop_data)
|
|
session.add(property_obj)
|
|
|
|
return property_obj
|
|
|
|
@staticmethod
|
|
async def update_property_and_owner(session, property_id, owner_data, property_data):
|
|
|
|
async with session.begin():
|
|
|
|
property_obj = await session.get(Property, property_id)
|
|
|
|
if not property_obj:
|
|
return None
|
|
|
|
owner = property_obj.owner
|
|
|
|
# Update owner
|
|
if owner_data:
|
|
for k, v in owner_data.items():
|
|
setattr(owner, k, v)
|
|
|
|
# Update property
|
|
if property_data:
|
|
for k, v in property_data.items():
|
|
setattr(property_obj, k, v)
|
|
|
|
return property_obj
|
|
|
|
@staticmethod
|
|
async def get_property_by_location_id(session, location_id: int):
|
|
|
|
property_obj = await PropertyRepository.get_by_location_id(
|
|
session, location_id
|
|
)
|
|
|
|
return property_obj
|
|
|
|
|
|
|