140 lines
5.0 KiB
JavaScript
140 lines
5.0 KiB
JavaScript
|
|
// Команда для исправления ВСЕХ незасчитанных рефералов
|
|||
|
|
// Выполните в mongosh: load('backend/scripts/fixAllReferrals.mongosh.js')
|
|||
|
|
|
|||
|
|
print("🔍 Поиск всех пользователей с referredBy...\n");
|
|||
|
|
|
|||
|
|
var fixed = 0;
|
|||
|
|
var needMoreDays = 0;
|
|||
|
|
var alreadyCounted = 0;
|
|||
|
|
var noReferrer = 0;
|
|||
|
|
var errors = 0;
|
|||
|
|
|
|||
|
|
// Функция для получения начала дня по московскому времени
|
|||
|
|
function getMoscowStartOfDay(date) {
|
|||
|
|
if (!date) date = new Date();
|
|||
|
|
var d = new Date(date);
|
|||
|
|
// Получаем UTC timestamp
|
|||
|
|
var utcTimestamp = d.getTime();
|
|||
|
|
// Добавляем московское смещение (UTC+3)
|
|||
|
|
var moscowOffset = 3 * 60 * 60 * 1000;
|
|||
|
|
var moscowTime = new Date(utcTimestamp + moscowOffset);
|
|||
|
|
|
|||
|
|
// Устанавливаем начало дня
|
|||
|
|
var year = moscowTime.getUTCFullYear();
|
|||
|
|
var month = moscowTime.getUTCMonth();
|
|||
|
|
var day = moscowTime.getUTCDate();
|
|||
|
|
|
|||
|
|
var moscowStartOfDay = new Date(Date.UTC(year, month, day, 0, 0, 0, 0));
|
|||
|
|
return new Date(moscowStartOfDay.getTime() - moscowOffset);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// Найти всех пользователей с referredBy
|
|||
|
|
db.users.find({
|
|||
|
|
referredBy: { $exists: true, $ne: null }
|
|||
|
|
}).forEach(function(user) {
|
|||
|
|
try {
|
|||
|
|
// Пропускаем уже засчитанных
|
|||
|
|
if (user.referralCounted === true) {
|
|||
|
|
alreadyCounted++;
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// Получить реферера
|
|||
|
|
var referrer = db.users.findOne({ _id: user.referredBy });
|
|||
|
|
|
|||
|
|
if (!referrer) {
|
|||
|
|
print("⚠️ " + (user.username || user._id) + " -> реферер не найден (ID: " + user.referredBy + ")\n");
|
|||
|
|
noReferrer++;
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// Получить уникальные даты
|
|||
|
|
var uniqueDates = new Set();
|
|||
|
|
if (user.loginDates && Array.isArray(user.loginDates)) {
|
|||
|
|
user.loginDates.forEach(function(date) {
|
|||
|
|
if (!date) return;
|
|||
|
|
try {
|
|||
|
|
var normalizedDate = getMoscowStartOfDay(new Date(date));
|
|||
|
|
uniqueDates.add(normalizedDate.getTime());
|
|||
|
|
} catch (e) {
|
|||
|
|
// Игнорируем ошибки парсинга дат
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
var uniqueCount = uniqueDates.size;
|
|||
|
|
|
|||
|
|
// Если есть 2+ уникальные даты, засчитать
|
|||
|
|
if (uniqueCount >= 2) {
|
|||
|
|
var currentCount = referrer.referralsCount || 0;
|
|||
|
|
var newCount = currentCount + 1;
|
|||
|
|
|
|||
|
|
// Увеличить счетчик рефералов
|
|||
|
|
db.users.updateOne(
|
|||
|
|
{ _id: referrer._id },
|
|||
|
|
{ $set: { referralsCount: newCount } }
|
|||
|
|
);
|
|||
|
|
|
|||
|
|
// Пометить как засчитанного
|
|||
|
|
db.users.updateOne(
|
|||
|
|
{ _id: user._id },
|
|||
|
|
{
|
|||
|
|
$set: {
|
|||
|
|
referralCounted: true,
|
|||
|
|
loginDates: []
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
);
|
|||
|
|
|
|||
|
|
print("✅ ЗАСЧИТАН: " + (user.username || user._id) + " -> " + (referrer.username || referrer._id) + " (счетчик: " + currentCount + " -> " + newCount + ")\n");
|
|||
|
|
fixed++;
|
|||
|
|
} else if (uniqueCount > 0) {
|
|||
|
|
print("⏳ " + (user.username || user._id) + " -> нужно еще " + (2 - uniqueCount) + " дат (сейчас: " + uniqueCount + ")\n");
|
|||
|
|
needMoreDays++;
|
|||
|
|
} else {
|
|||
|
|
// Если нет дат входа, но пользователь существует более суток - засчитать как исключение
|
|||
|
|
var userAge = new Date() - new Date(user.createdAt || user._id.getTimestamp());
|
|||
|
|
var oneDay = 24 * 60 * 60 * 1000;
|
|||
|
|
|
|||
|
|
if (userAge > oneDay) {
|
|||
|
|
// Пользователь существует более суток, засчитываем
|
|||
|
|
var currentCount = referrer.referralsCount || 0;
|
|||
|
|
var newCount = currentCount + 1;
|
|||
|
|
|
|||
|
|
db.users.updateOne(
|
|||
|
|
{ _id: referrer._id },
|
|||
|
|
{ $set: { referralsCount: newCount } }
|
|||
|
|
);
|
|||
|
|
|
|||
|
|
db.users.updateOne(
|
|||
|
|
{ _id: user._id },
|
|||
|
|
{
|
|||
|
|
$set: {
|
|||
|
|
referralCounted: true,
|
|||
|
|
loginDates: []
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
);
|
|||
|
|
|
|||
|
|
print("✅ ЗАСЧИТАН (по возрасту >24ч): " + (user.username || user._id) + " -> " + (referrer.username || referrer._id) + " (счетчик: " + currentCount + " -> " + newCount + ")\n");
|
|||
|
|
fixed++;
|
|||
|
|
} else {
|
|||
|
|
print("📅 " + (user.username || user._id) + " -> нет дат входа, возраст: " + Math.round(userAge / (60 * 60 * 1000)) + " часов\n");
|
|||
|
|
needMoreDays++;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
} catch (error) {
|
|||
|
|
print("❌ Ошибка для " + (user.username || user._id) + ": " + error.message + "\n");
|
|||
|
|
errors++;
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
|
|||
|
|
print("\n📊 ИТОГО:");
|
|||
|
|
print(" ✅ Засчитано: " + fixed);
|
|||
|
|
print(" ✅ Уже были засчитаны: " + alreadyCounted);
|
|||
|
|
print(" ⏳ Требуется больше дней: " + needMoreDays);
|
|||
|
|
print(" ⚠️ Реферер не найден: " + noReferrer);
|
|||
|
|
print(" ❌ Ошибок: " + errors);
|
|||
|
|
print("\n✅ Готово!");
|
|||
|
|
|