/// <summary>
        /// Remove um livro.
        /// </summary>
        /// <param name="viewModel">ViewModel com as informações do livro.</param>
        /// <returns></returns>
        public async Task <bool> DeleteBook(BookViewModel viewModel)
        {
            var book = viewModel.AutoMapear <BookViewModel, Book>();

            _bookRepository.Delete(book);
            await Commit();

            return(OperationSuccesful);
        }
        /// <summary>
        /// Cadastra um novo livro.
        /// </summary>
        /// <param name="viewModel">ViewModel com as informações do livro.</param>
        /// <returns></returns>
        public async Task <BookViewModel> AddBook(BookViewModel viewModel)
        {
            #region Validação da regra de negócios

            if (await _bookRepository.Exists(p => p.Title == viewModel.Title))
            {
                ModelError = string.Format(Criticas.Ja_Cadastrado_0, "Livro");
                return(viewModel);
            }
            else if (viewModel.CategoriesList.Count == 0)
            {
                ModelError = "Nenhum gênero informado para o livro.";
                return(viewModel);
            }

            #endregion

            var book = viewModel.AutoMapear <BookViewModel, Book>();

            //Convertendo a imagem de string para byte[].
            book.SetCoverImage(viewModel.CoverImageBase64);

            _bookRepository.Insert(book);

            #region Inserindo categorias

            if (viewModel.CategoriesList.Count > 0)
            {
                var bookId = _bookRepository.GetInsertCurrentKey(book, p => p.BookId);

                foreach (var categoryId in viewModel.CategoriesList)
                {
                    var bookCategory = new BookCategory(bookId, categoryId);
                    _bookCategoryRepository.Insert(bookCategory);
                }
            }

            #endregion

            await Commit();

            //Recuperando o valor recebido pelo BookId.
            viewModel.BookId = book.BookId;

            return(viewModel);
        }
        /// <summary>
        /// Altera informações de um livro cadastrado.
        /// </summary>
        /// <param name="viewModel">ViewModel com as informações do livro.</param>
        /// <returns></returns>
        public async Task <BookViewModel> UpdateBook(BookViewModel viewModel)
        {
            #region Validação da regra de negócios

            if (await _bookRepository.Exists(p => p.Title == viewModel.Title && p.BookId != viewModel.BookId))
            {
                ModelError = string.Format(Criticas.Ja_Existe_0, "outro Livro com este título.");
                return(viewModel);
            }
            else if (viewModel.CategoriesList.Count == 0)
            {
                ModelError = "Nenhum gênero informado para o livro.";
                return(viewModel);
            }

            #endregion

            var book = viewModel.AutoMapear <BookViewModel, Book>();

            //Convertendo a imagem de string para byte[].
            book.SetCoverImage(viewModel.CoverImageBase64);

            _bookRepository.Update(book);

            #region Inserindo categorias

            _bookCategoryRepository.Delete(p => p.BookId == book.BookId);

            if (viewModel.CategoriesList.Count > 0)
            {
                foreach (var categoryId in viewModel.CategoriesList)
                {
                    var bookCategory = new BookCategory(book.BookId, categoryId);
                    _bookCategoryRepository.Insert(bookCategory);
                }
            }

            #endregion

            await Commit();

            return(viewModel);
        }