diff --git a/TransactionProcessor.Mobile.BusinessLogic.Tests/ViewModelTests/MyAccount/MyAccountContactPageViewModelTests.cs b/TransactionProcessor.Mobile.BusinessLogic.Tests/ViewModelTests/MyAccount/MyAccountContactPageViewModelTests.cs index 1bd97c33..2c3a3985 100644 --- a/TransactionProcessor.Mobile.BusinessLogic.Tests/ViewModelTests/MyAccount/MyAccountContactPageViewModelTests.cs +++ b/TransactionProcessor.Mobile.BusinessLogic.Tests/ViewModelTests/MyAccount/MyAccountContactPageViewModelTests.cs @@ -1,4 +1,5 @@ -using Moq; +using MediatR; +using Moq; using Shouldly; using TransactionProcessor.Mobile.BusinessLogic.Services; using TransactionProcessor.Mobile.BusinessLogic.UIServices; @@ -19,6 +20,7 @@ public class MyAccountContactPageViewModelTests private readonly MyAccountContactPageViewModel ViewModel; private readonly Mock DeviceService; + private readonly Mock Mediator; public MyAccountContactPageViewModelTests() { this.NavigationService = new Mock(); @@ -26,10 +28,13 @@ public MyAccountContactPageViewModelTests() { this.NavigationParameterService = new Mock(); this.DialogService = new Mock(); this.DeviceService = new Mock(); + this.Mediator = new Mock(); + this.ViewModel = new MyAccountContactPageViewModel(this.NavigationService.Object, this.ApplicationCache.Object, this.DialogService.Object, this.DeviceService.Object, - this.NavigationParameterService.Object); + this.NavigationParameterService.Object, + this.Mediator.Object); } [Fact] diff --git a/TransactionProcessor.Mobile.BusinessLogic/ViewModels/MyAccount/MyAccountAddressPageViewModel.cs b/TransactionProcessor.Mobile.BusinessLogic/ViewModels/MyAccount/MyAccountAddressPageViewModel.cs index d581bfbb..0bd72c33 100644 --- a/TransactionProcessor.Mobile.BusinessLogic/ViewModels/MyAccount/MyAccountAddressPageViewModel.cs +++ b/TransactionProcessor.Mobile.BusinessLogic/ViewModels/MyAccount/MyAccountAddressPageViewModel.cs @@ -1,5 +1,9 @@ using MediatR; +using Microsoft.Extensions.Caching.Memory; +using Microsoft.Extensions.Primitives; +using SimpleResults; using TransactionProcessor.Mobile.BusinessLogic.Models; +using TransactionProcessor.Mobile.BusinessLogic.Requests; using TransactionProcessor.Mobile.BusinessLogic.Services; using TransactionProcessor.Mobile.BusinessLogic.UIServices; @@ -42,7 +46,28 @@ public AddressModel Address { public async Task Initialise(CancellationToken cancellationToken) { MerchantDetailsModel merchantDetails = this.ApplicationCache.GetMerchantDetails(); - // TODO: handle a null + if (merchantDetails == null) { + GetMerchantDetailsRequest request = GetMerchantDetailsRequest.Create(); + + Result merchantDetailsResult = await this.Mediator.Send(request, cancellationToken); + if (merchantDetailsResult.IsFailed) { + await this.DialogService.ShowWarningToast("Unable to load merchant details. Please try again later.", cancellationToken: cancellationToken); + return; + } + + DateTime expirationTime = DateTime.Now.AddMinutes(60); + CancellationChangeToken expirationToken = new(new CancellationTokenSource(TimeSpan.FromMinutes(60)).Token); + MemoryCacheEntryOptions cacheEntryOptions = new MemoryCacheEntryOptions() + // Pin to cache. + .SetPriority(CacheItemPriority.NeverRemove) + // Set the actual expiration time + .SetAbsoluteExpiration(expirationTime) + // Force eviction to run + .AddExpirationToken(expirationToken); + + this.ApplicationCache.SetMerchantDetails(merchantDetailsResult.Data, cacheEntryOptions); + merchantDetails = this.ApplicationCache.GetMerchantDetails(); + } this.Address = merchantDetails.Address; } diff --git a/TransactionProcessor.Mobile.BusinessLogic/ViewModels/MyAccount/MyAccountContactPageViewModel.cs b/TransactionProcessor.Mobile.BusinessLogic/ViewModels/MyAccount/MyAccountContactPageViewModel.cs index fec32933..0274904c 100644 --- a/TransactionProcessor.Mobile.BusinessLogic/ViewModels/MyAccount/MyAccountContactPageViewModel.cs +++ b/TransactionProcessor.Mobile.BusinessLogic/ViewModels/MyAccount/MyAccountContactPageViewModel.cs @@ -1,4 +1,9 @@ -using TransactionProcessor.Mobile.BusinessLogic.Models; +using MediatR; +using Microsoft.Extensions.Caching.Memory; +using Microsoft.Extensions.Primitives; +using SimpleResults; +using TransactionProcessor.Mobile.BusinessLogic.Models; +using TransactionProcessor.Mobile.BusinessLogic.Requests; using TransactionProcessor.Mobile.BusinessLogic.Services; using TransactionProcessor.Mobile.BusinessLogic.UIServices; @@ -6,6 +11,7 @@ namespace TransactionProcessor.Mobile.BusinessLogic.ViewModels.MyAccount; public class MyAccountContactPageViewModel : ExtendedBaseViewModel { + private readonly IMediator Mediator; private ContactModel contact; public ContactModel Contact { @@ -19,17 +25,43 @@ public MyAccountContactPageViewModel(INavigationService navigationService, IApplicationCache applicationCache, IDialogService dialogService, IDeviceService deviceService, - INavigationParameterService navigationParameterService) : base(applicationCache, dialogService, navigationService, deviceService, navigationParameterService) { + INavigationParameterService navigationParameterService, + IMediator mediator) : base(applicationCache, dialogService, navigationService, deviceService, navigationParameterService) { + this.Mediator = mediator; this.Title = "My Contacts"; } #endregion - public async Task Initialise(CancellationToken none) { + public async Task Initialise(CancellationToken cancellationToken) { MerchantDetailsModel merchantDetails = this.ApplicationCache.GetMerchantDetails(); - // TODO: handle a null + if (merchantDetails == null) + { + GetMerchantDetailsRequest request = GetMerchantDetailsRequest.Create(); + + Result merchantDetailsResult = await this.Mediator.Send(request, cancellationToken); + if (merchantDetailsResult.IsFailed) + { + await this.DialogService.ShowWarningToast("Unable to load merchant details. Please try again later.", cancellationToken: cancellationToken); + return; + } + + DateTime expirationTime = DateTime.Now.AddMinutes(60); + CancellationChangeToken expirationToken = new(new CancellationTokenSource(TimeSpan.FromMinutes(60)).Token); + MemoryCacheEntryOptions cacheEntryOptions = new MemoryCacheEntryOptions() + // Pin to cache. + .SetPriority(CacheItemPriority.NeverRemove) + // Set the actual expiration time + .SetAbsoluteExpiration(expirationTime) + // Force eviction to run + .AddExpirationToken(expirationToken); + + this.ApplicationCache.SetMerchantDetails(merchantDetailsResult.Data, cacheEntryOptions); + merchantDetails = this.ApplicationCache.GetMerchantDetails(); + } + this.Contact = merchantDetails.Contact; } } \ No newline at end of file