Beispiel #1
0
        public async Task <IActionResult> InsertAsync(BookSaveRequestModel model)
        {
            try
            {
                if (ModelState.IsValid)
                {
                    var book = await repository.SaveAsync(model);

                    return(StatusCode(HttpStatusCode.Created, book));
                }
                else
                {
                    return(StatusCode(HttpStatusCode.BadRequest, String.Join(", ", ModelState.Values.Select(x => x.AttemptedValue))));
                }
            }
            catch (SomethingWrongException ex)
            {
                var exceptionDetails = ex.GetDetails();
                return(StatusCode(HttpStatusCode.Forbidden, ex.Message, exceptionDetails));
            }
            catch (Exception ex)
            {
                return(StatusCode(HttpStatusCode.InternalServerError, ex.Message));
            }
        }
Beispiel #2
0
        public async Task <IActionResult> UpdateAsync(string id, BookSaveRequestModel model)
        {
            try
            {
                if (!id.Equals(model.Id, StringComparison.OrdinalIgnoreCase))
                {
                    throw new InvalidRequestException <IEnumerable <string> >($"Request body is invalid.", new[] { "Book identifier does not match." });
                }

                if (ModelState.IsValid)
                {
                    var book = await repository.SaveAsync(model);

                    return(StatusCode(HttpStatusCode.Accepted, book));
                }
                else
                {
                    return(StatusCode(HttpStatusCode.BadRequest, String.Join(", ", ModelState.Values.Select(x => x.AttemptedValue))));
                }
            }
            catch (InvalidRequestException ex)
            {
                return(StatusCode(HttpStatusCode.BadRequest, ex.Message, ex.GetDetails()));
            }
            catch (RecordNotFoundException ex)
            {
                return(StatusCode(HttpStatusCode.NotFound, ex.Message));
            }
            catch (SomethingWrongException ex)
            {
                var exceptionDetails = ex.GetDetails();
                return(StatusCode(HttpStatusCode.Forbidden, ex.Message, exceptionDetails));
            }
            catch (Exception ex)
            {
                return(StatusCode(HttpStatusCode.InternalServerError, ex.Message));
            }
        }
        public async Task <BookModel> SaveAsync(BookSaveRequestModel model)
        {
            var bookId = model.Id;

            var book = dbContext.Books
                       .Include(x => x.Localizations)
                       .Where(b => !b.IsDeleted && b.Id == model.Id)
                       .FirstOrDefault();

            if (!String.IsNullOrWhiteSpace(model.Id) && book == null)
            {
                throw new RecordNotFoundException($"Could not find a book ({model.Id})");
            }

            var languages = dbContext.Languages.Where(language => !language.IsDeleted).AsNoTracking().ToList();

            var bookDetails = model.Details.Select(detail => new BookLocalization
            {
                LanguageId = languages.Where(x => x.Code == detail.LanguageCode).FirstOrDefault()?.Id,
                Title      = detail.Title,
                Author     = detail.Author
            }).ToList();


            if (model.UseTranslation)
            {
                var criteriaContent = model.Details.Where(x => x.LanguageCode == model.CriteriaLanguageCode).FirstOrDefault();

                if (criteriaContent != null)
                {
                    var criteriaLanguage = languages.Where(x => x.Code == model.CriteriaLanguageCode).FirstOrDefault();
                    var targetLanguages  = languages.Where(x => x.Code != model.CriteriaLanguageCode).ToList();

                    if (criteriaLanguage != null)
                    {
                        var translationResult = await translatorService.TranslateAsync(new RequestModel
                        {
                            Inputs = new[] {
                                new Input(criteriaContent.Title),
                                new Input(criteriaContent.Author)
                            },
                            ToLanguages  = targetLanguages.Select(x => x.Code).ToArray(),
                            FromLanguage = model.CriteriaLanguageCode,
                            TextType     = model.IsHtmlContent ? TextTypes.Html : TextTypes.Plain,
                            IsTranslationEachLanguage = model.IsTranslationEachLanguage,
                        });

                        var translationResultIndex = 0;

                        translationResult.ToList().ForEach(result =>
                        {
                            if (translationResultIndex == 0)
                            {
                                // Title
                                foreach (var t in result.Translations)
                                {
                                    // Translated language
                                    var language = languages.Where(x => x.Code.Equals(t.To, StringComparison.OrdinalIgnoreCase)).FirstOrDefault();
                                    if (language != null)
                                    {
                                        var bookDetail = bookDetails.Where(x => x.LanguageId == language.Id).FirstOrDefault();
                                        if (bookDetail == null)
                                        {
                                            bookDetails.Add(new BookLocalization
                                            {
                                                LanguageId = language.Id,
                                                Title      = t.Text,
                                            });
                                        }
                                        else
                                        {
                                            bookDetail.Title = t.Text;
                                        }
                                    }
                                }
                            }

                            if (translationResultIndex == 1)
                            {
                                // Author
                                foreach (var t in result.Translations)
                                {
                                    // Translated language
                                    var language = languages.Where(x => x.Code.Equals(t.To, StringComparison.OrdinalIgnoreCase)).FirstOrDefault();
                                    if (language != null)
                                    {
                                        var bookDetail = bookDetails.Where(x => x.LanguageId == language.Id).FirstOrDefault();
                                        if (bookDetail == null)
                                        {
                                            bookDetails.Add(new BookLocalization
                                            {
                                                LanguageId = language.Id,
                                                Author     = t.Text,
                                            });
                                        }
                                        else
                                        {
                                            bookDetail.Author = t.Text;
                                        }
                                    }
                                }
                            }

                            translationResultIndex++;
                        });
                    }
                }
            }

            if (book == null)
            {
                var newBooks = new Book
                {
                    Localizations = bookDetails,
                };

                var insertedEntry = dbContext.Books.Add(newBooks);

                bookId = insertedEntry.Entity.Id;
            }
            else
            {
                foreach (var detail in bookDetails)
                {
                    var detailValue = book.Localizations.Where(t => t.LanguageId == detail.LanguageId).FirstOrDefault();
                    if (detailValue != null)
                    {
                        detailValue.Title  = detail.Title;
                        detailValue.Author = detail.Author;
                    }
                    else
                    {
                        book.Localizations.Add(detail);
                    }
                }
            }

            await dbContext.SaveChangesAsync();

            var bookModel = await GetBookAsync(bookId);

            return(bookModel);
        }