public async void Reviews_UpdateAsync_PositiveAndNegative_Test()
        {
            var options = new DbContextOptionsBuilder <DreamFoodDeliveryContext>()
                          .UseInMemoryDatabase(databaseName: "Reviews_UpdateAsync_PositiveAndNegative_Test")
                          .Options;

            using (var context = new DreamFoodDeliveryContext(options))
            {
                context.AddRange(_reviews);
                int sum = 0;
                for (int i = 0; i < _reviews.Count; i++)
                {
                    sum += _reviews[i].Rating.Value;
                }
                RatingDB rating = new RatingDB()
                {
                    Sum   = sum,
                    Count = _reviews.Count
                };
                context.Add(rating);
                await context.SaveChangesAsync();
            }

            using (var context = new DreamFoodDeliveryContext(options))
            {
                var review = await context.Reviews.AsNoTracking().FirstOrDefaultAsync();

                var rating = await context.Rating.AsNoTracking().FirstOrDefaultAsync();

                var service = new ReviewService(_mapper, context);

                ReviewToUpdate updateReview = new ReviewToUpdate()
                {
                    Id       = review.Id.ToString(),
                    Headline = "Headline",
                    Content  = "Content",
                    Rating   = 1
                };

                ReviewToUpdate failReview = new ReviewToUpdate()
                {
                    Id       = new Guid().ToString(),
                    Headline = "Headline",
                    Content  = "Content",
                    Rating   = 0
                };

                var resultPositive = await service.UpdateAsync(updateReview);

                var resultNegative = await service.UpdateAsync(failReview);

                resultPositive.IsSuccess.Should().BeTrue();
                resultPositive.Data.Headline.Should().BeEquivalentTo(updateReview.Headline);
                resultPositive.Data.Headline.Should().NotBeEquivalentTo(review.Headline);

                resultNegative.IsSuccess.Should().BeFalse();
            }
        }
        public async Task <Result <ReviewView> > UpdateAsync(ReviewToUpdate review, CancellationToken cancellationToken = default)
        {
            ReviewDB reviewForUpdate = _mapper.Map <ReviewDB>(review);
            ReviewDB reviewOld       = await _context.Reviews.AsNoTracking().FirstOrDefaultAsync(_ => _.Id == Guid.Parse(review.Id));

            if (reviewOld is null)
            {
                return(Result <ReviewView> .Quite <ReviewView>(ExceptionConstants.REVIEW_WAS_NOT_FOUND));
            }
            var rating = await _context.Rating.AsNoTracking().FirstOrDefaultAsync(cancellationToken);

            if (rating is null)
            {
                rating = new RatingDB()
                {
                    Count = 0, Sum = 0
                };
                _context.Rating.Add(rating);
            }
            rating.Sum = rating.Sum.Value - reviewOld.Rating + reviewForUpdate.Rating;
            _context.Entry(rating).Property(c => c.Sum).IsModified = true;
            reviewForUpdate.Id = Guid.Parse(review.Id);
            reviewForUpdate.ModificationTime = DateTime.Now;
            _context.Entry(reviewForUpdate).Property(c => c.Headline).IsModified         = true;
            _context.Entry(reviewForUpdate).Property(c => c.Rating).IsModified           = true;
            _context.Entry(reviewForUpdate).Property(c => c.Content).IsModified          = true;
            _context.Entry(reviewForUpdate).Property(c => c.ModificationTime).IsModified = true;

            try
            {
                await _context.SaveChangesAsync();

                var reviewAfterUpdate = await _context.Reviews.Where(_ => _.Id == Guid.Parse(review.Id)).AsNoTracking().FirstOrDefaultAsync(cancellationToken);

                return(reviewAfterUpdate is null
                    ? Result <ReviewView> .Quite <ReviewView>(ExceptionConstants.REVIEW_WAS_NOT_FOUND)
                    : Result <ReviewView> .Ok(_mapper.Map <ReviewView>(reviewAfterUpdate)));
            }
            catch (DbUpdateConcurrencyException ex)
            {
                return(Result <ReviewView> .Fail <ReviewView>(ExceptionConstants.CANNOT_UPDATE_MODEL + ex.Message));
            }
            catch (DbUpdateException ex)
            {
                return(Result <ReviewView> .Fail <ReviewView>(ExceptionConstants.CANNOT_UPDATE_MODEL + ex.Message));
            }
        }
Example #3
0
        public async Task <IActionResult> Update([FromBody, CustomizeValidator] ReviewToUpdate review, CancellationToken cancellationToken = default)
        {
            if (review is null || !ModelState.IsValid)
            {
                return(BadRequest(ModelState));
            }
            try
            {
                var result = await _reviewService.UpdateAsync(review, cancellationToken);

                return(result.IsError ? throw new InvalidOperationException(result.Message) : (IActionResult)Ok(result.Data));
            }
            catch (InvalidOperationException ex)
            {
                Log.Error(ex, ex.Message);
                return(StatusCode(StatusCodes.Status500InternalServerError, new CustumResult()
                {
                    Status = StatusCodes.Status500InternalServerError, Message = ex.Message
                }));
            }
        }