public async Task <IActionResult> InsertAsync(PostSaveRequestModel model)
        {
            try
            {
                if (ModelState.IsValid)
                {
                    var post = await postsDomain.SaveUsingTextTranslationAsync(model);

                    return(StatusCode(HttpStatusCode.Created, post));
                }
                else
                {
                    throw new InvalidRequestException <IEnumerable <string> >("Request body is invalid.", ModelState.Values.Select(x => x.AttemptedValue));
                }
            }
            catch (OptionsValidationException ex)
            {
                return(StatusCode(HttpStatusCode.Forbidden, ex.Message, ex.Failures));
            }
            catch (InvalidRequestException ex)
            {
                return(StatusCode(HttpStatusCode.Forbidden, ex.Message, ex.GetDetails()));
            }
            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 <IActionResult> UpdateAsync(string id, PostSaveRequestModel model)
        {
            try
            {
                if (!id.Equals(model.Id, StringComparison.OrdinalIgnoreCase))
                {
                    throw new InvalidRequestException <IEnumerable <string> >($"Request body is invalid.", new[] { "Post identifier does not match." });
                }

                if (ModelState.IsValid)
                {
                    var post = await postsDomain.SaveUsingTextTranslationAsync(model);

                    return(StatusCode(HttpStatusCode.Accepted, post));
                }
                else
                {
                    throw new InvalidRequestException <IEnumerable <string> >("Request body is invalid.", 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));
            }
        }
Exemplo n.º 3
0
        /// <summary>
        /// Save a post data. It uses text translation on Azure Translator Service.
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        public async Task <PostDetailModel> SaveUsingTextTranslationAsync(PostSaveRequestModel model)
        {
            var languages = await languageRepository.GetAllAsync();

            var titleSet = model.PostContents.Select(postContent => new Localization
            {
                LanguageId = languages.Where(x => x.Code == postContent.LanguageCode).FirstOrDefault()?.Id,
                Value      = postContent.Title,
            }).ToList();

            var contentSet = model.PostContents.Select(postContent => new Localization
            {
                LanguageId = languages.Where(x => x.Code == postContent.LanguageCode).FirstOrDefault()?.Id,
                Value      = postContent.Content,
            }).ToList();

            if (model.UseTranslation)
            {
                var criteriaContent = model.PostContents.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 textTranslatorService.TranslateAsync(new RequestModel
                        {
                            Inputs = new[] {
                                new Input(criteriaContent.Title),
                                new Input(criteriaContent.Content)
                            },
                            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 title = titleSet.Where(x => x.LanguageId == language.Id).FirstOrDefault();
                                        if (title == null)
                                        {
                                            titleSet.Add(new Localization
                                            {
                                                LanguageId = language.Id,
                                                Value      = t.Text,
                                            });
                                        }
                                        else
                                        {
                                            title.Value = t.Text;
                                        }
                                    }
                                }
                            }

                            if (translationResultIndex == 1)
                            {
                                // Content
                                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 content = contentSet.Where(x => x.LanguageId == language.Id).FirstOrDefault();
                                        if (content == null)
                                        {
                                            contentSet.Add(new Localization
                                            {
                                                LanguageId = language.Id,
                                                Value      = t.Text,
                                            });
                                        }
                                        else
                                        {
                                            content.Value = t.Text;
                                        }
                                    }
                                }
                            }

                            translationResultIndex++;
                        });
                    }
                }
            }

            var post = await postRepository.SaveAsync(model.Id, titleSet, contentSet);

            return(post);
        }
