@@ -229,45 +229,8 @@ class AuthService {
229
229
user = await _userRepository.create (item: user);
230
230
_log.info ('Created new user: ${user .id } with appRole: ${user .appRole }' );
231
231
232
- // Create default UserAppSettings for the new user
233
- final defaultAppSettings = UserAppSettings (
234
- id: user.id,
235
- displaySettings: const DisplaySettings (
236
- baseTheme: AppBaseTheme .system,
237
- accentTheme: AppAccentTheme .defaultBlue,
238
- fontFamily: 'SystemDefault' ,
239
- textScaleFactor: AppTextScaleFactor .medium,
240
- fontWeight: AppFontWeight .regular,
241
- ),
242
- language: 'en' ,
243
- feedPreferences: const FeedDisplayPreferences (
244
- headlineDensity: HeadlineDensity .standard,
245
- headlineImageStyle: HeadlineImageStyle .largeThumbnail,
246
- showSourceInHeadlineFeed: true ,
247
- showPublishDateInHeadlineFeed: true ,
248
- ),
249
- );
250
- await _userAppSettingsRepository.create (
251
- item: defaultAppSettings,
252
- userId: user.id,
253
- );
254
- _log.info ('Created default UserAppSettings for user: ${user .id }' );
255
-
256
- // Create default UserContentPreferences for the new user
257
- final defaultUserPreferences = UserContentPreferences (
258
- id: user.id,
259
- followedCountries: const [],
260
- followedSources: const [],
261
- followedTopics: const [],
262
- savedHeadlines: const [],
263
- );
264
- await _userContentPreferencesRepository.create (
265
- item: defaultUserPreferences,
266
- userId: user.id,
267
- );
268
- _log.info (
269
- 'Created default UserContentPreferences for user: ${user .id }' ,
270
- );
232
+ // Ensure default documents are created for the new user.
233
+ await _ensureUserDataExists (user);
271
234
}
272
235
} on HtHttpException {
273
236
// Propagate known exceptions from dependencies or from this method's logic.
@@ -322,6 +285,9 @@ class AuthService {
322
285
);
323
286
user = await _userRepository.create (item: user);
324
287
_log.info ('Created anonymous user: ${user .id }' );
288
+
289
+ // Ensure default documents are created for the new anonymous user.
290
+ await _ensureUserDataExists (user);
325
291
} on HtHttpException catch (e) {
326
292
_log.severe ('Error creating anonymous user: $e ' );
327
293
throw const OperationFailedException ('Failed to create anonymous user.' );
@@ -332,46 +298,6 @@ class AuthService {
332
298
);
333
299
}
334
300
335
- // Create default UserAppSettings for the new anonymous user
336
- final defaultAppSettings = UserAppSettings (
337
- id: user.id,
338
- displaySettings: const DisplaySettings (
339
- baseTheme: AppBaseTheme .system,
340
- accentTheme: AppAccentTheme .defaultBlue,
341
- fontFamily: 'SystemDefault' ,
342
- textScaleFactor: AppTextScaleFactor .medium,
343
- fontWeight: AppFontWeight .regular,
344
- ),
345
- language: 'en' ,
346
- feedPreferences: const FeedDisplayPreferences (
347
- headlineDensity: HeadlineDensity .standard,
348
- headlineImageStyle: HeadlineImageStyle .largeThumbnail,
349
- showSourceInHeadlineFeed: true ,
350
- showPublishDateInHeadlineFeed: true ,
351
- ),
352
- );
353
- await _userAppSettingsRepository.create (
354
- item: defaultAppSettings,
355
- userId: user.id, // Pass user ID for scoping
356
- );
357
- _log.info ('Created default UserAppSettings for anonymous user: ${user .id }' );
358
-
359
- // Create default UserContentPreferences for the new anonymous user
360
- final defaultUserPreferences = UserContentPreferences (
361
- id: user.id,
362
- followedCountries: const [],
363
- followedSources: const [],
364
- followedTopics: const [],
365
- savedHeadlines: const [],
366
- );
367
- await _userContentPreferencesRepository.create (
368
- item: defaultUserPreferences,
369
- userId: user.id, // Pass user ID for scoping
370
- );
371
- _log.info (
372
- 'Created default UserContentPreferences for anonymous user: ${user .id }' ,
373
- );
374
-
375
301
// 2. Generate token
376
302
try {
377
303
final token = await _authTokenService.generateToken (user);
@@ -541,6 +467,9 @@ class AuthService {
541
467
'User ${permanentUser .id } successfully linked with email $linkedEmail .' ,
542
468
);
543
469
470
+ // Ensure user data exists after linking.
471
+ await _ensureUserDataExists (permanentUser);
472
+
544
473
// 3. Generate a new authentication token for the now-permanent user.
545
474
final newToken = await _authTokenService.generateToken (permanentUser);
546
475
_log.info ('Generated new token for linked user ${permanentUser .id }' );
@@ -666,4 +595,62 @@ class AuthService {
666
595
rethrow ;
667
596
}
668
597
}
598
+
599
+ /// Ensures that the essential user-specific documents (settings, preferences)
600
+ /// exist for a given user, creating them with default values if they are missing.
601
+ ///
602
+ /// This method is crucial for maintaining data integrity, especially for users
603
+ /// who might have been created before these documents were part of the standard
604
+ /// user creation process.
605
+ Future <void > _ensureUserDataExists (User user) async {
606
+ // Check for UserAppSettings
607
+ try {
608
+ await _userAppSettingsRepository.read (id: user.id, userId: user.id);
609
+ } on NotFoundException {
610
+ _log.info (
611
+ 'UserAppSettings not found for user ${user .id }. Creating with defaults.' ,
612
+ );
613
+ final defaultAppSettings = UserAppSettings (
614
+ id: user.id,
615
+ displaySettings: const DisplaySettings (
616
+ baseTheme: AppBaseTheme .system,
617
+ accentTheme: AppAccentTheme .defaultBlue,
618
+ fontFamily: 'SystemDefault' ,
619
+ textScaleFactor: AppTextScaleFactor .medium,
620
+ fontWeight: AppFontWeight .regular,
621
+ ),
622
+ language: 'en' ,
623
+ feedPreferences: const FeedDisplayPreferences (
624
+ headlineDensity: HeadlineDensity .standard,
625
+ headlineImageStyle: HeadlineImageStyle .largeThumbnail,
626
+ showSourceInHeadlineFeed: true ,
627
+ showPublishDateInHeadlineFeed: true ,
628
+ ),
629
+ );
630
+ await _userAppSettingsRepository.create (
631
+ item: defaultAppSettings,
632
+ userId: user.id,
633
+ );
634
+ }
635
+
636
+ // Check for UserContentPreferences
637
+ try {
638
+ await _userContentPreferencesRepository.read (id: user.id, userId: user.id);
639
+ } on NotFoundException {
640
+ _log.info (
641
+ 'UserContentPreferences not found for user ${user .id }. Creating with defaults.' ,
642
+ );
643
+ final defaultUserPreferences = UserContentPreferences (
644
+ id: user.id,
645
+ followedCountries: const [],
646
+ followedSources: const [],
647
+ followedTopics: const [],
648
+ savedHeadlines: const [],
649
+ );
650
+ await _userContentPreferencesRepository.create (
651
+ item: defaultUserPreferences,
652
+ userId: user.id,
653
+ );
654
+ }
655
+ }
669
656
}
0 commit comments