from __future__ import annotations import json from sqlite3 import Connection from chat.eventlog.projector import on from chat.eventlog.log import Event @on("group_node_initialized") def _apply_group_node_initialized(conn: Connection, e: Event) -> None: p = e.payload conn.execute( "INSERT OR REPLACE INTO group_node " "(chat_id, members_json, summary, dynamic, threads_json) " "VALUES (?, ?, ?, ?, ?)", ( p["chat_id"], json.dumps(p["members"]), p.get("summary", ""), p.get("dynamic", ""), json.dumps(p.get("threads", [])), ), ) @on("group_node_updated") def _apply_group_node_updated(conn: Connection, e: Event) -> None: p = e.payload conn.execute( "UPDATE group_node SET summary = ?, dynamic = ?, updated_at = datetime('now') " "WHERE chat_id = ?", (p.get("summary", ""), p.get("dynamic", ""), p["chat_id"]), ) def get_group_node(conn: Connection, chat_id: str) -> dict | None: row = conn.execute( "SELECT chat_id, members_json, summary, dynamic, threads_json, updated_at " "FROM group_node WHERE chat_id = ?", (chat_id,), ).fetchone() if not row: return None return { "chat_id": row[0], "members": json.loads(row[1]), "summary": row[2], "dynamic": row[3], "threads": json.loads(row[4]), "updated_at": row[5], }