public ActionResult <UserLocationRuleDTO> GetLocationByCampaignAndLocationRuleId(int campaignId,
                                                                                         int userLocationRuleId)
        {
            if (campaignId < 1 || userLocationRuleId < 1)
            {
                return(BadRequest());
            }

            UserLocationRule location = null;

            if (!_settings.CachingEnabled)
            {
                location = _context.Rules
                           .OfType <UserLocationRule>()
                           .SingleOrDefault(c => c.CampaignId == campaignId && c.Id == userLocationRuleId);
            }
            else
            {
                var options = new CachingOptions();
                options.SetAbsoluteExpiration(DateTime.Now.AddMinutes(_settings.MarketingCacheExpirationTimeInMinutes));

                location = _context.Rules
                           .OfType <UserLocationRule>()
                           .DeferredSingleOrDefault(c => c.CampaignId == campaignId && c.Id == userLocationRuleId)
                           .FromCache(options);
            }

            if (location is null)
            {
                return(NotFound());
            }

            return(MapUserLocationRuleModelToDto(location));
        }
 private UserLocationRuleDTO MapUserLocationRuleModelToDto(UserLocationRule userLocationRule)
 {
     return(new UserLocationRuleDTO
     {
         Id = userLocationRule.Id,
         Description = userLocationRule.Description,
         LocationId = userLocationRule.LocationId
     });
 }
        public async Task <ActionResult> DeleteLocationByIdAsync(int campaignId, int userLocationRuleId)
        {
            if (campaignId < 1 || userLocationRuleId < 1)
            {
                return(BadRequest());
            }

            UserLocationRule locationToDelete = null;

            if (!_settings.CachingEnabled)
            {
                locationToDelete = _context.Rules
                                   .OfType <UserLocationRule>()
                                   .SingleOrDefault(c => c.CampaignId == campaignId && c.Id == userLocationRuleId);
            }
            else
            {
                var options = new CachingOptions();
                options.SetAbsoluteExpiration(DateTime.Now.AddMinutes(_settings.MarketingCacheExpirationTimeInMinutes));

                locationToDelete = await _context.Rules
                                   .OfType <UserLocationRule>()
                                   .DeferredSingleOrDefault(c => c.CampaignId == campaignId && c.Id == userLocationRuleId)
                                   .FromCacheAsync(options);
            }

            if (locationToDelete is null)
            {
                return(NotFound());
            }

            _context.Rules.Remove(locationToDelete);
            await _context.SaveChangesAsync();

            if (_settings.CachingEnabled)
            {
                var cache = _context.GetCache();
                await Task.Run(() => cache.Remove(locationToDelete));
            }

            return(NoContent());
        }