Beispiel #1
0
        private void RemoveBookCategories(CreateEditBookServiceModel model, bool saveChanges)
        {
            if (model.BookCategories.Any())
            {
                var book = GetBook(model.Id);
                var categoriesToBeRemoved = model.BookCategories
                                            .Where(c => c.IsRemoved)
                                            .ToList();

                foreach (var category in categoriesToBeRemoved)
                {
                    // Remove the marked category from database and then remove it from model.
                    var dbSubcategory = _dbContext.SubCategories.Find(category.Subcategory.Id);

                    book.SubCategories.Remove(dbSubcategory);
                    model.BookCategories.Remove(
                        model.BookCategories.SingleOrDefault(c => c.Subcategory.Id == dbSubcategory.Id));
                }

                if (saveChanges)
                {
                    _dbContext.SaveChanges();
                }
            }
        }
Beispiel #2
0
        private void RemoveBookCopies(CreateEditBookServiceModel model, Dictionary <string, string> modelErrors, bool saveChanges)
        {
            if (model.BookCopies.Any())
            {
                var bookCopiesToBeRemoved = model.BookCopies
                                            .Where(bc => bc.IsToBeDeleted)
                                            .ToList();

                foreach (var bookCopy in bookCopiesToBeRemoved)
                {
                    if (!IsNewBookCopy(bookCopy.Id))
                    {
                        // Remove the marked book copy from database and then remove it from model.
                        try
                        {
                            DeleteBookCopy(bookCopy.Id);
                            model.BookCopies.Remove(bookCopy);
                        }
                        catch (BookCopyNotAvailableException)
                        {
                            modelErrors.Add("Book Copy", "Book copy with Id # = " + bookCopy.Id + " is currently involved in loans. Unable to remove it.");
                        }
                        catch (KeyNotFoundException)
                        {
                            modelErrors.Add("Book Copy", "Book copy with Id # = " + bookCopy.Id + " is not found. Someone may have already deleted it. Please reload page to see latest changes.");
                        }
                    }
                }

                if (saveChanges)
                {
                    _dbContext.SaveChanges();
                }
            }
        }
Beispiel #3
0
        public void RemoveDataFromDatabase(CreateEditBookServiceModel model, Dictionary <string, string> modelErrors)
        {
            var bookCopiesToBeRemoved     = model.BookCopies.Where(bc => bc.IsToBeDeleted).ToList();
            var allBookCopiesAreRemovable = true;

            foreach (var bookCopy in bookCopiesToBeRemoved)
            {
                if (!IsBookCopyRemovable(bookCopy.Id))
                {
                    allBookCopiesAreRemovable = false;
                    break;
                }
            }

            if (allBookCopiesAreRemovable)
            {
                bool saveChanges = true;

                RemoveBookCopies(model, modelErrors, saveChanges);

                RemoveAuthors(model, saveChanges);

                RemoveBookCategories(model, saveChanges);
            }
        }
Beispiel #4
0
        private void ValidateBookCopiesNumber(CreateEditBookServiceModel model, Dictionary <string, string> modelErrors)
        {
            var limit = int.Parse(ConfigurationManager.AppSettings["ListLimitNumber"]);

            if (model.BookCopies.Where(bc => !bc.IsToBeDeleted).Count() > limit)
            {
                modelErrors.Add("Book Copies", "Book Copies number is too large.");
            }
        }
Beispiel #5
0
 public void CreateEdit(CreateEditBookServiceModel model, string imagePath)
 {
     if (model.Id <= 0)
     {
         // Create.
         Create(model, imagePath);
     }
     else
     {
         // Edit.
         Edit(model, imagePath);
     }
 }
Beispiel #6
0
        private void ValidateISBN(CreateEditBookServiceModel model, Dictionary <string, string> modelErrors)
        {
            var book = GetBook(model.Id);

            // Validate ISBN to be unique if it has changed or is new.
            if (book == null || (book != null && model.ISBN != book.ISBN))
            {
                if (!IsValidISBN(model.ISBN))
                {
                    modelErrors.Add("ISBN", "A book with this ISBN already exists");
                }
            }
        }
