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