ваше сообщение коммита

This commit is contained in:
2025-04-10 18:27:06 +03:00
parent f695dea7ba
commit 6f1cebe27b
11 changed files with 979 additions and 482 deletions

View File

@@ -195,6 +195,110 @@ class IdentityService {
return { success: false, error: error.message };
}
}
/**
* Мигрирует все идентификаторы и сообщения от одного пользователя к другому
* @param {number} fromUserId - ID исходного пользователя
* @param {number} toUserId - ID целевого пользователя
* @returns {Promise<object>} - Результат операции
*/
async migrateUserData(fromUserId, toUserId) {
try {
if (!fromUserId || !toUserId) {
logger.warn(`[IdentityService] Missing parameters: fromUserId=${fromUserId}, toUserId=${toUserId}`);
return { success: false, error: 'Missing required parameters' };
}
// Начинаем транзакцию
const client = await db.pool.connect();
try {
await client.query('BEGIN');
// Получаем все идентификаторы исходного пользователя
const identitiesResult = await client.query(
`SELECT provider, provider_id FROM user_identities WHERE user_id = $1`,
[fromUserId]
);
// Переносим каждый идентификатор
for (const identity of identitiesResult.rows) {
await client.query(
`UPDATE user_identities
SET user_id = $1
WHERE user_id = $2 AND provider = $3 AND provider_id = $4`,
[toUserId, fromUserId, identity.provider, identity.provider_id]
);
}
// Переносим все сообщения
await client.query(
`UPDATE messages
SET user_id = $1
WHERE user_id = $2`,
[toUserId, fromUserId]
);
// Переносим все диалоги
await client.query(
`UPDATE conversations
SET user_id = $1
WHERE user_id = $2`,
[toUserId, fromUserId]
);
// Удаляем исходного пользователя
await client.query(
`DELETE FROM users WHERE id = $1`,
[fromUserId]
);
await client.query('COMMIT');
logger.info(`[IdentityService] Successfully migrated data from user ${fromUserId} to user ${toUserId}`);
return {
success: true,
migratedIdentities: identitiesResult.rows.length
};
} catch (error) {
await client.query('ROLLBACK');
throw error;
} finally {
client.release();
}
} catch (error) {
logger.error(`[IdentityService] Error migrating data from user ${fromUserId} to user ${toUserId}:`, error);
return { success: false, error: error.message };
}
}
/**
* Находит всех пользователей с похожими идентификаторами
* @param {object} identities - Объект с идентификаторами
* @returns {Promise<Array>} - Массив ID пользователей
*/
async findRelatedUsers(identities) {
try {
const userIds = new Set();
for (const [provider, providerId] of Object.entries(identities)) {
if (!providerId) continue;
const result = await db.query(
`SELECT DISTINCT user_id
FROM user_identities
WHERE provider = $1 AND provider_id = $2`,
[provider, providerId]
);
result.rows.forEach(row => userIds.add(row.user_id));
}
return Array.from(userIds);
} catch (error) {
logger.error(`[IdentityService] Error finding related users:`, error);
return [];
}
}
}
module.exports = new IdentityService();