From 1d9bb9097659a6c61f4da6201862d54e692a3eac Mon Sep 17 00:00:00 2001 From: Stanley Dimant Date: Sat, 8 Feb 2025 00:14:16 +0100 Subject: [PATCH] implement RestoreThenUpload for charadata --- .../Services/CharaData/CharaDataManager.cs | 27 ++++++++++++++++--- MareSynchronos/UI/CharaDataHubUi.McdOnline.cs | 5 ++++ .../ApiController.Functions.CharaData.cs | 17 ++++++++++++ 3 files changed, 46 insertions(+), 3 deletions(-) diff --git a/MareSynchronos/Services/CharaData/CharaDataManager.cs b/MareSynchronos/Services/CharaData/CharaDataManager.cs index be9be20..b2f6a60 100644 --- a/MareSynchronos/Services/CharaData/CharaDataManager.cs +++ b/MareSynchronos/Services/CharaData/CharaDataManager.cs @@ -621,8 +621,29 @@ public sealed partial class CharaDataManager : DisposableMediatorSubscriberBase var hasDto = _ownCharaData.TryGetValue(id, out var dto); if (!hasDto || dto == null) return; - var missingFileList = dto.MissingFiles.ToList(); - UiBlockingComputation = UploadTask = UploadFiles(missingFileList, async () => + UiBlockingComputation = UploadTask = RestoreThenUpload(dto); + } + + private async Task<(string Output, bool Success)> RestoreThenUpload(CharaDataFullExtendedDto dto) + { + var newDto = await _apiController.CharaDataAttemptRestore(dto.Id).ConfigureAwait(false); + if (newDto == null) + { + _ownCharaData.Remove(dto.Id); + _metaInfoCache.Remove(dto.FullId, out _); + return ("No such DTO found", false); + } + + await AddOrUpdateDto(newDto).ConfigureAwait(false); + _ = _ownCharaData.TryGetValue(dto.Id, out var extendedDto); + + if (!extendedDto!.HasMissingFiles) + { + return ("Restored successfully", true); + } + + var missingFileList = extendedDto!.MissingFiles.ToList(); + return await UploadFiles(missingFileList, async () => { var newFilePaths = dto.FileGamePaths; foreach (var missing in missingFileList) @@ -635,7 +656,7 @@ public sealed partial class CharaDataManager : DisposableMediatorSubscriberBase }; var res = await _apiController.CharaDataUpdate(updateDto).ConfigureAwait(false); await AddOrUpdateDto(res).ConfigureAwait(false); - }); + }).ConfigureAwait(false); } internal void ApplyDataToSelf(CharaDataFullExtendedDto dataDto) diff --git a/MareSynchronos/UI/CharaDataHubUi.McdOnline.cs b/MareSynchronos/UI/CharaDataHubUi.McdOnline.cs index cb20e27..1cb2572 100644 --- a/MareSynchronos/UI/CharaDataHubUi.McdOnline.cs +++ b/MareSynchronos/UI/CharaDataHubUi.McdOnline.cs @@ -84,6 +84,11 @@ internal sealed partial class CharaDataHubUi } }); } + else if (_charaDataManager.UploadTask?.IsCompleted ?? false) + { + var color = UiSharedService.GetBoolColor(_charaDataManager.UploadTask.Result.Success); + UiSharedService.ColorTextWrapped(_charaDataManager.UploadTask.Result.Output, color); + } }); } indent.Dispose(); diff --git a/MareSynchronos/WebAPI/SignalR/ApiController.Functions.CharaData.cs b/MareSynchronos/WebAPI/SignalR/ApiController.Functions.CharaData.cs index 9d273b3..1aea914 100644 --- a/MareSynchronos/WebAPI/SignalR/ApiController.Functions.CharaData.cs +++ b/MareSynchronos/WebAPI/SignalR/ApiController.Functions.CharaData.cs @@ -1,5 +1,6 @@ using MareSynchronos.API.Data; using MareSynchronos.API.Dto.CharaData; +using MareSynchronos.Services.CharaData.Models; using Microsoft.AspNetCore.SignalR.Client; using Microsoft.Extensions.Logging; @@ -70,6 +71,22 @@ public partial class ApiController } } + public async Task CharaDataAttemptRestore(string id) + { + if (!IsConnected) return null; + + try + { + Logger.LogDebug("Attempting to restore chara data {id}", id); + return await _mareHub!.InvokeAsync(nameof(CharaDataAttemptRestore), id).ConfigureAwait(false); + } + catch (Exception ex) + { + Logger.LogWarning(ex, "Failed to restore chara data for {id}", id); + return null; + } + } + public async Task> CharaDataGetOwn() { if (!IsConnected) return [];