Beispiel #7
0
        private void ValidateAuthorsNumber(CreateEditBookServiceModel model, Dictionary <string, string> modelErrors)
        {
            // Validate authors number to be less than limit.
            var limit = int.Parse(ConfigurationManager.AppSettings["ListLimitNumber"]);

            if (model.Authors.Where(a => !a.IsRemoved).Count() > limit)
            {
                modelErrors.Add("Authors", "Authors number is too large.");
            }

            // Validate authors number to be at least one.
            if (!model.Authors.Any())
            {
                modelErrors.Add("Authors", "There has to be at least one author.");
            }
        }
Beispiel #8
0
 private void RemoveDupliacteAuthors(CreateEditBookServiceModel model)
 {
     // Remove duplicate authors from model.
     if (model.Authors.Any())
     {
         model.Authors = model.Authors
                         .GroupBy(a => new
         {
             a.AuthorName.FirstName,
             a.AuthorName.MiddleName,
             a.AuthorName.LastName
         })
                         .Select(g => g.First())
                         .ToList();
     }
 }
Beispiel #9
0
        private void ValidateBookCategoriesNumber(CreateEditBookServiceModel model, Dictionary <string, string> modelErrors)
        {
            // Validate book categories number to be less than limit.
            var limit = int.Parse(ConfigurationManager.AppSettings["ListLimitNumber"]);

            if (model.BookCategories.Where(bc => !bc.IsRemoved).Count() > limit)
            {
                modelErrors.Add("Book Categories", "Book Categories number is too large.");
            }

            // Validate book categories number to be at least one.
            if (!model.BookCategories.Any())
            {
                modelErrors.Add("BookCategories",
                                "There has to be at least one book category.");
            }
        }
Beispiel #10
0
        private void RemoveMarkedAuthorsFromModel(CreateEditBookServiceModel model)
        {
            // Remove Authors only from model only if not in book.
            if (model.Authors != null && model.Authors.Any())
            {
                var book = GetBook(model.Id);
                var authorsToBeRemoved = model.Authors.Where(a => a.IsRemoved).ToList();

                foreach (var author in authorsToBeRemoved)
                {
                    if (book == null || (book != null && !book.Authors.Any(a => a.Id == author.Id)))
                    {
                        model.Authors.Remove(author);
                    }
                }
            }
        }
Beispiel #11
0
        private void RemoveMarkedBookCopiesFromModel(CreateEditBookServiceModel model)
        {
            // Remove Book copies only from model only if not in book.
            if (model.BookCopies.Any())
            {
                var book = GetBook(model.Id);
                var bookCopiesToBeDeleted = model.BookCopies.Where(bc => bc.IsToBeDeleted).ToList();

                foreach (var bookCopy in bookCopiesToBeDeleted)
                {
                    if (book == null || (book != null && !book.BookCopies.Any(a => a.Id == bookCopy.Id)))
                    {
                        model.BookCopies.Remove(bookCopy);
                    }
                }
            }
        }
Beispiel #12
0
        private void RemoveMarkedBookCategoriesFromModel(CreateEditBookServiceModel model)
        {
            // Remove marked categories only from model only if not in book.
            if (model.BookCategories.Any())
            {
                var book = GetBook(model.Id);
                var categoriesToBeRemoved = model.BookCategories.Where(c => c.IsRemoved).ToList();

                foreach (var category in categoriesToBeRemoved)
                {
                    if (book == null || (book != null && !book.SubCategories
                                         .Any(sc => sc.Id == category.Subcategory.Id)))
                    {
                        model.BookCategories.Remove(category);
                    }
                }
            }
        }
