2025-01-21 14:24:31 +03:00
|
|
|
|
import 'package:friflex_starter/app/app_env.dart';
|
|
|
|
|
|
import 'package:friflex_starter/di/di_base_repo.dart';
|
|
|
|
|
|
import 'package:friflex_starter/di/di_container.dart';
|
|
|
|
|
|
import 'package:friflex_starter/di/di_typedefs.dart';
|
|
|
|
|
|
import 'package:friflex_starter/features/auth/data/repository/auth_mock_repository.dart';
|
|
|
|
|
|
import 'package:friflex_starter/features/auth/data/repository/auth_repository.dart';
|
|
|
|
|
|
import 'package:friflex_starter/features/auth/domain/repository/i_auth_repository.dart';
|
|
|
|
|
|
import 'package:friflex_starter/features/main/data/repository/main_mock_repository.dart';
|
|
|
|
|
|
import 'package:friflex_starter/features/main/data/repository/main_repository.dart';
|
|
|
|
|
|
import 'package:friflex_starter/features/main/domain/repository/i_main_repository.dart';
|
2025-02-26 13:40:43 +03:00
|
|
|
|
import 'package:friflex_starter/features/profile/data/repository/profile_mock_repository.dart';
|
|
|
|
|
|
import 'package:friflex_starter/features/profile/data/repository/profile_repository.dart';
|
|
|
|
|
|
import 'package:friflex_starter/features/profile/domain/repository/i_profile_repository.dart';
|
2025-09-26 08:21:42 +03:00
|
|
|
|
import 'package:friflex_starter/features/update/data/repository/update_mock_repository.dart';
|
|
|
|
|
|
import 'package:friflex_starter/features/update/data/repository/update_repository.dart';
|
|
|
|
|
|
import 'package:friflex_starter/features/update/domain/repository/i_update_repository.dart';
|
2025-01-21 14:24:31 +03:00
|
|
|
|
|
|
|
|
|
|
/// Список названий моковых репозиториев, которые должны быть подменены
|
2025-06-20 16:50:48 +03:00
|
|
|
|
/// для использования в сборке stage окружения.
|
2025-01-21 14:24:31 +03:00
|
|
|
|
///
|
|
|
|
|
|
/// Для того, чтобы репозиторий был автоматически подменен на моковый в stage
|
2025-10-06 10:19:27 +03:00
|
|
|
|
/// сборке, необходимо в этом списке указать тип интерфейса репозитория
|
2025-01-21 14:24:31 +03:00
|
|
|
|
///
|
|
|
|
|
|
/// Пример:
|
|
|
|
|
|
/// ```
|
2025-10-06 10:19:27 +03:00
|
|
|
|
/// <Type>{ IUpdateRepository }
|
2025-01-21 14:24:31 +03:00
|
|
|
|
/// ```
|
2025-10-06 10:19:27 +03:00
|
|
|
|
const _mockReposToSwitch = <Type>{IUpdateRepository};
|
2025-01-21 14:24:31 +03:00
|
|
|
|
|
2025-06-20 16:50:48 +03:00
|
|
|
|
/// {@template di_repositories}
|
|
|
|
|
|
/// Класс для инициализации и управления репозиториями приложения.
|
2025-01-21 14:24:31 +03:00
|
|
|
|
///
|
2025-06-20 16:50:48 +03:00
|
|
|
|
/// Отвечает за:
|
|
|
|
|
|
/// - Инициализацию репозиториев для работы с данными
|
|
|
|
|
|
/// - Автоматическое переключение между моковыми и реальными репозиториями
|
|
|
|
|
|
/// - Уведомление о прогрессе инициализации
|
|
|
|
|
|
/// - Обработку ошибок инициализации репозиториев
|
|
|
|
|
|
///
|
|
|
|
|
|
/// Стратегия инициализации по окружениям:
|
|
|
|
|
|
/// - dev: всегда используются моковые репозитории
|
|
|
|
|
|
/// - prod: всегда используются реальные репозитории
|
|
|
|
|
|
/// - stage: используются моковые репозитории из списка _mockReposToSwitch
|
|
|
|
|
|
/// {@endtemplate}
|
2025-01-21 14:24:31 +03:00
|
|
|
|
final class DiRepositories {
|
2025-06-20 16:50:48 +03:00
|
|
|
|
/// {@macro di_repositories}
|
|
|
|
|
|
DiRepositories();
|
|
|
|
|
|
|
2025-01-21 14:24:31 +03:00
|
|
|
|
/// Интерфейс для работы с репозиторием авторизации
|
|
|
|
|
|
late final IAuthRepository authRepository;
|
|
|
|
|
|
|
|
|
|
|
|
/// Интерфейс для работы с репозиторием главного сервиса
|
|
|
|
|
|
late final IMainRepository mainRepository;
|
|
|
|
|
|
|
2025-02-26 13:40:43 +03:00
|
|
|
|
/// Интерфейс для работы с репозиторием профиля
|
|
|
|
|
|
late final IProfileRepository profileRepository;
|
|
|
|
|
|
|
2025-09-26 08:21:42 +03:00
|
|
|
|
/// Интерфейс для работы с репозиторием обновлений
|
|
|
|
|
|
late final IUpdateRepository updatesRepository;
|
|
|
|
|
|
|
2025-06-20 16:50:48 +03:00
|
|
|
|
/// Метод для инициализации репозиториев в приложении.
|
2025-01-21 14:24:31 +03:00
|
|
|
|
///
|
|
|
|
|
|
/// Принимает:
|
2025-06-20 16:50:48 +03:00
|
|
|
|
/// - [onProgress] - обратный вызов для уведомления о прогрессе инициализации
|
|
|
|
|
|
/// - [diContainer] - контейнер зависимостей с конфигурацией приложения
|
|
|
|
|
|
/// - [onError] - обратный вызов для обработки ошибок инициализации
|
|
|
|
|
|
///
|
|
|
|
|
|
/// Последовательность инициализации:
|
|
|
|
|
|
/// 1. Инициализация репозитория авторизации
|
|
|
|
|
|
/// 2. Инициализация репозитория главного сервиса
|
|
|
|
|
|
/// 3. Инициализация репозитория профиля
|
2025-01-21 14:24:31 +03:00
|
|
|
|
void init({
|
|
|
|
|
|
required OnProgress onProgress,
|
|
|
|
|
|
required OnError onError,
|
|
|
|
|
|
required DiContainer diContainer,
|
|
|
|
|
|
}) {
|
2025-09-26 08:21:42 +03:00
|
|
|
|
onProgress('Начинаем инициализацию репозиториев...');
|
|
|
|
|
|
|
2025-10-23 12:00:09 +03:00
|
|
|
|
// Инициализация репозитория обновлений
|
|
|
|
|
|
updatesRepository = _lazyInitRepo<IUpdateRepository>(
|
|
|
|
|
|
mockFactory: UpdateMockRepository.new,
|
|
|
|
|
|
mainFactory: UpdateRepository.new,
|
|
|
|
|
|
onProgress: onProgress,
|
|
|
|
|
|
onError: onError,
|
|
|
|
|
|
environment: diContainer.env,
|
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
|
|
// Инициализация репозитория авторизации
|
|
|
|
|
|
authRepository = _lazyInitRepo<IAuthRepository>(
|
|
|
|
|
|
mockFactory: AuthMockRepository.new,
|
|
|
|
|
|
mainFactory: () => AuthRepository(
|
|
|
|
|
|
httpClient: diContainer.httpClientFactory(
|
|
|
|
|
|
diContainer.debugService,
|
|
|
|
|
|
diContainer.appConfig,
|
2025-01-21 14:24:31 +03:00
|
|
|
|
),
|
2025-10-23 12:00:09 +03:00
|
|
|
|
),
|
|
|
|
|
|
onProgress: onProgress,
|
|
|
|
|
|
onError: onError,
|
|
|
|
|
|
environment: diContainer.env,
|
|
|
|
|
|
);
|
2025-01-21 14:24:31 +03:00
|
|
|
|
|
2025-10-23 12:00:09 +03:00
|
|
|
|
// Инициализация репозитория сервиса управления токеном доступа
|
|
|
|
|
|
mainRepository = _lazyInitRepo<IMainRepository>(
|
|
|
|
|
|
mockFactory: MainMockRepository.new,
|
|
|
|
|
|
mainFactory: () => MainRepository(
|
|
|
|
|
|
httpClient: diContainer.httpClientFactory(
|
|
|
|
|
|
diContainer.debugService,
|
|
|
|
|
|
diContainer.appConfig,
|
2025-01-21 14:24:31 +03:00
|
|
|
|
),
|
2025-10-23 12:00:09 +03:00
|
|
|
|
),
|
|
|
|
|
|
onProgress: onProgress,
|
|
|
|
|
|
onError: onError,
|
|
|
|
|
|
environment: diContainer.env,
|
|
|
|
|
|
);
|
2025-02-26 13:40:43 +03:00
|
|
|
|
|
2025-10-23 12:00:09 +03:00
|
|
|
|
// Инициализация репозитория профиля
|
|
|
|
|
|
profileRepository = _lazyInitRepo<IProfileRepository>(
|
|
|
|
|
|
mockFactory: ProfileMockRepository.new,
|
|
|
|
|
|
mainFactory: () => ProfileRepository(
|
|
|
|
|
|
httpClient: diContainer.httpClientFactory(
|
|
|
|
|
|
diContainer.debugService,
|
|
|
|
|
|
diContainer.appConfig,
|
2025-02-26 13:40:43 +03:00
|
|
|
|
),
|
2025-10-23 12:00:09 +03:00
|
|
|
|
),
|
|
|
|
|
|
onProgress: onProgress,
|
|
|
|
|
|
onError: onError,
|
|
|
|
|
|
environment: diContainer.env,
|
|
|
|
|
|
);
|
2025-05-28 16:38:56 +03:00
|
|
|
|
|
2025-02-12 10:53:38 +03:00
|
|
|
|
onProgress(
|
2025-01-21 14:24:31 +03:00
|
|
|
|
'Инициализация репозиториев завершена! Было подменено репозиториев - ${_mockReposToSwitch.length} (${_mockReposToSwitch.join(', ')})',
|
|
|
|
|
|
);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/// Метод для ленивой инициализации конкретного репозитория по типу [Т].
|
|
|
|
|
|
/// В зависимости от окружения инициализируется моковый или сетевой репозиторий.
|
|
|
|
|
|
///
|
|
|
|
|
|
/// Принимает:
|
2025-06-20 16:50:48 +03:00
|
|
|
|
/// - [mockFactory] - функция-фабрика для инициализации мокового репозитория
|
|
|
|
|
|
/// - [mainFactory] - функция-фабрика для инициализации основного репозитория
|
|
|
|
|
|
/// - [onProgress] - обратный вызов для уведомления о прогрессе
|
2025-10-23 12:00:09 +03:00
|
|
|
|
/// - [onError] - обратный вызов для обработки ошибок инициализации
|
2025-06-20 16:50:48 +03:00
|
|
|
|
/// - [environment] - окружение приложения для определения стратегии инициализации
|
|
|
|
|
|
///
|
|
|
|
|
|
/// Возвращает:
|
|
|
|
|
|
/// - Экземпляр репозитория в зависимости от окружения
|
2025-10-23 12:00:09 +03:00
|
|
|
|
///
|
|
|
|
|
|
/// Throws:
|
|
|
|
|
|
/// - Перебрасывает исключение, если инициализация репозитория завершилась с ошибкой
|
2025-02-12 10:53:38 +03:00
|
|
|
|
T _lazyInitRepo<T extends DiBaseRepo>({
|
2025-01-21 14:24:31 +03:00
|
|
|
|
required AppEnv environment,
|
|
|
|
|
|
required T Function() mainFactory,
|
|
|
|
|
|
required T Function() mockFactory,
|
|
|
|
|
|
required OnProgress onProgress,
|
2025-10-23 12:00:09 +03:00
|
|
|
|
required OnError onError,
|
2025-01-21 14:24:31 +03:00
|
|
|
|
}) {
|
2025-10-23 12:00:09 +03:00
|
|
|
|
try {
|
|
|
|
|
|
final repo = switch (environment) {
|
2025-11-17 12:49:07 +03:00
|
|
|
|
.dev => mockFactory(),
|
|
|
|
|
|
.prod => mainFactory(),
|
|
|
|
|
|
.stage =>
|
2025-10-23 12:00:09 +03:00
|
|
|
|
_mockReposToSwitch.contains(T) ? mockFactory() : mainFactory(),
|
|
|
|
|
|
};
|
2025-02-12 10:53:38 +03:00
|
|
|
|
|
2025-10-23 12:00:09 +03:00
|
|
|
|
// throw Exception('Тестовая - ошибка инициализации репозитория $T');
|
|
|
|
|
|
onProgress(repo.name);
|
|
|
|
|
|
return repo;
|
|
|
|
|
|
} on Object catch (error, stackTrace) {
|
|
|
|
|
|
onError('Ошибка инициализации репозитория $T', error, stackTrace);
|
|
|
|
|
|
// Перебрасываем исключение дальше, чтобы не скрыть ошибку инициализации
|
|
|
|
|
|
rethrow;
|
|
|
|
|
|
}
|
2025-01-21 14:24:31 +03:00
|
|
|
|
}
|
|
|
|
|
|
}
|