Пример #1
0
        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();
            }
        }
Пример #2
0
        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));
        }
Пример #3
0
        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>());
        }
Пример #4
0
        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));
        }
Пример #5
0
        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));
        }
Пример #6
0
 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
     });
 }