feat: новая функция

This commit is contained in:
2025-10-09 16:48:20 +03:00
parent dd2c9988a5
commit 13fb51e447
60 changed files with 7694 additions and 1157 deletions

View File

@@ -73,17 +73,23 @@ class IdentityService {
const { provider: normalizedProvider, providerId: normalizedProviderId } =
this.normalizeIdentity(provider, providerId);
// Проверяем тип провайдера и перенаправляем гостевые идентификаторы в guest_user_mapping
// Проверяем тип провайдера и перенаправляем гостевые идентификаторы в unified_guest_mapping
if (normalizedProvider === 'guest') {
logger.info(
`[IdentityService] Converting guest identity for user ${userId} to guest_user_mapping: ${normalizedProviderId}`
`[IdentityService] Converting guest identity for user ${userId} to unified_guest_mapping: ${normalizedProviderId}`
);
try {
await encryptedDb.saveData('guest_user_mapping', {
user_id: userId,
guest_id: normalizedProviderId
});
const db = require('../db');
const encryptionUtils = require('../utils/encryptionUtils');
const encryptionKey = encryptionUtils.getEncryptionKey();
await db.getQuery()(
`INSERT INTO unified_guest_mapping (user_id, identifier_encrypted, channel, created_at)
VALUES ($1, encrypt_text($2, $4), $3, NOW())
ON CONFLICT (identifier_encrypted, channel) DO NOTHING`,
[userId, `web:${normalizedProviderId}`, 'web', encryptionKey]
);
return { success: true };
} catch (guestError) {
logger.error(
@@ -285,13 +291,19 @@ class IdentityService {
results.push({ type: 'telegram', result: telegramResult });
}
// Сохраняем гостевые идентификаторы в guest_user_mapping
// Сохраняем гостевые идентификаторы в unified_guest_mapping
if (session.guestId) {
try {
await encryptedDb.saveData('guest_user_mapping', {
user_id: userId,
guest_id: session.guestId
});
const db = require('../db');
const encryptionUtils = require('../utils/encryptionUtils');
const encryptionKey = encryptionUtils.getEncryptionKey();
await db.getQuery()(
`INSERT INTO unified_guest_mapping (user_id, identifier_encrypted, channel, created_at)
VALUES ($1, encrypt_text($2, $4), $3, NOW())
ON CONFLICT (identifier_encrypted, channel) DO NOTHING`,
[userId, `web:${session.guestId}`, 'web', encryptionKey]
);
results.push({ type: 'guest', result: { success: true } });
} catch (error) {
logger.error(`[IdentityService] Error saving guest ID for user ${userId}:`, error);
@@ -301,10 +313,16 @@ class IdentityService {
if (session.previousGuestId && session.previousGuestId !== session.guestId) {
try {
await encryptedDb.saveData('guest_user_mapping', {
user_id: userId,
guest_id: session.previousGuestId
});
const db = require('../db');
const encryptionUtils = require('../utils/encryptionUtils');
const encryptionKey = encryptionUtils.getEncryptionKey();
await db.getQuery()(
`INSERT INTO unified_guest_mapping (user_id, identifier_encrypted, channel, created_at)
VALUES ($1, encrypt_text($2, $4), $3, NOW())
ON CONFLICT (identifier_encrypted, channel) DO NOTHING`,
[userId, `web:${session.previousGuestId}`, 'web', encryptionKey]
);
results.push({ type: 'previousGuest', result: { success: true } });
} catch (error) {
logger.error(
@@ -364,19 +382,24 @@ class IdentityService {
}
// Мигрируем гостевые идентификаторы
const guestMappings = await encryptedDb.getData('guest_user_mapping', { user_id: fromUserId });
const guestMappings = await encryptedDb.getData('unified_guest_mapping', { user_id: fromUserId });
// Переносим каждый гостевой идентификатор
for (const mapping of guestMappings) {
await encryptedDb.saveData('guest_user_mapping', {
user_id: toUserId,
guest_id: mapping.guest_id,
processed: mapping.processed
});
const db = require('../db');
const encryptionUtils = require('../utils/encryptionUtils');
const encryptionKey = encryptionUtils.getEncryptionKey();
await db.getQuery()(
`INSERT INTO unified_guest_mapping (user_id, identifier_encrypted, channel, processed, processed_at, created_at)
VALUES ($1, encrypt_text($2, $6), $3, $4, $5, NOW())
ON CONFLICT (identifier_encrypted, channel) DO UPDATE SET user_id = $1, processed = $4, processed_at = $5`,
[toUserId, mapping.identifier_encrypted, mapping.channel, mapping.processed, mapping.processed_at, encryptionKey]
);
}
// Удаляем старые гостевые маппинги
await encryptedDb.deleteData('guest_user_mapping', { user_id: fromUserId });
await encryptedDb.deleteData('unified_guest_mapping', { user_id: fromUserId });
// Переносим все сообщения
const messages = await encryptedDb.getData('messages', { user_id: fromUserId });