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());
        }
Exemple #4
0
        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);
        }