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

This commit is contained in:
2025-05-28 11:15:38 +03:00
parent 2c28d48167
commit 2fc496d5bb
13 changed files with 1303 additions and 981 deletions

View File

@@ -1,5 +1,6 @@
const db = require('../db');
const logger = require('../utils/logger');
const { getLinkedWallet } = require('./wallet-service');
/**
* Сервис для работы с идентификаторами пользователей
@@ -521,6 +522,38 @@ class IdentityService {
return { success: false, error: error.message };
}
}
/**
* Универсальная функция: найти или создать пользователя по идентификатору, привязать идентификатор, проверить роль
* @param {string} provider - Тип идентификатора ('email' | 'telegram')
* @param {string} providerId - Значение идентификатора
* @param {object} [options] - Дополнительные опции
* @returns {Promise<{userId: number, role: string, isNew: boolean}>}
*/
async findOrCreateUserWithRole(provider, providerId, options = {}) {
let user = await this.findUserByIdentity(provider, providerId);
let isNew = false;
if (!user) {
// Создаем пользователя
const newUserResult = await db.getQuery()('INSERT INTO users (role) VALUES ($1) RETURNING id', ['user']);
const userId = newUserResult.rows[0].id;
await this.saveIdentity(userId, provider, providerId, true);
user = { id: userId, role: 'user' };
isNew = true;
}
// Проверяем связь с кошельком
const wallet = await getLinkedWallet(user.id);
let role = 'user';
if (wallet) {
const isAdmin = await authService.checkAdminRole(wallet);
role = isAdmin ? 'admin' : 'user';
// Обновляем роль в users, если изменилась
if (user.role !== role) {
await db.getQuery()('UPDATE users SET role = $1 WHERE id = $2', [role, user.id]);
}
}
return { userId: user.id, role, isNew };
}
}
module.exports = new IdentityService();