public async Task <StatusData <GeneralKvPair <int, List <long> > > > UpsertInbox(InboxRequest request, SystemSession session)
        {
            var result = new StatusData <GeneralKvPair <int, List <long> > >();

            if (request.Rule != null && request.Rule.Any())
            {
                request.Rule.RemoveAll(x => x.UserSelection == SystemUserSelection.None && x.RuleTypeSubject == SystemRuleTypeSubject.None);
            }

            var inboxRequest = new Kauwa.Inbox {
                UserId = request.UserId, Name = request.Name, FolderId = 0, InboxRules = request.Rule != null && request.Rule.Any() ? request.Rule.Select(x => new InboxRule {
                    TypeUserSelection = (int)x.UserSelection, RuleTypeUser = (int)x.RuleTypeUser, ContactList = x.ContactList, GroupList = x.GroupList, RuleTypeSubject = (int)x.RuleTypeSubject, Subject = x.Subject, ApplyOnOldMessage = x.ApplyOnOldMessage
                }).ToList() : null
            };

            var response = await Task.Factory.StartNew(() => Client.InboxService.createInboxWithRules(inboxRequest, session.GetSession())).ConfigureAwait(false);

            result.Status  = (SystemDbStatus)response.DbStatusCode;
            result.Data    = new GeneralKvPair <int, List <long> >();
            result.Message = response.DbStatusMsg;

            result.Data = new GeneralKvPair <int, List <long> >
            {
                Id    = response.FolderId,
                Value = response.InboxRules != null?response.InboxRules.Select(x => x.RuleId).ToList() : null
            };

            return(result);
        }
        public async Task <StatusData <int> > UpsertInbox(InboxRequest request, int folderId, SystemSession session)
        {
            var inboxRequest = new Kauwa.Inbox {
                UserId = request.UserId, Name = request.Name, FolderId = folderId
            };

            var response = await Task.Factory.StartNew(() => Client.InboxService.updateInboxFolderName(inboxRequest, session.GetSession())).ConfigureAwait(false);

            var result = response.GetStatusData <int>();

            result.Data = folderId;
            return(result);
        }
        //public async Task<StatusData<long>> DeleteRule(long messageRuleId, SystemSession session)
        //{
        //    var ruleRequest = new Kauwa.Inbox { UserId = session.UserId, InboxRules = new List<InboxRule> { new InboxRule { RuleId = messageRuleId } } };
        //    var response = (await Task.Factory.StartNew(() => Client.InboxRuleService.deleteInboxRules(ruleRequest, session.GetSession())).ConfigureAwait(false)).GetStatusData<long>();
        //    response.Data = messageRuleId;
        //    return response;
        //}

        public async Task <StatusData <long> > DeleteRule(SingleData <GeneralKvPair <long, int> > request, SystemSession session)
        {
            var ruleRequest = new Kauwa.Inbox {
                UserId = session.UserId, FolderId = request.Data.Value, InboxRules = new List <InboxRule> {
                    new InboxRule {
                        RuleId = request.Data.Id
                    }
                }
            };
            var response = (await Task.Factory.StartNew(() => Client.InboxRuleService.deleteInboxRules(ruleRequest, session.GetSession())).ConfigureAwait(false)).GetStatusData <long>();

            response.Data = request.Data.Id;
            return(response);
        }
        public async Task <StatusData <GeneralKvPair <int, List <long> > > > UpsertRule(RequestBase request, SystemDbStatus dbMode, SystemSession session)
        {
            var result = new StatusData <GeneralKvPair <int, List <long> > >();

            if (dbMode == SystemDbStatus.Inserted)
            {
                var req = request as RuleAddRequest;

                var ruleRequest = new Kauwa.Inbox {
                    UserId = request.UserId, FolderId = req.FolderId, InboxRules = new List <InboxRule> {
                        new InboxRule {
                            TypeUserSelection = (int)req.Rule.UserSelection, RuleTypeUser = (int)req.Rule.RuleTypeUser, ContactList = req.Rule.ContactList, GroupList = req.Rule.GroupList, RuleTypeSubject = (int)req.Rule.RuleTypeSubject, Subject = req.Rule.Subject, ApplyOnOldMessage = req.Rule.ApplyOnOldMessage
                        }
                    }
                };

                var response = await Task.Factory.StartNew(() => Client.InboxRuleService.createInboxRules(ruleRequest, session.GetSession())).ConfigureAwait(false);

                result.Status = (SystemDbStatus)response.DbStatusCode;

                result.Data = new GeneralKvPair <int, List <long> >
                {
                    Id    = response.FolderId,
                    Value = response.InboxRules != null?response.InboxRules.Select(x => x.RuleId).ToList() : null
                };

                result.SubStatus = response.DbSubStatusCode;
                result.Message   = response.DbStatusMsg;
                return(result);
            }
            else
            {
                var req = request as RuleUpdateRequest;

                var ruleRequest = new Kauwa.Inbox {
                    UserId = request.UserId, FolderId = req.FolderId, InboxRules = new List <InboxRule> {
                        new InboxRule {
                            RuleId = req.MessageRuleId, TypeUserSelection = (int)req.Rule.UserSelection, RuleTypeUser = (int)req.Rule.RuleTypeUser, ContactList = req.Rule.ContactList, GroupList = req.Rule.GroupList, RuleTypeSubject = (int)req.Rule.RuleTypeSubject, Subject = req.Rule.Subject, ApplyOnOldMessage = req.Rule.ApplyOnOldMessage
                        }
                    }
                };

                result = (await Task.Factory.StartNew(() => Client.InboxRuleService.updateInboxRules(ruleRequest, session.GetSession())).ConfigureAwait(false)).GetStatusData <GeneralKvPair <int, List <long> > >();
                return(result);
            }
        }
        public async Task<StatusData<GeneralKvPair<int, List<long>>>> UpsertInbox(InboxRequest request, SystemSession session)
        {
            var result = new StatusData<GeneralKvPair<int, List<long>>>();
            if (request.Rule != null && request.Rule.Any())
                request.Rule.RemoveAll(x => x.UserSelection == SystemUserSelection.None && x.RuleTypeSubject == SystemRuleTypeSubject.None);

            var inboxRequest = new Kauwa.Inbox { UserId = request.UserId, Name = request.Name, FolderId = 0, InboxRules = request.Rule != null && request.Rule.Any() ? request.Rule.Select(x => new InboxRule { TypeUserSelection = (int)x.UserSelection, RuleTypeUser = (int)x.RuleTypeUser, ContactList = x.ContactList, GroupList = x.GroupList, RuleTypeSubject = (int)x.RuleTypeSubject, Subject = x.Subject, ApplyOnOldMessage = x.ApplyOnOldMessage }).ToList() : null };

            var response = await Task.Factory.StartNew(() => Client.InboxService.createInboxWithRules(inboxRequest, session.GetSession())).ConfigureAwait(false);
            result.Status = (SystemDbStatus)response.DbStatusCode;
            result.Data = new GeneralKvPair<int, List<long>>();
            result.Message = response.DbStatusMsg;

            result.Data = new GeneralKvPair<int, List<long>>
            {
                Id = response.FolderId,
                Value = response.InboxRules != null ? response.InboxRules.Select(x => x.RuleId).ToList() : null
            };

            return result;
        }
        public async Task<StatusData<int>> UpsertInbox(InboxRequest request, int folderId, SystemSession session)
        {
            var inboxRequest = new Kauwa.Inbox { UserId = request.UserId, Name = request.Name, FolderId = folderId };

            var response = await Task.Factory.StartNew(() => Client.InboxService.updateInboxFolderName(inboxRequest, session.GetSession())).ConfigureAwait(false);

            var result = response.GetStatusData<int>();
            result.Data = folderId;
            return result;
        }
        //public async Task<StatusData<long>> DeleteRule(long messageRuleId, SystemSession session)
        //{
        //    var ruleRequest = new Kauwa.Inbox { UserId = session.UserId, InboxRules = new List<InboxRule> { new InboxRule { RuleId = messageRuleId } } };
        //    var response = (await Task.Factory.StartNew(() => Client.InboxRuleService.deleteInboxRules(ruleRequest, session.GetSession())).ConfigureAwait(false)).GetStatusData<long>();
        //    response.Data = messageRuleId;
        //    return response;
        //}

        public async Task<StatusData<long>> DeleteRule(SingleData<GeneralKvPair<long, int>> request, SystemSession session)
        {
            var ruleRequest = new Kauwa.Inbox { UserId = session.UserId, FolderId = request.Data.Value, InboxRules = new List<InboxRule> { new InboxRule { RuleId = request.Data.Id } } };
            var response = (await Task.Factory.StartNew(() => Client.InboxRuleService.deleteInboxRules(ruleRequest, session.GetSession())).ConfigureAwait(false)).GetStatusData<long>();
            response.Data = request.Data.Id;
            return response;
        }
        public async Task<StatusData<GeneralKvPair<int, List<long>>>> UpsertRule(RequestBase request, SystemDbStatus dbMode, SystemSession session)
        {
            var result = new StatusData<GeneralKvPair<int, List<long>>>();

            if (dbMode == SystemDbStatus.Inserted)
            {
                var req = request as RuleAddRequest;

                var ruleRequest = new Kauwa.Inbox { UserId = request.UserId, FolderId = req.FolderId, InboxRules = new List<InboxRule> { new InboxRule { TypeUserSelection = (int)req.Rule.UserSelection, RuleTypeUser = (int)req.Rule.RuleTypeUser, ContactList = req.Rule.ContactList, GroupList = req.Rule.GroupList, RuleTypeSubject = (int)req.Rule.RuleTypeSubject, Subject = req.Rule.Subject, ApplyOnOldMessage = req.Rule.ApplyOnOldMessage } } };

                var response = await Task.Factory.StartNew(() => Client.InboxRuleService.createInboxRules(ruleRequest, session.GetSession())).ConfigureAwait(false);
                result.Status = (SystemDbStatus)response.DbStatusCode;

                result.Data = new GeneralKvPair<int, List<long>>
                {
                    Id = response.FolderId,
                    Value = response.InboxRules != null ? response.InboxRules.Select(x => x.RuleId).ToList() : null
                };

                result.SubStatus = response.DbSubStatusCode;
                result.Message = response.DbStatusMsg;
                return result;
            }
            else
            {
                var req = request as RuleUpdateRequest;

                var ruleRequest = new Kauwa.Inbox { UserId = request.UserId, FolderId = req.FolderId, InboxRules = new List<InboxRule> { new InboxRule { RuleId = req.MessageRuleId, TypeUserSelection = (int)req.Rule.UserSelection, RuleTypeUser = (int)req.Rule.RuleTypeUser, ContactList = req.Rule.ContactList, GroupList = req.Rule.GroupList, RuleTypeSubject = (int)req.Rule.RuleTypeSubject, Subject = req.Rule.Subject, ApplyOnOldMessage = req.Rule.ApplyOnOldMessage } } };

                result = (await Task.Factory.StartNew(() => Client.InboxRuleService.updateInboxRules(ruleRequest, session.GetSession())).ConfigureAwait(false)).GetStatusData<GeneralKvPair<int, List<long>>>();
                return result;
            }
        }