public PrefundingAccountData getPrefundingAccountData(ReviewFilter filter) { if (filter == null) { return(null); } try { JavaScriptSerializer serializer = new JavaScriptSerializer(); var request = new RestRequest(ResourcePath + "/prefunding-account", Method.POST); request.RequestFormat = DataFormat.Json; serializer.MaxJsonLength = int.MaxValue; string json = serializer.Serialize(filter); request.AddParameter("application/json", json, ParameterType.RequestBody); var response = RestClient.ExecuteTaskAsync(request); RestResponse queryResult = (RestResponse)response.Result; bool valid = ValidateResponse(queryResult); JavaScriptSerializer Serializer = new JavaScriptSerializer(); Serializer.MaxJsonLength = int.MaxValue; PrefundingAccountData data = Serializer.Deserialize <PrefundingAccountData>(queryResult.Content); return(data); } catch (Exception e) { logger.Error("Unable to retrieve Prefunding Account Data from server.", e); return(null); } }
//TODO: genericrepo voor MongoDB //*** GET ------------------------------------------------------------- public async Task <IEnumerable <Review> > GetAll(ReviewFilter filter = null) { try { var result = new List <Review>(); if (filter == null || filter.FlightId == null && filter.Subject == null && filter.DateOfCreation == null) { //var result = await context.Reviews.Aggregate().Lookup<Review, Author, Review>(context.Authors, aut => aut.UserId, d => d.UserId, aut => aut.Author); result = await context.Reviews.Find(FilterDefinition <Review> .Empty).ToListAsync <Review>(); } else { result = await context.Reviews.Find(filter.ToFilterDefinition()) .SortBy(d => d.DateOfCreation).ThenBy(d => d.Subject) .ToListAsync <Review>(); } foreach (Review review in result) { review.Flight = context.Flights.AsQueryable().Where(fl => fl.FlightId == review.FlightId).FirstOrDefault(); review.Author = context.Authors.AsQueryable().Where(aut => aut.UserId == review.UserId).FirstOrDefault(); } return(result); } catch (Exception exception) { throw exception; } }
public static ProductReviewModelList GetProductReviewModel(ReviewFilter reviewFilter) { using (var client = new LandauPortalWebAPI()) { var reviews = client.ProductReviews.GetAllByProduct(reviewFilter.Code, reviewFilter.PageNumber, reviewFilter.Size); ProductReviewModelList productReviewModelList = new ProductReviewModelList(); productReviewModelList.List = reviews.Results.Select(s => new ProductReviewModel() { Comments = s.Comments, FirstName = s.FirstName, LastName = s.LastName, Rating = s.Rating ?? 0, EntryDate = (DateTimeOffset)s.EntryDate }).ToList(); PaginationModel pagination = new PaginationModel(); pagination.CurrentPage = reviews.Pagination.CurrentPage ?? 0; pagination.PageCount = reviews.Pagination.TotalPages ?? 0; pagination.PageSize = reviews.Pagination.PageSize ?? 0; pagination.TotalCount = reviews.Pagination.TotalCount ?? 0; productReviewModelList.Pagination = pagination; productReviewModelList.Average = reviews.Average ?? 0; return(productReviewModelList); } }
public async Task <IActionResult> Index([FromQuery] ReviewFilter reviewFilter) { var filter = new ReviewFilter(); { filter.Subject = reviewFilter.Subject; filter.FlightId = reviewFilter.FlightId; filter.DateOfCreation = reviewFilter.DateOfCreation; } return(Ok(await repo.GetAll(filter))); }
public async Task <IActionResult> Index([FromQuery(Name = "ReviewFilter")] ReviewFilter reviewFilter = null) { var filter = new ReviewFilter() { Subject = reviewFilter.Subject, RestaurantId = reviewFilter.RestaurantId, DateOfCreation = reviewFilter.DateOfCreation }; return(Ok(await reviewRepo.GetAll(filter))); }
public List <SettlementEvolutionChartData> getSettlementEvolutionChartDatas(ReviewFilter filter) { if (filter == null) { return(null); } //Kernel.Util.FileUtil.buildTimeMeasurementFile(); try { //Console.Out.WriteLine(" ---------------- Evolution Chart Measures of " + DateTime.Now + " -------------"); //Console.Out.WriteLine(); //DateTime begin = DateTime.Now; JavaScriptSerializer serializer = new JavaScriptSerializer(); var request = new RestRequest(ResourcePath + "/settlement-evolution-chart", Method.POST); request.RequestFormat = DataFormat.Json; serializer.MaxJsonLength = int.MaxValue; string json = serializer.Serialize(filter); request.AddParameter("application/json", json, ParameterType.RequestBody); //DateTime chartrequest = DateTime.Now; var response = RestClient.ExecuteTaskAsync(request); RestResponse queryResult = (RestResponse)response.Result; bool valid = ValidateResponse(queryResult); //Console.Out.WriteLine(" Chart data request " + (DateTime.Now - chartrequest)); //Console.Out.WriteLine(); JavaScriptSerializer Serializer = new JavaScriptSerializer(); Serializer.MaxJsonLength = int.MaxValue; //DateTime chartSerialisation = DateTime.Now; List <SettlementEvolutionChartData> datas = Serializer.Deserialize <List <SettlementEvolutionChartData> >(queryResult.Content); //Console.Out.WriteLine(" Chart data serialization " + (DateTime.Now - chartSerialisation)); //Console.Out.WriteLine(); //Console.Out.WriteLine(); //Console.Out.WriteLine(" Total Chart duration " + (DateTime.Now - begin)); //Console.Out.WriteLine(); //Console.Out.WriteLine(" --------------- End Evolution Chart -------------"); //Console.Out.WriteLine(); //Console.Out.WriteLine(); //Kernel.Util.FileUtil.closeTimeMeasurementFile(); return(datas); } catch (Exception e) { logger.Error("Unable to retrieve Settlement Evolution Datas from server.", e); return(null); } }
public void FillFilter(ReviewFilter filter) { if (filter == null) { filter = new ReviewFilter(); } /*if (this.Scheme != null) * { * filter.schemeIdOids.Add(this.Scheme.oid.Value); * } * filter.startDateTime = this.StartDatePicker.SelectedDate; * filter.endDateTime = this.EndDatePicker.SelectedDate;*/ }
public ActionResult ReviewsPagination(string productId, int pageNumber) { var model = new DetailModel(); ReviewFilter reviewFilter = new ReviewFilter(); reviewFilter.Code = productId; reviewFilter.PageNumber = pageNumber; reviewFilter.Size = PAGE_REVIEW_SIZE; model.ProductReviews = DetailManager.GetProductReviewModel(reviewFilter); return(PartialView("~/Views/Partials/Detail/_ReviewsPaginationPartial.cshtml", model)); }
public List <AgeingBalanceData> getAgeingBalanceDatas(ReviewFilter filter) { if (filter == null) { return(null); } //Kernel.Util.FileUtil.buildTimeMeasurementFile(); //Console.Out.WriteLine(" ---------------- Ageing "+( filter.details ?"Details" : "")+" Measures of "+DateTime.Now +" -------------"); //DateTime begin = DateTime.Now; try { JavaScriptSerializer serializer = new JavaScriptSerializer(); var request = new RestRequest(ResourcePath + "/ageing-balance", Method.POST); request.RequestFormat = DataFormat.Json; serializer.MaxJsonLength = int.MaxValue; string json = serializer.Serialize(filter); request.AddParameter("application/json", json, ParameterType.RequestBody); var response = RestClient.ExecuteTaskAsync(request); //DateTime requesttime = DateTime.Now; RestResponse queryResult = (RestResponse)response.Result; bool valid = ValidateResponse(queryResult); //Console.Out.WriteLine(" Ageing "+( filter.details ?"Details" : "")+" server quering duration " + (DateTime.Now - requesttime)); //Console.Out.WriteLine(); JavaScriptSerializer Serializer = new JavaScriptSerializer(); Serializer.MaxJsonLength = int.MaxValue; //DateTime serialization = DateTime.Now; List <AgeingBalanceData> datas = Serializer.Deserialize <List <AgeingBalanceData> >(queryResult.Content); //Console.Out.WriteLine(" Ageing "+( filter.details ?"Details" : "")+" serialisation duration " + (DateTime.Now - serialization)); //Console.Out.WriteLine(); //Console.Out.WriteLine(" Total Duration Ageing "+( filter.details ?"Details " : " ")+ (DateTime.Now - begin)); //Console.Out.WriteLine(); //Console.Out.WriteLine(); //Console.Out.WriteLine(" ------------End Ageing "+( filter.details ?"Details" : "")+" Measure -------------"); //Console.Out.WriteLine(); //Console.Out.WriteLine(); //Kernel.Util.FileUtil.closeTimeMeasurementFile(); return(datas); } catch (Exception e) { logger.Error("Unable to retrieve Ageing Balance Datas from server.", e); return(null); } }
public void FillFilter(ReviewFilter filter) { if (filter == null) { filter = new ReviewFilter(); } foreach (BfcItem scheme in this.Schemes) { filter.schemeIdOids.Add(scheme.oid.Value); } foreach (BfcItem pml in this.Pmls) { filter.pmlIdOids.Add(pml.oid.Value); } }
public async Task <IActionResult> Index(ReviewFilter filter, int page) { var seller = await HttpContext.GetMemberAsync(); filter.SellerId = seller.Id; var reviews = await _reviewService.GetQuery(filter).ToPageableAsync(page, _appSettings.PageDefaultSize); var model = new ReviewListModel { Filter = filter }; await _appService.PrepareModelAsync(model, reviews); return(View(model)); }
public void FillFilter(ReviewFilter filter) { if (filter == null) { filter = new ReviewFilter(); } foreach (BfcItem scheme in this.Schemes) { filter.schemeIdOids.Add(scheme.oid.Value); } foreach (BfcItem platform in this.Platforms) { filter.platformIdOids.Add(platform.oid.Value); } filter.startDateTime = this.StartDatePicker.SelectedDate; filter.endDateTime = this.EndDatePicker.SelectedDate; }
private void UpdateSettlementEvolutionChart(ReviewFilter filter = null) { try { getReviewBrowser().Form.SettlementEvolutionForm.IsChartBussy = true; if (filter == null) { filter = getReviewBrowser().Form.GetFilter(); } List <SettlementEvolutionChartData> datas = getReviewService().getSettlementEvolutionChartDatas(filter); getReviewBrowser().Form.SettlementEvolutionForm.DisplayChart(datas); getReviewBrowser().Form.SettlementEvolutionForm.IsChartBussy = false; } catch (Exception) { getReviewBrowser().Form.SettlementEvolutionForm.IsChartBussy = false; } }
private void AgeingBalanceSearchDetail() { try { getReviewBrowser().Form.AgeingBalanceForm.IsDetailGridBussy = true; ReviewFilter fil = getReviewBrowser().Form.GetFilter(); ReviewFilter filter = new ReviewFilter(); filter.details = true; filter.memberBankIdOids = fil.memberBankIdOids; filter.schemeIdOids = fil.schemeIdOids; List <AgeingBalanceData> datas = getReviewService().getAgeingBalanceDatas(filter); getReviewBrowser().Form.DisplayDetails(datas); getReviewBrowser().Form.AgeingBalanceForm.IsDetailGridBussy = false; } catch (Exception) { getReviewBrowser().Form.AgeingBalanceForm.IsDetailGridBussy = false; } }
private DetailModel GetDetailModelFromProduct(String productId, BreadcrumbModel bc, bool buildNavigation = true) { DetailModel model; if (!String.IsNullOrEmpty(productId)) { model = DetailManager.GetModel(this.CurrentBrand, productId); model.Breadcrumb = bc; //search for default category size containing default color model.ProductDetail.DefaultCategorySize = model.ColorsAndSizes.ProductCategorySizes.Count > 0 ? model.ColorsAndSizes.ProductCategorySizes[0] : null; foreach (var aSizeCategory in model.ColorsAndSizes.AvailableColorsPerSizeCategory) { var match = aSizeCategory.Value.Find(c => c.ColorCode == model.ProductDetail.DefaultColorCode); if (match != null) { model.ProductDetail.DefaultCategorySize = aSizeCategory.Key; break; } } ReviewFilter reviewFilter = new ReviewFilter(); reviewFilter.Code = productId; reviewFilter.PageNumber = 1; reviewFilter.Size = PAGE_REVIEW_SIZE; model.ProductReviews = DetailManager.GetProductReviewModel(reviewFilter); if (buildNavigation) { BuildProductsNavigation(productId, bc, model); } } else { model = new DetailModel(); } return(model); }
public ReviewFilter GetFilter() { ReviewFilter filter = new ReviewFilter(); foreach (BfcItem bank in this.MemberBanks) { filter.memberBankIdOids.Add(bank.oid.Value); } if (this.TabControl.SelectedIndex == 0) { this.PrefundingAccountForm.FillFilter(filter); } else if (this.TabControl.SelectedIndex == 1) { this.SettlementEvolutionForm.FillFilter(filter); } else if (this.TabControl.SelectedIndex == 2) { this.AgeingBalanceForm.FillFilter(filter); } return(filter); }
public async Task <IList <Review> > QueryReview(ReviewFilter filter) { var requestIDs = new DataTable(); requestIDs.Columns.Add("Val"); if (filter.RequestIDs?.Any() ?? false) { foreach (var id in filter.RequestIDs) { requestIDs.Rows.Add(id); } } var param = new DynamicParameters(); param.Add("RequestIDs", requestIDs.AsTableValuedParameter("dbo.BigIntType")); var mapper = new ReviewMapper(); return((await SqlMapper.QueryAsync(_unitOfWork.Connection, "QueryReview", new[] { typeof(Review), typeof(ReviewLineItem) }, obj => { var review = obj[0] as Review; var lineItem = obj[1] as ReviewLineItem; return mapper.Map(review, lineItem); }, param, splitOn: "ID,LineItemID", commandType: CommandType.StoredProcedure, transaction: _unitOfWork.Transaction)).Distinct().ToList()); }
//** GET --------------------------- public async Task <IEnumerable <Review> > GetAll(ReviewFilter filter = null) { try { if (filter == null || filter.RestaurantId == null && filter.Subject == null && filter.DateOfCreation == null) { var result = await context.Reviews.Find(FilterDefinition <Review> .Empty).ToListAsync <Review>(); return(result); } else { return(await context.Reviews.Find(filter.ToFilterDefinition()) .SortBy(d => d.DateOfCreation).ThenBy(d => d.Subject) .ToListAsync <Review>()); } } catch (Exception exception) { throw exception; } }
public async Task <IActionResult> PrepareProductDetailsView(Product product, int page) { var seller = await HttpContext.GetSellerAsync(); var customer = await HttpContext.GetMemberAsync(); var model = new ProductModel(); await _appService.PrepareModelAsync(model, product); var reviewFilter = new ReviewFilter { Approved = true, SellerId = seller.Id, ProductId = product.Id }; var reviewEvaluation = await _reviewService.EvaluateAsync(reviewFilter); model.ReviewListModel = new ReviewListModel { Filter = reviewFilter, Evaluation = reviewEvaluation }; model.ReviewEvaluation = reviewEvaluation; if (customer != null) { model.IsAddedToCart = await _cartService.GetQuery(new CartFilter { CustomerId = customer.Id, SellerId = seller.Id, ProductId = product.Id, Type = CartType.Cart }).AnyAsync(); model.IsAddedToWishlist = await _cartService.GetQuery(new CartFilter { CustomerId = customer.Id, SellerId = seller.Id, ProductId = product.Id, Type = CartType.Wishlist }).AnyAsync(); } var reviews = await _reviewService.GetQuery(reviewFilter).ToPageableAsync(page, _appSettings.PageDefaultSize); await _appService.PrepareModelAsync(model.ReviewListModel, reviews); return(View("ProductDetails", model)); }
public override OperationState Search() { getReviewBrowser().Form.IsBussy = true; Kernel.Application.Application.Current.Dispatcher.BeginInvoke(DispatcherPriority.Background, new Action(() => { try { ReviewFilter filter = getReviewBrowser().Form.GetFilter(); if (getReviewBrowser().Form.TabControl.SelectedIndex == 0) { PrefundingAccountData data = getReviewService().getPrefundingAccountData(filter); getReviewBrowser().Form.Display(data); } else if (getReviewBrowser().Form.TabControl.SelectedIndex == 1) { List <SettlementEvolutionData> datas = getReviewService().getSettlementEvolutionDatas(filter); getReviewBrowser().Form.Display(datas); UpdateSettlementEvolutionChart(filter); } else if (getReviewBrowser().Form.TabControl.SelectedIndex == 2) { List <AgeingBalanceData> datas = getReviewService().getAgeingBalanceDatas(filter); getReviewBrowser().Form.DisplayTotal(datas); } getReviewBrowser().Form.IsBussy = false; } catch (Exception) { getReviewBrowser().Form.IsBussy = false; } finally { getReviewBrowser().Form.IsBussy = false; } })); return(OperationState.CONTINUE); }
public ReviewsController(ReviewFilter businessware) { _businessware = businessware; }
/// <summary> /// /// </summary> /// <returns></returns> public AvailabilityRQ toAvailabilityRQ() { try { AvailabilityRQ availabilityRQ = new AvailabilityRQ(); availabilityRQ.language = this.language; availabilityRQ.stay = new Stay(checkIn, checkOut, shiftDays, true); if (rooms != null && rooms.Count > 0) { availabilityRQ.occupancies = new List <Occupancy>(); for (int i = 0; i < rooms.Count; i++) { Occupancy occupancy = new Occupancy(); occupancy.adults = rooms[i].adults; occupancy.children = rooms[i].children; occupancy.rooms = rooms[i].numberOfRooms; if (rooms[i].details != null && rooms[i].details.Count > 0) { occupancy.paxes = new List <Pax>(); Pax[] paxes = new Pax[rooms[i].details.Count]; for (int d = 0; d < rooms[i].details.Count; d++) { Pax pax = new Pax(); pax.type = (rooms[i].details[d].getType() == RoomDetail.GuestType.ADULT) ? SimpleTypes.HotelbedsCustomerType.AD : SimpleTypes.HotelbedsCustomerType.CH; pax.age = rooms[i].details[d].getAge(); pax.name = rooms[i].details[d].getName(); pax.surname = rooms[i].details[d].getSurname(); paxes[d] = pax; } occupancy.paxes.AddRange(paxes); } availabilityRQ.occupancies.Add(occupancy); } } // Linea 224 Availability.java if (withinThis != null) { GeoLocation geolocation = new GeoLocation(); geolocation.unit = UnitMeasure.UnitMeasureType.km; if (withinThis.GetType() == typeof(Circle)) { Circle circle = (Circle)withinThis; geolocation.latitude = circle.latitude; geolocation.longitude = circle.longitude; geolocation.radius = circle.radiusInKilometers; } else if (withinThis.GetType() == typeof(Square)) { Square square = (Square)withinThis; geolocation.latitude = square.northEastLatitude; geolocation.longitude = square.northEastLongitude; geolocation.secondaryLatitude = square.southWestLatitude; geolocation.secondaryLongitude = square.southWestLongitude; } availabilityRQ.geolocation = geolocation; } if (!String.IsNullOrEmpty(destination)) { Destination dest = new Destination(); dest.code = destination; if (zone != null) { dest.zone = zone.Value; } availabilityRQ.destination = dest; } if (matchingKeywords != null && matchingKeywords.Count > 0) { availabilityRQ.keywords = new KeywordsFilter(matchingKeywords.ToList <int>(), keywordsMatcher.Equals(Matcher.ALL));// matchingKeywords.ToList(); } if (includeHotels != null && includeHotels.Count > 0 && excludeHotels != null && excludeHotels.Count > 0) { foreach (int e in excludeHotels) { includeHotels.RemoveAll(i => i == e); } } if (includeHotels != null && includeHotels.Count > 0) { HotelsFilter hotelsFilter = new HotelsFilter(); hotelsFilter.included = true; hotelsFilter.hotel = includeHotels; hotelsFilter.type = (useGiataCodes) ? SimpleTypes.HotelCodeType.GIATA : SimpleTypes.HotelCodeType.HOTELBEDS; availabilityRQ.hotels = hotelsFilter; } else if (excludeHotels != null && excludeHotels.Count > 0) { HotelsFilter hotelsFilter = new HotelsFilter(); hotelsFilter.included = false; hotelsFilter.hotel = excludeHotels; hotelsFilter.type = (useGiataCodes) ? SimpleTypes.HotelCodeType.GIATA : SimpleTypes.HotelCodeType.HOTELBEDS; availabilityRQ.hotels = hotelsFilter; } if (includeBoards != null && includeBoards.Count > 0) { Boards boardFilter = new Boards(); boardFilter.included = true; boardFilter.board = includeBoards; availabilityRQ.boards = boardFilter; } else if (excludeBoards != null && excludeBoards.Count > 0) { Boards boardFilter = new Boards(); boardFilter.included = false; boardFilter.board = excludeBoards; availabilityRQ.boards = boardFilter; } if (includeRoomCodes != null && includeRoomCodes.Count > 0) { Rooms roomFilter = new Rooms(); roomFilter.included = true; roomFilter.room = includeRoomCodes; availabilityRQ.rooms = roomFilter; } else if (excludeRoomCodes != null && excludeRoomCodes.Count > 0) { Rooms roomFilter = new Rooms(); roomFilter.included = false; roomFilter.room = excludeRoomCodes; availabilityRQ.rooms = roomFilter; } availabilityRQ.dailyRate = dailyRate; if (ofTypes != null && ofTypes.Count > 0) { availabilityRQ.accommodations = new List <SimpleTypes.AccommodationType>(); availabilityRQ.accommodations.AddRange(ofTypes); } List <ReviewFilter> reviewsFilter = new List <ReviewFilter>(); if (hbScoreHigherThan != null || hbScoreLowerThan != null || numberOfHBReviewsHigherThan != null) { ReviewFilter reviewFilter = new ReviewFilter(); if (hbScoreLowerThan.HasValue) { reviewFilter.maxRate = hbScoreLowerThan.Value; } if (hbScoreHigherThan.HasValue) { reviewFilter.minRate = hbScoreHigherThan.Value; } if (numberOfHBReviewsHigherThan.HasValue) { reviewFilter.minReviewCount = numberOfHBReviewsHigherThan.Value; } reviewFilter.type = SimpleTypes.ReviewsType.HOTELBEDS; reviewsFilter.Add(reviewFilter); } if (tripAdvisorScoreHigherThan != null || tripAdvisorScoreLowerThan != null || numberOfTripAdvisorReviewsHigherThan != null) { ReviewFilter reviewFilter = new ReviewFilter(); if (tripAdvisorScoreLowerThan.HasValue) { reviewFilter.maxRate = tripAdvisorScoreLowerThan.Value; } if (tripAdvisorScoreHigherThan.HasValue) { reviewFilter.minRate = tripAdvisorScoreHigherThan.Value; } if (numberOfTripAdvisorReviewsHigherThan.HasValue) { reviewFilter.minReviewCount = numberOfTripAdvisorReviewsHigherThan.Value; } reviewFilter.type = SimpleTypes.ReviewsType.TRIPDAVISOR; reviewsFilter.Add(reviewFilter); } if (reviewsFilter.Count > 1) { availabilityRQ.reviews = reviewsFilter; } if (limitHotelsTo != null || maxCategory != null || minCategory != null || limitRoomsPerHotelTo != null || limitRatesPerRoomTo != null || ratesLowerThan != null || ratesHigherThan != null || packaging != null || payed != null) { Filter filter = new Filter(); if (maxCategory.HasValue) { filter.maxCategory = maxCategory.Value; } if (minCategory.HasValue) { filter.minCategory = minCategory.Value; } if (packaging.HasValue) { filter.packaging = packaging.Value; } if (limitHotelsTo.HasValue) { filter.maxHotels = limitHotelsTo.Value; } if (limitRoomsPerHotelTo.HasValue) { filter.maxRooms = limitRoomsPerHotelTo.Value; } if (limitRatesPerRoomTo.HasValue) { filter.maxRatesPerRoom = limitRatesPerRoomTo.Value; } if (ratesLowerThan.HasValue) { filter.maxRate = ratesLowerThan.Value; } if (ratesHigherThan.HasValue) { filter.minRate = ratesHigherThan.Value; } if (payed.HasValue) { switch (payed.Value) { case Pay.AT_HOTEL: filter.paymentType = SimpleTypes.ShowDirectPaymentType.AT_HOTEL; break; case Pay.AT_WEB: filter.paymentType = SimpleTypes.ShowDirectPaymentType.AT_WEB; break; case Pay.INDIFFERENT: filter.paymentType = SimpleTypes.ShowDirectPaymentType.BOTH; break; } } availabilityRQ.filter = filter; } availabilityRQ.Validate(); return(availabilityRQ); } catch (Exception e) { throw e; } }
public async Task <ActionResult <ListResponse <ReviewResponse> > > GetReviewsListAsync([FromQuery] ReviewFilter review, [FromQuery] ListOptions options, [FromServices] ListQuery <ReviewResponse, ReviewFilter> query) => await query.RunAsync(review, options);