157 lines
4.6 KiB
JavaScript
157 lines
4.6 KiB
JavaScript
/**
|
||
* Copyright (c) 2024-2025 Тарабанов Александр Викторович
|
||
* All rights reserved.
|
||
*
|
||
* This software is proprietary and confidential.
|
||
* Unauthorized copying, modification, or distribution is prohibited.
|
||
*
|
||
* For licensing inquiries: info@hb3-accelerator.com
|
||
* Website: https://hb3-accelerator.com
|
||
* GitHub: https://github.com/HB3-ACCELERATOR
|
||
*/
|
||
|
||
const encryptedDb = require('./encryptedDatabaseService');
|
||
const logger = require('../utils/logger');
|
||
|
||
class VerificationService {
|
||
constructor() {
|
||
this.codeLength = 6;
|
||
this.expirationMinutes = 15;
|
||
}
|
||
|
||
// Генерация кода
|
||
generateCode() {
|
||
const code = Math.random()
|
||
.toString(36)
|
||
.substring(2, 2 + this.codeLength)
|
||
.toUpperCase();
|
||
logger.info(`Generated verification code: ${code}`);
|
||
return code;
|
||
}
|
||
|
||
// Создание кода верификации
|
||
async createVerificationCode(provider, providerId, userId) {
|
||
const code = this.generateCode();
|
||
const expiresAt = new Date(Date.now() + this.expirationMinutes * 60 * 1000);
|
||
|
||
try {
|
||
logger.info(
|
||
`Creating verification code for ${provider}:${providerId}, userId: ${userId || 'null'}`
|
||
);
|
||
|
||
const data = {
|
||
code: code,
|
||
provider: provider,
|
||
provider_id: providerId,
|
||
expires_at: expiresAt,
|
||
used: false
|
||
};
|
||
|
||
// Если userId указан, добавляем его
|
||
if (userId !== null && userId !== undefined) {
|
||
data.user_id = userId;
|
||
}
|
||
|
||
await encryptedDb.saveData('verification_codes', data);
|
||
|
||
logger.info(`Verification code created successfully for ${provider}:${providerId}`);
|
||
return code;
|
||
} catch (error) {
|
||
logger.error('Error creating verification code:', {
|
||
error: error.message,
|
||
provider,
|
||
providerId,
|
||
userId,
|
||
});
|
||
throw error;
|
||
}
|
||
}
|
||
|
||
// Проверка кода
|
||
async verifyCode(code, provider, providerId) {
|
||
try {
|
||
logger.info(`Verifying code for ${provider}:${providerId}`);
|
||
|
||
// Преобразуем код в верхний регистр для сравнения
|
||
const normalizedCode = code.toUpperCase();
|
||
logger.info(`Normalized code: ${normalizedCode}`);
|
||
|
||
// Проверим, есть ли такой код в базе (для отладки)
|
||
const checkResult = await encryptedDb.getData('verification_codes', {
|
||
provider: provider,
|
||
provider_id: providerId,
|
||
used: false
|
||
});
|
||
|
||
if (checkResult.length > 0) {
|
||
logger.info(
|
||
`Found codes for ${provider}:${providerId}: ${JSON.stringify(checkResult.map((r) => r.code))}`
|
||
);
|
||
} else {
|
||
logger.warn(`No active codes found for ${provider}:${providerId}`);
|
||
}
|
||
|
||
const result = await encryptedDb.getData('verification_codes', {
|
||
code: normalizedCode,
|
||
provider: provider,
|
||
provider_id: providerId,
|
||
used: false
|
||
}, 1);
|
||
|
||
if (result.length === 0) {
|
||
logger.warn(`No valid verification code found for ${provider}:${providerId}`);
|
||
return { valid: false, message: 'Invalid or expired code' };
|
||
}
|
||
|
||
const verificationCode = result[0];
|
||
|
||
// Проверяем срок действия
|
||
if (new Date(verificationCode.expires_at) < new Date()) {
|
||
logger.warn(`Verification code expired for ${provider}:${providerId}`);
|
||
return { valid: false, message: 'Code has expired' };
|
||
}
|
||
|
||
// Отмечаем код как использованный
|
||
await encryptedDb.saveData('verification_codes', {
|
||
used: true
|
||
}, {
|
||
id: verificationCode.id
|
||
});
|
||
|
||
logger.info(`Verification code verified successfully for ${provider}:${providerId}`);
|
||
return {
|
||
valid: true,
|
||
userId: verificationCode.user_id,
|
||
message: 'Code verified successfully'
|
||
};
|
||
} catch (error) {
|
||
logger.error('Error verifying code:', {
|
||
error: error.message,
|
||
code,
|
||
provider,
|
||
providerId,
|
||
});
|
||
throw error;
|
||
}
|
||
}
|
||
|
||
// Очистка истекших кодов
|
||
async cleanupExpiredCodes() {
|
||
try {
|
||
const expiredCodes = await encryptedDb.getData('verification_codes', {
|
||
expires_at: { $lt: new Date() }
|
||
});
|
||
|
||
for (const code of expiredCodes) {
|
||
await encryptedDb.deleteData('verification_codes', { id: code.id });
|
||
}
|
||
|
||
logger.info(`Cleaned up ${expiredCodes.length} expired verification codes`);
|
||
} catch (error) {
|
||
logger.error('Error cleaning up expired codes:', error);
|
||
}
|
||
}
|
||
}
|
||
|
||
module.exports = new VerificationService();
|