update calculate user balance
This commit is contained in:
@@ -1,5 +1,9 @@
|
||||
// userService.js
|
||||
|
||||
import db from "../config/database.js";
|
||||
import Wallet from "../models/Wallet.js";
|
||||
import WalletUtils from "../utils/walletUtils.js";
|
||||
|
||||
|
||||
class UserService {
|
||||
// Функция для нормализации telegram_id
|
||||
@@ -119,22 +123,50 @@ class UserService {
|
||||
static async recalculateUserBalanceByTelegramId(telegramId) {
|
||||
const normalizedTelegramId = this.normalizeTelegramId(telegramId);
|
||||
const user = await this.getUserByTelegramId(normalizedTelegramId);
|
||||
|
||||
|
||||
if (!user) {
|
||||
return;
|
||||
}
|
||||
|
||||
const archivedBalance = await Wallet.getArchivedWalletsBalance(user.id);
|
||||
const activeBalance = await Wallet.getActiveWalletsBalance(user.id);
|
||||
|
||||
const purchases = await db.getAsync(
|
||||
`SELECT SUM(total_price) as total_sum FROM purchases WHERE user_id = ?`,
|
||||
[user.id]
|
||||
);
|
||||
|
||||
const userTotalBalance = (activeBalance + archivedBalance) - (purchases?.total_sum || 0);
|
||||
|
||||
await db.runAsync(`UPDATE users SET total_balance = ? WHERE id = ?`, [userTotalBalance, user.id]);
|
||||
|
||||
try {
|
||||
// Получаем все крипто-балансы пользователя
|
||||
const cryptoBalances = await db.allAsync(
|
||||
`SELECT wallet_type, balance FROM crypto_wallets WHERE user_id = ?`,
|
||||
[user.id]
|
||||
);
|
||||
|
||||
// Получаем актуальные курсы криптовалют
|
||||
const prices = await WalletUtils.getCryptoPrices();
|
||||
|
||||
// Пересчитываем балансы в доллары
|
||||
let totalCryptoBalance = 0;
|
||||
for (const wallet of cryptoBalances) {
|
||||
const baseType = WalletUtils.getBaseWalletType(wallet.wallet_type); // Убираем суффиксы
|
||||
const rate = prices[baseType.toLowerCase()] || 0; // Получаем курс для базового типа
|
||||
totalCryptoBalance += wallet.balance * rate;
|
||||
}
|
||||
|
||||
// Получаем сумму всех покупок в крипте
|
||||
const cryptoPurchases = await db.getAsync(
|
||||
`SELECT SUM(total_price) as total_sum FROM purchases
|
||||
WHERE user_id = ? AND wallet_type LIKE 'crypto%'`,
|
||||
[user.id]
|
||||
);
|
||||
|
||||
// Вычитаем сумму покупок из общего крипто-баланса
|
||||
const remainingBalance = totalCryptoBalance - (cryptoPurchases?.total_sum || 0);
|
||||
|
||||
// Обновляем поле total_balance в таблице users
|
||||
await db.runAsync(
|
||||
`UPDATE users SET total_balance = ? WHERE id = ?`,
|
||||
[remainingBalance, user.id]
|
||||
);
|
||||
|
||||
console.log(`[DEBUG] Updated total_balance for user ${user.id}: ${remainingBalance}`);
|
||||
} catch (error) {
|
||||
console.error('Error recalculating user balance:', error);
|
||||
throw error;
|
||||
}
|
||||
}
|
||||
|
||||
static async updateUserLocation(telegramId, country, city, district) {
|
||||
@@ -164,28 +196,13 @@ class UserService {
|
||||
|
||||
static async getUserBalance(userId) {
|
||||
try {
|
||||
// Пересчитываем баланс перед получением
|
||||
const user = await this.getUserByUserId(userId);
|
||||
if (!user) {
|
||||
throw new Error('User not found');
|
||||
}
|
||||
|
||||
await this.recalculateUserBalanceByTelegramId(user.telegram_id);
|
||||
|
||||
// Получаем обновленный баланс
|
||||
const updatedUser = await db.getAsync(
|
||||
`SELECT total_balance, bonus_balance
|
||||
FROM users
|
||||
WHERE id = ?`,
|
||||
[userId]
|
||||
);
|
||||
|
||||
if (!updatedUser) {
|
||||
throw new Error('User not found');
|
||||
}
|
||||
|
||||
// Возвращаем сумму основного и бонусного баланса
|
||||
return updatedUser.total_balance + updatedUser.bonus_balance;
|
||||
// Возвращаем сумму доступного крипто-баланса и бонусного баланса
|
||||
return user.total_balance + user.bonus_balance;
|
||||
} catch (error) {
|
||||
console.error('Error getting user balance:', error);
|
||||
throw error;
|
||||
|
||||
Reference in New Issue
Block a user