Exemplo n.º 4
0
        public async Task <PostDetailModel> SaveUsingDocumentTranslationAsync(PostSaveRequestModel model)
        {
            var languages = await languageRepository.GetAllAsync();

            var titleSet = model.PostContents.Select(postContent => new Localization
            {
                LanguageId = languages.Where(x => x.Code == postContent.LanguageCode).FirstOrDefault()?.Id,
                Value      = postContent.Title,
            }).ToList();

            var contentSet = model.PostContents.Select(postContent => new Localization
            {
                LanguageId = languages.Where(x => x.Code == postContent.LanguageCode).FirstOrDefault()?.Id,
                Value      = postContent.Content,
            }).ToList();

            if (model.UseTranslation)
            {
                var criteriaContent = model.PostContents.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 textTranslatorService.TranslateAsync(new RequestModel
                        {
                            Inputs = new[] {
                                new Input(criteriaContent.Title),
                                //new Input(criteriaContent.Content)
                            },
                            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 title = titleSet.Where(x => x.LanguageId == language.Id).FirstOrDefault();
                                        if (title == null)
                                        {
                                            titleSet.Add(new Localization
                                            {
                                                LanguageId = language.Id,
                                                Value      = t.Text,
                                            });
                                        }
                                        else
                                        {
                                            title.Value = t.Text;
                                        }
                                    }
                                }
                            }

                            //if (translationResultIndex == 1)
                            //{
                            //    // Content
                            //    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 content = contentSet.Where(x => x.LanguageId == language.Id).FirstOrDefault();
                            //            if (content == null)
                            //            {
                            //                contentSet.Add(new Localization
                            //                {
                            //                    LanguageId = language.Id,
                            //                    Value = t.Text,
                            //                });
                            //            }
                            //            else
                            //            {
                            //                content.Value = t.Text;
                            //            }
                            //        }
                            //    }
                            //}

                            //translationResultIndex++;
                        });

                        // Source html file.
                        var sourceBlob = await storageService.CreateAsync(
                            GenerateNewDocumentName(".html"),
                            criteriaContent.Content,
                            "text/html");

                        var targets = targetLanguages.Select(language =>
                        {
                            var targetBlobName = namingStrategy.GetTranslatedDocumentName(sourceBlob.BlobName, language.Code);

                            return(new DocumentTranslationTarget
                            {
                                BlobName = targetBlobName,
                                LanguageCode = language.Code,
                                LanguageId = language.Id,
                                TargetInput = new DocumentTranslationRequestModels.TargetInput
                                {
                                    TargetUrl = storageService.GenerateBlobSasUri(targetBlobName),
                                    Language = language.Code,
                                    StorageSource = DocumentTranslationRequestModels.StorageSources.AzureBlob,
                                },
                            });
                        });

                        var documentTranslationRequestModel = new DocumentTranslationRequestModels.RequestModel
                        {
                            Inputs = new DocumentTranslationRequestModels.BatchInput[]
                            {
                                new DocumentTranslationRequestModels.BatchInput
                                {
                                    Source = new DocumentTranslationRequestModels.SourceInput
                                    {
                                        SourceUrl     = storageService.GenerateBlobSasUri(sourceBlob.BlobName),
                                        Language      = criteriaLanguage.Code,
                                        StorageSource = DocumentTranslationRequestModels.StorageSources.AzureBlob,
                                    },
                                    StorageType = DocumentTranslationRequestModels.StorageInputTypes.File,
                                    Targets     = targets.Select(x => x.TargetInput),
                                },
                            }
                        };

                        var documentTranslationResult = await documentTranslationService.RequestTranslation(documentTranslationRequestModel);

                        if (documentTranslationResult == null)
                        {
                            var statusCode = HttpStatusCode.NotAcceptable;
                            var message    = "Document translation failed.";
                            throw new ApiHttpStatusException <ErrorModel <int> >(
                                      statusCode,
                                      message,
                                      new ErrorModel <int>
                            {
                                Code    = (int)statusCode,
                                Message = message,
                            });
                        }

                        var translationJobCompleted = false;
                        do
                        {
                            await Task.Delay(TimeSpan.FromSeconds(1));

                            var jobStatusResult = await documentTranslationService.GetJobStatusAsync(documentTranslationResult.Id);

                            if (jobStatusResult.Status == kr.bbon.Azure.Translator.Services.Models.DocumentTranslation.GetJobStatus.JobStatus.Succeeded)
                            {
                                translationJobCompleted = true;
                                break;
                            }
                        } while (true);

                        if (translationJobCompleted)
                        {
                            #region translationJobCompleted

                            foreach (var target in targets)
                            {
                                using (var stream = await storageService.LoadBlob(target.BlobName))
                                {
                                    if (stream != null)
                                    {
                                        using (var reader = new StreamReader(stream))
                                        {
                                            var stringContent = await reader.ReadToEndAsync();

                                            if (!string.IsNullOrWhiteSpace(stringContent))
                                            {
                                                var content = contentSet.Where(x => x.LanguageId == target.LanguageId).FirstOrDefault();
                                                if (content == null)
                                                {
                                                    contentSet.Add(new Localization
                                                    {
                                                        LanguageId = target.LanguageId,
                                                        Value      = stringContent,
                                                    });
                                                }
                                                else
                                                {
                                                    content.Value = stringContent;
                                                }
                                            }
                                        }
                                    }
                                }

                                // Delete a translated file.
                                await storageService.DeleteAsync(target.BlobName);
                            }

                            #endregion

                            await storageService.DeleteAsync(sourceBlob.BlobName);
                        }
                    }
                }
            }

            var post = await postRepository.SaveAsync(model.Id, titleSet, contentSet);

            return(post);
        }
        public async Task <PostDetailModel> SaveAsync(PostSaveRequestModel model)
        {
            var postId = model.Id;

            var post = dbContext.Posts
                       .Include(post => post.Title).ThenInclude(localizationSet => localizationSet.Localizations)
                       .Include(post => post.Content).ThenInclude(localizationSet => localizationSet.Localizations)
                       .Where(post => !post.IsDeleted && post.Id == model.Id).FirstOrDefault();

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

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

            var titleSet = model.PostContents.Select(postContent => new Localization
            {
                LanguageId = languages.Where(x => x.Code == postContent.LanguageCode).FirstOrDefault()?.Id,
                Value      = postContent.Title,
            }).ToList();

            var contentSet = model.PostContents.Select(postContent => new Localization
            {
                LanguageId = languages.Where(x => x.Code == postContent.LanguageCode).FirstOrDefault()?.Id,
                Value      = postContent.Content,
            }).ToList();

            if (model.UseTranslation)
            {
                var criteriaContent = model.PostContents.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.Content)
                            },
                            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 title = titleSet.Where(x => x.LanguageId == language.Id).FirstOrDefault();
                                        if (title == null)
                                        {
                                            titleSet.Add(new Localization
                                            {
                                                LanguageId = language.Id,
                                                Value      = t.Text,
                                            });
                                        }
                                        else
                                        {
                                            title.Value = t.Text;
                                        }
                                    }
                                }
                            }

                            if (translationResultIndex == 1)
                            {
                                // Content
                                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 content = contentSet.Where(x => x.LanguageId == language.Id).FirstOrDefault();
                                        if (content == null)
                                        {
                                            contentSet.Add(new Localization
                                            {
                                                LanguageId = language.Id,
                                                Value      = t.Text,
                                            });
                                        }
                                        else
                                        {
                                            content.Value = t.Text;
                                        }
                                    }
                                }
                            }

                            translationResultIndex++;
                        });
                    }
                }
            }

            if (post == null)
            {
                var newPost = new Post
                {
                    Title = new LocalizationSet
                    {
                        Localizations = titleSet,
                    },
                    Content = new LocalizationSet
                    {
                        Localizations = contentSet,
                    },
                };

                var insertedPostEntry = dbContext.Posts.Add(newPost);

                postId = insertedPostEntry.Entity.Id;
            }
            else
            {
                foreach (var title in titleSet)
                {
                    var titleValue = post.Title.Localizations.Where(t => t.LanguageId == title.LanguageId).FirstOrDefault();
                    if (titleValue != null)
                    {
                        titleValue.Value = title.Value;
                    }
                    else
                    {
                        post.Title.Localizations.Add(title);
                    }
                }

                foreach (var content in contentSet)
                {
                    var contentValue = post.Content.Localizations.Where(t => t.LanguageId == content.LanguageId).FirstOrDefault();
                    if (contentValue != null)
                    {
                        contentValue.Value = content.Value;
                    }
                    else
                    {
                        post.Content.Localizations.Add(contentValue);
                    }
                }
            }

            await dbContext.SaveChangesAsync();

            var postModel = await GetPostAsync(postId);

            return(postModel);
        }