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)); } }
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 })); } }