From 1a8061539fd71ab05188e721dd28b60abbea8a3a Mon Sep 17 00:00:00 2001 From: Jack Levy Date: Sun, 15 Mar 2026 11:09:55 -0400 Subject: [PATCH] =?UTF-8?q?fix:=20member=20sync=20=E2=80=94=20robust=20cha?= =?UTF-8?q?mber=20parsing=20and=20district=20int=20conversion?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Handle terms as list or dict (Congress.gov API inconsistency) - Infer 'House of Representatives' from district presence as fallback - Convert district to int before str() to avoid leading zeros / 'None' Authored by: Jack Levy --- backend/app/services/congress_api.py | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/backend/app/services/congress_api.py b/backend/app/services/congress_api.py index b4a49ce..3ea0fb7 100644 --- a/backend/app/services/congress_api.py +++ b/backend/app/services/congress_api.py @@ -165,8 +165,19 @@ def _normalize_state(state: str | None) -> str | None: def parse_member_from_api(data: dict) -> dict: """Normalize raw API member list data into our model fields.""" - terms = data.get("terms", {}).get("item", []) + terms_raw = data.get("terms", {}) + if isinstance(terms_raw, list): + terms = terms_raw + elif isinstance(terms_raw, dict): + terms = terms_raw.get("item", []) + else: + terms = [] current_term = terms[-1] if terms else {} + chamber = current_term.get("chamber") + # Fallback: infer House from presence of a numeric district + if not chamber and data.get("district"): + chamber = "House of Representatives" + district = data.get("district") return { "bioguide_id": data.get("bioguideId"), "name": data.get("name", ""), @@ -174,8 +185,8 @@ def parse_member_from_api(data: dict) -> dict: "last_name": data.get("lastName"), "party": data.get("partyName") or None, "state": _normalize_state(data.get("state")), - "chamber": current_term.get("chamber"), - "district": str(data.get("district")) if data.get("district") else None, + "chamber": chamber, + "district": str(int(district)) if district is not None else None, "photo_url": data.get("depiction", {}).get("imageUrl"), "official_url": data.get("officialWebsiteUrl"), }