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