repos
Some checks are pending
Backend CI / test (push) Waiting to run
Backend 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

This commit is contained in:
Dmitry 2026-01-08 19:32:25 +03:00
parent a6abcfa7e6
commit e3afe9888c
6 changed files with 87 additions and 70 deletions

View file

@ -76,9 +76,6 @@ extension GetItInjectableX on _i174.GetIt {
() => _i222.RustorePurchaseHandler(), () => _i222.RustorePurchaseHandler(),
); );
gh.lazySingleton<_i972.GoogleApi>(() => const _i972.GoogleApi()); gh.lazySingleton<_i972.GoogleApi>(() => const _i972.GoogleApi());
gh.lazySingleton<_i368.AdminAnalyticsApiV2>(
() => _i368.AdminAnalyticsApiV2(),
);
gh.lazySingleton<_i240.TelegramAuthCodeService>( gh.lazySingleton<_i240.TelegramAuthCodeService>(
() => _i240.TelegramAuthCodeService(), () => _i240.TelegramAuthCodeService(),
); );
@ -107,21 +104,12 @@ extension GetItInjectableX on _i174.GetIt {
gh.lazySingleton<_i108.JwtService>( gh.lazySingleton<_i108.JwtService>(
() => _i108.JwtService(gh<_i1072.AppDatabase>()), () => _i108.JwtService(gh<_i1072.AppDatabase>()),
); );
gh.lazySingleton<_i891.DiscountsManager>(
() => _i891.DiscountsManager(gh<_i1072.AppDatabase>()),
);
gh.lazySingleton<_i258.PackRepository>( gh.lazySingleton<_i258.PackRepository>(
() => _i258.PackRepository(gh<_i1072.AppDatabase>()), () => _i258.PackRepository(gh<_i1072.AppDatabase>()),
); );
gh.lazySingleton<_i802.AchievementManager>(
() => _i802.AchievementManager(gh<_i1072.AppDatabase>()),
);
gh.lazySingleton<_i71.SessionTracker>( gh.lazySingleton<_i71.SessionTracker>(
() => _i71.SessionTracker(gh<_i1072.AppDatabase>()), () => _i71.SessionTracker(gh<_i1072.AppDatabase>()),
); );
gh.lazySingleton<_i1029.StatisticsCalculator>(
() => _i1029.StatisticsCalculator(gh<_i1072.AppDatabase>()),
);
gh.lazySingleton<_i909.WordStatisticsManager>( gh.lazySingleton<_i909.WordStatisticsManager>(
() => _i909.WordStatisticsManager(gh<_i1072.AppDatabase>()), () => _i909.WordStatisticsManager(gh<_i1072.AppDatabase>()),
); );
@ -131,21 +119,33 @@ extension GetItInjectableX on _i174.GetIt {
gh.lazySingleton<_i950.UserRepository>( gh.lazySingleton<_i950.UserRepository>(
() => _i950.UserRepository(gh<_i1072.AppDatabase>()), () => _i950.UserRepository(gh<_i1072.AppDatabase>()),
); );
gh.factory<_i1015.AdminPacksApiV2>(
() => _i1015.AdminPacksApiV2(gh<_i1072.AppDatabase>()),
);
gh.lazySingleton<_i964.SubscriptionsApiV2>( gh.lazySingleton<_i964.SubscriptionsApiV2>(
() => _i964.SubscriptionsApiV2(gh<_i377.SubscriptionManager>()), () => _i964.SubscriptionsApiV2(gh<_i377.SubscriptionManager>()),
); );
gh.lazySingleton<_i858.DiscountsApiV2>(
() => _i858.DiscountsApiV2(gh<_i891.DiscountsManager>()),
);
gh.lazySingleton<_i296.TelegramBotApiV2>( gh.lazySingleton<_i296.TelegramBotApiV2>(
() => _i296.TelegramBotApiV2( () => _i296.TelegramBotApiV2(
gh<_i1072.AppDatabase>(), gh<_i1072.AppDatabase>(),
gh<_i950.UserRepository>(), 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>( gh.factory<_i895.AdminUsersApiV2>(
() => _i895.AdminUsersApiV2( () => _i895.AdminUsersApiV2(
gh<_i1072.AppDatabase>(), gh<_i1072.AppDatabase>(),
@ -172,19 +172,16 @@ extension GetItInjectableX on _i174.GetIt {
gh<_i1009.PaymentManager>(), gh<_i1009.PaymentManager>(),
), ),
); );
gh.lazySingleton<_i1062.FreePacksDistributor>( gh.factory<_i1015.AdminPacksApiV2>(
() => _i1062.FreePacksDistributor( () => _i1015.AdminPacksApiV2(
gh<_i1072.AppDatabase>(), gh<_i1072.AppDatabase>(),
gh<_i258.PackRepository>(), gh<_i258.PackRepository>(),
), ),
); );
gh.lazySingleton<_i560.UserManager>( gh.lazySingleton<_i368.AdminAnalyticsApiV2>(
() => _i560.UserManager( () => _i368.AdminAnalyticsApiV2(
gh<_i950.UserRepository>(),
gh<_i1072.AppDatabase>(), gh<_i1072.AppDatabase>(),
gh<_i1062.FreePacksDistributor>(),
gh<_i71.SessionTracker>(),
gh<_i1029.StatisticsCalculator>(),
gh<_i802.AchievementManager>(),
), ),
); );
gh.lazySingleton<_i273.PromocodesApiV2>( gh.lazySingleton<_i273.PromocodesApiV2>(
@ -193,7 +190,13 @@ extension GetItInjectableX on _i174.GetIt {
gh.lazySingleton<_i908.ProductsPriceResolver>( gh.lazySingleton<_i908.ProductsPriceResolver>(
() => _i908.ProductsPriceResolver( () => _i908.ProductsPriceResolver(
gh<_i891.DiscountsManager>(), 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>( gh.lazySingleton<_i735.CheckPaymentTask>(
@ -202,6 +205,9 @@ extension GetItInjectableX on _i174.GetIt {
gh<_i1072.AppDatabase>(), gh<_i1072.AppDatabase>(),
), ),
); );
gh.lazySingleton<_i858.DiscountsApiV2>(
() => _i858.DiscountsApiV2(gh<_i891.DiscountsManager>()),
);
gh.lazySingleton<_i280.UserManager>( gh.lazySingleton<_i280.UserManager>(
() => _i280.UserManager( () => _i280.UserManager(
gh<_i1072.AppDatabase>(), gh<_i1072.AppDatabase>(),
@ -213,6 +219,15 @@ extension GetItInjectableX on _i174.GetIt {
gh<_i909.WordStatisticsManager>(), 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>( gh.lazySingleton<_i483.AdminAuthApiV2>(
() => _i483.AdminAuthApiV2( () => _i483.AdminAuthApiV2(
gh<_i240.TelegramAuthCodeService>(), gh<_i240.TelegramAuthCodeService>(),
@ -233,24 +248,36 @@ extension GetItInjectableX on _i174.GetIt {
gh<_i433.PackDtoConverter>(), gh<_i433.PackDtoConverter>(),
), ),
); );
gh.lazySingleton<_i69.PurchasesApiV2>( gh.lazySingleton<_i560.UserManager>(
() => _i69.PurchasesApiV2( () => _i560.UserManager(
gh<_i1009.PaymentManager>(),
gh<_i833.PackManager>(),
gh<_i1072.AppDatabase>(), gh<_i1072.AppDatabase>(),
gh<_i1062.FreePacksDistributor>(),
gh<_i71.SessionTracker>(),
gh<_i1029.StatisticsCalculator>(),
gh<_i802.AchievementManager>(),
), ),
); );
gh.lazySingleton<_i561.MnemoShelf>( gh.lazySingleton<_i561.MnemoShelf>(
() => _i561.MnemoShelf(gh<_i280.UserManager>()), () => _i561.MnemoShelf(gh<_i280.UserManager>()),
); );
gh.lazySingleton<_i247.UsersApiV2>( gh.lazySingleton<_i69.PurchasesApiV2>(
() => _i247.UsersApiV2( () => _i69.PurchasesApiV2(
gh<_i280.UserManager>(),
gh<_i1009.PaymentManager>(), gh<_i1009.PaymentManager>(),
gh<_i1029.StatisticsCalculator>(), gh<_i833.PackManager>(),
gh<_i950.UserRepository>(),
gh<_i1072.AppDatabase>(), 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>( gh.lazySingleton<_i170.TestsApiV2>(
() => _i170.TestsApiV2( () => _i170.TestsApiV2(
gh<_i259.TestManager>(), gh<_i259.TestManager>(),
@ -267,14 +294,6 @@ extension GetItInjectableX on _i174.GetIt {
gh<_i240.TelegramAuthCodeService>(), gh<_i240.TelegramAuthCodeService>(),
), ),
); );
gh.lazySingleton<_i800.PacksApiV2>(
() => _i800.PacksApiV2(
gh<_i833.PackManager>(),
gh<_i259.TestManager>(),
gh<_i1072.AppDatabase>(),
gh<_i747.MinioService>(),
),
);
return this; return this;
} }
} }

View file

@ -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) { if (userModel == null) {
log('User not found: ${payment.userId}'); log('User not found: ${payment.userId}');
return; return;

View file

@ -258,7 +258,7 @@ class UsersApiV2 {
} }
// Convert UserData to UserDataDto // Convert UserData to UserDataDto
final userDataModel = await _userRepository.getUserWithDataById(user.id!); final userDataModel = await _userRepository.getUserById(user.id!, withData: true);
if (userDataModel?.userData == null) { if (userDataModel?.userData == null) {
return _json({'error': 'user_data_not_found'}, statusCode: 404); return _json({'error': 'user_data_not_found'}, statusCode: 404);
} }

View file

@ -10,10 +10,9 @@ class CheckAdminsTask with task.Task {
@override @override
String get name => 'check_admins'; String get name => 'check_admins';
final AppDatabase _db;
final UserRepository _userRepository; final UserRepository _userRepository;
CheckAdminsTask(this._db, this._userRepository); CheckAdminsTask(this._userRepository);
@override @override
Future<void> task() async { Future<void> task() async {
@ -28,16 +27,15 @@ class CheckAdminsTask with task.Task {
print('$name processing admin ID: $externalUserId'); print('$name processing admin ID: $externalUserId');
if (externalUserId.isNotEmpty) { if (externalUserId.isNotEmpty) {
// Найти токен по externalUserId // Найти токен по externalUserId
final token = await _db.userDao.getTokenByExternalUserId( final rawUser = await _userRepository.getUserByExternalId(externalUserId);
externalUserId, final userId = rawUser?.id;
);
if (token == null) { if (userId == null) {
continue; continue;
} }
// Получить пользователя по userId из токена // Получить пользователя по userId из токена
final user = await _userRepository.getUserById(token.userId); final user = await _userRepository.getUserById(userId);
if (user != null && user.id != null) { if (user != null && user.id != null) {
adminIds.add(user.id!); adminIds.add(user.id!);
if (!user.admin) { 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 @override

View file

@ -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/discounts/discounts_manager.dart';
import 'package:mnemo_cards_backend/user/user_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/tests/test_manager.dart';
import 'package:mnemo_cards_backend/user/user_repository.dart';
import 'api/di/injector.dart'; import 'api/di/injector.dart';
import 'cron/check_admins.dart'; import 'cron/check_admins.dart';
@ -120,9 +121,9 @@ void main() async {
// ignore: unawaited_futures // ignore: unawaited_futures
CronManager([ CronManager([
DeleteOldArchives(), DeleteOldArchives(),
CheckAdminsTask(database), CheckAdminsTask(getIt.get<UserRepository>()),
getIt.get<CheckPaymentTask>(), getIt.get<CheckPaymentTask>(),
AddFreePacks(getIt.get<FreePacksDistributor>(), database), AddFreePacks(getIt.get<FreePacksDistributor>(), getIt.get<UserRepository>()),
Backup(backupDir), Backup(backupDir),
GeneratePromocodes(database), GeneratePromocodes(database),
DiscountCampaignTask(getIt.get<DiscountsManager>(), database), DiscountCampaignTask(getIt.get<DiscountsManager>(), database),

View file

@ -17,10 +17,24 @@ class UserRepository {
/// Получить пользователя по ID /// Получить пользователя по ID
/// [includePacks] - загружать ли связанные паки пользователя /// [includePacks] - загружать ли связанные паки пользователя
/// [withData] - загружать ли UserData пользователя
Future<UserModel?> getUserById( Future<UserModel?> getUserById(
String id, { String id, {
bool includePacks = false, bool includePacks = false,
bool withData = true,
}) async { }) 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); final user = await _db.userDao.getUserById(id);
if (user == null) return null; if (user == null) return null;
@ -43,25 +57,12 @@ class UserRepository {
/// Получить пользователя по externalUserId /// Получить пользователя по externalUserId
Future<UserModel?> getUserByExternalId(String externalId) async { Future<UserModel?> getUserByExternalId(String externalId) async {
final user = await _db.userDao.getUserByExternalId(externalId); final user = await _db.userDao.getUserByExternalId(externalId);
if (user == null) return null; if (user == null) return null;
return await user.toUserModel(); return await user.toUserModel();
} }
/// Получить пользователя с UserData
Future<UserModel?> 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<String> createUser(UserModel userModel) async { Future<String> createUser(UserModel userModel) async {
final userCompanion = userModel.toUsersCompanion(); final userCompanion = userModel.toUsersCompanion();