ваше сообщение коммита
This commit is contained in:
@@ -145,6 +145,61 @@ class AuthService {
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Получение балансов токенов для адреса
|
||||
* @param {string} address - Адрес кошелька
|
||||
* @returns {Promise<Object>} - Объект с балансами токенов
|
||||
*/
|
||||
async getTokenBalances(address) {
|
||||
if (!address) {
|
||||
logger.error('No address provided for getTokenBalances');
|
||||
return {
|
||||
eth: '0',
|
||||
bsc: '0',
|
||||
arbitrum: '0',
|
||||
polygon: '0'
|
||||
};
|
||||
}
|
||||
|
||||
const balances = {};
|
||||
|
||||
for (const contract of ADMIN_CONTRACTS) {
|
||||
try {
|
||||
const provider = this.providers[contract.network];
|
||||
if (!provider) {
|
||||
logger.error(`No provider for network ${contract.network}`);
|
||||
balances[contract.network] = '0';
|
||||
continue;
|
||||
}
|
||||
|
||||
const tokenContract = new ethers.Contract(
|
||||
contract.address,
|
||||
ERC20_ABI,
|
||||
provider
|
||||
);
|
||||
|
||||
const balance = await tokenContract.balanceOf(address);
|
||||
const formattedBalance = ethers.formatUnits(balance, 18);
|
||||
|
||||
logger.info(`Token balance for ${address} on ${contract.network}:`, {
|
||||
contract: contract.address,
|
||||
balance: formattedBalance
|
||||
});
|
||||
|
||||
balances[contract.network] = formattedBalance;
|
||||
} catch (error) {
|
||||
logger.error(`Error getting balance for ${contract.network}:`, {
|
||||
address,
|
||||
contract: contract.address,
|
||||
error: error.message
|
||||
});
|
||||
balances[contract.network] = '0';
|
||||
}
|
||||
}
|
||||
|
||||
return balances;
|
||||
}
|
||||
|
||||
// Создание сессии с проверкой роли
|
||||
async createSession(session, { userId, authenticated, authType, guestId, address }) {
|
||||
try {
|
||||
@@ -209,12 +264,18 @@ class AuthService {
|
||||
try {
|
||||
// Проверяем наличие связанного кошелька
|
||||
const wallet = await this.getLinkedWallet(userId);
|
||||
if (wallet) {
|
||||
// Если есть кошелек, проверяем админские токены
|
||||
const isAdmin = await this.checkAdminRole(wallet);
|
||||
return isAdmin ? 'admin' : 'user';
|
||||
|
||||
// Если кошелек не привязан, пользователь получает роль user
|
||||
// с базовым доступом к чату и истории сообщений
|
||||
if (!wallet) {
|
||||
logger.info(`No wallet linked for user ${userId}, assigning basic user role`);
|
||||
return 'user';
|
||||
}
|
||||
return 'user';
|
||||
|
||||
// Если есть кошелек, проверяем админские токены
|
||||
const isAdmin = await this.checkAdminRole(wallet);
|
||||
logger.info(`Role check for user ${userId} with wallet ${wallet}: ${isAdmin ? 'admin' : 'user'}`);
|
||||
return isAdmin ? 'admin' : 'user';
|
||||
} catch (error) {
|
||||
logger.error('Error checking user role:', error);
|
||||
return 'user';
|
||||
@@ -243,17 +304,93 @@ class AuthService {
|
||||
if (userResult.rows.length === 0) {
|
||||
return { verified: false };
|
||||
}
|
||||
|
||||
// Проверяем наличие кошелька и определяем роль
|
||||
const wallet = await this.getLinkedWallet(userId);
|
||||
let role = 'user'; // Базовая роль для доступа к чату
|
||||
|
||||
if (wallet) {
|
||||
// Если есть кошелек, проверяем баланс токенов
|
||||
const isAdmin = await this.checkAdminRole(wallet);
|
||||
role = isAdmin ? 'admin' : 'user';
|
||||
logger.info(`User ${userId} has wallet ${wallet}, role set to ${role}`);
|
||||
} else {
|
||||
logger.info(`User ${userId} has no wallet, using basic user role`);
|
||||
}
|
||||
|
||||
return {
|
||||
verified: true,
|
||||
userId,
|
||||
email
|
||||
email,
|
||||
role,
|
||||
wallet: wallet || null
|
||||
};
|
||||
} catch (error) {
|
||||
logger.error('Error checking email verification:', error);
|
||||
return { verified: false };
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Проверка Telegram аутентификации
|
||||
*/
|
||||
async verifyTelegramAuth(telegramId, verificationCode) {
|
||||
try {
|
||||
logger.info(`Verifying Telegram auth for ID: ${telegramId} with code: ${verificationCode}`);
|
||||
|
||||
// Находим или создаем пользователя
|
||||
const userResult = await db.query(
|
||||
`SELECT u.* FROM users u
|
||||
JOIN user_identities ui ON u.id = ui.user_id
|
||||
WHERE ui.provider = 'telegram' AND ui.provider_id = $1`,
|
||||
[telegramId]
|
||||
);
|
||||
|
||||
let userId;
|
||||
if (userResult.rows.length > 0) {
|
||||
userId = userResult.rows[0].id;
|
||||
logger.info(`Found existing user ${userId} for Telegram ID ${telegramId}`);
|
||||
} else {
|
||||
// Создаем нового пользователя с ролью user
|
||||
const newUserResult = await db.query(
|
||||
'INSERT INTO users (role) VALUES ($1) RETURNING id',
|
||||
['user']
|
||||
);
|
||||
userId = newUserResult.rows[0].id;
|
||||
|
||||
// Добавляем Telegram идентификатор
|
||||
await db.query(
|
||||
'INSERT INTO user_identities (user_id, provider, provider_id) VALUES ($1, $2, $3)',
|
||||
[userId, 'telegram', telegramId]
|
||||
);
|
||||
logger.info(`Created new user ${userId} for Telegram ID ${telegramId}`);
|
||||
}
|
||||
|
||||
// Проверяем наличие кошелька и определяем роль
|
||||
const wallet = await this.getLinkedWallet(userId);
|
||||
let role = 'user'; // Базовая роль для доступа к чату
|
||||
|
||||
if (wallet) {
|
||||
// Если есть кошелек, проверяем баланс токенов
|
||||
const isAdmin = await this.checkAdminRole(wallet);
|
||||
role = isAdmin ? 'admin' : 'user';
|
||||
logger.info(`User ${userId} has wallet ${wallet}, role set to ${role}`);
|
||||
} else {
|
||||
logger.info(`User ${userId} has no wallet, using basic user role`);
|
||||
}
|
||||
|
||||
return {
|
||||
success: true,
|
||||
userId,
|
||||
role,
|
||||
telegramId,
|
||||
wallet: wallet || null
|
||||
};
|
||||
} catch (error) {
|
||||
logger.error('Error in Telegram auth verification:', error);
|
||||
throw error;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Создаем и экспортируем единственный экземпляр
|
||||
|
||||
Reference in New Issue
Block a user