mnemo_cards/mnemo_cards_backend/lib/api/subscription/subscription_manager.dart

100 lines
2.9 KiB
Dart
Raw Normal View History

2025-12-13 23:35:14 +00:00
import 'package:drift_postgres/drift_postgres.dart';
2025-11-16 11:25:27 +00:00
import 'package:injectable/injectable.dart';
2025-12-13 13:27:05 +00:00
import 'package:mnemo_cards_backend/database/database.dart';
2025-11-16 11:25:27 +00:00
import 'package:mnemo_cards_common_backend/mnemo_cards_common_backend.dart';
import 'package:mnemo_cards_common/mnemo_cards_common.dart';
2025-12-13 14:48:00 +00:00
import 'package:drift/drift.dart';
2025-11-16 11:25:27 +00:00
@lazySingleton
class SubscriptionManager {
2025-12-13 13:27:05 +00:00
final AppDatabase _db;
2025-11-16 11:25:27 +00:00
2025-12-13 13:27:05 +00:00
SubscriptionManager(this._db);
2025-11-16 11:25:27 +00:00
2025-12-13 13:27:05 +00:00
Future<SubscriptionDto> getSubscriptionDto(UserModel user) async {
2025-12-13 14:48:00 +00:00
if (user.id == null) {
return SubscriptionDto(
page: null,
isActive: false,
start: null,
finish: null,
);
}
final subscription = await _db.subscriptionDao.getActiveUserSubscription(user.id!);
2025-11-16 11:25:27 +00:00
return SubscriptionDto(
2025-12-13 13:27:05 +00:00
page: null,
2025-12-13 14:48:00 +00:00
isActive: subscription != null,
2025-12-13 23:35:14 +00:00
start: subscription?.start.dateTime,
finish: subscription?.finish.dateTime,
2025-11-16 11:25:27 +00:00
);
}
2025-12-13 13:27:05 +00:00
Future<void> createSubscription(UserModel user, SubscriptionPlanModel plan) async {
2025-12-13 14:48:00 +00:00
if (user.id == null || plan.id == null) {
throw ArgumentError('User ID and Plan ID are required');
}
final now = DateTime.now();
final endDate = now.add(Duration(days: plan.durationDays));
await _db.subscriptionDao.createUserSubscription(
UserSubscriptionsCompanion.insert(
userId: user.id!,
2025-12-13 23:35:14 +00:00
start: PgDateTime(now),
finish: PgDateTime(endDate),
2025-12-13 14:48:00 +00:00
features: const Value([]),
),
);
2025-12-13 13:27:05 +00:00
}
2025-11-16 11:25:27 +00:00
2025-12-13 13:27:05 +00:00
Future<List<SubscriptionPlanModel>> getAllPlans() async {
2025-12-13 14:48:00 +00:00
final plans = await _db.subscriptionDao.getAllPlans();
return plans.map((plan) {
final uiMap = plan.ui as Map<String, dynamic>?;
final ui = uiMap != null ? SubscriptionPlanUI.fromJson(uiMap) : null;
return SubscriptionPlanModel(
id: plan.id,
ui: ui,
price: plan.price,
currency: plan.currency,
durationDays: plan.durationDays,
features: [],
paymentSystem: PaymentSystem.values.firstWhere(
(ps) => ps.name == plan.paymentSystem,
orElse: () => PaymentSystem.unknown,
),
paymentId: plan.paymentId,
);
}).toList();
}
Future<List<SubscriptionPlanModel>> getAllSubscriptionPlans() async {
return await getAllPlans();
}
2025-12-13 20:55:50 +00:00
Future<void> purchaseSubscription(String userId, String planId) async {
2025-12-13 14:48:00 +00:00
final plan = await _db.subscriptionDao.getPlanById(planId);
if (plan == null) {
throw StateError('Subscription plan not found');
}
final now = DateTime.now();
final endDate = now.add(Duration(days: plan.durationDays));
await _db.subscriptionDao.createUserSubscription(
UserSubscriptionsCompanion.insert(
userId: userId,
2025-12-13 23:35:14 +00:00
start: PgDateTime(now),
finish: PgDateTime(endDate),
2025-12-13 14:48:00 +00:00
features: Value(plan.features as List<dynamic>),
),
);
}
2025-12-13 20:55:50 +00:00
Future<void> cancelSubscription(String userId) async {
2025-12-13 14:48:00 +00:00
await _db.subscriptionDao.cancelUserSubscription(userId);
2025-11-16 11:25:27 +00:00
}
2025-12-13 13:27:05 +00:00
}