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)); } }
/// <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); }
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); }