public async Task AddBookAsync(NewBookDto bookDto) { await _newBookLock.WaitAsync(); try { var bookAlreadyExists = await _booksDbSet .AnyAsync(book => (bookDto.Isbn != null && book.Code == bookDto.Isbn && book.OrganizationId == bookDto.OrganizationId) || (bookDto.Isbn == null && book.OrganizationId == bookDto.OrganizationId && book.Title == bookDto.Title)); _bookServiceValidator.CheckIfBookAlreadyExists(bookAlreadyExists); await ValidateQuantifiedOfficesAsync(bookDto.QuantityByOffice.Select(o => o.OfficeId)); ValidateQuantitiesValues(bookDto.QuantityByOffice.Select(o => o.BookQuantity)); var newBook = MapNewBookToEntity(bookDto); _booksDbSet.Add(newBook); bookDto.QuantityByOffice .Where(office => office.BookQuantity > BookQuantityZero) .ForEach(office => _bookOfficesDbSet.Add(MapBookDtoToBookOfficeEntity(newBook, office, bookDto.UserId))); await _uow.SaveChangesAsync(false); } finally { _newBookLock.Release(); } }
public IActionResult CreateBookForAuthor(int authorId, [FromBody] NewBookDto book) { if (book == null) { return(BadRequest()); } if (book.Title.Equals(book.Description)) { ModelState.AddModelError(nameof(BookDto), "Title and description of book can't be same"); } if (!ModelState.IsValid) { return(new UnProcessableEntityObjectResult(ModelState)); } var bookEntity = Mapper.Map <Data.Book>(book); this.repository.AddBookForAuthor(authorId, bookEntity); if (!repository.Save()) { throw new Exception("Adding book for an author failed on save"); } var newBook = Mapper.Map <BookDto>(bookEntity); return(CreatedAtRoute("GetBook", new { authorId = authorId, bookId = newBook.Id }, newBook)); }
public async Task Should_Create_New_Book_And_Book_Office() { MockCreateNewBook(); var newBookDto = new NewBookDto { Author = "test", Isbn = "123", OrganizationId = 2, Title = "test", QuantityByOffice = new List <NewBookQuantityDto> { new NewBookQuantityDto { OfficeId = 1, BookQuantity = 0 }, new NewBookQuantityDto { OfficeId = 2, BookQuantity = 5 } }, UserId = "testUserId" }; await _bookService.AddBookAsync(newBookDto); _booksDbSet.Received(1).Add(Arg.Any <Book>()); _bookOfficesDbSet.Received(1).Add(Arg.Any <BookOffice>()); }
public void Should_Throw_On_Add_Book_If_Quantity_Is_Zero() { _booksDbSet.SetDbSetDataForAsync(new List <Book>()); var offices = new List <Office> { new Office { Id = 1 } }; _officesDbSet.SetDbSetDataForAsync(offices); var newBookDto = new NewBookDto { Author = "test", Isbn = "123", OrganizationId = 2, Title = "test", QuantityByOffice = new List <NewBookQuantityDto> { new NewBookQuantityDto { OfficeId = 1, BookQuantity = 0 } }, UserId = "testUserId" }; Assert.ThrowsAsync <BookException>(async() => await _bookService.AddBookAsync(newBookDto)); }
public void Should_Throw_On_Add_Book_If_Incorrect_Office_Is_Provided() { _booksDbSet.SetDbSetDataForAsync(new List <Book>()); _officesDbSet.SetDbSetDataForAsync(new List <Office>()); var newBookDto = new NewBookDto { Author = "test", Isbn = "123", OrganizationId = 2, Title = "test", QuantityByOffice = new List <NewBookQuantityDto> { new NewBookQuantityDto { OfficeId = 1, BookQuantity = 0 }, new NewBookQuantityDto { OfficeId = 2, BookQuantity = 0 } }, UserId = "testUserId" }; Assert.ThrowsAsync <ArgumentException>(async() => await _bookService.AddBookAsync(newBookDto)); }
private static Book MapNewBookToEntity(NewBookDto bookDto) { return(new Book { Author = bookDto.Author, Code = bookDto.Isbn, Created = DateTime.UtcNow, CreatedBy = bookDto.UserId, Modified = DateTime.UtcNow, OrganizationId = bookDto.OrganizationId, Title = bookDto.Title, Url = bookDto.Url, ApplicationUserId = bookDto.OwnerId, Note = bookDto.Note }); }