public async Task <DiscountsStatistics> GetDiscountsStatistics(DiscountsStatisticsCriteria criteria)
        {
            var aggregate = await _discounts.Aggregate().Match(criteria.GetMatch()).Group(criteria.GetGroup()).ToListAsync();

            var statistics = new DiscountsStatistics();

            if (aggregate.Count == 0)
            {
                return(null);
            }

            var doc = aggregate[0];

            var discountTotal      = doc.GetValue("discountTotal").AsInt32;
            var viewsTotal         = doc.GetValue("viewsTotal").AsInt32;
            var subscriptionsTotal = doc.GetValue("subscriptionsTotal").AsInt32;
            var ratedTotal         = doc.GetValue("ratedTotal").AsInt32;
            var favoritesTotal     = doc.GetValue("favoritesTotal").AsInt32;

            statistics.DiscountsTotal     = discountTotal;
            statistics.ViewsTotal         = viewsTotal;
            statistics.SubscriptionsTotal = subscriptionsTotal;
            statistics.RatedTotal         = ratedTotal;
            statistics.FavoritesTotal     = favoritesTotal;
            return(statistics);
        }
示例#2
0
        public static string GetMatch(this DiscountsStatisticsCriteria criteria)
        {
            var matchBuilder = new StringBuilder();

            matchBuilder.Append("{");
            matchBuilder.Append("$and: [");
            if (!string.IsNullOrEmpty(criteria.SearchAddressCountry))
            {
                matchBuilder.Append("{" + $"\"address.country\": \"{criteria.SearchAddressCountry}\", " + "},");
                if (!string.IsNullOrEmpty(criteria.SearchAddressCity))
                {
                    matchBuilder.Append("{" + $"\"address.city\": \"{criteria.SearchAddressCity}\" " + "},");
                }
            }

            if (criteria.CreateStartDate != null || criteria.CreateEndDate != null)
            {
                matchBuilder.Append("{" + "\"createDate\": {");
                if (criteria.CreateStartDate != null)
                {
                    matchBuilder.Append($"$gt: {criteria.CreateStartDate.ToIsoDate()},");
                }
                if (criteria.CreateEndDate != null)
                {
                    matchBuilder.Append($"$lt: {criteria.CreateEndDate.ToIsoDate()}");
                }
                matchBuilder.Append("}},");
            }

            matchBuilder.Append("{favoritesUsersId: {$exists: true}},{ratingUsersId: {$exists: true}}");
            matchBuilder.Append("]}");
            return(matchBuilder.ToString());
        }
        public void DiscountsStatisticsCriteriaTest()
        {
            var discountsStatisticsCriteria = new DiscountsStatisticsCriteria()
            {
                CreateStartDate      = "01.01.2020 10:10:10".GetUtcDateTime(),
                CreateEndDate        = "01.01.2021 10:10:10".GetUtcDateTime(),
                SearchAddressCity    = "SearchAddressCity",
                SearchAddressCountry = "SearchAddressCountry"
            };

            discountsStatisticsCriteria.SearchAddressCountry.Should().NotBeNull();
            discountsStatisticsCriteria.SearchAddressCity.Should().NotBeNull();
            discountsStatisticsCriteria.CreateEndDate.Should().NotBeNull();
            discountsStatisticsCriteria.CreateStartDate.Should().NotBeNull();
        }
示例#4
0
        public async Task <IActionResult> GetDiscountsStatistics([FromBody] DiscountsStatisticsCriteria criteria)
        {
            var incomingUser = ControllerContext.IncomingUser();

            if (criteria.CreateEndDate < criteria.CreateStartDate)
            {
                _logger.LogWarning("Get Discounts Statistics. Criteria: {@criteria}. Result is not enabled, user does not have permission. User: {@incomingUser}.", criteria, incomingUser);
                return(BadRequest("CreateEndDate field must be greater than CreateStartDate field."));
            }

            var statistics = await _statistics.GetDiscountsStatistics(criteria);

            if (statistics == null)
            {
                _logger.LogWarning("Get Discounts Statistics. Criteria: {@criteria}. Result is Empty. User: {@incomingUser}.", criteria, incomingUser);
                return(NotFound("Can't generate statistics for the specified criteria."));
            }

            _logger.LogInformation("Get Discounts Statistics. Criteria: {@criteria}. Result: {@statistics}. User: {@incomingUser}.", criteria, statistics, incomingUser);
            return(Ok(statistics));
        }
示例#5
0
 public static string GetGroup(this DiscountsStatisticsCriteria criteria)
 {
     return("{\"_id\": \"\", \"discountTotal\": {$sum: 1}, \"viewsTotal\": {$sum: \"$viewsTotal\"}, \"subscriptionsTotal\": {$sum: \"$subscriptionsTotal\"}" +
            ",\"favoritesTotal\": {$sum: {$size: \"$favoritesUsersId\"}}, \"ratedTotal\": {$sum: {$size: \"$ratingUsersId\"}}}");
 }