public List <MailUserFolderData> GetList(List <uint> ids = null, uint?parentId = null) { using (var daoFactory = new DaoFactory()) { var userFolderDao = daoFactory.CreateUserFolderDao(Tenant, User); var builder = SimpleUserFoldersExp.CreateBuilder(Tenant, User); if (ids != null && ids.Any()) { builder.SetIds(ids); } if (parentId.HasValue) { builder.SetParent(parentId.Value); } var exp = builder.Build(); var userFolderDataList = userFolderDao.GetList(exp) .ConvertAll(ToMailUserFolderData); return(userFolderDataList); } }
private bool IsFolderNameAlreadyExists(IUserFolderDao userFolderDao, UserFolder newUserFolder) { //Find folder sub-folders var exp = SimpleUserFoldersExp.CreateBuilder(Tenant, User) .SetParent(newUserFolder.ParentId) .Build(); var listExistinFolders = userFolderDao.GetList(exp); return(listExistinFolders.Any(existinFolder => existinFolder.Name.Equals(newUserFolder.Name, StringComparison.InvariantCultureIgnoreCase))); }
private bool CanMoveFolderTo(IUserFolderDao userFolderDao, UserFolder newUserFolder) { //Find folder sub-folders var exp = SimpleUserFoldersExp.CreateBuilder(Tenant, User) .SetParent(newUserFolder.Id) .SetIds(new List <uint> { newUserFolder.ParentId }) .Build(); var listExistinFolders = userFolderDao.GetList(exp); return(!listExistinFolders.Any()); }
public void RecalculateFolders(Action <MailOperationRecalculateMailboxProgress> callback = null) { using (var db = new DbManager(Defines.CONNECTION_STRING_NAME, Defines.RecalculateFoldersTimeout)) { var daoFactory = new DaoFactory(db); var daoFolder = daoFactory.CreateFolderDao(Tenant, User); using (var tx = db.BeginTransaction(IsolationLevel.ReadUncommitted)) { var folderTypes = Enum.GetValues(typeof(FolderType)).Cast <int>(); var daoMailInfo = daoFactory.CreateMailInfoDao(Tenant, User); if (callback != null) { callback(MailOperationRecalculateMailboxProgress.CountUnreadMessages); } var unreadMessagesCountByFolder = daoMailInfo.GetMailCount( SimpleMessagesExp.CreateBuilder(Tenant, User) .SetUnread(true) .Build()); if (callback != null) { callback(MailOperationRecalculateMailboxProgress.CountTotalMessages); } var totalMessagesCountByFolder = daoMailInfo.GetMailCount( SimpleMessagesExp.CreateBuilder(Tenant, User) .Build()); var daoChain = daoFactory.CreateChainDao(Tenant, User); if (callback != null) { callback(MailOperationRecalculateMailboxProgress.CountUreadConversation); } var unreadConversationsCountByFolder = daoChain.GetChainCount( SimpleConversationsExp.CreateBuilder(Tenant, User) .SetUnread(true) .Build()); if (callback != null) { callback(MailOperationRecalculateMailboxProgress.CountTotalConversation); } var totalConversationsCountByFolder = daoChain.GetChainCount( SimpleConversationsExp.CreateBuilder(Tenant, User) .Build()); if (callback != null) { callback(MailOperationRecalculateMailboxProgress.UpdateFoldersCounters); } var now = DateTime.UtcNow; var folders = (from folderId in folderTypes let unreadMessCount = unreadMessagesCountByFolder.ContainsKey(folderId) ? unreadMessagesCountByFolder[folderId] : 0 let totalMessCount = totalMessagesCountByFolder.ContainsKey(folderId) ? totalMessagesCountByFolder[folderId] : 0 let unreadConvCount = unreadConversationsCountByFolder.ContainsKey(folderId) ? unreadConversationsCountByFolder[folderId] : 0 let totalConvCount = totalConversationsCountByFolder.ContainsKey(folderId) ? totalConversationsCountByFolder[folderId] : 0 select new Folder { FolderType = (FolderType)folderId, Tenant = Tenant, UserId = User, UnreadCount = unreadMessCount, UnreadChainCount = unreadConvCount, TotalCount = totalMessCount, TotalChainCount = totalConvCount, TimeModified = now }) .ToList(); foreach (var folder in folders) { daoFolder.Save(folder); } var userFolder = folders.FirstOrDefault(f => f.FolderType == FolderType.UserFolder); if (userFolder != null) { var daoUserFolder = daoFactory.CreateUserFolderDao(Tenant, User); var userFolders = daoUserFolder.GetList( SimpleUserFoldersExp.CreateBuilder(Tenant, User) .Build()); if (userFolders.Any()) { var totalMessagesCountByUserFolder = daoMailInfo.GetMailUserFolderCount(); if (callback != null) { callback(MailOperationRecalculateMailboxProgress.CountTotalUserFolderMessages); } var unreadMessagesCountByUserFolder = daoMailInfo.GetMailUserFolderCount(true); if (callback != null) { callback(MailOperationRecalculateMailboxProgress.CountUnreadUserFolderMessages); } var totalConversationsCountByUserFolder = daoChain.GetChainUserFolderCount(); if (callback != null) { callback(MailOperationRecalculateMailboxProgress.CountTotalUserFolderConversation); } var unreadConversationsCountByUserFolder = daoChain.GetChainUserFolderCount(true); if (callback != null) { callback(MailOperationRecalculateMailboxProgress.CountUreadUserFolderConversation); } var newUserFolders = (from folder in userFolders let unreadMessCount = unreadMessagesCountByUserFolder.ContainsKey(folder.Id) ? unreadMessagesCountByUserFolder[folder.Id] : 0 let totalMessCount = totalMessagesCountByUserFolder.ContainsKey(folder.Id) ? totalMessagesCountByUserFolder[folder.Id] : 0 let unreadConvCount = unreadConversationsCountByUserFolder.ContainsKey(folder.Id) ? unreadConversationsCountByUserFolder[folder.Id] : 0 let totalConvCount = totalConversationsCountByUserFolder.ContainsKey(folder.Id) ? totalConversationsCountByUserFolder[folder.Id] : 0 select new UserFolder { Id = folder.Id, ParentId = folder.ParentId, Name = folder.Name, FolderCount = folder.FolderCount, Tenant = Tenant, User = User, UnreadCount = unreadMessCount, UnreadChainCount = unreadConvCount, TotalCount = totalMessCount, TotalChainCount = totalConvCount, TimeModified = now }) .ToList(); if (callback != null) { callback(MailOperationRecalculateMailboxProgress.UpdateUserFoldersCounters); } foreach (var folder in newUserFolders) { daoUserFolder.Save(folder); } } } tx.Commit(); } } }
public void Delete(uint folderId) { var affectedIds = new List <int>(); using (var db = new DbManager(Defines.CONNECTION_STRING_NAME, Defines.RecalculateFoldersTimeout)) { var daoFactory = new DaoFactory(db); var userFolderXmailDao = daoFactory.CreateUserFolderXMailDao(Tenant, User); var userFolderTreeDao = daoFactory.CreateUserFolderTreeDao(Tenant, User); var userFolderDao = daoFactory.CreateUserFolderDao(Tenant, User); var folder = userFolderDao.Get(folderId); if (folder == null) { return; } using (var tx = daoFactory.DbManager.BeginTransaction(IsolationLevel.ReadUncommitted)) { //Find folder sub-folders var expTree = SimpleUserFoldersTreeExp.CreateBuilder() .SetParent(folder.Id) .Build(); var removeFolderIds = userFolderTreeDao.Get(expTree) .ConvertAll(f => f.FolderId); if (!removeFolderIds.Contains(folderId)) { removeFolderIds.Add(folderId); } //Remove folder with subfolders var expFolders = SimpleUserFoldersExp.CreateBuilder(Tenant, User) .SetIds(removeFolderIds) .Build(); userFolderDao.Remove(expFolders); //Remove folder tree info expTree = SimpleUserFoldersTreeExp.CreateBuilder() .SetIds(removeFolderIds) .Build(); userFolderTreeDao.Remove(expTree); //Move mails to trash foreach (var id in removeFolderIds) { var listMailIds = userFolderXmailDao.GetMailIds(id); if (!listMailIds.Any()) { continue; } affectedIds.AddRange(listMailIds); //Move mails to trash Factory.MessageEngine.SetFolder(daoFactory, listMailIds, FolderType.Trash); //Remove listMailIds from 'mail_user_folder_x_mail' userFolderXmailDao.Remove(listMailIds); } tx.Commit(); } userFolderDao.RecalculateFoldersCount(folder.ParentId); } if (!FactoryIndexer <MailWrapper> .Support || !affectedIds.Any()) { return; } var data = new MailWrapper { Folder = (byte)FolderType.Trash }; Factory.IndexEngine.Update(data, s => s.In(m => m.Id, affectedIds.ToArray()), wrapper => wrapper.Unread); }