improvements, fixes, etc...

This commit is contained in:
Loretta 2024-06-24 07:07:57 +02:00
parent 50869e4754
commit 2f3abd800b
2 changed files with 31 additions and 22 deletions

View File

@ -72,27 +72,28 @@ namespace AyCode.Blazor.Components.Services
public virtual Task SendMessageToServerAsync(int messageTag) public virtual Task SendMessageToServerAsync(int messageTag)
=> SendMessageToServerAsync(messageTag, null, AcDomain.NextUniqueInt32); => SendMessageToServerAsync(messageTag, null, AcDomain.NextUniqueInt32);
public virtual async Task SendMessageToServerAsync(int messageTag, ISignalRMessage? message, int? requestId) public virtual Task SendMessageToServerAsync(int messageTag, ISignalRMessage? message, int? requestId)
{ {
Logger.DebugConditional($"Client SendMessageToServerAsync; {nameof(messageTag)}: {messageTag}; {nameof(requestId)}: {requestId};"); Logger.DebugConditional($"Client SendMessageToServerAsync; {nameof(messageTag)}: {messageTag}; {nameof(requestId)}: {requestId};");
await StartConnection(); return StartConnection().ContinueWith(x =>
{
var msgp = message?.ToMessagePack(ContractlessStandardResolver.Options); var msgp = message?.ToMessagePack(ContractlessStandardResolver.Options);
HubConnection.SendAsync(nameof(IAcSignalRHubClient.OnReceiveMessage), messageTag, msgp, requestId).Forget(); return HubConnection.SendAsync(nameof(IAcSignalRHubClient.OnReceiveMessage), messageTag, msgp, requestId);
});
} }
#region CRUD #region CRUD
public virtual Task<TResponseData?> GetByIdAsync<TResponseData>(int messageTag, params Guid[] ids) where TResponseData : class public virtual Task<TResponseData?> GetByIdAsync<TResponseData>(int messageTag, params Guid[] ids) where TResponseData : class
=> SendMessageToServerAsync<TResponseData>(messageTag, new SignalPostJsonDataMessage<IdMessage>(new IdMessage(ids)), AcDomain.NextUniqueInt32); => SendMessageToServerAsync<TResponseData>(messageTag, new SignalPostJsonDataMessage<IdMessage>(new IdMessage(ids)), AcDomain.NextUniqueInt32);
public virtual Task GetByIdAsync<TResponseData>(int messageTag, Action<ISignalResponseMessage<TResponseData?>> responseCallback, params Guid[] ids) public virtual Task GetByIdAsync<TResponseData>(int messageTag, Func<ISignalResponseMessage<TResponseData?>, Task> responseCallback, params Guid[] ids)
=> SendMessageToServerAsync(messageTag, new SignalPostJsonDataMessage<IdMessage>(new IdMessage(ids)), responseCallback); => SendMessageToServerAsync(messageTag, new SignalPostJsonDataMessage<IdMessage>(new IdMessage(ids)), responseCallback);
public virtual Task<TResponseData?> GetAllAsync<TResponseData>(int messageTag) where TResponseData : class public virtual Task<TResponseData?> GetAllAsync<TResponseData>(int messageTag) where TResponseData : class
=> SendMessageToServerAsync<TResponseData>(messageTag); => SendMessageToServerAsync<TResponseData>(messageTag);
public virtual Task GetAllAsync<TResponseData>(int messageTag, Action<ISignalResponseMessage<TResponseData?>> responseCallback) public virtual Task GetAllAsync<TResponseData>(int messageTag, Func<ISignalResponseMessage<TResponseData?>, Task> responseCallback)
=> SendMessageToServerAsync(messageTag, null, responseCallback); => SendMessageToServerAsync(messageTag, null, responseCallback);
public virtual Task GetAllAsync<TResponseData>(int messageTag, Action<ISignalResponseMessage<TResponseData?>> responseCallback, params Guid[]? contextIds) public virtual Task GetAllAsync<TResponseData>(int messageTag, Func<ISignalResponseMessage<TResponseData?>, Task> responseCallback, params Guid[]? contextIds)
=> SendMessageToServerAsync(messageTag, (contextIds == null || contextIds.Length == 0 ? null : new SignalPostJsonDataMessage<IdMessage>(new IdMessage(contextIds))), responseCallback); => SendMessageToServerAsync(messageTag, (contextIds == null || contextIds.Length == 0 ? null : new SignalPostJsonDataMessage<IdMessage>(new IdMessage(contextIds))), responseCallback);
public virtual Task<TResponseData?> GetAllAsync<TResponseData>(int messageTag, params Guid[]? contextIds) where TResponseData : class public virtual Task<TResponseData?> GetAllAsync<TResponseData>(int messageTag, params Guid[]? contextIds) where TResponseData : class
@ -100,7 +101,7 @@ namespace AyCode.Blazor.Components.Services
public virtual Task<TPostData?> PostDataAsync<TPostData>(int messageTag, TPostData postData) where TPostData : class public virtual Task<TPostData?> PostDataAsync<TPostData>(int messageTag, TPostData postData) where TPostData : class
=> SendMessageToServerAsync<TPostData>(messageTag, new SignalPostJsonDataMessage<TPostData>(postData), AcDomain.NextUniqueInt32); => SendMessageToServerAsync<TPostData>(messageTag, new SignalPostJsonDataMessage<TPostData>(postData), AcDomain.NextUniqueInt32);
public virtual Task PostDataAsync<TPostData>(int messageTag, TPostData postData, Action<ISignalResponseMessage<TPostData?>> responseCallback) where TPostData : class public virtual Task PostDataAsync<TPostData>(int messageTag, TPostData postData, Func<ISignalResponseMessage<TPostData?>, Task> responseCallback) where TPostData : class
=> SendMessageToServerAsync(messageTag, new SignalPostJsonDataMessage<TPostData>(postData), responseCallback); => SendMessageToServerAsync(messageTag, new SignalPostJsonDataMessage<TPostData>(postData), responseCallback);
#endregion CRUD #endregion CRUD
@ -146,10 +147,10 @@ namespace AyCode.Blazor.Components.Services
return default; return default;
} }
public virtual Task SendMessageToServerAsync<TResponseData>(int messageTag, Action<ISignalResponseMessage<TResponseData?>> responseCallback) public virtual Task SendMessageToServerAsync<TResponseData>(int messageTag, Func<ISignalResponseMessage<TResponseData?>, Task> responseCallback)
=> SendMessageToServerAsync(messageTag, null, responseCallback); => SendMessageToServerAsync(messageTag, null, responseCallback);
public virtual Task SendMessageToServerAsync<TResponseData>(int messageTag, ISignalRMessage? message, Action<ISignalResponseMessage<TResponseData?>> responseCallback) public virtual Task SendMessageToServerAsync<TResponseData>(int messageTag, ISignalRMessage? message, Func<ISignalResponseMessage<TResponseData?>, Task> responseCallback)
{ {
if (messageTag == 0) if (messageTag == 0)
Logger.Error($"SendMessageToServerAsync; messageTag == 0"); Logger.Error($"SendMessageToServerAsync; messageTag == 0");

View File

@ -138,7 +138,7 @@ namespace AyCode.Blazor.Components.Services
if (result.Status != SignalResponseStatus.Success || result.ResponseData == null) if (result.Status != SignalResponseStatus.Success || result.ResponseData == null)
throw new NullReferenceException($"LoadDataSourceAsync; result.Status != SignalResponseStatus.Success || result.ResponseData == null; Status: {SignalResponseStatus.Success}"); throw new NullReferenceException($"LoadDataSourceAsync; result.Status != SignalResponseStatus.Success || result.ResponseData == null; Status: {SignalResponseStatus.Success}");
LoadDataSource(result.ResponseData).Forget(); return LoadDataSource(result.ResponseData);
}, ContextIds); }, ContextIds);
} }
@ -687,17 +687,23 @@ namespace AyCode.Blazor.Components.Services
protected Task SaveTrackingItemUnsafeAsync(TrackingItem<T> trackingItem) protected Task SaveTrackingItemUnsafeAsync(TrackingItem<T> trackingItem)
=> SaveItemUnsafeAsync(trackingItem.CurrentValue, trackingItem.TrackingState); => SaveItemUnsafeAsync(trackingItem.CurrentValue, trackingItem.TrackingState);
protected async Task<T> SaveItemUnsafe(T item, TrackingState trackingState) protected Task<T> SaveItemUnsafe(T item, TrackingState trackingState)
{ {
var messageTag = SignalRCrudTags.GetMessageTagByTrackingState(trackingState); var messageTag = SignalRCrudTags.GetMessageTagByTrackingState(trackingState);
if (messageTag == AcSignalRTags.None) throw new ArgumentException($"SaveItemUnsafe; messageTag == SignalRTags.None"); if (messageTag == AcSignalRTags.None) throw new ArgumentException($"SaveItemUnsafe; messageTag == SignalRTags.None");
var result = await SignalRClient.PostDataAsync(messageTag, item); return SignalRClient.PostDataAsync(messageTag, item).ContinueWith(x =>
if (result == null) throw new NullReferenceException($"SaveItemUnsafe; result == null"); {
if (x.Result == null)
{
if (TryRollbackItem(item.Id, out _)) return item;
await ProcessSavedResponseItem(result, trackingState); throw new NullReferenceException($"SaveItemUnsafe; result == null");
}
return result; ProcessSavedResponseItem(x.Result, trackingState);
return x.Result;
});
} }
protected Task SaveItemUnsafeAsync(T item, TrackingState trackingState) protected Task SaveItemUnsafeAsync(T item, TrackingState trackingState)
@ -713,12 +719,12 @@ namespace AyCode.Blazor.Components.Services
{ {
if (response.Status != SignalResponseStatus.Success || response.ResponseData == null) if (response.Status != SignalResponseStatus.Success || response.ResponseData == null)
{ {
if (TryRollbackItem(item.Id, out _)) return; if (TryRollbackItem(item.Id, out _)) return Task.CompletedTask;
throw new NullReferenceException($"SaveItemUnsafeAsync; result.Status != SignalResponseStatus.Success || result.ResponseData == null; Status: {SignalResponseStatus.Success}"); throw new NullReferenceException($"SaveItemUnsafeAsync; result.Status != SignalResponseStatus.Success || result.ResponseData == null; Status: {SignalResponseStatus.Success}");
} }
ProcessSavedResponseItem(response.ResponseData, trackingState).Forget(); return ProcessSavedResponseItem(response.ResponseData, trackingState);
} }
finally finally
{ {
@ -727,9 +733,9 @@ namespace AyCode.Blazor.Components.Services
}); });
} }
private async Task ProcessSavedResponseItem(T? resultItem, TrackingState trackingState) private Task ProcessSavedResponseItem(T? resultItem, TrackingState trackingState)
{ {
if (resultItem == null) return; if (resultItem == null) return Task.CompletedTask;
if (TryGetTrackingItem(resultItem.Id, out var trackingItem)) if (TryGetTrackingItem(resultItem.Id, out var trackingItem))
TrackingItems.Remove(trackingItem); TrackingItems.Remove(trackingItem);
@ -738,7 +744,9 @@ namespace AyCode.Blazor.Components.Services
InnerList[index] = resultItem; InnerList[index] = resultItem;
var eventArgs = new ItemChangedEventArgs<T>(resultItem, trackingState); var eventArgs = new ItemChangedEventArgs<T>(resultItem, trackingState);
if (OnDataSourceItemChanged != null) await OnDataSourceItemChanged.Invoke(eventArgs); if (OnDataSourceItemChanged != null) return OnDataSourceItemChanged.Invoke(eventArgs);
return Task.CompletedTask;
} }
protected void RollbackItemUnsafe(TrackingItem<T> trackingItem) protected void RollbackItemUnsafe(TrackingItem<T> trackingItem)