MagicPlanService orchestrating fetch, match, map, persist 🟩

This commit is contained in:
Daniel Roth 2026-05-07 13:12:00 +00:00
parent 1a8b27453e
commit 05bd2ba3e2

View file

@ -0,0 +1,35 @@
from typing import Optional
from datatypes.magicplan.domain.mapper import map_plan
from datatypes.magicplan.domain.models import Plan
from backend.app.db.connection import db_session
from backend.app.db.functions.magic_plan_functions import save_plan
from backend.magic_plan.address_matcher import find_matching_plan
from backend.magic_plan.magic_plan_client import MagicPlanClient
from utils.logger import setup_logger
logger = setup_logger()
class MagicPlanService:
def __init__(self, client: MagicPlanClient) -> None:
self._client = client
def run(self, address: str, uprn: Optional[str] = None) -> Plan:
if uprn is not None:
logger.info("MagicPlanService.run uprn=%s", uprn)
plans_response = self._client.get_plans()
matched = find_matching_plan(plans_response.plans, address)
if matched is None:
raise ValueError(f"No MagicPlan found for address: {address!r}")
magic_plan = self._client.get_plan(matched.id)
plan = map_plan(magic_plan)
with db_session() as session:
save_plan(session, plan)
return plan