diff --git a/products/ASC.Files/Core/Core/Dao/TeamlabDao/AbstractDao.cs b/products/ASC.Files/Core/Core/Dao/TeamlabDao/AbstractDao.cs index 981b1c9204..9b0ea66302 100644 --- a/products/ASC.Files/Core/Core/Dao/TeamlabDao/AbstractDao.cs +++ b/products/ASC.Files/Core/Core/Dao/TeamlabDao/AbstractDao.cs @@ -99,12 +99,12 @@ public class AbstractDao return set.AsQueryable().Where(r => r.TenantId == tenantId); } - protected internal IQueryable GetFileQuery(Expression> where) + protected internal IQueryable GetFileQuery(Expression> where, FilesDbContext filesDbContext = null) { - using var FilesDbContext = DbContextManager.GetNew(FileConstant.DatabaseId); - - return Query(FilesDbContext.Files) + var query = Query(filesDbContext.Files) .Where(where); + + return query; } protected async Task GetRecalculateFilesCountUpdateAsync(int folderId) diff --git a/products/ASC.Files/Core/Core/Dao/TeamlabDao/FileDao.cs b/products/ASC.Files/Core/Core/Dao/TeamlabDao/FileDao.cs index 10b16a59e7..23e21908cb 100644 --- a/products/ASC.Files/Core/Core/Dao/TeamlabDao/FileDao.cs +++ b/products/ASC.Files/Core/Core/Dao/TeamlabDao/FileDao.cs @@ -131,8 +131,7 @@ internal class FileDao : AbstractDao, IFileDao private async Task> InternalGetFileAsync(int parentId, string title) { - var query = GetFileQuery(r => r.Title == title && r.CurrentVersion && r.ParentId == parentId) - .AsNoTracking() + var query = GetFileQuery(r => r.Title == title && r.CurrentVersion && r.ParentId == parentId).AsNoTracking() .OrderBy(r => r.CreateOn); var dbFile = await FromQueryWithShared(query).FirstOrDefaultAsync().ConfigureAwait(false); @@ -142,8 +141,7 @@ internal class FileDao : AbstractDao, IFileDao public async Task> GetFileStableAsync(int fileId, int fileVersion = -1) { - var query = GetFileQuery(r => r.Id == fileId && r.Forcesave == ForcesaveType.None) - .AsNoTracking(); + var query = GetFileQuery(r => r.Id == fileId && r.Forcesave == ForcesaveType.None).AsNoTracking(); if (fileVersion >= 0) { @@ -172,8 +170,7 @@ internal class FileDao : AbstractDao, IFileDao return AsyncEnumerable.Empty>(); } - var query = GetFileQuery(r => fileIds.Contains(r.Id) && r.CurrentVersion) - .AsNoTracking(); + var query = GetFileQuery(r => fileIds.Contains(r.Id) && r.CurrentVersion).AsNoTracking(); return FromQueryWithShared(query).AsAsyncEnumerable() .Select(e => _mapper.Map>(e)); @@ -251,7 +248,6 @@ internal class FileDao : AbstractDao, IFileDao public IAsyncEnumerable> GetFilesAsync(int parentId, OrderBy orderBy, FilterType filterType, bool subjectGroup, Guid subjectID, string searchText, bool searchInContent, bool withSubfolders = false) { - using var FilesDbContext = DbContextManager.GetNew(FileConstant.DatabaseId); if (filterType == FilterType.FoldersOnly) { @@ -263,14 +259,16 @@ internal class FileDao : AbstractDao, IFileDao orderBy = new OrderBy(SortedByType.DateAndTime, false); } - var q = GetFileQuery(r => r.ParentId == parentId && r.CurrentVersion).AsNoTracking(); + var filesDbContext = DbContextManager.GetNew(FileConstant.DatabaseId); + + var q = GetFileQuery(r => r.ParentId == parentId && r.CurrentVersion, filesDbContext).AsNoTracking(); if (withSubfolders) { - q = GetFileQuery(r => r.CurrentVersion) + q= GetFileQuery(r => r.CurrentVersion, filesDbContext) .AsNoTracking() - .Join(FilesDbContext.Tree, r => r.ParentId, a => a.FolderId, (file, tree) => new { file, tree }) + .Join(filesDbContext.Tree, r => r.ParentId, a => a.FolderId, (file, tree) => new { file, tree }) .Where(r => r.tree.ParentId == parentId) .Select(r => r.file); } @@ -331,7 +329,7 @@ internal class FileDao : AbstractDao, IFileDao break; } - return FromQueryWithShared(q).AsAsyncEnumerable() + return FromQueryWithShared(q, filesDbContext).AsAsyncEnumerable() .Select(_mapper.Map>); } @@ -1550,19 +1548,17 @@ internal class FileDao : AbstractDao, IFileDao }; } - protected IQueryable FromQueryWithShared(IQueryable dbFiles) + protected IQueryable FromQueryWithShared(IQueryable dbFiles, FilesDbContext filesDbContext = null) { var cId = _authContext.CurrentAccount.ID; - using var FilesDbContext = DbContextManager.GetNew(FileConstant.DatabaseId); - return from r in dbFiles select new DbFileQuery { File = r, - Root = (from f in FilesDbContext.Folders.AsQueryable() + Root = (from f in filesDbContext.Folders.AsQueryable() where f.Id == - (from t in FilesDbContext.Tree.AsQueryable() + (from t in filesDbContext.Tree.AsQueryable() where t.FolderId == r.ParentId orderby t.Level descending select t.ParentId @@ -1570,11 +1566,11 @@ internal class FileDao : AbstractDao, IFileDao where f.TenantId == r.TenantId select f ).FirstOrDefault(), - Shared = (from f in FilesDbContext.Security.AsQueryable() + Shared = (from f in filesDbContext.Security.AsQueryable() where f.EntryType == FileEntryType.File && f.EntryId == r.Id.ToString() && f.TenantId == r.TenantId select f ).Any(), - IsFillFormDraft = (from f in FilesDbContext.FilesLink + IsFillFormDraft = (from f in filesDbContext.FilesLink where f.TenantId == r.TenantId && f.LinkedId == r.Id.ToString() && f.LinkedFor == cId select f) .Any() @@ -1585,7 +1581,7 @@ internal class FileDao : AbstractDao, IFileDao { var cId = _authContext.CurrentAccount.ID; - using var FilesDbContext = DbContextManager.GetNew(FileConstant.DatabaseId); + var FilesDbContext = DbContextManager.GetNew(FileConstant.DatabaseId); return dbFiles .Select(r => new DbFileQuery diff --git a/products/ASC.Files/Core/Core/Dao/TeamlabDao/FolderDao.cs b/products/ASC.Files/Core/Core/Dao/TeamlabDao/FolderDao.cs index 73b05c42d0..802204ba74 100644 --- a/products/ASC.Files/Core/Core/Dao/TeamlabDao/FolderDao.cs +++ b/products/ASC.Files/Core/Core/Dao/TeamlabDao/FolderDao.cs @@ -91,9 +91,11 @@ internal class FolderDao : AbstractDao, IFolderDao public async Task> GetFolderAsync(int folderId) { - var query = GetFolderQuery(r => r.Id == folderId).AsNoTracking(); + using var filesDbContext = DbContextManager.GetNew(FileConstant.DatabaseId); - var dbFolder = await FromQueryWithShared(query).Take(1).SingleOrDefaultAsync().ConfigureAwait(false); + var query = GetFolderQuery(r => r.Id == folderId, filesDbContext).AsNoTracking(); + + var dbFolder = await FromQueryWithShared(query, filesDbContext).Take(1).SingleOrDefaultAsync().ConfigureAwait(false); return _mapper.Map>(dbFolder); } @@ -176,16 +178,16 @@ internal class FolderDao : AbstractDao, IFolderDao orderBy = new OrderBy(SortedByType.DateAndTime, false); } - var q = GetFolderQuery(r => r.ParentId == parentId).AsNoTracking(); + var filesDbContext = DbContextManager.GetNew(FileConstant.DatabaseId); - using var FilesDbContext = DbContextManager.GetNew(FileConstant.DatabaseId); + var q = GetFolderQuery(r => r.ParentId == parentId, filesDbContext).AsNoTracking(); if (withSubfolders) { - q = GetFolderQuery().AsNoTracking() - .Join(FilesDbContext.Tree, r => r.Id, a => a.FolderId, (folder, tree) => new { folder, tree }) - .Where(r => r.tree.ParentId == parentId && r.tree.Level != 0) - .Select(r => r.folder); + q = GetFolderQuery(null, filesDbContext).AsNoTracking() + .Join(FilesDbContext.Tree, r => r.Id, a => a.FolderId, (folder, tree) => new { folder, tree }) + .Where(r => r.tree.ParentId == parentId && r.tree.Level != 0) + .Select(r => r.folder); } if (!string.IsNullOrEmpty(searchText)) @@ -221,7 +223,7 @@ internal class FolderDao : AbstractDao, IFolderDao } } - var dbFolders = FromQueryWithShared(q).AsAsyncEnumerable(); + var dbFolders = FromQueryWithShared(q, filesDbContext).AsAsyncEnumerable(); return dbFolders.Select(_mapper.Map>); } @@ -236,13 +238,13 @@ internal class FolderDao : AbstractDao, IFolderDao return AsyncEnumerable.Empty>(); } - var q = GetFolderQuery(r => folderIds.Contains(r.Id)).AsNoTracking(); + var FilesDbContext = DbContextManager.GetNew(FileConstant.DatabaseId); - using var FilesDbContext = DbContextManager.GetNew(FileConstant.DatabaseId); + var q = GetFolderQuery(r => folderIds.Contains(r.Id), FilesDbContext).AsNoTracking(); if (searchSubfolders) { - q = GetFolderQuery() + q = GetFolderQuery(null, FilesDbContext) .AsNoTracking() .Join(FilesDbContext.Tree, r => r.Id, a => a.FolderId, (folder, tree) => new { folder, tree }) .Where(r => folderIds.Contains(r.tree.ParentId)) @@ -279,23 +281,23 @@ internal class FolderDao : AbstractDao, IFolderDao } } - var dbFolders = (checkShare ? FromQueryWithShared(q) : FromQuery(q)).AsAsyncEnumerable(); + var dbFolders = (checkShare ? FromQueryWithShared(q, FilesDbContext) : FromQuery(q, FilesDbContext)).AsAsyncEnumerable(); return dbFolders.Select(_mapper.Map>).Distinct(); } public async Task>> GetParentFoldersAsync(int folderId) { - using var FilesDbContext = DbContextManager.GetNew(FileConstant.DatabaseId); + using var filesDbContext = DbContextManager.GetNew(FileConstant.DatabaseId); - var q = GetFolderQuery() + var q = GetFolderQuery(null, filesDbContext) .AsNoTracking() - .Join(FilesDbContext.Tree, r => r.Id, a => a.ParentId, (folder, tree) => new { folder, tree }) + .Join(filesDbContext.Tree, r => r.Id, a => a.ParentId, (folder, tree) => new { folder, tree }) .Where(r => r.tree.FolderId == folderId) .OrderByDescending(r => r.tree.Level) .Select(r => r.folder); - var query = await FromQueryWithShared(q).ToListAsync().ConfigureAwait(false); + var query = await FromQueryWithShared(q, filesDbContext).ToListAsync().ConfigureAwait(false); return _mapper.Map, List>>(query); } @@ -1161,11 +1163,9 @@ internal class FolderDao : AbstractDao, IFolderDao #endregion - protected internal IQueryable GetFolderQuery(Expression> where = null) + protected internal IQueryable GetFolderQuery(Expression> where = null, FilesDbContext filesDbContext = null) { - using var FilesDbContext = DbContextManager.GetNew(FileConstant.DatabaseId); - - var q = Query(FilesDbContext.Folders); + var q = Query(filesDbContext.Folders); if (where != null) { q = q.Where(where); @@ -1174,9 +1174,9 @@ internal class FolderDao : AbstractDao, IFolderDao return q; } - protected IQueryable FromQueryWithShared(IQueryable dbFiles) + protected IQueryable FromQueryWithShared(IQueryable dbFiles, FilesDbContext filesDbContext = null) { - using var FilesDbContext = DbContextManager.GetNew(FileConstant.DatabaseId); + var FilesDbContext = filesDbContext ?? base.FilesDbContext; var e = from r in dbFiles select new DbFolderQuery @@ -1201,9 +1201,9 @@ internal class FolderDao : AbstractDao, IFolderDao return e; } - protected IQueryable FromQuery(IQueryable dbFiles) + protected IQueryable FromQuery(IQueryable dbFiles, FilesDbContext filesDbContext = null) { - using var FilesDbContext = DbContextManager.GetNew(FileConstant.DatabaseId); + var FilesDbContext = filesDbContext; return dbFiles .Select(r => new DbFolderQuery diff --git a/products/ASC.Files/Core/Core/Dao/TeamlabDao/SecurityDao.cs b/products/ASC.Files/Core/Core/Dao/TeamlabDao/SecurityDao.cs index 956c8b680c..6972e0d4ec 100644 --- a/products/ASC.Files/Core/Core/Dao/TeamlabDao/SecurityDao.cs +++ b/products/ASC.Files/Core/Core/Dao/TeamlabDao/SecurityDao.cs @@ -389,7 +389,7 @@ internal class SecurityDao : AbstractDao, ISecurityDao private IQueryable GetQuery(Expression> where = null) { - using var FilesDbContext = DbContextManager.GetNew(FileConstant.DatabaseId); + var FilesDbContext = DbContextManager.GetNew(FileConstant.DatabaseId); var q = Query(FilesDbContext.Security); if (q != null) diff --git a/products/ASC.Files/Core/Utils/EntryManager.cs b/products/ASC.Files/Core/Utils/EntryManager.cs index 21762989f9..e5522ab84f 100644 --- a/products/ASC.Files/Core/Utils/EntryManager.cs +++ b/products/ASC.Files/Core/Utils/EntryManager.cs @@ -497,11 +497,14 @@ public class EntryManager { var folderDao = _daoFactory.GetFolderDao(); var fileDao = _daoFactory.GetFileDao(); - var folders = await folderDao.GetFoldersAsync(parent.Id, orderBy, filter, subjectGroup, subjectId, searchText, withSubfolders).ToListAsync(); - entries = entries.Concat(await fileSecurity.FilterReadAsync(folders)); - var files = await fileDao.GetFilesAsync(parent.Id, orderBy, filter, subjectGroup, subjectId, searchText, searchInContent, withSubfolders).ToListAsync(); - entries = entries.Concat(await fileSecurity.FilterReadAsync(files)); + var folders = folderDao.GetFoldersAsync(parent.Id, orderBy, filter, subjectGroup, subjectId, searchText, withSubfolders).ToListAsync(); + + entries = entries.Concat(await fileSecurity.FilterReadAsync(await folders)); + + var files = fileDao.GetFilesAsync(parent.Id, orderBy, filter, subjectGroup, subjectId, searchText, searchInContent, withSubfolders).ToListAsync(); + + entries = entries.Concat(await fileSecurity.FilterReadAsync(await files)); //share var shared = await fileSecurity.GetPrivacyForMeAsync(filter, subjectGroup, subjectId, searchText, searchInContent, withSubfolders); @@ -516,12 +519,14 @@ public class EntryManager { withSubfolders = false; } - - var folders = await _daoFactory.GetFolderDao().GetFoldersAsync(parent.Id, orderBy, filter, subjectGroup, subjectId, searchText, withSubfolders).ToListAsync(); - entries = entries.Concat(await fileSecurity.FilterReadAsync(folders)); - - var files = await _daoFactory.GetFileDao().GetFilesAsync(parent.Id, orderBy, filter, subjectGroup, subjectId, searchText, searchInContent, withSubfolders).ToListAsync(); - entries = entries.Concat(await fileSecurity.FilterReadAsync(files)); + + var files = _daoFactory.GetFileDao().GetFilesAsync(parent.Id, orderBy, filter, subjectGroup, subjectId, searchText, searchInContent, withSubfolders).ToListAsync(); + var folders = _daoFactory.GetFolderDao().GetFoldersAsync(parent.Id, orderBy, filter, subjectGroup, subjectId, searchText, withSubfolders).ToListAsync(); + + + entries = entries.Concat(await fileSecurity.FilterReadAsync(await files)); + entries = entries.Concat(await fileSecurity.FilterReadAsync(await folders)); + if (filter == FilterType.None || filter == FilterType.FoldersOnly) {