public IEnumerable <MailMessage> GetFilteredMessages(int?folder, bool?unread, bool?attachments, long?period_from, long?period_to, bool?important, string from_address, string to_address, int?mailbox_id, IEnumerable <int> tags, string search, int?page, int?page_size, string sortorder, bool?with_calendar, int?user_folder_id) { var primaryFolder = user_folder_id.HasValue ? FolderType.UserFolder : folder.HasValue ? (FolderType)folder.Value : FolderType.Inbox; var filter = new MailSearchFilterData { PrimaryFolder = primaryFolder, Unread = unread, Attachments = attachments, PeriodFrom = period_from, PeriodTo = period_to, Important = important, FromAddress = from_address, ToAddress = to_address, MailboxId = mailbox_id, CustomLabels = new List <int>(tags), SearchText = search, PageSize = page_size.GetValueOrDefault(25), Sort = Defines.ORDER_BY_DATE_SENT, SortOrder = sortorder, WithCalendar = with_calendar, UserFolderId = user_folder_id }; if (page.HasValue) { filter.Page = page.Value > 0 ? page.Value - 1 : 0; } long totalMessages; var messages = MailEngineFactory.MessageEngine.GetFilteredMessages(filter, out totalMessages); _context.SetTotalCount(totalMessages); return(messages); }
public long GetPrevNextMessageId(int id, string direction, int?folder, bool?unread, bool?attachments, long?period_from, long?period_to, bool?important, string from_address, string to_address, int?mailbox_id, IEnumerable <int> tags, string search, int?page_size, string sortorder, bool?with_calendar, int?user_folder_id) { // inverse sort order if prev message require if ("prev" == direction) { sortorder = Defines.ASCENDING == sortorder ? Defines.DESCENDING : Defines.ASCENDING; } var primaryFolder = folder.HasValue ? (FolderType)folder.Value : FolderType.Inbox; var filter = new MailSearchFilterData { PrimaryFolder = primaryFolder, Unread = unread, Attachments = attachments, PeriodFrom = period_from, PeriodTo = period_to, Important = important, FromAddress = from_address, ToAddress = to_address, MailboxId = mailbox_id, CustomLabels = new List <int>(tags), SearchText = search, Page = null, PageSize = 2, Sort = Defines.ORDER_BY_DATE_SENT, SortOrder = sortorder, WithCalendar = with_calendar, UserFolderId = user_folder_id }; var nextId = MailEngineFactory.MessageEngine.GetNextFilteredMessageId(id, filter); return(nextId); }
public void ReassignMailMessages(int folder, string email) { var filter = new MailSearchFilterData { PrimaryFolder = (FolderType)folder }; if (filter.PrimaryFolder != FolderType.Draft && filter.PrimaryFolder != FolderType.Templates) { throw new InvalidOperationException("Only folders Templates and Drafts are allowed."); } long totalMessages; var messages = MailEngineFactory.MessageEngine.GetFilteredMessages(filter, out totalMessages); _context.SetTotalCount(totalMessages); for (var i = 0; i < messages.Count; i++) { var message = messages[i]; if (message.Bcc == null) { message.Bcc = ""; } var to = message.To.Split(',').ToList <string>(); var cc = message.Cc.Split(',').ToList <string>(); var bcc = message.Bcc.Split(',').ToList <string>(); if (filter.PrimaryFolder == FolderType.Draft) { MailEngineFactory.DraftEngine.Save(message.Id, email, to, cc, bcc, message.MimeReplyToId, message.Important, message.Subject, message.TagIds, message.HtmlBody, message.Attachments, message.CalendarEventIcs); } if (filter.PrimaryFolder == FolderType.Templates) { MailEngineFactory.TemplateEngine.Save(message.Id, email, to, cc, bcc, message.MimeReplyToId, message.Important, message.Subject, message.TagIds, message.HtmlBody, message.Attachments, message.CalendarEventIcs); } } }
public FilterMessagesExp(List <int> ids, int tenant, string user, MailSearchFilterData filter) { Filter = filter; Tenant = tenant; User = user; Ids = ids; StartIndex = filter.Page.HasValue ? 0 : (int?)null; if (filter.Page.HasValue && filter.Page.Value > 0 && filter.PageSize.HasValue && filter.PageSize.Value > 0) { StartIndex = filter.Page.Value * filter.PageSize; } Limit = Filter.PageSize; }
public long GetNextConversationId(int id, MailSearchFilterData filter) { using (var daoFactory = new DaoFactory()) { var daoMail = daoFactory.CreateMailDao(Tenant, User); var mail = daoMail.GetMail(new ConcreteUserMessageExp(id, Tenant, User)); if (mail == null) { return(0); } filter.FromDate = mail.ChainDate; filter.FromMessage = id; filter.PageSize = 1; bool hasMore; var messages = GetFilteredConversations(daoFactory, filter, out hasMore); return(messages.Any() ? messages.First().Id : 0); } }
public FilterMessagesExp(List <int> ids, int tenant, string user, MailSearchFilterData filter) { Filter = filter; Tenant = tenant; User = user; Ids = ids; StartIndex = filter.Page.HasValue ? 0 : (int?)null; if (filter.Page.HasValue && filter.Page.Value > 0 && filter.PageSize.HasValue && filter.PageSize.Value > 0) { StartIndex = filter.Page.Value * filter.PageSize; } Limit = Filter.PageSize; OrderAsc = string.IsNullOrEmpty(Filter.SortOrder) ? (bool?)null : Filter.SortOrder == Defines.ASCENDING; }
public static bool TryGetFullTextSearchIds(MailSearchFilterData filter, string user, out List <int> ids, out long total, DateTime?dateSend = null) { ids = new List <int>(); if (!FactoryIndexer <MailWrapper> .Support) { total = 0; return(false); } if (filter.Page.HasValue && filter.Page.Value < 0) { total = 0; return(true); } var userId = new Guid(user); Selector <MailWrapper> selector = null; if (!string.IsNullOrEmpty(filter.SearchText)) { selector = new Selector <MailWrapper>().MatchAll(filter.SearchText); } if (!string.IsNullOrEmpty(filter.FromAddress)) { Selector <MailWrapper> tempSelector; if (filter.PrimaryFolder == FolderType.Sent || filter.PrimaryFolder == FolderType.Draft) { tempSelector = new Selector <MailWrapper>().Match(s => s.ToText, filter.FromAddress); } else { tempSelector = new Selector <MailWrapper>().Match(s => s.FromText, filter.FromAddress); } if (selector != null) { selector &= tempSelector; } else { selector = tempSelector; } } if (!string.IsNullOrEmpty(filter.ToAddress)) { Selector <MailWrapper> tempSelector; if (filter.PrimaryFolder == FolderType.Sent || filter.PrimaryFolder == FolderType.Draft) { tempSelector = new Selector <MailWrapper>().Match(s => s.FromText, filter.ToAddress); } else { tempSelector = new Selector <MailWrapper>().Match(s => s.ToText, filter.ToAddress); } if (selector != null) { selector &= tempSelector; } else { selector = tempSelector; } } if (selector == null) { selector = new Selector <MailWrapper>(); } selector.Where(r => r.Folder, (int)filter.PrimaryFolder); if (filter.MailboxId.HasValue) { selector.Where(s => s.MailboxId, filter.MailboxId.Value); } if (filter.Unread.HasValue) { selector.Where(s => s.Unread, filter.Unread.Value); } if (filter.Important.HasValue) { selector.Where(s => s.Importance, filter.Important.Value); } if (filter.Attachments.HasValue) { selector.Where(s => s.HasAttachments, filter.Attachments.Value); } if (filter.PrimaryFolder == FolderType.UserFolder && filter.UserFolderId.HasValue) { selector.InAll(s => s.UserFolders.Select(f => f.Id), new[] { filter.UserFolderId.Value }); } if (filter.WithCalendar.HasValue) { selector.Where(m => m.WithCalendar, filter.WithCalendar.Value); } if (dateSend.HasValue) { if (filter.SortOrder == Defines.ASCENDING) { selector.Ge(r => r.DateSent, dateSend.Value); } else { selector.Le(r => r.DateSent, dateSend.Value); } } if (filter.CustomLabels != null && filter.CustomLabels.Any()) { selector.InAll(r => r.Tags.Select(t => t.Id), filter.CustomLabels.ToArray()); } if (filter.PeriodFrom.HasValue && filter.PeriodTo.HasValue) { var fromTs = TimeSpan.FromMilliseconds(filter.PeriodFrom.Value); var from = Defines.BaseJsDateTime.Add(fromTs); var toTs = TimeSpan.FromMilliseconds(filter.PeriodTo.Value); var to = Defines.BaseJsDateTime.Add(toTs); selector.Ge(s => s.DateSent, from); selector.Le(s => s.DateSent, to); } var pageSize = filter.PageSize.GetValueOrDefault(25); if (filter.Page.HasValue && filter.Page.Value > 0) { selector.Limit(filter.Page.Value * pageSize, pageSize); } else if (filter.PageSize.HasValue) { selector.Limit(0, pageSize); } selector.Where(r => r.UserId, userId) .Sort(r => r.DateSent, filter.SortOrder == Defines.ASCENDING); return(FactoryIndexer <MailWrapper> .TrySelectIds(s => selector, out ids, out total)); }
public FilterChainMessagesExp(MailSearchFilterData filter, int tenant, string user, List <int> ids = null) : base(ids ?? new List <int>(), tenant, user, filter) { }
public FilterNextMessageExp(DateTime dateSent, int tenant, string user, MailSearchFilterData filter) : base(null, tenant, user, filter) { DateSent = dateSent; }
private List <MailMessageData> GetFilteredConversations(IDaoFactory daoFactory, MailSearchFilterData filter, out bool hasMore) { var conversations = new List <MailMessageData>(); var skipFlag = false; var chunkIndex = 0; if (filter.FromDate.HasValue && filter.FromMessage.HasValue && filter.FromMessage.Value > 0) { skipFlag = true; } var prevFlag = filter.PrevFlag.GetValueOrDefault(false); var tenantInfo = CoreContext.TenantManager.GetTenant(Tenant); var utcNow = DateTime.UtcNow; var pageSize = filter.PageSize.GetValueOrDefault(25); var daoMailInfo = daoFactory.CreateMailInfoDao(Tenant, User); while (conversations.Count < pageSize + 1) { filter.PageSize = CHUNK_SIZE * pageSize; IMessagesExp exp = null; if (!filter.IsDefault() && FactoryIndexer <MailWrapper> .Support && FactoryIndexer.CheckState(false)) { filter.Page = chunkIndex * CHUNK_SIZE * pageSize; // Elastic Limit from {index of last message} to {count of messages} List <MailWrapper> mailWrappers; if (FilterChainMessagesExp.TryGetFullTextSearchChains(filter, User, out mailWrappers)) { if (!mailWrappers.Any()) { break; } var ids = mailWrappers.Select(c => c.Id).ToList(); var query = SimpleMessagesExp.CreateBuilder(Tenant, User) .SetMessageIds(ids) .SetOrderBy(filter.Sort); if (prevFlag) { query.SetOrderAsc(!(filter.SortOrder == Defines.ASCENDING)); } else { query.SetOrderAsc(filter.SortOrder == Defines.ASCENDING); } exp = query .Build(); } } else { filter.Page = chunkIndex; // MySQL Limit from {page by size} to {size} exp = new FilterChainMessagesExp(filter, Tenant, User); } chunkIndex++; var listMessages = daoMailInfo.GetMailInfoList(exp, true) .ConvertAll(m => MessageEngine.ToMailMessage(m, tenantInfo, utcNow)); if (0 == listMessages.Count) { break; } if (skipFlag && filter.FromMessage.HasValue) { var messageData = listMessages.FirstOrDefault(m => m.Id == filter.FromMessage.Value); if (messageData != null) { // Skip chain messages by FromMessage. listMessages = listMessages.Where( m => !(m.ChainId.Equals(messageData.ChainId) && m.MailboxId == messageData.MailboxId)) .ToList(); } skipFlag = false; } foreach (var messageData in listMessages) { var existingChainIndex = conversations.FindIndex( c => c.ChainId == messageData.ChainId && c.MailboxId == messageData.MailboxId); if (existingChainIndex > -1) { if (conversations[existingChainIndex].Date < messageData.Date) { conversations[existingChainIndex] = messageData; } } else { conversations.Add(messageData); } } if (conversations.Count > pageSize) { break; } } hasMore = conversations.Count > pageSize; if (hasMore) { conversations = conversations.Take(pageSize).ToList(); } if (prevFlag) { conversations.Reverse(); } return(conversations); }
public List <MailMessageData> GetConversations(MailSearchFilterData filterData, out bool hasMore) { if (filterData == null) { throw new ArgumentNullException("filterData"); } var filter = (MailSearchFilterData)filterData.Clone(); if (filter.UserFolderId.HasValue && Factory.UserFolderEngine.Get((uint)filter.UserFolderId.Value) == null) { throw new ArgumentException("Folder not found"); } using (var daoFactory = new DaoFactory()) { var filteredConversations = GetFilteredConversations(daoFactory, filter, out hasMore); if (!filteredConversations.Any()) { return(filteredConversations); } var chainIds = new List <string>(); filteredConversations.ForEach(x => chainIds.Add(x.ChainId)); var daoChain = daoFactory.CreateChainDao(Tenant, User); var exp = SimpleConversationsExp.CreateBuilder(Tenant, User) .SetChainIds(chainIds) .SetFoldersIds( filter.PrimaryFolder == FolderType.Inbox || filter.PrimaryFolder == FolderType.Sent ? new List <int> { (int)FolderType.Inbox, (int)FolderType.Sent } : new List <int> { (int)filter.PrimaryFolder }) .Build(); var extendedInfo = daoChain.GetChains(exp); foreach (var chain in filteredConversations) { var chainMessages = extendedInfo.FindAll(x => x.MailboxId == chain.MailboxId && x.Id == chain.ChainId); if (!chainMessages.Any()) { continue; } chain.IsNew = chainMessages.Any(x => x.Unread); chain.HasAttachments = chainMessages.Any(x => x.HasAttachments); chain.Important = chainMessages.Any(x => x.Importance); chain.ChainLength = chainMessages.Sum(x => x.Length); var firstOrDefault = chainMessages.FirstOrDefault(x => !string.IsNullOrEmpty(x.Tags)); chain.LabelsString = firstOrDefault != null ? firstOrDefault.Tags : ""; } return(filteredConversations); } }
public IEnumerable <MailMessageData> GetFilteredConversations(int?folder, bool?unread, bool?attachments, long?period_from, long?period_to, bool?important, string from_address, string to_address, int?mailbox_id, IEnumerable <int> tags, string search, int?page_size, string sortorder, ApiDateTime from_date, int?from_message, bool?prev_flag, bool?with_calendar, int?user_folder_id) { var primaryFolder = user_folder_id.HasValue ? FolderType.UserFolder : folder.HasValue ? (FolderType)folder.Value : FolderType.Inbox; var filter = new MailSearchFilterData { PrimaryFolder = primaryFolder, Unread = unread, Attachments = attachments, PeriodFrom = period_from, PeriodTo = period_to, Important = important, FromAddress = from_address, ToAddress = to_address, MailboxId = mailbox_id, CustomLabels = new List <int>(tags), SearchText = search, PageSize = page_size.GetValueOrDefault(25), Sort = Defines.ORDER_BY_DATE_CHAIN, SortOrder = sortorder, WithCalendar = with_calendar, UserFolderId = user_folder_id, FromDate = from_date, FromMessage = from_message.GetValueOrDefault(0), PrevFlag = prev_flag.GetValueOrDefault(false) }; bool hasMore; var conversations = MailEngineFactory.ChainEngine.GetConversations(filter, out hasMore); if (hasMore) { _context.SetTotalCount(page_size.GetValueOrDefault(25) + 1); } else { _context.SetTotalCount(conversations.Count); } return(conversations); }