diff --git a/mnemo_cards_backend/lib/api/di/injector.config.dart b/mnemo_cards_backend/lib/api/di/injector.config.dart index 3b18908..95693eb 100644 --- a/mnemo_cards_backend/lib/api/di/injector.config.dart +++ b/mnemo_cards_backend/lib/api/di/injector.config.dart @@ -76,9 +76,6 @@ extension GetItInjectableX on _i174.GetIt { () => _i222.RustorePurchaseHandler(), ); gh.lazySingleton<_i972.GoogleApi>(() => const _i972.GoogleApi()); - gh.lazySingleton<_i368.AdminAnalyticsApiV2>( - () => _i368.AdminAnalyticsApiV2(), - ); gh.lazySingleton<_i240.TelegramAuthCodeService>( () => _i240.TelegramAuthCodeService(), ); @@ -107,21 +104,12 @@ extension GetItInjectableX on _i174.GetIt { gh.lazySingleton<_i108.JwtService>( () => _i108.JwtService(gh<_i1072.AppDatabase>()), ); - gh.lazySingleton<_i891.DiscountsManager>( - () => _i891.DiscountsManager(gh<_i1072.AppDatabase>()), - ); gh.lazySingleton<_i258.PackRepository>( () => _i258.PackRepository(gh<_i1072.AppDatabase>()), ); - gh.lazySingleton<_i802.AchievementManager>( - () => _i802.AchievementManager(gh<_i1072.AppDatabase>()), - ); gh.lazySingleton<_i71.SessionTracker>( () => _i71.SessionTracker(gh<_i1072.AppDatabase>()), ); - gh.lazySingleton<_i1029.StatisticsCalculator>( - () => _i1029.StatisticsCalculator(gh<_i1072.AppDatabase>()), - ); gh.lazySingleton<_i909.WordStatisticsManager>( () => _i909.WordStatisticsManager(gh<_i1072.AppDatabase>()), ); @@ -131,21 +119,33 @@ extension GetItInjectableX on _i174.GetIt { gh.lazySingleton<_i950.UserRepository>( () => _i950.UserRepository(gh<_i1072.AppDatabase>()), ); - gh.factory<_i1015.AdminPacksApiV2>( - () => _i1015.AdminPacksApiV2(gh<_i1072.AppDatabase>()), - ); gh.lazySingleton<_i964.SubscriptionsApiV2>( () => _i964.SubscriptionsApiV2(gh<_i377.SubscriptionManager>()), ); - gh.lazySingleton<_i858.DiscountsApiV2>( - () => _i858.DiscountsApiV2(gh<_i891.DiscountsManager>()), - ); gh.lazySingleton<_i296.TelegramBotApiV2>( () => _i296.TelegramBotApiV2( gh<_i1072.AppDatabase>(), gh<_i950.UserRepository>(), ), ); + gh.lazySingleton<_i891.DiscountsManager>( + () => _i891.DiscountsManager( + gh<_i1072.AppDatabase>(), + gh<_i950.UserRepository>(), + ), + ); + gh.lazySingleton<_i802.AchievementManager>( + () => _i802.AchievementManager( + gh<_i1072.AppDatabase>(), + gh<_i950.UserRepository>(), + ), + ); + gh.lazySingleton<_i1029.StatisticsCalculator>( + () => _i1029.StatisticsCalculator( + gh<_i1072.AppDatabase>(), + gh<_i950.UserRepository>(), + ), + ); gh.factory<_i895.AdminUsersApiV2>( () => _i895.AdminUsersApiV2( gh<_i1072.AppDatabase>(), @@ -172,19 +172,16 @@ extension GetItInjectableX on _i174.GetIt { gh<_i1009.PaymentManager>(), ), ); - gh.lazySingleton<_i1062.FreePacksDistributor>( - () => _i1062.FreePacksDistributor( + gh.factory<_i1015.AdminPacksApiV2>( + () => _i1015.AdminPacksApiV2( gh<_i1072.AppDatabase>(), gh<_i258.PackRepository>(), ), ); - gh.lazySingleton<_i560.UserManager>( - () => _i560.UserManager( + gh.lazySingleton<_i368.AdminAnalyticsApiV2>( + () => _i368.AdminAnalyticsApiV2( + gh<_i950.UserRepository>(), gh<_i1072.AppDatabase>(), - gh<_i1062.FreePacksDistributor>(), - gh<_i71.SessionTracker>(), - gh<_i1029.StatisticsCalculator>(), - gh<_i802.AchievementManager>(), ), ); gh.lazySingleton<_i273.PromocodesApiV2>( @@ -193,7 +190,13 @@ extension GetItInjectableX on _i174.GetIt { gh.lazySingleton<_i908.ProductsPriceResolver>( () => _i908.ProductsPriceResolver( gh<_i891.DiscountsManager>(), - gh<_i1072.AppDatabase>(), + gh<_i950.UserRepository>(), + ), + ); + gh.lazySingleton<_i1062.FreePacksDistributor>( + () => _i1062.FreePacksDistributor( + gh<_i950.UserRepository>(), + gh<_i258.PackRepository>(), ), ); gh.lazySingleton<_i735.CheckPaymentTask>( @@ -202,6 +205,9 @@ extension GetItInjectableX on _i174.GetIt { gh<_i1072.AppDatabase>(), ), ); + gh.lazySingleton<_i858.DiscountsApiV2>( + () => _i858.DiscountsApiV2(gh<_i891.DiscountsManager>()), + ); gh.lazySingleton<_i280.UserManager>( () => _i280.UserManager( gh<_i1072.AppDatabase>(), @@ -213,6 +219,15 @@ extension GetItInjectableX on _i174.GetIt { gh<_i909.WordStatisticsManager>(), ), ); + gh.lazySingleton<_i247.UsersApiV2>( + () => _i247.UsersApiV2( + gh<_i280.UserManager>(), + gh<_i1009.PaymentManager>(), + gh<_i1029.StatisticsCalculator>(), + gh<_i950.UserRepository>(), + gh<_i1072.AppDatabase>(), + ), + ); gh.lazySingleton<_i483.AdminAuthApiV2>( () => _i483.AdminAuthApiV2( gh<_i240.TelegramAuthCodeService>(), @@ -233,24 +248,36 @@ extension GetItInjectableX on _i174.GetIt { gh<_i433.PackDtoConverter>(), ), ); - gh.lazySingleton<_i69.PurchasesApiV2>( - () => _i69.PurchasesApiV2( - gh<_i1009.PaymentManager>(), - gh<_i833.PackManager>(), + gh.lazySingleton<_i560.UserManager>( + () => _i560.UserManager( gh<_i1072.AppDatabase>(), + gh<_i1062.FreePacksDistributor>(), + gh<_i71.SessionTracker>(), + gh<_i1029.StatisticsCalculator>(), + gh<_i802.AchievementManager>(), ), ); gh.lazySingleton<_i561.MnemoShelf>( () => _i561.MnemoShelf(gh<_i280.UserManager>()), ); - gh.lazySingleton<_i247.UsersApiV2>( - () => _i247.UsersApiV2( - gh<_i280.UserManager>(), + gh.lazySingleton<_i69.PurchasesApiV2>( + () => _i69.PurchasesApiV2( gh<_i1009.PaymentManager>(), - gh<_i1029.StatisticsCalculator>(), + gh<_i833.PackManager>(), + gh<_i950.UserRepository>(), gh<_i1072.AppDatabase>(), ), ); + gh.lazySingleton<_i800.PacksApiV2>( + () => _i800.PacksApiV2( + gh<_i833.PackManager>(), + gh<_i259.TestManager>(), + gh<_i258.PackRepository>(), + gh<_i950.UserRepository>(), + gh<_i1072.AppDatabase>(), + gh<_i747.MinioService>(), + ), + ); gh.lazySingleton<_i170.TestsApiV2>( () => _i170.TestsApiV2( gh<_i259.TestManager>(), @@ -267,14 +294,6 @@ extension GetItInjectableX on _i174.GetIt { gh<_i240.TelegramAuthCodeService>(), ), ); - gh.lazySingleton<_i800.PacksApiV2>( - () => _i800.PacksApiV2( - gh<_i833.PackManager>(), - gh<_i259.TestManager>(), - gh<_i1072.AppDatabase>(), - gh<_i747.MinioService>(), - ), - ); return this; } } diff --git a/mnemo_cards_backend/lib/api/purchase/payment_manager.dart b/mnemo_cards_backend/lib/api/purchase/payment_manager.dart index aa65a09..0cc8e5f 100644 --- a/mnemo_cards_backend/lib/api/purchase/payment_manager.dart +++ b/mnemo_cards_backend/lib/api/purchase/payment_manager.dart @@ -120,7 +120,7 @@ class PaymentManager { } // Получить пользователя - final userModel = await _userRepository.getUserWithDataById(payment.userId); + final userModel = await _userRepository.getUserById(payment.userId, withData: true); if (userModel == null) { log('User not found: ${payment.userId}'); return; diff --git a/mnemo_cards_backend/lib/api/v2/users_api_v2.dart b/mnemo_cards_backend/lib/api/v2/users_api_v2.dart index b9439d0..588b3f3 100644 --- a/mnemo_cards_backend/lib/api/v2/users_api_v2.dart +++ b/mnemo_cards_backend/lib/api/v2/users_api_v2.dart @@ -258,7 +258,7 @@ class UsersApiV2 { } // Convert UserData to UserDataDto - final userDataModel = await _userRepository.getUserWithDataById(user.id!); + final userDataModel = await _userRepository.getUserById(user.id!, withData: true); if (userDataModel?.userData == null) { return _json({'error': 'user_data_not_found'}, statusCode: 404); } diff --git a/mnemo_cards_backend/lib/cron/check_admins.dart b/mnemo_cards_backend/lib/cron/check_admins.dart index b132e5c..3a484db 100644 --- a/mnemo_cards_backend/lib/cron/check_admins.dart +++ b/mnemo_cards_backend/lib/cron/check_admins.dart @@ -10,10 +10,9 @@ class CheckAdminsTask with task.Task { @override String get name => 'check_admins'; - final AppDatabase _db; final UserRepository _userRepository; - CheckAdminsTask(this._db, this._userRepository); + CheckAdminsTask(this._userRepository); @override Future task() async { @@ -28,16 +27,15 @@ class CheckAdminsTask with task.Task { print('$name processing admin ID: $externalUserId'); if (externalUserId.isNotEmpty) { // Найти токен по externalUserId - final token = await _db.userDao.getTokenByExternalUserId( - externalUserId, - ); + final rawUser = await _userRepository.getUserByExternalId(externalUserId); + final userId = rawUser?.id; - if (token == null) { + if (userId == null) { continue; } // Получить пользователя по userId из токена - final user = await _userRepository.getUserById(token.userId); + final user = await _userRepository.getUserById(userId); if (user != null && user.id != null) { adminIds.add(user.id!); if (!user.admin) { @@ -53,8 +51,6 @@ class CheckAdminsTask with task.Task { } } } - // TODO: Implement logic to remove admin flag from users not in adminIdsList - // if needed in the future } @override diff --git a/mnemo_cards_backend/lib/main.dart b/mnemo_cards_backend/lib/main.dart index 8b20c61..41bff9a 100644 --- a/mnemo_cards_backend/lib/main.dart +++ b/mnemo_cards_backend/lib/main.dart @@ -10,6 +10,7 @@ import 'package:mnemo_cards_backend/database/database.dart'; import 'package:mnemo_cards_backend/discounts/discounts_manager.dart'; import 'package:mnemo_cards_backend/user/user_manager.dart'; import 'package:mnemo_cards_backend/tests/test_manager.dart'; +import 'package:mnemo_cards_backend/user/user_repository.dart'; import 'api/di/injector.dart'; import 'cron/check_admins.dart'; @@ -120,9 +121,9 @@ void main() async { // ignore: unawaited_futures CronManager([ DeleteOldArchives(), - CheckAdminsTask(database), + CheckAdminsTask(getIt.get()), getIt.get(), - AddFreePacks(getIt.get(), database), + AddFreePacks(getIt.get(), getIt.get()), Backup(backupDir), GeneratePromocodes(database), DiscountCampaignTask(getIt.get(), database), diff --git a/mnemo_cards_backend/lib/user/user_repository.dart b/mnemo_cards_backend/lib/user/user_repository.dart index 3d187aa..ab080a7 100644 --- a/mnemo_cards_backend/lib/user/user_repository.dart +++ b/mnemo_cards_backend/lib/user/user_repository.dart @@ -17,10 +17,24 @@ class UserRepository { /// Получить пользователя по ID /// [includePacks] - загружать ли связанные паки пользователя + /// [withData] - загружать ли UserData пользователя Future getUserById( String id, { bool includePacks = false, + bool withData = true, }) async { + if (withData) { + final userWithData = await _db.userDao.getUserWithDataById(id); + if (userWithData == null) return null; + + if (includePacks) { + final packs = await _db.userDao.getUserPacks(id); + return await userWithData.user.toUserModel(packs); + } + + return await userWithData.user.toUserModel(); + } + final user = await _db.userDao.getUserById(id); if (user == null) return null; @@ -43,25 +57,12 @@ class UserRepository { /// Получить пользователя по externalUserId Future getUserByExternalId(String externalId) async { final user = await _db.userDao.getUserByExternalId(externalId); + if (user == null) return null; return await user.toUserModel(); } - /// Получить пользователя с UserData - Future getUserWithDataById(String id) async { - final userWithData = await _db.userDao.getUserWithDataById(id); - if (userWithData == null) return null; - - final packs = await _db.userDao.getUserPacks(id); - final userModel = await userWithData.user.toUserModel(packs); - - // TODO: загрузить UserDataModel если нужно - // userModel.userData = userWithData.userData?.toUserDataModel(); - - return userModel; - } - /// Создать пользователя Future createUser(UserModel userModel) async { final userCompanion = userModel.toUsersCompanion();