mnemo_cards/mnemo_cards_backend/lib/database/daos/subscription_dao.dart

124 lines
4.4 KiB
Dart
Raw Permalink Normal View History

2025-12-13 13:27:05 +00:00
import 'package:drift/drift.dart';
2025-12-13 23:35:14 +00:00
import 'package:drift_postgres/drift_postgres.dart';
2025-12-13 13:27:05 +00:00
import '../database.dart';
import '../tables/subscriptions.dart';
import '../tables/users.dart';
part 'subscription_dao.g.dart';
@DriftAccessor(tables: [SubscriptionPlans, UserSubscriptions])
2025-12-20 18:26:15 +00:00
class SubscriptionDao extends DatabaseAccessor<AppDatabase>
with _$SubscriptionDaoMixin {
2025-12-13 13:27:05 +00:00
SubscriptionDao(super.db);
2025-12-20 18:26:15 +00:00
2025-12-13 13:27:05 +00:00
// ==================== SubscriptionPlans ====================
2025-12-20 18:26:15 +00:00
2025-12-13 13:27:05 +00:00
/// Получить план подписки по ID
2026-01-06 21:11:44 +00:00
Future<SubscriptionPlan?> getPlanById(String id) async {
final query = select(subscriptionPlans)
..where((p) => p.id.equals(id))
..limit(1);
final results = await query.get();
return results.isNotEmpty ? results.first : null;
2025-12-13 13:27:05 +00:00
}
2025-12-20 18:26:15 +00:00
2025-12-13 13:27:05 +00:00
/// Получить все планы подписки
Future<List<SubscriptionPlan>> getAllPlans() {
2025-12-20 18:26:15 +00:00
return (select(
subscriptionPlans,
)..where((p) => p.isDeleted.equals(false))).get();
2025-12-13 13:27:05 +00:00
}
2025-12-20 18:26:15 +00:00
2025-12-13 13:27:05 +00:00
/// Создать план подписки
2025-12-13 20:55:50 +00:00
Future<String> createPlan(SubscriptionPlansCompanion plan) async {
final inserted = await into(subscriptionPlans).insertReturning(plan);
return inserted.id;
2025-12-13 13:27:05 +00:00
}
2025-12-20 18:26:15 +00:00
2025-12-13 13:27:05 +00:00
/// Обновить план подписки
Future<bool> updatePlan(SubscriptionPlan plan) {
return update(subscriptionPlans).replace(plan);
}
2025-12-20 18:26:15 +00:00
2025-12-13 13:27:05 +00:00
// ==================== UserSubscriptions ====================
2025-12-20 18:26:15 +00:00
2025-12-13 13:27:05 +00:00
/// Получить подписку пользователя
2026-01-06 21:11:44 +00:00
Future<UserSubscription?> getUserSubscription(String userId) async {
final query = select(userSubscriptions)
..where((us) => us.userId.equals(userId))
..orderBy([(us) => OrderingTerm.desc(us.finish)])
..limit(1);
final results = await query.get();
return results.isNotEmpty ? results.first : null;
2025-12-13 13:27:05 +00:00
}
2025-12-20 18:26:15 +00:00
2025-12-13 13:27:05 +00:00
/// Получить активную подписку пользователя
2025-12-13 20:55:50 +00:00
Future<UserSubscription?> getActiveSubscription(String userId) async {
2025-12-13 23:35:14 +00:00
final now = PgDateTime(DateTime.now());
2026-01-06 21:11:44 +00:00
final query = select(userSubscriptions)
..where((us) => us.userId.equals(userId))
..where((us) => us.start.isSmallerThanValue(now))
..where((us) => us.finish.isBiggerThanValue(now))
..orderBy([(us) => OrderingTerm.desc(us.finish)])
..limit(1);
final results = await query.get();
return results.isNotEmpty ? results.first : null;
2025-12-13 13:27:05 +00:00
}
2025-12-20 18:26:15 +00:00
2025-12-13 13:27:05 +00:00
/// Проверить, есть ли у пользователя активная подписка
2025-12-13 20:55:50 +00:00
Future<bool> hasActiveSubscription(String userId) async {
2025-12-13 13:27:05 +00:00
final subscription = await getActiveSubscription(userId);
return subscription != null;
}
2025-12-20 18:26:15 +00:00
2025-12-13 13:27:05 +00:00
/// Создать подписку пользователя
2025-12-20 18:26:15 +00:00
Future<String> createUserSubscription(
UserSubscriptionsCompanion subscription,
) async {
final inserted = await into(
userSubscriptions,
).insertReturning(subscription);
2025-12-13 20:55:50 +00:00
return inserted.id;
2025-12-13 13:27:05 +00:00
}
2025-12-20 18:26:15 +00:00
2025-12-13 13:27:05 +00:00
/// Обновить подписку пользователя
Future<bool> updateUserSubscription(UserSubscription subscription) {
return update(userSubscriptions).replace(subscription);
}
2025-12-20 18:26:15 +00:00
2025-12-13 13:27:05 +00:00
/// Удалить подписку пользователя
2025-12-13 20:55:50 +00:00
Future<void> deleteUserSubscription(String userId) {
2025-12-20 18:26:15 +00:00
return (delete(
userSubscriptions,
)..where((us) => us.userId.equals(userId))).go();
2025-12-13 13:27:05 +00:00
}
2025-12-20 18:26:15 +00:00
2025-12-13 13:27:05 +00:00
/// Получить всех пользователей с активными подписками
Future<List<UserSubscription>> getActiveSubscriptions() async {
2025-12-13 23:35:14 +00:00
final now = PgDateTime(DateTime.now());
2025-12-13 13:27:05 +00:00
return (select(userSubscriptions)
2025-12-20 18:26:15 +00:00
..where((us) => us.start.isSmallerThanValue(now))
..where((us) => us.finish.isBiggerThanValue(now))
..orderBy([(us) => OrderingTerm.desc(us.finish)]))
.get();
2025-12-13 13:27:05 +00:00
}
2025-12-13 14:48:00 +00:00
/// Получить активную подписку пользователя (alias для getActiveSubscription)
2025-12-13 20:55:50 +00:00
Future<UserSubscription?> getActiveUserSubscription(String userId) {
2025-12-13 14:48:00 +00:00
return getActiveSubscription(userId);
}
/// Отменить подписку пользователя (установить finish на текущее время)
2025-12-13 20:55:50 +00:00
Future<void> cancelUserSubscription(String userId) async {
2025-12-13 14:48:00 +00:00
final subscription = await getActiveSubscription(userId);
if (subscription != null) {
2025-12-20 18:26:15 +00:00
await update(
userSubscriptions,
).replace(subscription.copyWith(finish: PgDateTime(DateTime.now())));
2025-12-13 14:48:00 +00:00
}
}
2025-12-13 13:27:05 +00:00
}