Files
BudgetApp/lib/injection_container.dart
Sanders 85daede4a9 Implements authentication flow with user registration
This commit implements a complete authentication flow, including user registration.

- Introduces an `AuthRegisterRequested` event to handle user registration.
- Persists the user ID in settings upon successful authentication.
- Modifies `AuthBloc` to load the user based on the stored ID, improving app launch persistence.
- Refactors `UserCubit` to only manage the user state and removes authentication logic.
- Removes `UserCubit` initialization from `main.dart` and triggers `AuthStarted` to initiate the authentication process.
2025-07-12 22:40:31 +03:00

190 lines
7.4 KiB
Dart

import 'package:get_it/get_it.dart';
import 'data/database/hive_service.dart';
import 'data/repositories/hive_category_repository.dart';
import 'data/repositories/hive_global_settings_repository.dart';
import 'data/repositories/hive_settings_repository.dart';
import 'data/repositories/hive_sms_handler_repository.dart';
import 'data/repositories/hive_sms_message_repository.dart';
import 'data/repositories/hive_tag_repository.dart';
import 'data/repositories/hive_transaction_repository.dart';
import 'data/repositories/hive_user_repository.dart';
import 'data/repositories/interfaces/icategory_repository.dart';
import 'data/repositories/interfaces/iglobal_settings_repository.dart';
import 'data/repositories/interfaces/isettings_repository.dart';
import 'data/repositories/interfaces/isms_handler_repository.dart';
import 'data/repositories/interfaces/isms_message_repository.dart';
import 'data/repositories/interfaces/itag_repository.dart';
import 'data/repositories/interfaces/itransaction_repository.dart';
import 'data/repositories/interfaces/iuser_repository.dart';
import 'logic/auth/auth_bloc.dart';
import 'logic/category/category_cubit.dart';
import 'logic/settings/settings_cubit.dart';
import 'logic/sms/sms_cubit.dart';
import 'logic/tag/tag_cubit.dart';
import 'logic/transaction/transaction_bloc.dart';
import 'logic/user/user_cubit.dart';
import 'services/sms_service.dart';
final getIt = GetIt.instance;
/// Инициализация глобальных зависимостей, которые не зависят от пользователя.
/// Вызывается один раз при старте приложения.
Future<void> initGlobalDependencies() async {
// Инициализация Hive
await HiveService.initGlobalBoxes();
// Глобальные репозитории
getIt.registerSingleton<IUserRepository>(
HiveUserRepository(HiveService.users),
);
getIt.registerSingleton<IGlobalSettingsRepository>(
HiveGlobalSettingsRepository(HiveService.globalSettings),
);
// Сервисы
getIt.registerSingleton<SmsService>(SmsService());
// Cubits & Blocs, которые нужны до входа пользователя
getIt.registerSingleton<UserCubit>(
UserCubit(
settingsRepository: getIt<IGlobalSettingsRepository>(),
userRepository: getIt<IUserRepository>(),
// Эти репозитории будут заменены после входа пользователя
categoryRepository:
null, // Временно null, будет заменен в initUserSpecificDependencies
tagRepository:
null, // Временно null, будет заменен в initUserSpecificDependencies
transactionRepository:
null, // Временно null, будет заменен в initUserSpecificDependencies
),
);
getIt.registerFactory<AuthBloc>(() => AuthBloc(
userCubit: getIt(),
settingsRepository: getIt(),
userRepository: getIt(),
));
}
/// Инициализация зависимостей, специфичных для пользователя.
/// Вызывается после успешной аутентификации.
Future<void> initUserSpecificDependencies(String userId) async {
// Открываем пользовательские Hive Box'ы
await HiveService.initUserBoxes(userId);
// --- Регистрация пользовательских репозиториев ---
// Используем lazy singletons, чтобы их можно было легко сбросить и создать заново при смене пользователя.
// Категории
if (getIt.isRegistered<ICategoryRepository>()) {
await getIt.unregister<ICategoryRepository>();
}
getIt.registerLazySingleton<ICategoryRepository>(
() => HiveCategoryRepository(HiveService.categories),
);
// Теги
if (getIt.isRegistered<ITagRepository>()) {
await getIt.unregister<ITagRepository>();
}
getIt.registerLazySingleton<ITagRepository>(
() => HiveTagRepository(),
);
// Транзакции
if (getIt.isRegistered<ITransactionRepository>()) {
await getIt.unregister<ITransactionRepository>();
}
getIt.registerLazySingleton<ITransactionRepository>(
() => HiveTransactionRepository(HiveService.transactions),
);
// Настройки приложения
if (getIt.isRegistered<ISettingsRepository>()) {
await getIt.unregister<ISettingsRepository>();
}
getIt.registerLazySingleton<ISettingsRepository>(
() => HiveSettingsRepository(HiveService.appSettings),
);
// Настройки обработчика SMS
if (getIt.isRegistered<ISmsHandlerRepository>()) {
await getIt.unregister<ISmsHandlerRepository>();
}
getIt.registerLazySingleton<ISmsHandlerRepository>(
() => HiveSmsHandlerRepository(HiveService.smsHandlerSettings),
);
// Сообщения SMS
if (getIt.isRegistered<ISmsMessageRepository>()) {
await getIt.unregister<ISmsMessageRepository>();
}
getIt.registerLazySingleton<ISmsMessageRepository>(
() => HiveSmsMessageRepository(HiveService.smsMessages),
);
// --- Обновление UserCubit новыми репозиториями ---
// Мы не пересоздаем UserCubit, а просто обновляем его зависимости.
final userCubit = getIt<UserCubit>();
userCubit.categoryRepository = getIt<ICategoryRepository>();
userCubit.tagRepository = getIt<ITagRepository>();
userCubit.transactionRepository = getIt<ITransactionRepository>();
// --- Регистрация Cubits & Blocs, которые зависят от пользовательских данных ---
// Настройки
if (getIt.isRegistered<SettingsCubit>()) {
await getIt.unregister<SettingsCubit>();
}
getIt.registerSingleton<SettingsCubit>(
SettingsCubit(getIt()),
);
// Транзакции
if (getIt.isRegistered<TransactionBloc>()) {
await getIt.unregister<TransactionBloc>();
}
getIt.registerFactory<TransactionBloc>(
() => TransactionBloc(transactionRepository: getIt()),
);
// SMS
if (getIt.isRegistered<SmsCubit>()) {
await getIt.unregister<SmsCubit>();
}
getIt.registerFactory<SmsCubit>(() => SmsCubit(getIt(), getIt(), getIt()));
// Категории
if (getIt.isRegistered<CategoryCubit>()) {
await getIt.unregister<CategoryCubit>();
}
getIt.registerFactory<CategoryCubit>(
() => CategoryCubit(getIt()), // Добавляем userId
);
// Теги
if (getIt.isRegistered<TagCubit>()) {
await getIt.unregister<TagCubit>();
}
getIt.registerFactory<TagCubit>(() => TagCubit(getIt()));
}
/// Сброс пользовательских зависимостей при выходе из системы.
Future<void> resetUserSpecificDependencies() async {
// Закрываем пользовательские Hive Box'ы
await HiveService.closeUserBoxes();
// Разрегистрация всех пользовательских зависимостей
await getIt.unregister<ICategoryRepository>();
await getIt.unregister<ITagRepository>();
await getIt.unregister<ITransactionRepository>();
await getIt.unregister<ISettingsRepository>();
await getIt.unregister<ISmsHandlerRepository>();
await getIt.unregister<ISmsMessageRepository>();
await getIt.unregister<SettingsCubit>();
await getIt.unregister<TransactionBloc>();
await getIt.unregister<SmsCubit>();
await getIt.unregister<CategoryCubit>();
await getIt.unregister<TagCubit>();
}