Files
DLE/backend/services/emailAuth.js

106 lines
3.5 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

const { pool } = require('../db');
const verificationService = require('./verification-service');
const logger = require('../utils/logger');
const emailBot = require('./emailBot');
const db = require('../db');
const authService = require('./auth-service');
class EmailAuth {
constructor() {
this.emailBot = emailBot;
}
async initEmailAuth(session, email) {
try {
if (!email || !email.match(/^[^\s@]+@[^\s@]+\.[^\s@]+$/)) {
throw new Error('Некорректный формат email');
}
// Создаем или получаем ID пользователя
let userId;
if (session.authenticated && session.userId) {
userId = session.userId;
} else {
const userResult = await db.query(
'INSERT INTO users (role) VALUES ($1) RETURNING id',
['user']
);
userId = userResult.rows[0].id;
session.tempUserId = userId;
}
// Сохраняем email в сессии
session.pendingEmail = email.toLowerCase();
// Создаем код через сервис верификации
const verificationCode = await verificationService.createVerificationCode(
'email',
email.toLowerCase(),
userId
);
// Отправляем код на email
await this.emailBot.sendVerificationCode(email, verificationCode);
logger.info(`Generated verification code for Email auth for ${email} and sent to user's email`);
return { success: true, verificationCode };
} catch (error) {
logger.error('Error in email auth initialization:', error);
throw error;
}
}
async checkEmailVerification(code, session) {
try {
if (!code) {
return { verified: false, message: 'Код верификации не предоставлен' };
}
if (!session.pendingEmail) {
return { verified: false, message: 'Email не найден в сессии' };
}
// Проверяем код через сервис верификации
const result = await verificationService.verifyCode(code, 'email', session.pendingEmail);
if (!result.success) {
// Используем сообщение об ошибке из сервиса верификации
return { verified: false, message: result.error || 'Неверный код верификации' };
}
const userId = result.userId || session.tempUserId;
const email = session.pendingEmail;
// Добавляем email в базу данных
await db.query(
`INSERT INTO user_identities
(user_id, provider, provider_id)
VALUES ($1, $2, $3)
ON CONFLICT (provider, provider_id)
DO UPDATE SET user_id = $1`,
[userId, 'email', email.toLowerCase()]
);
// Очищаем временные данные
delete session.pendingEmail;
if (session.tempUserId) {
delete session.tempUserId;
}
return {
verified: true,
userId,
email: email.toLowerCase()
};
} catch (error) {
logger.error('Error checking email verification:', error);
return { verified: false, message: 'Ошибка при проверке кода верификации' };
}
}
}
// Создаем и экспортируем единственный экземпляр
const emailAuth = new EmailAuth();
module.exports = emailAuth;