Beispiel #13
0
        public void CreateEditPreparations(CreateEditBookServiceModel model, out Dictionary <string, string> modelErrors)
        {
            modelErrors = new Dictionary <string, string>();

            // Format and trim model fields.
            model.ISBN        = FormatISBN(model.ISBN);
            model.Description = model.Description.Trim();
            FormatAuthorNames(model.Authors);

            // Remove elements that have to be deleted.
            RemoveMarkedBookCopiesFromModel(model);
            RemoveMarkedAuthorsFromModel(model);
            RemoveMarkedBookCategoriesFromModel(model);
            RemoveDupliacteAuthors(model);

            // Manually validate needed fields.
            ValidateISBN(model, modelErrors);
            ValidateAuthorsNumber(model, modelErrors);
            ValidateBookCopiesNumber(model, modelErrors);
            ValidateBookCategoriesNumber(model, modelErrors);
        }
Beispiel #14
0
        private void RemoveAuthors(CreateEditBookServiceModel model, bool saveChanges)
        {
            if (model.Authors.Any())
            {
                var book = GetBook(model.Id);

                var authorsToBeRemoved = model.Authors
                                         .Where(a => a.IsRemoved)
                                         .ToList();

                foreach (var author in authorsToBeRemoved)
                {
                    // Remove the marked auhots from database and then remove it from model.
                    var dbAuthor = _dbContext.Authors.Find(author.Id);
                    book.Authors.Remove(dbAuthor);
                    model.Authors.Remove(author);
                }

                if (saveChanges)
                {
                    _dbContext.SaveChanges();
                }
            }
        }
Beispiel #15
0
        private void Edit(CreateEditBookServiceModel model, string imagePath)
        {
            // Find and update book.
            Book book = GetBook(model.Id);

            if (model.Title != book.Title)
            {
                book.Title = model.Title;
            }

            if (model.Description != book.Description)
            {
                book.Description = model.Description;
            }

            if (model.ISBN != book.ISBN)
            {
                book.ISBN = model.ISBN;
            }

            if (model.PublishDate != book.PublishDate)
            {
                book.PublishDate = model.PublishDate;
            }

            // Delete old book cover image if new image was added.
            if (!string.IsNullOrEmpty(model.OldImagePath))
            {
                DeleteOldBookCoverImage(model.OldImagePath, imagePath);
            }

            // Save image from Url address in case image is imported.
            if (!string.IsNullOrEmpty(model.BookCover.FrontCover) &&
                model.BookCover.FrontCover.StartsWith("http"))
            {
                book.FrontCover = SaveImageFromUrl(model.BookCover.FrontCover, imagePath);
            }

            // Update image if was uploaded.
            if (model.BookCover.Image != null)
            {
                book.FrontCover = SaveImage(model.BookCover.Image, imagePath);
            }

            if (model.BookCopies.Any())
            {
                // Mark book copies as lost if needed.
                foreach (var bookCopy in model.BookCopies)
                {
                    if (bookCopy.IsLost != (book.BookCopies.FirstOrDefault(bc => bc.Id == bookCopy.Id)?.IsLost ?? false))
                    {
                        _librarianService.ChangeIsLostStatus(bookCopy.Id, bookCopy.IsLost);
                    }
                }

                // Update book copies if needed.
                foreach (var bookCopyModel in model.BookCopies)
                {
                    var bookCopy = _dbContext.BookCopies.Find(bookCopyModel.Id);

                    if (bookCopy != null && bookCopy.Condition != bookCopyModel.BookCondition)
                    {
                        // Update existing book copy.
                        bookCopy.Condition = bookCopyModel.BookCondition;
                    }
                    else if (bookCopy == null)
                    {
                        // Create and add new book copy.
                        var newBookCopy = new BookCopy()
                        {
                            Condition = bookCopyModel.BookCondition,
                            BookId    = book.Id
                        };

                        book.BookCopies.Add(newBookCopy);
                        _dbContext.SaveChanges();
                    }
                }
            }

            // Update authors.
            foreach (var authorModel in model.Authors)
            {
                // See if the book already has such an author.
                var bookAuthor = book.Authors
                                 .FirstOrDefault(a => a.FirstName == authorModel.AuthorName.FirstName &&
                                                 a.MiddleName == authorModel.AuthorName.MiddleName &&
                                                 a.LastName == authorModel.AuthorName.LastName);

                if (bookAuthor == null)
                {
                    // Check whether the author with same name already exists.
                    var authorByName = _dbContext.Authors
                                       .FirstOrDefault(a => a.FirstName == authorModel.AuthorName.FirstName &&
                                                       a.MiddleName == authorModel.AuthorName.MiddleName &&
                                                       a.LastName == authorModel.AuthorName.LastName);

                    if (authorByName != null)
                    {
                        book.Authors.Add(authorByName);
                    }
                    else
                    {
                        // Create and add new author.
                        Author newAuthor = new Author()
                        {
                            FirstName  = authorModel.AuthorName.FirstName,
                            MiddleName = authorModel.AuthorName.MiddleName,
                            LastName   = authorModel.AuthorName.LastName
                        };

                        _dbContext.Authors.Add(newAuthor);
                        book.Authors.Add(newAuthor);
                    }

                    // Select author from database with id coresponding to current author iterated from model.
                    var authorById = _dbContext.Authors.Find(authorModel.Id);

                    // If user edits existing author name, previous author is removed.
                    if (authorById != null)
                    {
                        if (authorById.FirstName != authorModel.AuthorName.FirstName ||
                            authorById.MiddleName != authorModel.AuthorName.MiddleName ||
                            authorById.LastName != authorModel.AuthorName.LastName)
                        {
                            book.Authors.Remove(authorById);
                        }
                    }
                }
            }

            // Update book categories if needed.
            foreach (var category in model.BookCategories)
            {
                if (!book.SubCategories.Any(sc => sc.Id == category.Subcategory.Id))
                {
                    // If the book has no such subcategory, add it.
                    var addedSubcategory = _dbContext.SubCategories.Find(category.Subcategory.Id);
                    book.SubCategories.Add(addedSubcategory);
                }
            }

            _dbContext.SaveChanges();
        }
