public bool SaveMailBox(MailBox mailbox)
        {
            if (mailbox == null) throw new ArgumentNullException("mailbox");

            var idMailbox = MailBoxExists(GetAddress(mailbox.EMail), mailbox.UserId, mailbox.TenantId);

            using (var db = GetDb())
            {
                int result;

                var loginDelayTime = GetLoginDelayTime(mailbox);

                if (idMailbox == 0)
                {
                    var utcNow = DateTime.UtcNow;
                    
                    result = db.ExecuteScalar<int>(
                        new SqlInsert(MailboxTable.name)
                            .InColumnValue(MailboxTable.Columns.id, 0)
                            .InColumnValue(MailboxTable.Columns.id_tenant, mailbox.TenantId)
                            .InColumnValue(MailboxTable.Columns.id_user, mailbox.UserId)
                            .InColumnValue(MailboxTable.Columns.address, GetAddress(mailbox.EMail))
                            .InColumnValue(MailboxTable.Columns.name, mailbox.Name)
                            .InColumnValue(MailboxTable.Columns.password, EncryptPassword(mailbox.Password))
                            .InColumnValue(MailboxTable.Columns.msg_count_last, mailbox.MessagesCount)
                            .InColumnValue(MailboxTable.Columns.smtp_password,
                                           string.IsNullOrEmpty(mailbox.SmtpPassword)
                                               ? EncryptPassword(mailbox.Password)
                                               : EncryptPassword(mailbox.SmtpPassword))
                            .InColumnValue(MailboxTable.Columns.size_last, mailbox.Size)
                            .InColumnValue(MailboxTable.Columns.login_delay, loginDelayTime)
                            .InColumnValue(MailboxTable.Columns.enabled, true)
                            .InColumnValue(MailboxTable.Columns.imap, mailbox.Imap)
                            .InColumnValue(MailboxTable.Columns.begin_date, mailbox.BeginDate)
                            .InColumnValue(MailboxTable.Columns.service_type, mailbox.ServiceType)
                            .InColumnValue(MailboxTable.Columns.refresh_token, mailbox.RefreshToken)
                            .InColumnValue(MailboxTable.Columns.id_smtp_server, mailbox.SmtpServerId)
                            .InColumnValue(MailboxTable.Columns.id_in_server, mailbox.InServerId)
                            .InColumnValue(MailboxTable.Columns.date_created, utcNow)
                            .Identity(0, 0, true));

                    mailbox.MailBoxId = result;
                    mailbox.Enabled = true;
                }
                else
                {
                    mailbox.MailBoxId = idMailbox;

                    var queryUpdate = new SqlUpdate(MailboxTable.name)
                        .Where(MailboxTable.Columns.id, idMailbox)
                        .Set(MailboxTable.Columns.id_tenant, mailbox.TenantId)
                        .Set(MailboxTable.Columns.id_user, mailbox.UserId)
                        .Set(MailboxTable.Columns.address, GetAddress(mailbox.EMail))
                        .Set(MailboxTable.Columns.name, mailbox.Name)
                        .Set(MailboxTable.Columns.password, EncryptPassword(mailbox.Password))
                        .Set(MailboxTable.Columns.msg_count_last, mailbox.MessagesCount)
                        .Set(MailboxTable.Columns.smtp_password,
                             string.IsNullOrEmpty(mailbox.SmtpPassword)
                                 ? EncryptPassword(mailbox.Password)
                                 : EncryptPassword(mailbox.SmtpPassword))
                        .Set(MailboxTable.Columns.size_last, mailbox.Size)
                        .Set(MailboxTable.Columns.login_delay, loginDelayTime)
                        .Set(MailboxTable.Columns.is_removed, false)
                        .Set(MailboxTable.Columns.imap, mailbox.Imap)
                        .Set(MailboxTable.Columns.begin_date, mailbox.BeginDate)
                        .Set(MailboxTable.Columns.service_type, mailbox.ServiceType)
                        .Set(MailboxTable.Columns.refresh_token, mailbox.RefreshToken)
                        .Set(MailboxTable.Columns.id_smtp_server, mailbox.SmtpServerId)
                        .Set(MailboxTable.Columns.id_in_server, mailbox.InServerId);

                    if (mailbox.BeginDate == MinBeginDate)
                    {
                        var currentMailbox = GetMailBox(idMailbox);

                        if (currentMailbox == null)
                            throw new ItemNotFoundException("Mailbox was removed");

                        if (mailbox.BeginDate != currentMailbox.BeginDate)
                        {
                            foreach (var folderName in currentMailbox.ImapIntervals.Keys)
                            {
                                var imapIntervals =
                                    new ImapIntervals(currentMailbox.ImapIntervals[folderName].UnhandledUidIntervals);

                                if (currentMailbox.ImapIntervals[folderName].BeginDateUid != 1)
                                    imapIntervals.AddUnhandledInterval(new UidInterval(1,
                                                                                       currentMailbox.ImapIntervals[
                                                                                           folderName].BeginDateUid));
                                
                                currentMailbox.ImapIntervals[folderName].UnhandledUidIntervals =
                                    new List<int>(imapIntervals.ToIndexes());

                                currentMailbox.ImapIntervals[folderName].BeginDateUid = 1;
                            }

                            queryUpdate.Set(MailboxTable.Columns.imap_intervals, currentMailbox.ImapIntervalsJson);
                        }

                    }

                    result = db.ExecuteNonQuery(queryUpdate);
                }

                return result > 0;
            }
        }
Ejemplo n.º 2
0
        public void AddUnhandledIntervalBaseTest(int[] indexes, UidInterval newInterval, int[] indexesMody, UidInterval[] intervals)
        {
            var imapIntervals = new ImapIntervals(new List<int>(indexes));
            imapIntervals.AddUnhandledInterval(newInterval);
            var uidIntervals = imapIntervals.GetUnhandledIntervalsCopy();
            Assert.IsTrue(uidIntervals.Count == intervals.Count());
            foreach (var interval in intervals)
            {
                Assert.IsTrue(uidIntervals.Contains(interval));
            }

            var indexesListMody = new List<int>(indexesMody);
            Assert.IsTrue(indexesListMody.SequenceEqual(imapIntervals.ToIndexes()));
        }