saveOnboardingDataTransaction method

  1. @override
Future<Either<Failure, void>> saveOnboardingDataTransaction({
  1. required UserProfile profile,
  2. required OnboardingPreferences preferences,
})
override

Uses shared Isar instance for true transactional atomicity

Implementation

@override
Future<Either<Failure, void>> saveOnboardingDataTransaction({
  required UserProfile profile,
  required OnboardingPreferences preferences,
}) async {
  try {
    // Single atomic transaction for BOTH entities
    await _isar.writeTxn(() async {
      // 1. Save UserProfile as DTO
      final profileDto = UserProfileModel.fromEntity(profile)
        ..id = 1; // Enforcing singleton ID for the primary user
      await _isar.userProfileModels.put(profileDto);

      // 2. Save OnboardingPreferences -> AppPreferences as DTO
      final prefsDto =
          AppPreferencesDto.fromOnboardingPreferences(preferences)
            ..id = _prefsId; // Ensure singleton ID
      await _isar.appPreferencesDtos.put(prefsDto);

      // 3. Mark onboarding as complete
      final onboardingStatus = OnboardingStatusDto()
        ..id = 0
        ..isComplete = true
        ..completedAt = DateTime.now();
      await _isar.onboardingStatusDtos.put(onboardingStatus);
    });

    return const Right(null);
  } on IsarError catch (e) {
    // Transaction auto-rolls back on ANY error
    return Left(CacheFailure('Transaction failed: ${e.message}'));
  } catch (e) {
    return Left(CacheFailure(e.toString()));
  }
}