public Task<StatusData<GeneralKvPair<int, List<long>>>> UpsertRule(RequestBase request, SystemDbStatus dbMode, SystemSession session)
 {
     return _jUnitOfWork.Inbox.UpsertRule(request, dbMode, session);
 }
        /// <summary>
        /// Passes or fails authentication, based on whether you provide a valid application key in the http headers of the request.
        /// </summary>
        /// <param name="actionContext">Action filter context.</param>
        public void OnAuthorization(HttpActionContext actionContext)
        {
            try
            {
                if (actionContext.ActionDescriptor.GetCustomAttributes<AllowAnonymousAttribute>().Any() || actionContext.ControllerContext.ControllerDescriptor.GetCustomAttributes<AllowAnonymousAttribute>().Any())
                    return;

                var credentials = ProcessAuthorizationToken(actionContext.Request, Entries);
                if (credentials != null && credentials.Count == Entries)
                {
                    var authenticationToken = actionContext.Request.Headers.FirstOrDefault(x => x.Key.Equals("Authorization", StringComparison.OrdinalIgnoreCase)).Value.First();
                    var body = actionContext.Request.Content.ReadAsStringAsync().Result;

                    if (actionContext.Request.Method != HttpMethod.Get && !string.IsNullOrWhiteSpace(body) && !actionContext.Request.Content.IsMimeMultipartContent())
                    //NOT (If GET request or request without any body or body having image/audio/video content)
                    {
                        try
                        {
                            RequestBase req = null;
                            if (Helper.IsJson(body))
                                req = JsonConvert.DeserializeObject<RequestBase>(body);
                            else
                            {
                                var doc = XDocument.Load(new StringReader(body));
                                var xElements = doc.Descendants().Elements() as IList<XElement> ?? doc.Descendants().Elements().ToList();
                                var userIdData = xElements.FirstOrDefault(x => x.Name == "UserId");
                                var deviceIdData = xElements.FirstOrDefault(x => x.Name == "DeviceId");
                                if (userIdData != null && deviceIdData != null)
                                {
                                    req = new RequestBase
                                    {
                                        UserId = Convert.ToInt32(userIdData.Value),
                                        DeviceId = deviceIdData.Value
                                    };
                                }
                            }
                            if (req != null && (!req.UserId.ToString(CultureInfo.InvariantCulture).Equals(credentials[(int)SystemSessionEntity.UserId]) || !req.DeviceId.Equals(credentials[(int)SystemSessionEntity.DeviceId])))
                            {
                                actionContext.Response = actionContext.Request.SystemResponse<string>(SystemDbStatus.Unauthorized);
                                return;
                            }
                        }
                        catch (Exception ex)
                        {
                            actionContext.Response = actionContext.Request.SystemResponse(SystemDbStatus.GeneralError, ex.Message, false, SystemResponseMessage.NonInheritingRequestBase);
                            return;
                        }
                    }

                    if (MemoryCache.GetValue(authenticationToken) != null && SaveToSession(actionContext, credentials)) return;

                    var dvcTyp = credentials[(int)SystemSessionEntity.DeviceTypeId];

                    var userExists = _service.IsAuthenticated(Convert.ToInt32(credentials[(int)SystemSessionEntity.UserId]), credentials[(int)SystemSessionEntity.UserName], credentials[(int)SystemSessionEntity.LoginToken], credentials[(int)SystemSessionEntity.DeviceId], dvcTyp, dvcTyp.Equals("W", StringComparison.OrdinalIgnoreCase) ? System.Web.HttpContext.Current.Request.UserHostAddress : null);

                    if (userExists)
                    {
                        SaveToSession(actionContext, credentials);
                        MemoryCache.Add(authenticationToken, credentials[(int)SystemSessionEntity.UserId], DateTime.Now.AddMinutes(SystemConstants.CacheExpiryTimeInMinutes));
                        return;
                    }
                }
                actionContext.Response = actionContext.Request.SystemResponse<string>(SystemDbStatus.Unauthorized);
            }
            catch (Exception ex)
            {
                actionContext.Response = actionContext.Request.SystemResponse<string>(SystemDbStatus.GeneralError, null, false, ex.Message);
            }
        }
        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;
            }
        }