diff --git a/products/ASC.Files/Core/Core/Thirdparty/CrossDao.cs b/products/ASC.Files/Core/Core/Thirdparty/CrossDao.cs index 7ff0c1b9548..6bc28436459 100644 --- a/products/ASC.Files/Core/Core/Thirdparty/CrossDao.cs +++ b/products/ASC.Files/Core/Core/Thirdparty/CrossDao.cs @@ -230,8 +230,7 @@ await PerformCrossDaoFolderCopyAsync(folder.Id, fromFolderDao, fromFileDao, from { var id = fromConverter(fromFolderId); var folder = await fromFolderDao.GetFolderAsync(id); - await fromFolderDao.DeleteFolderAsync(id); - await _socketManager.DeleteFolder(folder); + await _socketManager.DeleteFolder(folder, action: async () => await fromFolderDao.DeleteFolderAsync(id)); } } diff --git a/products/ASC.Files/Core/Services/WCFService/FileOperations/FileDeleteOperation.cs b/products/ASC.Files/Core/Services/WCFService/FileOperations/FileDeleteOperation.cs index f1f3cb8cc39..8b1ea103098 100644 --- a/products/ASC.Files/Core/Services/WCFService/FileOperations/FileDeleteOperation.cs +++ b/products/ASC.Files/Core/Services/WCFService/FileOperations/FileDeleteOperation.cs @@ -195,19 +195,19 @@ private async Task DeleteFoldersAsync(IEnumerable folderIds, IServiceScope sc if (isRoom) { - var room = await roomLogoManager.DeleteAsync(folder.Id, checkPermissions); - await socketManager.UpdateFolderAsync(room); + await roomLogoManager.DeleteAsync(folder.Id, checkPermissions); aces = await fileSharing.GetSharedInfoAsync(folder); } - - await FolderDao.DeleteFolderAsync(folder.Id); - - if (isRoom && folder.ProviderEntry) + + await socketManager.DeleteFolder(folder, action: async () => { - await ProviderDao.RemoveProviderInfoAsync(folder.ProviderId); - } + await FolderDao.DeleteFolderAsync(folder.Id); - await socketManager.DeleteFolder(folder); + if (isRoom && folder.ProviderEntry) + { + await ProviderDao.RemoveProviderInfoAsync(folder.ProviderId); + } + }); if (isRoom) { @@ -242,16 +242,17 @@ private async Task DeleteFoldersAsync(IEnumerable folderIds, IServiceScope sc await socketManager.UpdateFolderAsync(room); aces = await fileSharing.GetSharedInfoAsync(folder); } - - await FolderDao.DeleteFolderAsync(folder.Id); - - if (isRoom && folder.ProviderEntry) + + await socketManager.DeleteFolder(folder, action: async () => { - await ProviderDao.RemoveProviderInfoAsync(folder.ProviderId); - } - - await socketManager.DeleteFolder(folder); + await FolderDao.DeleteFolderAsync(folder.Id); + if (isRoom && folder.ProviderEntry) + { + await ProviderDao.RemoveProviderInfoAsync(folder.ProviderId); + } + }); + if (isNeedSendActions) { if (isRoom) @@ -267,9 +268,8 @@ private async Task DeleteFoldersAsync(IEnumerable folderIds, IServiceScope sc } else { - await FolderDao.MoveFolderAsync(folder.Id, _trashId, CancellationToken); - await socketManager.DeleteFolder(folder); - + await socketManager.DeleteFolder(folder, action: async () => await FolderDao.MoveFolderAsync(folder.Id, _trashId, CancellationToken)); + if (isNeedSendActions) { await filesMessageService.SendAsync(MessageAction.FolderMovedToTrash, folder, _headers, folder.Title); @@ -310,7 +310,8 @@ private async Task DeleteFilesAsync(IEnumerable fileIds, IServiceScope scope, await fileMarker.RemoveMarkAsNewForAllAsync(file); if (!_immediately && FileDao.UseTrashForRemove(file)) { - await FileDao.MoveFileAsync(file.Id, _trashId); + await socketManager.DeleteFileAsync(file, action: async () => await FileDao.MoveFileAsync(file.Id, _trashId)); + if (isNeedSendActions) { await filesMessageService.SendAsync(MessageAction.FileMovedToTrash, file, _headers, file.Title); @@ -322,14 +323,14 @@ private async Task DeleteFilesAsync(IEnumerable fileIds, IServiceScope scope, await FileDao.SetThumbnailStatusAsync(file, Thumbnail.NotRequired); } - await socketManager.DeleteFileAsync(file); + } else { try { - await FileDao.DeleteFileAsync(file.Id); - + await socketManager.DeleteFileAsync(file, action: async () => await FileDao.DeleteFileAsync(file.Id)); + if (_headers != null) { if (isNeedSendActions) @@ -341,8 +342,6 @@ private async Task DeleteFilesAsync(IEnumerable fileIds, IServiceScope scope, { await filesMessageService.SendAsync(MessageAction.FileDeleted, file, MessageInitiator.AutoCleanUp, file.Title); } - - await socketManager.DeleteFileAsync(file); } catch (Exception ex) { diff --git a/products/ASC.Files/Core/Services/WCFService/FileOperations/FileMoveCopyOperation.cs b/products/ASC.Files/Core/Services/WCFService/FileOperations/FileMoveCopyOperation.cs index eae4f49010e..3c4d3859d8e 100644 --- a/products/ASC.Files/Core/Services/WCFService/FileOperations/FileMoveCopyOperation.cs +++ b/products/ASC.Files/Core/Services/WCFService/FileOperations/FileMoveCopyOperation.cs @@ -374,10 +374,7 @@ private async Task>> MoveOrCopyFoldersAsync(IServiceScope } else if (await FolderDao.IsEmptyAsync(folder.Id)) { - await FolderDao.DeleteFolderAsync(folder.Id); - - await socketManager.DeleteFolder(folder); - + await socketManager.DeleteFolder(folder, action: async () => await FolderDao.DeleteFolderAsync(folder.Id)); if (ProcessedFolder(folderId)) { sb.Append($"folder_{newFolder.Id}{SplitChar}"); @@ -464,17 +461,23 @@ private async Task>> MoveOrCopyFoldersAsync(IServiceScope { await _semaphore.WaitAsync(); await countRoomChecker.CheckAppend(); - newFolderId = await FolderDao.MoveFolderAsync(folder.Id, toFolderId, CancellationToken); - await socketManager.DeleteFolder(folder); - + + await socketManager.DeleteFolder(folder, action: async () => + { + newFolderId = await FolderDao.MoveFolderAsync(folder.Id, toFolderId, CancellationToken); + }); + var (name, value) = await tenantQuotaFeatureStatHelper.GetStatAsync(); _ = quotaSocketManager.ChangeQuotaUsedValueAsync(name, value); } else if (isRoom && toFolder.FolderType == FolderType.Archive) { await _semaphore.WaitAsync(); - newFolderId = await FolderDao.MoveFolderAsync(folder.Id, toFolderId, CancellationToken); - await socketManager.DeleteFolder(folder); + + await socketManager.DeleteFolder(folder, action: async () => + { + newFolderId = await FolderDao.MoveFolderAsync(folder.Id, toFolderId, CancellationToken); + }); var (name, value) = await tenantQuotaFeatureStatHelper.GetStatAsync(); _ = quotaSocketManager.ChangeQuotaUsedValueAsync(name, value); @@ -649,7 +652,8 @@ private async Task>> MoveOrCopyFilesAsync(IServiceScope { await fileMarker.RemoveMarkAsNewForAllAsync(file); - var newFileId = await FileDao.MoveFileAsync(file.Id, toFolderId); + TTo newFileId = default; + await socketManager.DeleteFileAsync(file, action: async () => newFileId = await FileDao.MoveFileAsync(file.Id, toFolderId)); newFile = await fileDao.GetFileAsync(newFileId); await filesMessageService.SendAsync(MessageAction.FileMoved, file, toFolder, _headers, file.Title, parentFolder.Title, toFolder.Title); @@ -671,8 +675,6 @@ private async Task>> MoveOrCopyFilesAsync(IServiceScope needToMark.Add(newFile); } - await socketManager.DeleteFileAsync(file); - await socketManager.CreateFileAsync(newFile); if (ProcessedFile(fileId)) @@ -762,15 +764,16 @@ private async Task>> MoveOrCopyFilesAsync(IServiceScope this[Err] = message; } else - { - await FileDao.DeleteFileAsync(file.Id); + { + await socketManager.DeleteFileAsync(file, action: async () => + { + await FileDao.DeleteFileAsync(file.Id); - await LinkDao.DeleteAllLinkAsync(file.Id.ToString()); + await LinkDao.DeleteAllLinkAsync(file.Id.ToString()); + }); await filesMessageService.SendAsync(MessageAction.FileMovedWithOverwriting, file, toFolder, _headers, file.Title, parentFolder.Title, toFolder.Title); - await socketManager.DeleteFileAsync(file); - if (ProcessedFile(fileId)) { sb.Append($"file_{newFile.Id}{SplitChar}"); diff --git a/products/ASC.Files/Core/Utils/EntryManager.cs b/products/ASC.Files/Core/Utils/EntryManager.cs index b97fb8ad32a..ed797fb351b 100644 --- a/products/ASC.Files/Core/Utils/EntryManager.cs +++ b/products/ASC.Files/Core/Utils/EntryManager.cs @@ -1914,58 +1914,4 @@ private async Task SetOriginsAsync(IFolder parent, IEnumerable entrie fileEntry.OriginTitle = data.OriginFolder.FolderType == FolderType.USER ? FilesUCResource.MyFiles : data.OriginFolder.Title; } } - - //Long operation - public async Task DeleteSubitemsAsync(T parentId, IFolderDao folderDao, IFileDao fileDao, ILinkDao linkDao) - { - var folders = folderDao.GetFoldersAsync(parentId); - await foreach (var folder in folders) - { - await DeleteSubitemsAsync(folder.Id, folderDao, fileDao, linkDao); - - _logger.InformationDeleteFolder(folder.Id.ToString(), parentId.ToString()); - await folderDao.DeleteFolderAsync(folder.Id); - await _socketManager.DeleteFolder(folder); - } - - var files = fileDao.GetFilesAsync(parentId, null, FilterType.None, false, Guid.Empty, string.Empty, null, true); - await foreach (var file in files) - { - _logger.InformationDeletefile(file.Id.ToString(), parentId.ToString()); - await fileDao.DeleteFileAsync(file.Id); - await _socketManager.DeleteFileAsync(file); - - await linkDao.DeleteAllLinkAsync(file.Id.ToString()); - } - } - - public async Task MoveSharedItemsAsync(T parentId, T toId, IFolderDao folderDao, IFileDao fileDao) - { - var folders = folderDao.GetFoldersAsync(parentId); - await foreach (var folder in folders) - { - var shares = await _fileSecurity.GetSharesAsync(folder); - var shared = folder.Shared - && shares.Any(record => record.Share != FileShare.Restrict); - if (shared) - { - _logger.InformationMoveSharedFolder(folder.Id.ToString(), parentId.ToString(), toId.ToString()); - await folderDao.MoveFolderAsync(folder.Id, toId, null); - } - else - { - await MoveSharedItemsAsync(folder.Id, toId, folderDao, fileDao); - } - } - - var files = fileDao.GetFilesAsync(parentId, null, FilterType.None, false, Guid.Empty, string.Empty, null, true) - .WhereAwait(async file => file.Shared && - (await _fileSecurity.GetSharesAsync(file)).Any(record => record.Subject != FileConstant.ShareLinkId && record.Share != FileShare.Restrict)); - - await foreach (var file in files) - { - _logger.InformationMoveSharedFile(file.Id.ToString(), parentId.ToString(), toId.ToString()); - await fileDao.MoveFileAsync(file.Id, toId); - } - } } diff --git a/products/ASC.Files/Core/Utils/FileSharing.cs b/products/ASC.Files/Core/Utils/FileSharing.cs index 54c1e841b26..f8f5ccccfa7 100644 --- a/products/ASC.Files/Core/Utils/FileSharing.cs +++ b/products/ASC.Files/Core/Utils/FileSharing.cs @@ -48,7 +48,8 @@ public class FileSharingAceHelper private readonly UserManagerWrapper _userManagerWrapper; private readonly CountPaidUserChecker _countPaidUserChecker; private readonly IUrlShortener _urlShortener; - + private readonly SocketManager _socketManager; + private const int MaxInvitationLinks = 1; private const int MaxAdditionalExternalLinks = 5; private const int MaxPrimaryExternalLinks = 1; @@ -70,7 +71,8 @@ public FileSharingAceHelper( StudioNotifyService studioNotifyService, UserManagerWrapper userManagerWrapper, CountPaidUserChecker countPaidUserChecker, - IUrlShortener urlShortener) + IUrlShortener urlShortener, + SocketManager socketManager) { _fileSecurity = fileSecurity; _coreBaseSettings = coreBaseSettings; @@ -89,6 +91,7 @@ public FileSharingAceHelper( _userManagerWrapper = userManagerWrapper; _countPaidUserChecker = countPaidUserChecker; _urlShortener = urlShortener; + _socketManager = socketManager; } public async Task SetAceObjectAsync(List aceWrappers, FileEntry entry, bool notify, string message, AceAdvancedSettingsWrapper advancedSettings, string culture = null) @@ -260,6 +263,18 @@ public async Task SetAceObjectAsync(List ace } await _fileSecurity.ShareAsync(entry.Id, entryType, w.Id, share, w.SubjectType, w.FileShareOptions); + if (room != null) + { + if (share == FileShare.None) + { + await _socketManager.DeleteFolder(room, new [] { w.Id }); + } + else if(existedShare == null) + { + await _socketManager.CreateFolderAsync(room, new [] { w.Id }); + } + } + changed = true; handledAces.Add(new Tuple(eventType, w)); diff --git a/products/ASC.Files/Core/Utils/SocketManager.cs b/products/ASC.Files/Core/Utils/SocketManager.cs index 3d20034844f..f9147f4ae34 100644 --- a/products/ASC.Files/Core/Utils/SocketManager.cs +++ b/products/ASC.Files/Core/Utils/SocketManager.cs @@ -71,9 +71,9 @@ public async Task CreateFileAsync(File file) await MakeRequest("create-file", file, true); } - public async Task CreateFolderAsync(Folder folder) + public async Task CreateFolderAsync(Folder folder, IEnumerable users = null) { - await MakeRequest("create-folder", folder, true); + await MakeRequest("create-folder", folder, true, users); } public async Task UpdateFileAsync(File file) @@ -86,14 +86,14 @@ public async Task UpdateFolderAsync(Folder folder) await MakeRequest("update-folder", folder, true); } - public async Task DeleteFileAsync(File file) + public async Task DeleteFileAsync(File file, Func action = null) { - await MakeRequest("delete-file", file); + await MakeRequest("delete-file", file, action: action); } - public async Task DeleteFolder(Folder folder) + public async Task DeleteFolder(Folder folder, IEnumerable users = null, Func action = null) { - await MakeRequest("delete-folder", folder); + await MakeRequest("delete-folder", folder, users: users, action: action); } public async Task ExecMarkAsNewFilesAsync(IEnumerable tags) @@ -127,10 +127,16 @@ public async Task ExecMarkAsNewFoldersAsync(IEnumerable tags) SendNotAwaitableRequest("mark-as-new-folder", result); } - private async Task MakeRequest(string method, FileEntry entry, bool withData = false) + private async Task MakeRequest(string method, FileEntry entry, bool withData = false, IEnumerable users = null, Func action = null) { var room = await GetFolderRoomAsync(entry.ParentId); - var whoCanRead = await GetWhoCanRead(entry); + var whoCanRead = users ?? await GetWhoCanRead(entry); + + if (action != null) + { + await action(); + } + var data = ""; if (withData)