const mongoose = require('mongoose'); const dotenv = require('dotenv'); const path = require('path'); // Загрузить переменные окружения из корня проекта // __dirname указывает на backend/scripts, поэтому нужно подняться на 2 уровня вверх dotenv.config({ path: path.join(__dirname, '../../.env') }); const User = require('../models/User'); const { getMoscowStartOfDay } = require('../utils/moscowTime'); const { awardReferral } = require('../utils/tickets'); async function fixReferrals() { try { const mongoUri = process.env.MONGODB_URI || 'mongodb://localhost:27017/nakama'; await mongoose.connect(mongoUri); console.log('✅ Подключено к MongoDB'); // Найти всех пользователей, у которых есть referredBy, но они еще не засчитаны // Включаем случаи, когда referralCounted отсутствует, null или false const usersWithReferrals = await User.find({ referredBy: { $exists: true, $ne: null }, $or: [ { referralCounted: { $exists: false } }, { referralCounted: null }, { referralCounted: false } ] }).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();