From dd36d286fd61e843308909dd22afe64b65be27df Mon Sep 17 00:00:00 2001 From: Chris Perry Date: Thu, 9 May 2024 19:54:03 -0500 Subject: [PATCH] Only wait for items to download if the user has items not already in the mobile db --- .../Methods/User/GetUserLogin.cs | 36 +++++++++++++++++-- .../Responses/User/GetUserResponse.cs | 8 ++--- 2 files changed, 38 insertions(+), 6 deletions(-) diff --git a/src/FocusApp.Client/Methods/User/GetUserLogin.cs b/src/FocusApp.Client/Methods/User/GetUserLogin.cs index 93274fd..dcfeb9b 100644 --- a/src/FocusApp.Client/Methods/User/GetUserLogin.cs +++ b/src/FocusApp.Client/Methods/User/GetUserLogin.cs @@ -175,6 +175,11 @@ public async Task Handle( string userName, CancellationToken cancellationToken = default) { + if (createUserResponse.User == null) + { + return null; + } + Shared.Models.User user = new() { Id = createUserResponse.User.Id, @@ -233,10 +238,12 @@ public async Task Handle( bool userExistsLocally = await _localContext.Users .AnyAsync(u => u.Auth0Id == getUserResponse.User.Auth0Id || getUserResponse.User.Id == u.Id, cancellationToken); - // If the user doesn't exist locally, wait for all content to be downloaded to ensure the app has all of their items downloaded + // If the user doesn't exist locally and they have content that isnt't in the DB, + // wait for all content to be downloaded to ensure the app has all of their items downloaded if (!userExistsLocally && _authService.StartupSyncTask != null && - !_authService.StartupSyncTask.IsCompleted) + !_authService.StartupSyncTask.IsCompleted && + await DoesUserHaveUnsyncedData(getUserResponse)) { await _popupService.ShowPopupAsync(); await _authService.StartupSyncTask.WaitAsync(cancellationToken); @@ -300,6 +307,31 @@ await _mediator.Send(new SyncUserData.Query return user; } + /// + /// Check if the user owns any items that aren't in the mobile DB + /// + private async Task DoesUserHaveUnsyncedData(GetUserResponse response) + { + var mobileDbHasAllOwnedIslands = (await _localContext.Islands.Where(i => response.UserIslandIds.Contains(i.Id)).CountAsync()) == + response.UserIslandIds.Count; + if (!mobileDbHasAllOwnedIslands) return true; + + var mobileDbHasAllOwnedPets = (await _localContext.Pets.Where(p => response.UserPetIds.Contains(p.Id)).CountAsync()) == + response.UserPetIds.Count; + if (!mobileDbHasAllOwnedPets) return true; + + var mobileDbHasAllOwnedDecor = (await _localContext.Decor.Where(d => response.UserDecorIds.Contains(d.Id)).CountAsync()) == + response.UserDecorIds.Count; + if (!mobileDbHasAllOwnedDecor) return true; + + + var mobileDbHasAllOwnedBadges = (await _localContext.Badges.Where(b => response.UserBadgeIds.Contains(b.Id)).CountAsync()) == + response.UserBadgeIds.Count; + if (!mobileDbHasAllOwnedBadges) return true; + + return false; + } + private IQueryable GetInitialIslandQuery() { return _localContext.Islands diff --git a/src/FocusCore/Responses/User/GetUserResponse.cs b/src/FocusCore/Responses/User/GetUserResponse.cs index df0451d..20e6955 100644 --- a/src/FocusCore/Responses/User/GetUserResponse.cs +++ b/src/FocusCore/Responses/User/GetUserResponse.cs @@ -5,8 +5,8 @@ namespace FocusCore.Responses.User; public class GetUserResponse { public BaseUser? User { get; set; } - public List? UserIslandIds { get; set; } - public List? UserPetIds { get; set; } - public List? UserDecorIds { get; set; } - public List? UserBadgeIds { get; set; } + public List UserIslandIds { get; set; } = new List(); + public List UserPetIds { get; set; } = new List(); + public List UserDecorIds { get; set; } = new List(); + public List UserBadgeIds { get; set; } = new List(); } \ No newline at end of file