🚧 Fix facet counts on Messages show 1 per device

This commit is contained in:
Jonas Bengtsson
2026-09-05 18:49:05 +02:00
parent 3c4b5563ea
commit 8c1e5d16b8
3 changed files with 54 additions and 4 deletions
+32
View File
@@ -1472,6 +1472,38 @@ def create_app(
count = row[0] if row is not None else 0
return {"count": count}
@app.get(
"/messages/facet-counts", tags=["meta"], dependencies=[Depends(authenticate)]
)
def message_facet_counts() -> dict[str, Any]:
"""Occurrence counts per IMEI and per device name over ALL messages
(not just a page), for the Messages view's filter popovers. Values
with zero messages still appear when a settings row exists (merged
from imei_map), so the facets list devices that "might occur"."""
try:
conn = psycopg.connect(config.dsn)
try:
with conn.cursor() as cur:
cur.execute(
"SELECT imei, count(*) FROM mqtt_messages GROUP BY imei"
)
imei_counts = {row[0]: row[1] for row in cur.fetchall()}
cur.execute(
"SELECT device, count(*) FROM mqtt_messages GROUP BY device"
)
device_counts = {row[0]: row[1] for row in cur.fetchall()}
# devices that exist but have no messages yet: count 0
cur.execute("SELECT imei, meta->>'device' FROM imei_map")
for imei, name in cur.fetchall():
imei_counts.setdefault(imei, 0)
if name:
device_counts.setdefault(name, 0)
finally:
conn.close()
except psycopg.Error as exc:
raise _db_unavailable(exc) from exc
return {"imei": imei_counts, "device": device_counts}
@app.get("/messages", tags=["data"], dependencies=[Depends(authenticate)])
def list_messages(
imei: list[str] | None = Query(