saveOnboardingDataTransaction method
- required UserProfile profile,
- 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()));
}
}