import { getConnection, upsertConnection } from '../core/db.js'; import { logger } from '../core/logger.js'; /** * Резолвер владельца по business_connection_id. * * Зачем: у бизнес-сообщений НЕТ флага «исходящее». Единственный надёжный способ * отличить сообщение владельца от сообщения собеседника — сравнить from.id с id * владельца подключения. А уведомления об удалении надо слать в личку владельца * (owner_chat_id). И то, и другое берём из подключения. * * Порядок поиска: память → БД → getBusinessConnection (и результат кэшируем). * getBusinessConnection нужен после рестарта, если событие connection пришло до * запуска и в памяти пусто, но в БД запись есть — тогда чаще хватит БД. */ const memo = new Map(); // connId -> { ownerId, ownerChatId, ownerName, ownerUsername, isEnabled } /** Кладёт/обновляет подключение и в память, и в БД. Возвращает нормализованную запись. */ export function rememberConnection(conn) { const record = { connId: String(conn.id), ownerId: conn.user?.id != null ? String(conn.user.id) : '', ownerChatId: conn.user_chat_id != null ? String(conn.user_chat_id) : '', ownerName: [conn.user?.first_name, conn.user?.last_name].filter(Boolean).join(' '), ownerUsername: conn.user?.username ?? '', isEnabled: Boolean(conn.is_enabled), }; memo.set(record.connId, record); upsertConnection(record); return record; } /** * Возвращает { ownerId, ownerChatId, ... } по connId или null. * api — bot.api (для getBusinessConnection); можно не передавать, тогда только кэш/БД. */ export async function resolveOwner(connId, api) { if (connId == null) return null; const key = String(connId); const cached = memo.get(key); if (cached) return cached; const row = getConnection(key); if (row) { const record = { connId: key, ownerId: row.owner_id ?? '', ownerChatId: row.owner_chat_id ?? '', ownerName: row.owner_name ?? '', ownerUsername: row.owner_username ?? '', isEnabled: Boolean(row.is_enabled), }; memo.set(key, record); return record; } if (api?.getBusinessConnection) { try { const conn = await api.getBusinessConnection(key); if (conn?.id) return rememberConnection(conn); } catch (err) { logger.warn(`connections: getBusinessConnection(${key}) не удался:`, err.message); } } return null; }