Files
eatvio_app/lib/features/payment/repositories/payment_repository.dart

88 lines
3.0 KiB
Dart
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import 'package:dio/dio.dart';
import 'package:eatvio_app/features/chat/models/payment_model.dart';
import 'package:eatvio_app/features/chat/services/chat_service.dart';
import 'package:eatvio_app/features/payment/models/promo_applied_list_response.dart';
import 'package:eatvio_app/features/payment/models/promo_apply_response.dart';
import 'package:eatvio_app/features/payment/models/promo_code_model.dart';
import 'package:eatvio_app/features/payment/models/promo_remove_response.dart';
import 'package:eatvio_app/features/payment/models/promo_validate_response.dart';
/// Репозиторий оплаты консультаций (chosen_plan) через Alfa Bank / СБП.
class PaymentRepository {
final ChatService chatService;
PaymentRepository({required this.chatService});
/// Запускает процесс оплаты: POST `/api/chosen_plans/{id}/start_payment_process`
/// с `payment_provider: alfa-bank`.
Future<PaymentModel> startPaymentProcess({required int planId}) async {
return chatService.getPaymentLink(
id: planId,
body: const {'payment_provider': 'alfa-bank'},
);
}
/// Список applied-промокодов текущего пользователя.
Future<PromoAppliedListResponse> listAppliedPromoCodes() {
return chatService.listAppliedPromoCodes();
}
/// Applied-промокод для конкретного chosen_plan, либо null (нет / ошибка сети).
Future<PromoCodeModel?> findAppliedPromoForPlan(int planId) async {
try {
final response = await listAppliedPromoCodes();
for (final promo in response.promoCodes) {
if (promo.chosenPlanId == planId && promo.state == 'applied') {
return promo;
}
}
return null;
} catch (_) {
return null;
}
}
/// Preview-валидация промокода без применения.
Future<PromoValidateResponse> validatePromoCode({
required int planId,
required String promoCode,
}) {
return chatService.validatePromoCode(
id: planId,
body: {'promo_code': promoCode},
);
}
/// Применяет промокод к chosen_plan. При HTTP 422 возвращает тело ответа.
Future<PromoApplyResponse> applyPromoCode({
required int planId,
required String promoCode,
}) async {
try {
return await chatService.applyPromoCode(
id: planId,
body: {'promo_code': promoCode},
);
} on DioException catch (e) {
final data = e.response?.data;
if (data is Map<String, dynamic>) {
return PromoApplyResponse.fromJson(data);
}
rethrow;
}
}
/// Удаляет применённый промокод (idempotent).
Future<PromoRemoveResponse> removePromoCode({required int planId}) async {
try {
return await chatService.removePromoCode(id: planId);
} on DioException catch (e) {
final data = e.response?.data;
if (data is Map<String, dynamic>) {
return PromoRemoveResponse.fromJson(data);
}
rethrow;
}
}
}