diff --git a/src/api/main.py b/src/api/main.py index 4fabe48..9df2f6b 100644 --- a/src/api/main.py +++ b/src/api/main.py @@ -70,19 +70,19 @@ def _enrich_related_names(conn, contact: dict) -> None: related = contact.get("related_names", []) if not related: return - uids = [r["value"] for r in related if r.get("value")] - if not uids: + names = list({r["value"] for r in related if r.get("value")}) + if not names: return - resolved = db.resolve_related_names(conn, contact["account"], uids) + resolved = db.resolve_related_names(conn, contact["account"], names) for r in related: - uid = r.get("value", "") - info = resolved.get(uid) + name = r.get("value", "") + info = resolved.get(name) if info: r["id"] = info["id"] r["name"] = info["name"] else: r["id"] = None - r["name"] = uid + r["name"] = name def _account_filter_clause(account_name: str | None) -> tuple[str, list]: diff --git a/src/db.py b/src/db.py index 52d9bed..46d3a1c 100644 --- a/src/db.py +++ b/src/db.py @@ -383,16 +383,29 @@ def get_groups_for_contact(conn, account: str, member_uid: str) -> list[dict]: return cur.fetchall() -def resolve_related_names(conn, account: str, uids: list[str]) -> dict[str, dict]: - if not uids: +def resolve_related_names(conn, account: str, names: list[str]) -> dict[str, dict]: + if not names: return {} - placeholders = ", ".join(["%s"] * len(uids)) + conditions = [] + params: list = [account] + for name in names: + conditions.append("full_name = %s") + params.append(name) + parts = name.strip().split() + if len(parts) >= 2: + conditions.append("(given_name = %s AND family_name = %s)") + params.extend([parts[0], parts[-1]]) + placeholders = " OR ".join(conditions) with conn.cursor() as cur: cur.execute( - f"SELECT uid, id, full_name FROM contacts WHERE account = %s AND uid IN ({placeholders})", - [account] + uids, + f"SELECT full_name, id, given_name, family_name FROM contacts WHERE account = %s AND ({placeholders})", + params, ) - return {row["uid"]: {"id": row["id"], "name": row["full_name"]} for row in cur.fetchall()} + result = {} + for row in cur.fetchall(): + fn = row["full_name"] or f"{row.get('given_name') or ''} {row.get('family_name') or ''}".strip() + result[fn] = {"id": row["id"], "name": fn} + return result def get_group_count(conn, account: str | None) -> int: