public async Task <Result <ReviewView> > AddAsync(ReviewToAdd review, string userIdFromIdentity, CancellationToken cancellationToken = default)
        {
            UserDB userDB = await _context.Users.Where(_ => _.IdFromIdentity == userIdFromIdentity).Select(_ => _).AsNoTracking().FirstOrDefaultAsync(cancellationToken);

            var reviewToAdd = _mapper.Map <ReviewDB>(review);

            reviewToAdd.UserId  = userDB.Id;
            reviewToAdd.OrderId = Guid.Parse(review.OrderId);
            _context.Reviews.Add(reviewToAdd);
            var rating = await _context.Rating.FirstOrDefaultAsync(cancellationToken);

            if (rating  is null)
            {
                rating = new RatingDB()
                {
                    Count = 0, Sum = 0
                };
                _context.Rating.Add(rating);
            }
            rating.Sum += reviewToAdd.Rating;
            rating.Count++;
            _context.Entry(rating).Property(c => c.Sum).IsModified   = true;
            _context.Entry(rating).Property(c => c.Count).IsModified = true;
            try
            {
                await _context.SaveChangesAsync(cancellationToken);

                ReviewDB reviewAfterAdding = await _context.Reviews.Where(_ => _.Id == reviewToAdd.Id).Select(_ => _).AsNoTracking().FirstOrDefaultAsync(cancellationToken);

                return(Result <ReviewView> .Ok(_mapper.Map <ReviewView>(reviewAfterAdding)));
            }
            catch (DbUpdateConcurrencyException ex)
            {
                return(Result <ReviewView> .Fail <ReviewView>(ExceptionConstants.CANNOT_SAVE_MODEL + ex.Message));
            }
            catch (DbUpdateException ex)
            {
                return(Result <ReviewView> .Fail <ReviewView>(ExceptionConstants.CANNOT_SAVE_MODEL + ex.Message));
            }
            catch (ArgumentNullException ex)
            {
                return(Result <ReviewView> .Fail <ReviewView>(ExceptionConstants.SOURCE_IS_NULL + ex.Message));
            }
        }
예제 #2
0
        public async Task <IActionResult> Create([FromBody, CustomizeValidator] ReviewToAdd review, CancellationToken cancellationToken = default)
        {
            if (!ModelState.IsValid)
            {
                return(BadRequest(ModelState));
            }
            try
            {
                var result = await _reviewService.AddAsync(review, HttpContext.User.Claims.Single(_ => _.Type == "id").Value, 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
                }));
            }
        }