示例#1
0
        public async Task <IActionResult> Create([FromBody, CustomizeValidator] DishToAdd dish, CancellationToken cancellationToken = default)
        {
            if (!ModelState.IsValid)
            {
                return(BadRequest(ModelState));
            }
            try
            {
                var result = await _dishService.AddAsync(dish, cancellationToken);

                return(result.IsError ? throw new InvalidOperationException(result.Message)
                     : result.IsSuccess ? (IActionResult)Ok(result.Data)
                       //: BadRequest(new ProblemDetails() {
                       //    Detail = result.Message });
                     : StatusCode(StatusCodes.Status400BadRequest, result.Message));
            }
            catch (InvalidOperationException ex)
            {
                Log.Error(ex, ex.Message);
                return(StatusCode(StatusCodes.Status500InternalServerError, new CustumResult()
                {
                    Status = StatusCodes.Status500InternalServerError, Message = ex.Message
                }));
            }
        }
        public async void Dihes_AddAsync_Positive_Test()
        {
            var options = new DbContextOptionsBuilder <DreamFoodDeliveryContext>()
                          .UseInMemoryDatabase(databaseName: "Dihes_AddAsync_Positive_Test")
                          .Options;

            using (var context = new DreamFoodDeliveryContext(options))
            {
                var tagService = new TagService(_mapper, context);
                var service    = new DishService(_mapper, context, tagService);

                TagToAdd[] tags = new TagToAdd[] {
                    new TagToAdd
                    {
                        TagName = "New"
                    }
                };
                DishToAdd dish = new DishToAdd()
                {
                    Name        = "Name",
                    Composition = "Composition",
                    Description = "Description",
                    Weight      = "Weight",
                    TagNames    = new HashSet <TagToAdd>(tags)
                };

                var resultPositive = await service.AddAsync(dish);

                resultPositive.IsSuccess.Should().BeTrue();
                resultPositive.Data.Name.Should().BeEquivalentTo(dish.Name);
                resultPositive.Data.Composition.Should().BeEquivalentTo(dish.Composition);
                resultPositive.Data.Description.Should().BeEquivalentTo(dish.Description);
                resultPositive.Data.Weight.Should().BeEquivalentTo(dish.Weight);
            }
        }
        public async Task <Result <DishView> > AddAsync(DishToAdd dish, CancellationToken cancellationToken = default)
        {
            DishDB dishToAdd = _mapper.Map <DishDB>(dish);

            dishToAdd.Added = DateTime.UtcNow;
            _context.Dishes.Add(dishToAdd);
            try
            {
                await UpdateTagLinks(dish.TagNames, dishToAdd);

                await _context.SaveChangesAsync(cancellationToken);

                DishDB dishAfterAdding = await _context.Dishes.Where(_ => _.Id == dishToAdd.Id).Include(c => c.DishTags).ThenInclude(sc => sc.Tag).Select(_ => _).AsNoTracking().FirstOrDefaultAsync(cancellationToken);

                DishView view = _mapper.Map <DishView>(dishAfterAdding);
                view.TagList = CollectTagList(dishAfterAdding.DishTags, cancellationToken).Result;
                return(Result <DishView> .Ok(view));
            }
            catch (DbUpdateConcurrencyException ex)
            {
                return(Result <DishView> .Fail <DishView>(ExceptionConstants.CANNOT_SAVE_MODEL + ex.Message));
            }
            catch (DbUpdateException ex)
            {
                return(Result <DishView> .Fail <DishView>(ExceptionConstants.CANNOT_SAVE_MODEL + ex.Message));
            }
            catch (ArgumentNullException ex)
            {
                return(Result <DishView> .Fail <DishView>(ExceptionConstants.SOURCE_IS_NULL + ex.Message));
            }
        }