import 'package:mnemo_cards_backend/packs/free_packs_distributor.dart'; import 'package:mnemo_cards_backend/packs/product_availability_manager.dart'; import 'package:mnemo_cards_backend/repository/export.dart'; import 'task.dart' as task; class AddFreePacks with task.Task { final FreePacksDistributor _freePacksDistributor; final UserRepository _userRepository; final ProductAvailabilityManager _productAvailabilityManager; AddFreePacks( this._freePacksDistributor, this._userRepository, this._productAvailabilityManager, ); @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 _userRepository.getAllUsers(); // Фильтруем пользователей, у которых нет хотя бы одного из freePacks final usersToUpdate = []; for (final user in allUsers) { if (user.id == null) continue; final userPacks = await _userRepository.getUserPacks(user.id!); final userPackIds = userPacks .map((p) => p.id) .whereType() .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) { if (pack.id == null) continue; await _productAvailabilityManager.grantPackAccess( userId: userId, packId: pack.id!, grantType: 'free', ); } } catch (e) { print('$name on user $userId: $e'); } } } @override int get intervalSeconds => 600; }