示例#1
0
 public static Task <ReviewsPage> NextPage(this ReviewsPage page, int fetchSize = 5)
 {
     if (page.NextKey == null)
     {
         throw new RegenException("There are no more reviews to fetch");
     }
     return(ReGenClient.Instance.Reviews.GetPage(page.RecipeId, page.NextKey, fetchSize));
 }
示例#2
0
        private void OnReviewsPage(object sender, EventArgs e)
        {
            var user        = (EmployeeViewModel)BindingContext;
            var reviewsPage = new ReviewsPage()
            {
                BindingContext = user.ReceivedReviews
            };

            Navigation.PushAsync(reviewsPage);
        }
示例#3
0
        public async Task <ReviewsPage> GetReviewsPageAsync(string recipeId, string pageStartKey, int pageSize)
        {
            try
            {
                // To-do: config options for index names and page sizes
                IReadOnlyCollection <FirebaseObject <Review> > results;

                if (!String.IsNullOrWhiteSpace(pageStartKey))
                {
                    results = await _client.Child("reviews")
                              .Child(recipeId)
                              .OrderByKey()
                              .EndAt(pageStartKey)
                              .LimitToLast(pageSize + 1)
                              .OnceAsync <Review>();
                }
                else
                {
                    results = await _client.Child("reviews")
                              .Child(recipeId)
                              .OrderByKey()
                              .LimitToLast(pageSize + 1)
                              .OnceAsync <Review>();
                }

                if (results.Count < 1)
                {
                    throw new NoResultsFoundException("No reviews found for recipe ID: " + recipeId);
                }


                //var ratings = results.Select(async o =>
                //    new KeyValuePair<string, int>
                //    (o.Object.UserId,
                //    await GetUserRatingAsync(o.Object.UserId, recipeId))
                //);

                // If the number of results is less than the requested page size, don't generate a "start key"
                var page = results.Count < pageSize ? results : results.Skip(1);

                var ratings = new Dictionary <string, int>();
                foreach (var r in page)
                {
                    var rating = await GetUserRatingAsync(r.Object.UserId, recipeId);

                    ratings.Add(r.Object.UserId, rating);
                }

                var reviews = from pair in page
                              select new Review
                {
                    RecipeId  = recipeId,
                    ReviewId  = pair.Key,
                    UserId    = pair.Object.UserId,
                    Content   = pair.Object.Content,
                    Timestamp = pair.Object.Timestamp,
                    Rating    = ratings[pair.Object.UserId]
                };

                var trimmedPage = reviews.Reverse();
                //trimmedPage.RemoveAt(trimmedPage.Count - 1);

                var reviewPage =
                    new ReviewsPage
                {
                    NextKey = results.Count < pageSize ? null : results.First().Key,
                    Reviews = trimmedPage
                };

                return(reviewPage);
            }
            catch (Exception)
            {
                throw;
            }
        }