ASC.Files: ReassignStorageAsync refactoring (deletion of personal data, optimization of data reassignment)

This commit is contained in:
Andrey Savihin 2023-06-29 11:53:18 +03:00
parent d6e3d3c3ba
commit c21ea30882
10 changed files with 41 additions and 48 deletions

View File

@ -245,9 +245,9 @@ public interface IFileDao<T>
/// <summary>
/// Set created by
/// </summary>
/// <param name="fileIds"></param>
/// <param name="oldOwnerId"></param>
/// <param name="newOwnerId"></param>
Task ReassignFilesAsync(T[] fileIds, Guid newOwnerId);
Task ReassignFilesAsync(Guid oldOwnerId, Guid newOwnerId);
/// <summary>
/// Search files in SharedWithMe & Projects

View File

@ -221,9 +221,9 @@ public interface IFolderDao<T>
/// <summary>
/// Set created by
/// </summary>
/// <param name="folderIds"></param>
/// <param name="oldOwnerId"></param>
/// <param name="newOwnerId"></param>
Task ReassignFoldersAsync(T[] folderIds, Guid newOwnerId);
Task ReassignFoldersAsync(Guid oldOwnerId, Guid newOwnerId);
/// <summary>

View File

@ -1169,15 +1169,14 @@ internal class FileDao : AbstractDao, IFileDao<int>
#region Only in TMFileDao
public async Task ReassignFilesAsync(int[] fileIds, Guid newOwnerId)
public async Task ReassignFilesAsync(Guid oldOwnerId, Guid newOwnerId)
{
using var filesDbContext = _dbContextFactory.CreateDbContext();
await Query(filesDbContext.Files)
.Where(r => r.CurrentVersion)
.Where(r => fileIds.Contains(r.Id))
.Where(r => r.CreateBy == oldOwnerId)
.ExecuteUpdateAsync(p => p.SetProperty(f => f.CreateBy, newOwnerId));
}
}
public IAsyncEnumerable<File<int>> GetFilesAsync(IEnumerable<int> parentIds, FilterType filterType, bool subjectGroup, Guid subjectID, string searchText, bool searchInContent)
{

View File

@ -974,12 +974,12 @@ internal class FolderDao : AbstractDao, IFolderDao<int>
#region Only for TMFolderDao
public async Task ReassignFoldersAsync(int[] folderIds, Guid newOwnerId)
public async Task ReassignFoldersAsync(Guid oldOwnerId, Guid newOwnerId)
{
using var filesDbContext = _dbContextFactory.CreateDbContext();
await Query(filesDbContext.Folders)
.Where(r => folderIds.Contains(r.Id))
.Where(r => r.CreateBy == oldOwnerId)
.ExecuteUpdateAsync(f => f.SetProperty(p => p.CreateBy, newOwnerId));
}

View File

@ -2236,8 +2236,8 @@ public class FileStorageService //: IFileStorageService
var providerDao = GetProviderDao<T>();
if (providerDao != null)
{
//move common thirdparty storage userFrom
await foreach (var commonProviderInfo in providerDao.GetProvidersInfoAsync(userFrom.Id).Where(provider => provider.RootFolderType == FolderType.COMMON))
//move thirdparty storage userFrom
await foreach (var commonProviderInfo in providerDao.GetProvidersInfoAsync(userFrom.Id))
{
_logger.InformationReassignProvider(commonProviderInfo.ProviderId, userFrom.Id, userTo.Id);
await providerDao.UpdateProviderInfoAsync(commonProviderInfo.ProviderId, null, null, FolderType.DEFAULT, userTo.Id);
@ -2249,27 +2249,23 @@ public class FileStorageService //: IFileStorageService
if (!await _userManager.IsUserAsync(userFrom))
{
var folderIdFromMy = await folderDao.GetFolderIDUserAsync(false, userFrom.Id);
_logger.InformationDeletePersonalData(userFrom.Id);
var folderIdFromMy = await folderDao.GetFolderIDUserAsync(false, userFrom.Id);
if (!Equals(folderIdFromMy, 0))
{
//create folder with name userFrom in folder userTo
var folderIdToMy = await folderDao.GetFolderIDUserAsync(true, userTo.Id);
var newFolder = _serviceProvider.GetService<Folder<T>>();
newFolder.Title = string.Format(_customNamingPeople.Substitute<FilesCommonResource>("TitleDeletedUserFolder"), userFrom.DisplayUserName(false, _displayUserSettingsHelper));
newFolder.ParentId = folderIdToMy;
await folderDao.DeleteFolderAsync(folderIdFromMy);
}
var newFolderTo = await folderDao.SaveFolderAsync(newFolder);
await _socketManager.CreateFolderAsync(newFolder);
//move items from userFrom to userTo
await _entryManager.MoveSharedItemsAsync(folderIdFromMy, newFolderTo, folderDao, fileDao);
await EntryManager.ReassignItemsAsync(newFolderTo, userFrom.Id, userTo.Id, folderDao, fileDao);
var folderIdFromTrash = await folderDao.GetFolderIDTrashAsync(false, userFrom.Id);
if (!Equals(folderIdFromTrash, 0))
{
await folderDao.DeleteFolderAsync(folderIdFromTrash);
}
}
await EntryManager.ReassignItemsAsync(await _globalFolderHelper.GetFolderCommonAsync<T>(), userFrom.Id, userTo.Id, folderDao, fileDao);
_logger.InformationReassignData(userFrom.Id, userTo.Id);
await EntryManager.ReassignItemsAsync(userFrom.Id, userTo.Id, folderDao, fileDao);
}
#region Favorites Manager

View File

@ -600,7 +600,7 @@ internal abstract class ThirdPartyFileDao<TFile, TFolder, TItem>: IFileDao<strin
public abstract Task AbortUploadSessionAsync(ChunkedUploadSession<string> uploadSession);
public Task ReassignFilesAsync(string[] fileIds, Guid newOwnerId)
public Task ReassignFilesAsync(Guid oldOwner, Guid newOwnerId)
{
return Task.CompletedTask;
}

View File

@ -521,7 +521,7 @@ internal class ThirdPartyFolderDao<TFile, TFolder, TItem> : BaseFolderDao, IFold
return Task.FromResult<IDataWriteOperator>(new ChunkZipWriteOperator(_tempStream, chunkedUploadSession, sessionHolder));
}
public Task ReassignFoldersAsync(string[] folderIds, Guid newOwnerId)
public Task ReassignFoldersAsync(Guid oldOwnerId, Guid newOwnerId)
{
return Task.CompletedTask;
}

View File

@ -30,7 +30,7 @@ internal abstract class ThirdPartyProviderDao
{
#region FileDao
public Task ReassignFilesAsync(string[] fileIds, Guid newOwnerId)
public Task ReassignFilesAsync(Guid oldOwner, Guid newOwnerId)
{
return Task.CompletedTask;
}
@ -125,7 +125,7 @@ internal abstract class ThirdPartyProviderDao
#endregion
#region FolderDao
public Task ReassignFoldersAsync(string[] folderIds, Guid newOwnerId)
public Task ReassignFoldersAsync(Guid oldOwnerId, Guid newOwnerId)
{
return Task.CompletedTask;
}

View File

@ -28,17 +28,23 @@ namespace ASC.Files.Core.Log;
internal static partial class FileStorageServiceLogger
{
[LoggerMessage(Level = LogLevel.Error, Message = "DocEditor")]
public static partial void ErrorDocEditor(this ILogger logger, Exception exception);
public static partial void ErrorDocEditor(this ILogger logger, Exception exception);
[LoggerMessage(Level = LogLevel.Error, Message = "CreateThumbnails")]
public static partial void ErrorCreateThumbnails(this ILogger logger, Exception exception);
public static partial void ErrorCreateThumbnails(this ILogger logger, Exception exception);
[LoggerMessage(Level = LogLevel.Error, Message = "FileStorageService")]
public static partial void ErrorFileStorageService(this ILogger logger, Exception exception);
[LoggerMessage(Level = LogLevel.Information, Message = "Reassign provider {providerId} from {fromUser} to {toUser}")]
public static partial void InformationReassignProvider(this ILogger logger, int providerId, Guid fromUser, Guid toUser);
public static partial void InformationReassignProvider(this ILogger logger, int providerId, Guid fromUser, Guid toUser);
[LoggerMessage(Level = LogLevel.Information, Message = "Delete provider {providerId} for {userId}")]
public static partial void InformationDeleteProvider(this ILogger logger, int providerId, Guid userId);
[LoggerMessage(Level = LogLevel.Information, Message = "Reassign data from {fromUser} to {toUser}")]
public static partial void InformationReassignData(this ILogger logger, Guid fromUser, Guid toUser);
[LoggerMessage(Level = LogLevel.Information, Message = "Delete personal data for {userId}")]
public static partial void InformationDeletePersonalData(this ILogger logger, Guid userId);
}

View File

@ -1952,18 +1952,10 @@ public class EntryManager
}
}
public static async Task ReassignItemsAsync<T>(T parentId, Guid fromUserId, Guid toUserId, IFolderDao<T> folderDao, IFileDao<T> fileDao)
public static async Task ReassignItemsAsync<T>(Guid fromUserId, Guid toUserId, IFolderDao<T> folderDao, IFileDao<T> fileDao)
{
var fileIds = await fileDao.GetFilesAsync(parentId, new OrderBy(SortedByType.AZ, true), FilterType.ByUser, false, fromUserId, null, true, default, true)
.Where(file => file.CreateBy == fromUserId).Select(file => file.Id)
.ToListAsync();
await fileDao.ReassignFilesAsync(fromUserId, toUserId);
await fileDao.ReassignFilesAsync(fileIds.ToArray(), toUserId);
var folderIds = await folderDao.GetFoldersAsync(parentId, new OrderBy(SortedByType.AZ, true), FilterType.ByUser, false, fromUserId, null, default, true)
.Where(folder => folder.CreateBy == fromUserId).Select(folder => folder.Id)
.ToListAsync();
await folderDao.ReassignFoldersAsync(folderIds.ToArray(), toUserId);
await folderDao.ReassignFoldersAsync(fromUserId, toUserId);
}
}