2025-11-16 11:25:27 +00:00
|
|
|
|
import 'package:mnemo_cards_backend/cron/task.dart';
|
2025-12-13 14:48:00 +00:00
|
|
|
|
import 'package:mnemo_cards_backend/database/database.dart';
|
2025-11-16 11:25:27 +00:00
|
|
|
|
import 'package:mnemo_cards_backend/packs/free_packs_distributor.dart';
|
|
|
|
|
|
|
2025-12-13 14:48:00 +00:00
|
|
|
|
import 'task.dart' as task;
|
2025-11-16 11:25:27 +00:00
|
|
|
|
|
2025-12-13 14:48:00 +00:00
|
|
|
|
class AddFreePacks with task.Task {
|
2025-11-16 11:25:27 +00:00
|
|
|
|
final FreePacksDistributor _freePacksDistributor;
|
2025-12-13 14:48:00 +00:00
|
|
|
|
final AppDatabase _db;
|
2025-11-16 11:25:27 +00:00
|
|
|
|
|
2025-12-13 14:48:00 +00:00
|
|
|
|
AddFreePacks(this._freePacksDistributor, this._db);
|
2025-11-16 11:25:27 +00:00
|
|
|
|
|
|
|
|
|
|
@override
|
|
|
|
|
|
String get name => 'add_free_packs';
|
|
|
|
|
|
|
|
|
|
|
|
@override
|
|
|
|
|
|
Future<void> task() async {
|
|
|
|
|
|
final freePacks = await _freePacksDistributor.getFreePacks();
|
|
|
|
|
|
|
|
|
|
|
|
print('$name found ${freePacks.length} free packs');
|
|
|
|
|
|
if (freePacks.isEmpty) {
|
|
|
|
|
|
print('No free packs found');
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-12-13 14:48:00 +00:00
|
|
|
|
final freePackIds = freePacks.map((p) => p.id).toSet();
|
2025-12-20 18:26:15 +00:00
|
|
|
|
|
2025-12-13 14:48:00 +00:00
|
|
|
|
// Получаем всех пользователей
|
|
|
|
|
|
final allUsers = await _db.userDao.getAllUsers();
|
2025-12-20 18:26:15 +00:00
|
|
|
|
|
2025-12-13 14:48:00 +00:00
|
|
|
|
// Фильтруем пользователей, у которых нет хотя бы одного из freePacks
|
2025-12-13 20:55:50 +00:00
|
|
|
|
final usersToUpdate = <String>[];
|
2025-12-13 14:48:00 +00:00
|
|
|
|
for (final user in allUsers) {
|
|
|
|
|
|
final userPacks = await _db.userDao.getUserPacks(user.id);
|
|
|
|
|
|
final userPackIds = userPacks.map((p) => p.id).toSet();
|
2025-12-20 18:26:15 +00:00
|
|
|
|
|
2025-12-13 14:48:00 +00:00
|
|
|
|
// Если у пользователя нет хотя бы одного из freePacks
|
|
|
|
|
|
if (!freePackIds.every((packId) => userPackIds.contains(packId))) {
|
|
|
|
|
|
usersToUpdate.add(user.id);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
2025-12-20 18:26:15 +00:00
|
|
|
|
|
2025-11-16 11:25:27 +00:00
|
|
|
|
print(
|
2025-12-13 14:48:00 +00:00
|
|
|
|
'Found ${usersToUpdate.length} users for ${freePacks.length} free packs: ${freePacks.map((e) => e.title).join(',')}',
|
2025-11-16 11:25:27 +00:00
|
|
|
|
);
|
|
|
|
|
|
|
2025-12-13 14:48:00 +00:00
|
|
|
|
// Добавляем freePacks пользователям
|
|
|
|
|
|
for (final userId in usersToUpdate) {
|
2025-11-16 11:25:27 +00:00
|
|
|
|
try {
|
2025-12-13 14:48:00 +00:00
|
|
|
|
for (final pack in freePacks) {
|
|
|
|
|
|
await _db.userDao.grantPackAccess(
|
|
|
|
|
|
userId: userId,
|
|
|
|
|
|
packId: pack.id,
|
|
|
|
|
|
grantType: 'free',
|
|
|
|
|
|
);
|
|
|
|
|
|
}
|
2025-11-16 11:25:27 +00:00
|
|
|
|
} catch (e) {
|
2025-12-13 14:48:00 +00:00
|
|
|
|
print('$name on user $userId: $e');
|
2025-11-16 11:25:27 +00:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
@override
|
|
|
|
|
|
int get intervalSeconds => 600;
|
|
|
|
|
|
}
|