nakama/backend/scripts/fixReferrals.js

106 lines
4.2 KiB
JavaScript
Raw Permalink Normal View History

2025-12-08 14:37:25 +00:00
const mongoose = require('mongoose');
const dotenv = require('dotenv');
const path = require('path');
2025-12-08 14:57:15 +00:00
// Загрузить переменные окружения из корня проекта
// __dirname указывает на backend/scripts, поэтому нужно подняться на 2 уровня вверх
dotenv.config({ path: path.join(__dirname, '../../.env') });
2025-12-08 14:37:25 +00:00
const User = require('../models/User');
const { getMoscowStartOfDay } = require('../utils/moscowTime');
const { awardReferral } = require('../utils/tickets');
async function fixReferrals() {
try {
2025-12-08 14:57:15 +00:00
const mongoUri = process.env.MONGODB_URI || 'mongodb://localhost:27017/nakama';
2025-12-08 14:37:25 +00:00
await mongoose.connect(mongoUri);
console.log('✅ Подключено к MongoDB');
// Найти всех пользователей, у которых есть referredBy, но они еще не засчитаны
2025-12-08 14:57:15 +00:00
// Включаем случаи, когда referralCounted отсутствует, null или false
2025-12-08 14:37:25 +00:00
const usersWithReferrals = await User.find({
referredBy: { $exists: true, $ne: null },
2025-12-08 14:57:15 +00:00
$or: [
{ referralCounted: { $exists: false } },
{ referralCounted: null },
{ referralCounted: false }
]
2025-12-08 14:37:25 +00:00
}).populate('referredBy', 'username referralCode referralsCount');
console.log(`\n📊 Найдено ${usersWithReferrals.length} пользователей с незасчитанными рефералами\n`);
let fixed = 0;
let needMoreDays = 0;
for (const user of usersWithReferrals) {
if (!user.referredBy) {
console.log(`⚠️ Пользователь ${user.username} (${user._id}) имеет referredBy, но реферер не найден`);
continue;
}
// Инициализировать loginDates если его нет
if (!user.loginDates || user.loginDates.length === 0) {
console.log(`📅 Пользователь ${user.username} (${user._id}) не имеет дат входа. Пропускаем.`);
needMoreDays++;
continue;
}
// Получить уникальные даты из массива loginDates
const uniqueDates = new Set();
user.loginDates.forEach(date => {
const dateObj = getMoscowStartOfDay(new Date(date));
uniqueDates.add(dateObj.getTime());
});
console.log(`👤 ${user.username} (${user._id})`);
console.log(` Реферер: ${user.referredBy.username} (${user.referredBy._id})`);
console.log(` Уникальных дат входа: ${uniqueDates.size}`);
console.log(` Даты: ${Array.from(uniqueDates).map(t => new Date(t).toLocaleDateString('ru-RU')).join(', ')}`);
// Если есть 2 или более уникальные даты, засчитать реферала
if (uniqueDates.size >= 2) {
const referrer = user.referredBy;
// Увеличить счетчик рефералов
referrer.referralsCount = (referrer.referralsCount || 0) + 1;
await referrer.save();
console.log(` ✅ РЕФЕРАЛ ЗАСЧИТАН! Новый счетчик: ${referrer.referralsCount}`);
// Начислить баллы за реферала
try {
await awardReferral(referrer._id);
console.log(` ✅ Баллы начислены`);
} catch (error) {
console.error(` ⚠️ Ошибка начисления баллов:`, error.message);
}
// Пометить как засчитанный
user.referralCounted = true;
user.loginDates = [];
await user.save();
fixed++;
} else {
console.log(` ⏳ Нужно еще ${2 - uniqueDates.size} уникальных дат входа`);
needMoreDays++;
}
console.log('');
}
console.log(`\n📊 Итого:`);
console.log(` ✅ Засчитано рефералов: ${fixed}`);
console.log(` ⏳ Требуется больше дней: ${needMoreDays}`);
await mongoose.connection.close();
console.log('✅ Готово!');
} catch (error) {
console.error('❌ Ошибка:', error);
process.exit(1);
}
}
fixReferrals();