ваше сообщение коммита
This commit is contained in:
@@ -13,16 +13,12 @@ class SessionService {
|
||||
*/
|
||||
async saveSession(session) {
|
||||
try {
|
||||
// Логируем содержимое сессии перед сохранением
|
||||
logger.info('[SessionService] Saving session data:', session);
|
||||
|
||||
return new Promise((resolve, reject) => {
|
||||
session.save((err) => {
|
||||
if (err) {
|
||||
logger.error('Error saving session:', err);
|
||||
reject(err);
|
||||
} else {
|
||||
logger.info('Session saved successfully');
|
||||
resolve(true);
|
||||
}
|
||||
});
|
||||
@@ -41,16 +37,7 @@ class SessionService {
|
||||
*/
|
||||
async linkGuestMessages(session, userId) {
|
||||
try {
|
||||
logger.info(
|
||||
`[linkGuestMessages] Starting for user ${userId} with guestId=${session.guestId}, previousGuestId=${session.previousGuestId}`
|
||||
);
|
||||
|
||||
// Инициализируем массив обработанных гостевых ID, если его нет
|
||||
if (!session.processedGuestIds) {
|
||||
session.processedGuestIds = [];
|
||||
}
|
||||
|
||||
// Получаем все гостевые ID для текущего пользователя из новой таблицы
|
||||
// Получаем все гостевые ID для текущего пользователя из таблицы
|
||||
const guestIdsResult = await db.getQuery()(
|
||||
'SELECT guest_id FROM guest_user_mapping WHERE user_id = $1',
|
||||
[userId]
|
||||
@@ -60,39 +47,52 @@ class SessionService {
|
||||
// Собираем все гостевые ID, которые нужно обработать
|
||||
const guestIdsToProcess = new Set();
|
||||
|
||||
// Добавляем текущий гостевой ID
|
||||
if (session.guestId && !session.processedGuestIds.includes(session.guestId)) {
|
||||
guestIdsToProcess.add(session.guestId);
|
||||
// Добавляем текущий гостевой ID, если он есть и не обработан в БД
|
||||
if (session.guestId) {
|
||||
const isProcessed = await this.isGuestIdProcessed(session.guestId);
|
||||
if (!isProcessed) {
|
||||
guestIdsToProcess.add(session.guestId);
|
||||
|
||||
// Записываем связь с пользователем в новую таблицу
|
||||
await db.getQuery()(
|
||||
'INSERT INTO guest_user_mapping (user_id, guest_id) VALUES ($1, $2) ON CONFLICT (guest_id) DO UPDATE SET user_id = $1',
|
||||
[userId, session.guestId]
|
||||
);
|
||||
// Записываем связь с пользователем в новую таблицу
|
||||
await db.getQuery()(
|
||||
'INSERT INTO guest_user_mapping (user_id, guest_id) VALUES ($1, $2) ON CONFLICT (guest_id) DO UPDATE SET user_id = $1',
|
||||
[userId, session.guestId]
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
// Добавляем предыдущий гостевой ID
|
||||
if (session.previousGuestId && !session.processedGuestIds.includes(session.previousGuestId)) {
|
||||
guestIdsToProcess.add(session.previousGuestId);
|
||||
// Добавляем предыдущий гостевой ID, если он есть и не обработан в БД
|
||||
if (session.previousGuestId) {
|
||||
const isProcessed = await this.isGuestIdProcessed(session.previousGuestId);
|
||||
if (!isProcessed) {
|
||||
guestIdsToProcess.add(session.previousGuestId);
|
||||
|
||||
// Записываем связь с пользователем в новую таблицу
|
||||
await db.getQuery()(
|
||||
'INSERT INTO guest_user_mapping (user_id, guest_id) VALUES ($1, $2) ON CONFLICT (guest_id) DO UPDATE SET user_id = $1',
|
||||
[userId, session.previousGuestId]
|
||||
);
|
||||
// Записываем связь с пользователем в новую таблицу
|
||||
await db.getQuery()(
|
||||
'INSERT INTO guest_user_mapping (user_id, guest_id) VALUES ($1, $2) ON CONFLICT (guest_id) DO UPDATE SET user_id = $1',
|
||||
[userId, session.previousGuestId]
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
// Добавляем все гостевые ID пользователя из таблицы
|
||||
// Добавляем все гостевые ID пользователя из таблицы, которые еще не обработаны
|
||||
for (const guestId of userGuestIds) {
|
||||
if (!session.processedGuestIds.includes(guestId)) {
|
||||
const isProcessed = await this.isGuestIdProcessed(guestId);
|
||||
if (!isProcessed) {
|
||||
guestIdsToProcess.add(guestId);
|
||||
}
|
||||
}
|
||||
|
||||
// Логируем только если есть что обрабатывать
|
||||
if (guestIdsToProcess.size > 0) {
|
||||
logger.info(
|
||||
`[linkGuestMessages] Processing ${guestIdsToProcess.size} guest IDs for user ${userId}`
|
||||
);
|
||||
}
|
||||
|
||||
// Обрабатываем все собранные гостевые ID
|
||||
for (const guestId of guestIdsToProcess) {
|
||||
await this.processGuestMessagesWrapper(userId, guestId);
|
||||
session.processedGuestIds.push(guestId);
|
||||
|
||||
// Помечаем guestId как обработанный в базе данных
|
||||
await db.getQuery()(
|
||||
@@ -101,9 +101,6 @@ class SessionService {
|
||||
);
|
||||
}
|
||||
|
||||
// Сохраняем сессию
|
||||
await this.saveSession(session);
|
||||
|
||||
return { success: true };
|
||||
} catch (error) {
|
||||
logger.error('[linkGuestMessages] Error:', error);
|
||||
@@ -111,6 +108,25 @@ class SessionService {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Проверяет, был ли guest ID уже обработан
|
||||
* @param {string} guestId - ID гостя
|
||||
* @returns {Promise<boolean>} - Был ли guest ID обработан
|
||||
*/
|
||||
async isGuestIdProcessed(guestId) {
|
||||
try {
|
||||
const result = await db.getQuery()(
|
||||
'SELECT processed FROM guest_user_mapping WHERE guest_id = $1',
|
||||
[guestId]
|
||||
);
|
||||
|
||||
return result.rows.length > 0 && result.rows[0].processed === true;
|
||||
} catch (error) {
|
||||
logger.error(`[isGuestIdProcessed] Error checking guest ID ${guestId}:`, error);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Обертка для функции processGuestMessages
|
||||
* @param {number} userId - ID пользователя
|
||||
@@ -119,9 +135,6 @@ class SessionService {
|
||||
*/
|
||||
async processGuestMessagesWrapper(userId, guestId) {
|
||||
try {
|
||||
logger.info(
|
||||
`[processGuestMessagesWrapper] Processing messages: userId=${userId}, guestId=${guestId}`
|
||||
);
|
||||
return await processGuestMessages(userId, guestId);
|
||||
} catch (error) {
|
||||
logger.error(`[processGuestMessagesWrapper] Error: ${error.message}`, error);
|
||||
@@ -260,6 +273,29 @@ class SessionService {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Очищает все массивы processedGuestIds из сессий в базе данных
|
||||
* @returns {Promise<boolean>} - Результат операции
|
||||
*/
|
||||
async cleanupProcessedGuestIds() {
|
||||
try {
|
||||
logger.info('[SessionService] Starting cleanup of processedGuestIds from sessions');
|
||||
|
||||
// Используем один SQL-запрос для обновления всех сессий
|
||||
const result = await db.getQuery()(
|
||||
`UPDATE session
|
||||
SET sess = (sess::jsonb - 'processedGuestIds')::json
|
||||
WHERE sess::text LIKE '%"processedGuestIds"%'`
|
||||
);
|
||||
|
||||
logger.info(`[SessionService] Cleaned processedGuestIds from ${result.rowCount} sessions`);
|
||||
return true;
|
||||
} catch (error) {
|
||||
logger.error('[SessionService] Error during cleanup:', error);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Очищает данные аутентификации в сессии
|
||||
* @param {object} session - Объект сессии
|
||||
@@ -286,6 +322,11 @@ class SessionService {
|
||||
delete session.telegramUsername;
|
||||
delete session.telegramFirstName;
|
||||
|
||||
// Очищаем массив processedGuestIds для экономии места
|
||||
if (session.processedGuestIds) {
|
||||
delete session.processedGuestIds;
|
||||
}
|
||||
|
||||
// Восстанавливаем гостевой ID для продолжения работы
|
||||
if (guestId) {
|
||||
session.guestId = guestId;
|
||||
|
||||
Reference in New Issue
Block a user