From 59a78409b4be095ab03ac29393a7dca66402c9fe Mon Sep 17 00:00:00 2001 From: pavelbannov Date: Fri, 8 Jul 2022 11:17:11 +0300 Subject: [PATCH] Files: optimization --- .../Core/ApiModels/ResponseDto/FileDto.cs | 1 + .../ApiModels/ResponseDto/FileEntryDto.cs | 3 +- .../ApiModels/ResponseDto/FolderContentDto.cs | 133 ++++++++++-------- .../Core/ApiModels/ResponseDto/FolderDto.cs | 4 +- 4 files changed, 77 insertions(+), 64 deletions(-) diff --git a/products/ASC.Files/Core/ApiModels/ResponseDto/FileDto.cs b/products/ASC.Files/Core/ApiModels/ResponseDto/FileDto.cs index 1464e7f4f5..57959ea612 100644 --- a/products/ASC.Files/Core/ApiModels/ResponseDto/FileDto.cs +++ b/products/ASC.Files/Core/ApiModels/ResponseDto/FileDto.cs @@ -48,6 +48,7 @@ public class FileDto : FileEntryDto public bool CanFillForms { get; set; } public bool DenyDownload { get; set; } public bool DenySharing { get; set; } + protected internal override FileEntryType EntryType { get => FileEntryType.File; } public FileDto() { } diff --git a/products/ASC.Files/Core/ApiModels/ResponseDto/FileEntryDto.cs b/products/ASC.Files/Core/ApiModels/ResponseDto/FileEntryDto.cs index c3e6324efd..aaee29b8b8 100644 --- a/products/ASC.Files/Core/ApiModels/ResponseDto/FileEntryDto.cs +++ b/products/ASC.Files/Core/ApiModels/ResponseDto/FileEntryDto.cs @@ -27,7 +27,8 @@ namespace ASC.Files.Core.ApiModels.ResponseDto; public abstract class FileEntryDto -{ +{ + protected internal abstract FileEntryType EntryType { get; } public string Title { get; set; } public FileShare Access { get; set; } public bool Shared { get; set; } diff --git a/products/ASC.Files/Core/ApiModels/ResponseDto/FolderContentDto.cs b/products/ASC.Files/Core/ApiModels/ResponseDto/FolderContentDto.cs index 5ac9e88a46..593ea6eca7 100644 --- a/products/ASC.Files/Core/ApiModels/ResponseDto/FolderContentDto.cs +++ b/products/ASC.Files/Core/ApiModels/ResponseDto/FolderContentDto.cs @@ -81,63 +81,35 @@ public class FolderContentDtoHelper public async Task> GetAsync(DataWrapper folderItems, int startIndex) { - var foldersIntWithRights = await GetFoldersIntWithRightsAsync(); - var foldersStringWithRights = await GetFoldersIntWithRightsAsync(); - var files = new List(); - var folders = new List(); + var foldersIntWithRightsTask = GetFoldersIntWithRightsAsync(); + var foldersStringWithRightsTask = GetFoldersIntWithRightsAsync(); - var fileEntries = folderItems.Entries.Where(r => r.FileEntryType == FileEntryType.File); - foreach (var r in fileEntries) - { - FileEntryDto wrapper = null; - if (r is File fol1) - { - wrapper = await _fileDtoHelper.GetAsync(fol1, foldersIntWithRights); - } - else if (r is File fol2) - { - wrapper = await _fileDtoHelper.GetAsync(fol2, foldersStringWithRights); - } + var foldersIntWithRights = await foldersIntWithRightsTask; + var foldersStringWithRights = await foldersStringWithRightsTask; - files.Add(wrapper); - } - - var folderEntries = folderItems.Entries.Where(r => r.FileEntryType == FileEntryType.Folder); - - foreach (var r in folderEntries) - { - FileEntryDto wrapper = null; - if (r is Folder fol1) - { - wrapper = await _folderDtoHelper.GetAsync(fol1, foldersIntWithRights); - } - else if (r is Folder fol2) - { - wrapper = await _folderDtoHelper.GetAsync(fol2, foldersStringWithRights); - } - - folders.Add(wrapper); - } + var filesTask = GetFilesDto().ToListAsync(); + var foldersTask = GetFoldersDto().ToListAsync(); + var currentTask = _folderDtoHelper.GetAsync(folderItems.FolderInfo); var result = new FolderContentDto { - Files = files, - Folders = folders, + Files = await filesTask, + Folders = await foldersTask, PathParts = folderItems.FolderPathParts, - StartIndex = startIndex + StartIndex = startIndex, + Current = await currentTask, + Total = folderItems.Total, + New = folderItems.New }; - result.Current = await _folderDtoHelper.GetAsync(folderItems.FolderInfo); result.Count = result.Files.Count + result.Folders.Count; - result.Total = folderItems.Total; - result.New = folderItems.New; return result; async ValueTask, bool>>> GetFoldersIntWithRightsAsync() { - var ids = folderItems.Entries.OfType>().Select(r => r.ParentId).Distinct(); + var ids = folderItems.Entries.OfType>().Select(r => r.ParentId).Distinct().ToList(); if (ids.Any()) { var folderDao = _daoFactory.GetFolderDao(); @@ -148,6 +120,40 @@ public class FolderContentDtoHelper return new List, bool>>(); } + + async IAsyncEnumerable GetFilesDto() + { + var fileEntries = folderItems.Entries.Where(r => r.FileEntryType == FileEntryType.File); + foreach (var r in fileEntries) + { + if (r is File fol1) + { + yield return await _fileDtoHelper.GetAsync(fol1, foldersIntWithRights); + } + + if (r is File fol2) + { + yield return await _fileDtoHelper.GetAsync(fol2, foldersStringWithRights); + } + } + } + + async IAsyncEnumerable GetFoldersDto() + { + var folderEntries = folderItems.Entries.Where(r => r.FileEntryType == FileEntryType.Folder); + + foreach (var r in folderEntries) + { + if (r is Folder fol1) + { + yield return await _folderDtoHelper.GetAsync(fol1, foldersIntWithRights); + } + else if (r is Folder fol2) + { + yield return await _folderDtoHelper.GetAsync(fol2, foldersStringWithRights); + } + } + } } } @@ -205,32 +211,37 @@ public class FileEntryWrapperConverter : System.Text.Json.Serialization.JsonConv public override void Write(Utf8JsonWriter writer, FileEntryDto value, JsonSerializerOptions options) { - if (value is FolderDto f1) + if (value.EntryType == FileEntryType.Folder) { - JsonSerializer.Serialize(writer, f1, typeof(FolderDto), options); + if (value is FolderDto f1) + { + JsonSerializer.Serialize(writer, f1, typeof(FolderDto), options); - return; + return; + } + + if (value is FolderDto f2) + { + JsonSerializer.Serialize(writer, f2, typeof(FolderDto), options); + + return; + } } - - if (value is FolderDto f2) + else { - JsonSerializer.Serialize(writer, f2, typeof(FolderDto), options); + if (value is FileDto f3) + { + JsonSerializer.Serialize(writer, f3, typeof(FileDto), options); - return; - } + return; + } - if (value is FileDto f3) - { - JsonSerializer.Serialize(writer, f3, typeof(FileDto), options); + if (value is FileDto f4) + { + JsonSerializer.Serialize(writer, f4, typeof(FileDto), options); - return; - } - - if (value is FileDto f4) - { - JsonSerializer.Serialize(writer, f4, typeof(FileDto), options); - - return; + return; + } } JsonSerializer.Serialize(writer, value, options); diff --git a/products/ASC.Files/Core/ApiModels/ResponseDto/FolderDto.cs b/products/ASC.Files/Core/ApiModels/ResponseDto/FolderDto.cs index 6d13466002..34078d654b 100644 --- a/products/ASC.Files/Core/ApiModels/ResponseDto/FolderDto.cs +++ b/products/ASC.Files/Core/ApiModels/ResponseDto/FolderDto.cs @@ -37,7 +37,7 @@ public class FolderDto : FileEntryDto public IEnumerable Tags { get; set; } public Logo Logo { get; set; } public bool Pinned { get; set; } - + protected internal override FileEntryType EntryType { get => FileEntryType.Folder; } public FolderDto() { } public static FolderDto GetSample() @@ -77,7 +77,7 @@ public class FolderDtoHelper : FileEntryDtoHelper IDaoFactory daoFactory, FileSecurity fileSecurity, GlobalFolderHelper globalFolderHelper, - FileSharingHelper fileSharingHelper, + FileSharingHelper fileSharingHelper, RoomLogoManager roomLogoManager) : base(apiDateTimeHelper, employeeWrapperHelper, fileSharingHelper, fileSecurity) {