mnemo_cards/mnemo_cards_backend/lib/cron/add_free_packs.dart

66 lines
2 KiB
Dart
Raw Normal View History

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();
// Получаем всех пользователей
final allUsers = await _db.userDao.getAllUsers();
// Фильтруем пользователей, у которых нет хотя бы одного из freePacks
final usersToUpdate = <int>[];
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);
}
}
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;
}