From 05bd2ba3e21ca85cf6c4540c34a2004ebb54ff0c Mon Sep 17 00:00:00 2001 From: Daniel Roth Date: Thu, 7 May 2026 13:12:00 +0000 Subject: [PATCH] =?UTF-8?q?MagicPlanService=20orchestrating=20fetch,=20mat?= =?UTF-8?q?ch,=20map,=20persist=20=F0=9F=9F=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/magic_plan/magic_plan_service.py | 35 ++++++++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 backend/magic_plan/magic_plan_service.py diff --git a/backend/magic_plan/magic_plan_service.py b/backend/magic_plan/magic_plan_service.py new file mode 100644 index 00000000..422946e3 --- /dev/null +++ b/backend/magic_plan/magic_plan_service.py @@ -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