100 lines
3.9 KiB
JavaScript
100 lines
3.9 KiB
JavaScript
const mongoose = require('mongoose');
|
||
const dotenv = require('dotenv');
|
||
const path = require('path');
|
||
|
||
// Загрузить переменные окружения
|
||
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.MONGO_URI || 'mongodb://localhost:27017/nakama';
|
||
await mongoose.connect(mongoUri);
|
||
console.log('✅ Подключено к MongoDB');
|
||
|
||
// Найти всех пользователей, у которых есть referredBy, но они еще не засчитаны
|
||
const usersWithReferrals = await User.find({
|
||
referredBy: { $exists: true, $ne: null },
|
||
referralCounted: { $ne: true }
|
||
}).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();
|
||
|