""" Talkgroup name resolution. C2 owns the `systems` collection, and a system's config carries the full talkgroup table — id and human name for every channel the node scans. The edge node only knows the name when OP25 happened to have it in the loaded tags file, so `tgid_name` on a call_start, and the `talkgroup_name` form field on /upload, are both frequently empty for a talkgroup C2 can name perfectly well. This resolver is the single place that closes that gap. `mqtt_handler` had its own copy of the lookup on the call_start path, so calls got a name written to their document while the /upload path — the one that drives transcription, correlation and, critically, the incident *title* — kept whatever empty string the node sent. The result was 84 of 100 incidents named "Ems — TGID 9048" instead of "Ems — Ossining Police Dispatch" (server-26#34). Order of preference: whatever the caller was given, then the call document (written at call_start), then the system config. Returns None when nothing knows the name, so callers keep their existing "TGID {id}" fallback. """ from typing import Optional from app.internal import firestore as fstore from app.internal.logger import logger async def name_from_system(system_id: Optional[str], talkgroup_id: Optional[int]) -> Optional[str]: """Look a talkgroup's name up in its system's config. None if unknown.""" if not system_id or talkgroup_id is None: return None try: tgid_int = int(talkgroup_id) except (TypeError, ValueError): return None system_doc = await fstore.doc_get_cached("systems", system_id) if not system_doc: return None for tg in system_doc.get("config", {}).get("talkgroups", []): try: if int(tg.get("id", -1)) == tgid_int: return tg.get("name") or None except (TypeError, ValueError): continue return None async def resolve( system_id: Optional[str], talkgroup_id: Optional[int], hint: Optional[str] = None, call_doc: Optional[dict] = None, ) -> Optional[str]: """ Best available human name for a talkgroup. `hint` is whatever the caller already had (OP25 metadata, a form field). `call_doc` is an already-fetched call document, if the caller has one — passing it avoids a second read. """ if hint: return hint if call_doc: from_doc = call_doc.get("talkgroup_name") if from_doc: return from_doc resolved = await name_from_system(system_id, talkgroup_id) if resolved: logger.info( f"Resolved talkgroup name from system config: " f"TGID {talkgroup_id} → {resolved!r}" ) return resolved