diff --git a/products/ASC.Files/Core/Core/Dao/TeamlabDao/TagDao.cs b/products/ASC.Files/Core/Core/Dao/TeamlabDao/TagDao.cs index 3593036be1..b65e1237b6 100644 --- a/products/ASC.Files/Core/Core/Dao/TeamlabDao/TagDao.cs +++ b/products/ASC.Files/Core/Core/Dao/TeamlabDao/TagDao.cs @@ -659,7 +659,7 @@ namespace ASC.Files.Core.Data result.AddRange(tempTags); } - var monitorFolderIdsInt = monitorFolderIds.Select(r => Convert.ToInt32(r)).ToList(); + var monitorFolderIdsInt = monitorFolderIds.OfType().ToList(); var subFoldersSqlQuery = FilesDbContext.Tree .Where(r => monitorFolderIdsInt.Contains(r.ParentId)); diff --git a/products/ASC.Files/Core/Utils/FileMarker.cs b/products/ASC.Files/Core/Utils/FileMarker.cs index cf1f2476f2..9e632af428 100644 --- a/products/ASC.Files/Core/Utils/FileMarker.cs +++ b/products/ASC.Files/Core/Utils/FileMarker.cs @@ -361,13 +361,14 @@ namespace ASC.Web.Files.Utils if (fileEntry == null) return; var tagDao = DaoFactory.GetTagDao(); + var internalFolderDao = DaoFactory.GetFolderDao(); var folderDao = DaoFactory.GetFolderDao(); if (!tagDao.GetNewTags(userID, fileEntry).Any()) return; T folderID; int valueNew; - var userFolderId = folderDao.GetFolderIDUser(false, userID); - var privacyFolderId = folderDao.GetFolderIDPrivacy(false, userID); + var userFolderId = internalFolderDao.GetFolderIDUser(false, userID); + var privacyFolderId = internalFolderDao.GetFolderIDPrivacy(false, userID); var removeTags = new List(); @@ -406,21 +407,21 @@ namespace ASC.Web.Files.Utils parentFolders.Reverse(); var rootFolder = parentFolders.LastOrDefault(); - T rootFolderId = default; - T cacheFolderId = default; + int rootFolderId = default; + int cacheFolderId = default; if (rootFolder == null) { } else if (rootFolder.RootFolderType == FolderType.BUNCH) { - cacheFolderId = rootFolderId = GlobalFolder.GetFolderProjects(DaoFactory); + cacheFolderId = rootFolderId = GlobalFolder.GetFolderProjects(DaoFactory); } else if (rootFolder.RootFolderType == FolderType.COMMON) { if (rootFolder.ProviderEntry) - cacheFolderId = rootFolderId = GlobalFolder.GetFolderCommon(this, DaoFactory); + cacheFolderId = rootFolderId = GlobalFolder.GetFolderCommon(this, DaoFactory); else - cacheFolderId = GlobalFolder.GetFolderCommon(this, DaoFactory); + cacheFolderId = GlobalFolder.GetFolderCommon(this, DaoFactory); } else if (rootFolder.RootFolderType == FolderType.USER) { @@ -428,7 +429,7 @@ namespace ASC.Web.Files.Utils cacheFolderId = rootFolderId = userFolderId; else if (!rootFolder.ProviderEntry && !Equals(rootFolder.RootFolderId, userFolderId) || rootFolder.ProviderEntry && rootFolder.RootFolderCreator != userID) - cacheFolderId = rootFolderId = GlobalFolder.GetFolderShare(DaoFactory); + cacheFolderId = rootFolderId = GlobalFolder.GetFolderShare(DaoFactory); else cacheFolderId = userFolderId; } @@ -441,22 +442,35 @@ namespace ASC.Web.Files.Utils } else if (rootFolder.RootFolderType == FolderType.SHARE) { - cacheFolderId = GlobalFolder.GetFolderShare(DaoFactory); - } + cacheFolderId = GlobalFolder.GetFolderShare(DaoFactory); + } + + var updateTags = new List(); if (!rootFolderId.Equals(default(T))) - { - parentFolders.Add(folderDao.GetFolder(rootFolderId)); - } + { + UpdateRemoveTags(internalFolderDao.GetFolder(rootFolderId)); + } + if (!cacheFolderId.Equals(default(T))) { RemoveFromCahce(cacheFolderId, userID); } - var updateTags = new List(); foreach (var parentFolder in parentFolders) - { - var parentTag = tagDao.GetNewTags(userID, parentFolder).FirstOrDefault(); + { + UpdateRemoveTags(parentFolder); + } + + if (updateTags.Any()) + tagDao.UpdateNewTags(updateTags); + if (removeTags.Any()) + tagDao.RemoveTags(removeTags); + + void UpdateRemoveTags(Folder folder) + { + var tagDao = DaoFactory.GetTagDao(); + var parentTag = tagDao.GetNewTags(userID, folder).FirstOrDefault(); if (parentTag != null) { @@ -470,13 +484,8 @@ namespace ASC.Web.Files.Utils { removeTags.Add(parentTag); } - } + } } - - if (updateTags.Any()) - tagDao.UpdateNewTags(updateTags); - if (removeTags.Any()) - tagDao.RemoveTags(removeTags); } public void RemoveMarkAsNewForAll(FileEntry fileEntry) @@ -521,33 +530,108 @@ namespace ASC.Web.Files.Utils if (!FileSecurity.CanRead(folder)) throw new SecurityException(FilesCommonResource.ErrorMassage_SecurityException_ViewFolder); if (folder.RootFolderType == FolderType.TRASH && !Equals(folder.ID, GlobalFolder.GetFolderTrash(DaoFactory))) throw new SecurityException(FilesCommonResource.ErrorMassage_ViewTrashItem); - var entryTags = new Dictionary, Tag>(); - var tagDao = DaoFactory.GetTagDao(); var fileDao = DaoFactory.GetFileDao(); - var folderDao = DaoFactory.GetFolderDao(); + var folderDao = DaoFactory.GetFolderDao(); + var providerFolderDao = DaoFactory.GetFolderDao(); + var providerTagDao = DaoFactory.GetTagDao(); var tags = (tagDao.GetNewTags(AuthContext.CurrentAccount.ID, folder, true) ?? new List()).ToList(); if (!tags.Any()) return new List(); - if (Equals(folder.ID, GlobalFolder.GetFolderMy(this, DaoFactory)) || Equals(folder.ID, GlobalFolder.GetFolderCommon(this, DaoFactory)) || Equals(folder.ID, GlobalFolder.GetFolderShare(DaoFactory))) + if (Equals(folder.ID, GlobalFolder.GetFolderMy(this, DaoFactory)) || + Equals(folder.ID, GlobalFolder.GetFolderCommon(this, DaoFactory)) || + Equals(folder.ID, GlobalFolder.GetFolderShare(DaoFactory))) { - var folderTags = tags.Where(tag => tag.EntryType == FileEntryType.Folder); + var folderTags = tags.Where(tag => tag.EntryType == FileEntryType.Folder && tag.EntryId.GetType() == typeof(string)); + + var providerFolderTags = folderTags + .Select(tag => new KeyValuePair>(tag, providerFolderDao.GetFolder(tag.EntryId.ToString()))) + .Where(pair => pair.Value != null && pair.Value.ProviderEntry) + .ToList(); - var providerFolderTags = folderTags.Select(tag => new KeyValuePair>(tag, folderDao.GetFolder((T)Convert.ChangeType(tag.EntryId, typeof(T))))) - .Where(pair => pair.Value != null && pair.Value.ProviderEntry).ToList(); providerFolderTags.Reverse(); foreach (var providerFolderTag in providerFolderTags) { - tags.AddRange(tagDao.GetNewTags(AuthContext.CurrentAccount.ID, providerFolderTag.Value, true)); + tags.AddRange(providerTagDao.GetNewTags(AuthContext.CurrentAccount.ID, providerFolderTag.Value, true)); } } - tags = tags.Distinct().ToList(); - tags.RemoveAll(tag => Equals(tag.EntryId, folder.ID)); - tags = tags.Where(t => t.EntryType == FileEntryType.Folder) - .Concat(tags.Where(t => t.EntryType == FileEntryType.File)).ToList(); + tags = tags + .Where(r => !Equals(r.EntryId, folder.ID)) + .Distinct() + .ToList(); + + //TODO: refactoring + var entryTagsProvider = GetEntryTags(tags.Where(r=> r.EntryId.GetType() == typeof(string))); + var entryTagsInternal = GetEntryTags(tags.Where(r=> r.EntryId.GetType() == typeof(int))); + + foreach (var entryTag in entryTagsInternal) + { + var parentEntry = entryTagsInternal.Keys + .FirstOrDefault(entryCountTag => Equals(entryCountTag.ID, entryTag.Key.FolderID)); + + if (parentEntry != null) + { + entryTagsInternal[parentEntry].Count -= entryTag.Value.Count; + } + } + + foreach (var entryTag in entryTagsProvider) + { + if (int.TryParse(entryTag.Key.FolderID, out var fId)) + { + var parentEntryInt = entryTagsInternal.Keys + .FirstOrDefault(entryCountTag => Equals(entryCountTag.ID, fId)); + + if (parentEntryInt != null) + { + entryTagsInternal[parentEntryInt].Count -= entryTag.Value.Count; + } + + continue; + } + + var parentEntry = entryTagsProvider.Keys + .FirstOrDefault(entryCountTag => Equals(entryCountTag.ID, entryTag.Key.FolderID)); + + if (parentEntry != null) + { + entryTagsProvider[parentEntry].Count -= entryTag.Value.Count; + } + } + + var result = new List(); + + GetResult(entryTagsInternal); + GetResult(entryTagsProvider); + + return result; + + void GetResult(Dictionary, Tag> entryTags) + { + foreach (var entryTag in entryTags) + { + if (!string.IsNullOrEmpty(entryTag.Key.Error)) + { + RemoveMarkAsNew(entryTag.Key); + continue; + } + + if (entryTag.Value.Count > 0) + { + result.Add(entryTag.Key); + } + } + } + } + + private Dictionary, Tag> GetEntryTags(IEnumerable tags) + { + var fileDao = DaoFactory.GetFileDao(); + var folderDao = DaoFactory.GetFolderDao(); + var entryTags = new Dictionary, Tag>(); foreach (var tag in tags) { @@ -562,38 +646,11 @@ namespace ASC.Web.Files.Utils { //todo: RemoveMarkAsNew(tag); } - } - - foreach (var entryTag in entryTags) - { - var entry = entryTag.Key; - var parentId = - entry.FileEntryType == FileEntryType.File - ? ((File)entry).FolderID - : ((Folder)entry).FolderID; - - var parentEntry = entryTags.Keys.FirstOrDefault(entryCountTag => Equals(entryCountTag.ID, parentId)); - if (parentEntry != null) - entryTags[parentEntry].Count -= entryTag.Value.Count; - } - - var result = new List(); - - foreach (var entryTag in entryTags) - { - if (!string.IsNullOrEmpty(entryTag.Key.Error)) - { - RemoveMarkAsNew(entryTag.Key); - continue; - } - - if (entryTag.Value.Count > 0) - { - result.Add(entryTag.Key); - } - } - return result; - } + } + + return entryTags; + } + public IEnumerable SetTagsNew(Folder parent, IEnumerable entries) {