diff --git a/MareAPI b/MareAPI index 4d8c380..fef2365 160000 --- a/MareAPI +++ b/MareAPI @@ -1 +1 @@ -Subproject commit 4d8c380dab3397eda9bcbfd249be91c32af9d01b +Subproject commit fef23652805ec4cd5a62e5a5597bc3b61002b0ae diff --git a/MareSynchronosServer/MareSynchronosServer/Hubs/MareHub.CharaData.cs b/MareSynchronosServer/MareSynchronosServer/Hubs/MareHub.CharaData.cs index 7904ebc..4c67ac6 100644 --- a/MareSynchronosServer/MareSynchronosServer/Hubs/MareHub.CharaData.cs +++ b/MareSynchronosServer/MareSynchronosServer/Hubs/MareHub.CharaData.cs @@ -124,6 +124,55 @@ public partial class MareHub return [.. ownCharaData.Select(GetCharaDataFullDto)]; } + [Authorize(Policy = "Identified")] + public async Task CharaDataAttemptRestore(string id) + { + _logger.LogCallInfo(MareHubLogger.Args(id)); + var charaData = await DbContext.CharaData + .Include(u => u.Files) + .Include(u => u.FileSwaps) + .Include(u => u.OriginalFiles) + .Include(u => u.AllowedIndividiuals) + .ThenInclude(u => u.AllowedUser) + .Include(u => u.AllowedIndividiuals) + .ThenInclude(u => u.AllowedGroup) + .Include(u => u.Poses) + .AsSplitQuery() + .SingleOrDefaultAsync(s => s.Id == id && s.UploaderUID == UserUID) + .ConfigureAwait(false); + if (charaData == null) + return null; + + var currentHashes = charaData.Files.Select(f => f.FileCacheHash).ToList(); + var missingFiles = charaData.OriginalFiles.Where(c => !currentHashes.Contains(c.Hash, StringComparer.Ordinal)).ToList(); + + // now let's see what's on the db still + var existingDbFiles = await DbContext.Files + .Where(f => missingFiles.Select(k => k.Hash).Distinct().Contains(f.Hash)) + .ToListAsync() + .ConfigureAwait(false); + + // now shove it all back into the db + foreach (var dbFile in existingDbFiles) + { + var missingFileEntry = missingFiles.First(f => string.Equals(f.Hash, dbFile.Hash, StringComparison.Ordinal)); + charaData.Files.Add(new CharaDataFile() + { + FileCache = dbFile, + GamePath = missingFileEntry.GamePath, + Parent = charaData + }); + missingFiles.Remove(missingFileEntry); + } + + if (existingDbFiles.Any()) + { + await DbContext.SaveChangesAsync().ConfigureAwait(false); + } + + return GetCharaDataFullDto(charaData); + } + [Authorize(Policy = "Identified")] public async Task> CharaDataGetShared() {