"""Service layer for cache-aware fetching of FINN ads and Eiendom.no units.""" import logging from .ad import fetch_ad_details from .cache import get_eiendom_unit as get_cached_eiendom_unit from .cache import get_finn_ad, init_db, save_eiendom_unit, save_finn_ad from .config import FINN_CACHE_PATH from .eiendom_no import get_unit from .models import EiendomUnit, FinnAd logger = logging.getLogger(__name__) async def get_or_fetch_ad(finnkode: str, force_refresh: bool = False) -> FinnAd: """Get FinnAd from cache or fetch fresh. Never returns None.""" conn = init_db(FINN_CACHE_PATH) ad = None if force_refresh else get_finn_ad(conn, finnkode, ttl_hours=24) if ad is None: ad = await fetch_ad_details(finnkode) save_finn_ad(conn, ad) return ad async def get_or_fetch_eiendom_unit( unit_code: str, force_refresh: bool = False ) -> EiendomUnit | None: """Get EiendomUnit from cache or fetch fresh.""" conn = init_db(FINN_CACHE_PATH) unit = None if force_refresh else get_cached_eiendom_unit(conn, unit_code, ttl_hours=24) if unit is None: unit = await get_unit(unit_code) if unit is not None: save_eiendom_unit(conn, unit) return unit