From bbcde75b8e9c964e7c9e33845af4e7d1af8ad6f1 Mon Sep 17 00:00:00 2001 From: Daniel Roth Date: Thu, 7 May 2026 12:51:41 +0000 Subject: [PATCH] =?UTF-8?q?MagicPlan=20HTTP=20client=20with=20auth=20heade?= =?UTF-8?q?rs=20and=20response=20parsing=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_client.py | 22 +++++++++++++++++++ .../tests/test_magic_plan_client.py | 2 +- 2 files changed, 23 insertions(+), 1 deletion(-) create mode 100644 backend/magic_plan/magic_plan_client.py diff --git a/backend/magic_plan/magic_plan_client.py b/backend/magic_plan/magic_plan_client.py new file mode 100644 index 00000000..ff99062d --- /dev/null +++ b/backend/magic_plan/magic_plan_client.py @@ -0,0 +1,22 @@ +import requests + +from datatypes.magicplan.api.response import MagicPlan, PlansListResponse + +_BASE_URL = "https://cloud.magicplan.app/api/v2" + + +class MagicPlanClient: + def __init__(self, customer_id: str, api_key: str) -> None: + self._api_key = api_key + self._session = requests.Session() + self._session.headers.update({"customer": customer_id}) + + def get_plans(self) -> PlansListResponse: + r = self._session.get(f"{_BASE_URL}/plans", params={"key": self._api_key}) + r.raise_for_status() + return PlansListResponse.model_validate(r.json()["data"]) + + def get_plan(self, plan_id: str) -> MagicPlan: + r = self._session.get(f"{_BASE_URL}/plans/{plan_id}", params={"key": self._api_key}) + r.raise_for_status() + return MagicPlan.model_validate(r.json()["data"]) diff --git a/backend/magic_plan/tests/test_magic_plan_client.py b/backend/magic_plan/tests/test_magic_plan_client.py index f8f35432..02ae054c 100644 --- a/backend/magic_plan/tests/test_magic_plan_client.py +++ b/backend/magic_plan/tests/test_magic_plan_client.py @@ -26,7 +26,7 @@ def _make_client(mock_session: MagicMock) -> MagicPlanClient: @pytest.fixture() def mock_session() -> MagicMock: - return MagicMock(spec=requests.Session) + return MagicMock() @pytest.fixture()