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); }
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(); }
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)); }
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\"}}}"); }