mnemo_cards/mnemo_cards_backend/lib/database/daos/subscription_dao.dart
Dmitry 550b56276e
Some checks are pending
Backend CI / test (push) Waiting to run
Backend CI / build (push) Blocked by required conditions
Mobile App CI / test (push) Waiting to run
Mobile App CI / build-android (push) Blocked by required conditions
Mobile App CI / build-ios (push) Blocked by required conditions
Web App CI / test (push) Waiting to run
Web App CI / build (push) Blocked by required conditions
Deploy Mnemo Cards / Deploy Backend (push) Waiting to run
Deploy Mnemo Cards / Deploy Web App (push) Blocked by required conditions
Deploy Mnemo Cards / Final Verification (push) Blocked by required conditions
Deploy Telegram Bot / Deploy Telegram Bot (push) Waiting to run
postgress fix
2025-12-13 23:55:50 +03:00

108 lines
4 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:drift/drift.dart';
import '../database.dart';
import '../tables/subscriptions.dart';
import '../tables/users.dart';
part 'subscription_dao.g.dart';
@DriftAccessor(tables: [SubscriptionPlans, UserSubscriptions])
class SubscriptionDao extends DatabaseAccessor<AppDatabase> with _$SubscriptionDaoMixin {
SubscriptionDao(super.db);
// ==================== SubscriptionPlans ====================
/// Получить план подписки по ID
Future<SubscriptionPlan?> getPlanById(String id) {
return (select(subscriptionPlans)..where((p) => p.id.equals(id))).getSingleOrNull();
}
/// Получить все планы подписки
Future<List<SubscriptionPlan>> getAllPlans() {
return (select(subscriptionPlans)
..where((p) => p.isDeleted.equals(false))
).get();
}
/// Создать план подписки
Future<String> createPlan(SubscriptionPlansCompanion plan) async {
final inserted = await into(subscriptionPlans).insertReturning(plan);
return inserted.id;
}
/// Обновить план подписки
Future<bool> updatePlan(SubscriptionPlan plan) {
return update(subscriptionPlans).replace(plan);
}
// ==================== UserSubscriptions ====================
/// Получить подписку пользователя
Future<UserSubscription?> getUserSubscription(String userId) {
return (select(userSubscriptions)
..where((us) => us.userId.equals(userId))
..orderBy([(us) => OrderingTerm.desc(us.finish)])
).getSingleOrNull();
}
/// Получить активную подписку пользователя
Future<UserSubscription?> getActiveSubscription(String userId) async {
final now = DateTime.now();
return (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)])
).getSingleOrNull();
}
/// Проверить, есть ли у пользователя активная подписка
Future<bool> hasActiveSubscription(String userId) async {
final subscription = await getActiveSubscription(userId);
return subscription != null;
}
/// Создать подписку пользователя
Future<String> createUserSubscription(UserSubscriptionsCompanion subscription) async {
final inserted = await into(userSubscriptions).insertReturning(subscription);
return inserted.id;
}
/// Обновить подписку пользователя
Future<bool> updateUserSubscription(UserSubscription subscription) {
return update(userSubscriptions).replace(subscription);
}
/// Удалить подписку пользователя
Future<void> deleteUserSubscription(String userId) {
return (delete(userSubscriptions)
..where((us) => us.userId.equals(userId))
).go();
}
/// Получить всех пользователей с активными подписками
Future<List<UserSubscription>> getActiveSubscriptions() async {
final now = DateTime.now();
return (select(userSubscriptions)
..where((us) => us.start.isSmallerThanValue(now))
..where((us) => us.finish.isBiggerThanValue(now))
..orderBy([(us) => OrderingTerm.desc(us.finish)])
).get();
}
/// Получить активную подписку пользователя (alias для getActiveSubscription)
Future<UserSubscription?> getActiveUserSubscription(String userId) {
return getActiveSubscription(userId);
}
/// Отменить подписку пользователя (установить finish на текущее время)
Future<void> cancelUserSubscription(String userId) async {
final subscription = await getActiveSubscription(userId);
if (subscription != null) {
await update(userSubscriptions).replace(
subscription.copyWith(
finish: DateTime.now(),
),
);
}
}
}