Beispiel #16
0
        private void Create(CreateEditBookServiceModel model, string imagePath)
        {
            // Create new book.
            var book = new Book()
            {
                Id          = model.Id,
                Title       = model.Title,
                Description = model.Description,
                ISBN        = model.ISBN,
                PublishDate = model.PublishDate
            };

            // Add front cover.
            if (!string.IsNullOrEmpty(model.BookCover.FrontCover))
            {
                book.FrontCover = SaveImageFromUrl(model.BookCover.FrontCover, imagePath);
            }
            else
            {
                book.FrontCover = SaveImage(model.BookCover.Image, imagePath);
            }

            // Add book copies.
            foreach (var bookCopy in model.BookCopies)
            {
                book.BookCopies.Add(new BookCopy
                {
                    Condition = bookCopy.BookCondition
                });
            }

            // Add authors.
            foreach (var author in model.Authors)
            {
                // Try to find author with the same name and link to existing author.
                Author existingAuthor = _dbContext.Authors
                                        .FirstOrDefault(a => a.FirstName == author.AuthorName.FirstName &&
                                                        a.MiddleName == author.AuthorName.MiddleName &&
                                                        a.LastName == author.AuthorName.LastName);

                if (existingAuthor != null)
                {
                    book.Authors.Add(existingAuthor);
                }
                else
                {
                    book.Authors.Add(new Author
                    {
                        FirstName  = author.AuthorName.FirstName,
                        MiddleName = author.AuthorName.MiddleName,
                        LastName   = author.AuthorName.LastName
                    });
                }
            }

            // Add categories.
            foreach (var category in model.BookCategories)
            {
                var bookSubcategory = _dbContext.SubCategories
                                      .Find(category.Subcategory.Id);

                book.SubCategories.Add(bookSubcategory);
            }

            // Save book.
            _dbContext.Books.Add(book);
            _dbContext.SaveChanges();
        }