nakama/backend/scripts/fixReferrals.js

100 lines
3.9 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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();