Files
arestools/src/business/connections.js
T

68 lines
2.8 KiB
JavaScript
Raw Normal View History

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;
}