예제 #1
0
        public IActionResult UpdateBookForAuthor(Guid authorId, Guid id, [FromBody] BookForUpdateDto book)
        {
            if (book == null)
            {
                return(BadRequest());
            }

            if (book.Title == book.Description)
            {
                ModelState.AddModelError(nameof(BookForUpdateDto), "O título e descrição devem ser diferentes.");
            }

            if (!ModelState.IsValid)
            {
                return(new UnprocessableEntityObjectResult(ModelState));
            }

            if (LibraryRepository.AuthorNotExists(authorId))
            {
                return(NotFound());
            }

            var bookForAuthorFromRepository = LibraryRepository.GetBookForAuthor(authorId, id);

            if (bookForAuthorFromRepository == null)
            {
                var bookToAdd = Mapper.Map <Book>(book);
                bookToAdd.Id = id;

                LibraryRepository.AddBookForAuthor(authorId, bookToAdd);

                if (LibraryRepository.NotSave())
                {
                    throw new Exception($"Upserting book {id} for author {authorId} failed on save.");
                }

                var bookToReturn = Mapper.Map <BookDto>(bookToAdd);

                return(CreatedAtRoute("GetBookForAuthor",
                                      new { authorId, bookId = bookToReturn.Id },
                                      bookToReturn));
            }

            Mapper.Map(book, bookForAuthorFromRepository);

            LibraryRepository.UpdateBookForAuthor(bookForAuthorFromRepository);

            if (LibraryRepository.NotSave())
            {
                throw new Exception($"Updating book {id} for author {authorId} failed on save.");
            }

            return(NoContent());
        }
예제 #2
0
        public IActionResult PartiallyUpdateBookForAuthor(Guid authorId, Guid id,
                                                          [FromBody] JsonPatchDocument <BookForUpdateDto> patchDocument)
        {
            if (patchDocument == null)
            {
                return(BadRequest());
            }

            if (LibraryRepository.AuthorNotExists(authorId))
            {
                return(NotFound());
            }

            var bookForAuthorFromRepo = LibraryRepository.GetBookForAuthor(authorId, id);

            if (bookForAuthorFromRepo == null)
            {
                var bookDto = new BookForUpdateDto();
                patchDocument.ApplyTo(bookDto, ModelState);

                if (bookDto.Title == bookDto.Description)
                {
                    ModelState.AddModelError(nameof(BookForUpdateDto), "The provided description should be different from the title.");
                }

                TryValidateModel(bookDto);

                if (!ModelState.IsValid)
                {
                    return(new UnprocessableEntityObjectResult(ModelState));
                }

                var bookToAdd = Mapper.Map <Book>(bookDto);
                bookToAdd.Id = id;

                LibraryRepository.AddBookForAuthor(authorId, bookToAdd);

                if (LibraryRepository.NotSave())
                {
                    throw new Exception($"Upserting book {id} for author {authorId} failed on save.");
                }

                var bookToReturn = Mapper.Map <BookDto>(bookToAdd);

                return(CreatedAtRoute("GetBookForAuthor",
                                      new { authorId, bookId = bookToReturn.Id },
                                      bookToReturn));
            }

            var bookToPatch = Mapper.Map <BookForUpdateDto>(bookForAuthorFromRepo);

            //patchDocument.ApplyTo(bookToPatch, ModelState);

            patchDocument.ApplyTo(bookToPatch);

            if (bookToPatch.Title == bookToPatch.Description)
            {
                ModelState.AddModelError(nameof(BookForUpdateDto), "The provided description should be different from the title.");
            }

            TryValidateModel(bookToPatch);

            if (!ModelState.IsValid)
            {
                return(new UnprocessableEntityObjectResult(ModelState));
            }

            Mapper.Map(bookToPatch, bookForAuthorFromRepo);

            LibraryRepository.UpdateBookForAuthor(bookForAuthorFromRepo);

            if (LibraryRepository.NotSave())
            {
                throw new Exception($"Patching book {id} for author {authorId} failed on save.");
            }

            return(NoContent());
        }