mnemo_cards/mnemo_cards_backend/lib/cron/check_payment.dart

61 lines
1.9 KiB
Dart
Raw Normal View History

2025-11-16 11:25:27 +00:00
import 'package:injectable/injectable.dart';
import 'package:mnemo_cards_backend/api/purchase/payment_manager.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_common/mnemo_cards_common.dart';
2025-12-13 14:48:00 +00:00
import 'task.dart' as task;
2025-11-16 11:25:27 +00:00
@LazySingleton()
2025-12-13 14:48:00 +00:00
class CheckPaymentTask with task.Task {
2025-11-16 11:25:27 +00:00
final PaymentManager _paymentManager;
2025-12-13 14:48:00 +00:00
final AppDatabase _db;
2025-11-16 11:25:27 +00:00
2025-12-20 18:26:15 +00:00
CheckPaymentTask(this._paymentManager, this._db);
2025-11-16 11:25:27 +00:00
Future<void> task() => check();
Future<void> check() async {
print('Checking payments...');
2025-12-20 18:26:15 +00:00
2025-12-13 14:48:00 +00:00
// Получаем платежи, которые не обработаны и не unknown
final allPayments = await _db.paymentDao.getAllPayments();
2025-12-20 18:26:15 +00:00
2025-12-13 14:48:00 +00:00
final unprocessedPayments = allPayments.where((payment) {
final status = PaymentStatus.values.firstWhere(
(s) => s.name == payment.status,
orElse: () => PaymentStatus.unknown,
);
2025-12-20 18:26:15 +00:00
if (status == PaymentStatus.processed ||
status == PaymentStatus.unknown) {
2025-12-13 14:48:00 +00:00
return false;
}
2025-12-20 18:26:15 +00:00
2025-12-13 14:48:00 +00:00
final system = PaymentSystem.values.firstWhere(
(s) => s.name == payment.paymentSystem,
orElse: () => PaymentSystem.yookassa,
);
2025-12-20 18:26:15 +00:00
return system == PaymentSystem.yookassa ||
system == PaymentSystem.rustore;
2025-12-13 14:48:00 +00:00
}).toList();
2025-12-20 18:26:15 +00:00
2025-12-13 14:48:00 +00:00
print('Found ${unprocessedPayments.length} unprocessed payments');
for (final payment in unprocessedPayments) {
2025-11-16 11:25:27 +00:00
try {
2025-12-13 14:48:00 +00:00
// PaymentManager должен работать с Payment (Drift)
// TODO: Возможно нужна конвертация в PaymentModel если PaymentManager еще не мигрирован
await _paymentManager.checkAndProcessPayment(payment);
2025-11-16 11:25:27 +00:00
} catch (e, s) {
print(e);
print(s);
}
}
}
@override
String get name => 'check_payment';
@override
int get intervalSeconds => 300;
}