public async Task <IActionResult> Run( [HttpTrigger( "post", Route = Routes.KontentClone )] string body, string itemCodename, string languageCodename ) { try { var stopwatch = new Stopwatch(); stopwatch.Start(); var oldItemReference = new CodenameReference(itemCodename); var newItemReference = new ExternalIdReference(kontentRepository.GetExternalId()); var languageReference = new CodenameReference(languageCodename); var newItemVariants = new Dictionary <Reference, ItemVariant>(); await kontentRepository.PrepareDeepClone(new PrepareItemParameters { ItemVariant = await kontentRepository.GetItemVariant(new GetItemVariantParameters { OldItemReference = oldItemReference, NewItemReference = newItemReference, LanguageReference = languageReference, NewItemVariants = newItemVariants }), LanguageReference = languageReference, NewItemVariants = newItemVariants }); var newItems = new List <ContentItem>(); foreach (var(newItem, newVariant) in newItemVariants.Values) { newItems.Add(await kontentRepository.UpsertContentItem(newItem)); await kontentRepository.UpsertLanguageVariant(new UpsertLanguageVariantParameters { LanguageReference = languageReference, Variant = newVariant }); } stopwatch.Stop(); return(LogOkObject(new { TotalApiCalls = kontentRepository.ApiCalls, TotalMilliseconds = stopwatch.ElapsedMilliseconds, NewItems = newItems })); } catch (Exception ex) { return(LogException(ex)); } }
private async Task TranslateItem(ItemObject item, string language, string translationLanguage) { if (item.Item == null) { throw new ArgumentNullException(nameof(item.Item)); } var languageVariant = await kontentRepository.RetrieveLanguageVariant(new RetrieveLanguageVariantParameters { ItemId = item.Item.Id, LanguageId = item.Language?.Id }); foreach (var element in languageVariant.Elements) { switch (element) { case RichTextElement richTextElement: var value = richTextElement.Value; if (value?.Length >= 5000) { var parts = textAnalyzer.SplitHtml(value); var result = ""; foreach (var part in parts) { var(partTranslated, partTranslation) = await Translate(part, translationLanguage); if (partTranslated) { result += partTranslation; } ; } if (!string.IsNullOrWhiteSpace(result)) { richTextElement.Value = result; } break; } var(translated, translation) = await Translate(richTextElement.Value, translationLanguage); if (translated) { richTextElement.Value = translation; } ; break; case UrlSlugElement urlSlugElement: (translated, translation) = await Translate(urlSlugElement.Value, translationLanguage); if (translated) { urlSlugElement.Value = translation.Replace(" ", "-"); } ; break; case TextElement textElement: (translated, translation) = await Translate(textElement.Value, translationLanguage); if (translated) { textElement.Value = translation; } ; break; } } await kontentRepository.UpsertLanguageVariant(new UpsertLanguageVariantParameters { ItemId = item.Item.Id, Language = language, Variant = languageVariant }); }
public async Task <IActionResult> Run( [HttpTrigger( "post", Route = Routes.KontentChangeType )] ChangeTypeRequest changeTypeRequest, string itemCodename, string languageCodename ) { try { var stopwatch = new Stopwatch(); stopwatch.Start(); kontentApiTracker.ApiCalls = 0; var(elementMappings, selectedType) = changeTypeRequest; var oldItemReference = new CodenameReference(itemCodename); var languageReference = new CodenameReference(languageCodename); var newTypeReference = new IdReference(selectedType.Id !); var newItemReference = kontentRepository.NewExternalIdReference(); var oldItemVariant = await kontentRepository.GetItemVariant(new GetItemVariantParameters { ItemReference = oldItemReference, LanguageReference = languageReference }); var(oldItem, oldVariant) = oldItemVariant; var newElements = new List <IElement>(); foreach (var pair in elementMappings) { var newTypeElementReferenceId = pair.Key; var newElement = selectedType.Elements.First(element => element.Id == newTypeElementReferenceId); var oldElementReference = pair.Value; var oldElement = oldVariant.Elements.First(element => element.Element?.Value == oldElementReference); var oldElementValue = (oldElement as dynamic).Value; var newTypeElementReference = new IdReference(newTypeElementReferenceId); switch (newElement.Type) { case UrlSlugElement.Type: newElements.Add(new UrlSlugElement { Element = newTypeElementReference, Value = oldElementValue?.ToString(), Mode = "custom" }); break; case "guidelines": case TextElement.Type: newElements.Add(new TextElement { Element = newTypeElementReference, Value = oldElementValue?.ToString() }); break; default: oldElement.Element = newTypeElementReference; newElements.Add(oldElement); break; } } oldVariant.Elements = newElements; var newVariants = new Dictionary <Reference, LanguageVariant>(); await kontentRepository.PrepareChangeType(new PrepareChangeTypeParameters { ItemVariant = oldItemVariant, LanguageReference = languageReference, NewItemReference = newItemReference, NewVariants = newVariants }); oldItem.Codename = null; oldItem.ExternalId = newItemReference.Value; oldItem.TypeReference = newTypeReference; oldVariant.ItemReference = newItemReference; var newItem = await kontentRepository.UpsertContentItem(oldItem); await kontentRepository.UpsertLanguageVariant(new UpsertLanguageVariantParameters { LanguageReference = languageReference, Variant = oldVariant }); var allWorkflowSteps = await kontentRepository.RetrieveWorkflowSteps(); var draftStep = allWorkflowSteps.First(step => step.Name == "Draft"); var publishedStep = allWorkflowSteps.First(step => step.Name == "Published"); var archivedStep = allWorkflowSteps.First(step => step.Name == "Archived"); foreach (var newVariant in newVariants.Values) { var languageVariantParameters = new UpsertLanguageVariantParameters { LanguageReference = languageReference, Variant = newVariant }; if (newVariant.WorkflowStep?.Value ! == publishedStep.Id) { await kontentRepository.CreateNewVersionLanguageVariant(languageVariantParameters); } if (newVariant.WorkflowStep?.Value ! == archivedStep.Id) { await kontentRepository.ChangeWorkflowStepLanguageVariant(new ChangeWorkflowStepParameters { WorkflowStepReference = new IdReference(draftStep.Id !), LanguageReference = languageReference, Variant = newVariant }); }
private async Task TranslateItem(Item item, string languageCodename, string translationLanguage) { if (item.ItemReference == null) { throw new ArgumentNullException(nameof(item.ItemReference)); } var languageVariant = await kontentRepository.RetrieveLanguageVariant(new RetrieveLanguageVariantParameters { ItemReference = item.ItemReference, LanguageReference = item.LanguageReference }); if (languageVariant == null) { throw new NotImplementedException("Variant could not be retrieved."); } if (languageVariant.Elements == null) { throw new NotImplementedException("Variant does not have elements."); } foreach (var element in languageVariant.Elements) { switch (element) { case RichTextElement richTextElement: { var value = richTextElement.Value; if (value?.Length >= 5000) { var parts = textAnalyzer.SplitHtml(value); var longResult = ""; foreach (var part in parts) { var(translated, translation) = await Translate(part, translationLanguage); if (translated) { longResult += translation; } ; } if (!string.IsNullOrWhiteSpace(longResult)) { richTextElement.Value = longResult; } break; } var result = await Translate(richTextElement.Value, translationLanguage); if (result.translated) { richTextElement.Value = result.translation; } ; break; } case UrlSlugElement urlSlugElement: { var(translated, translation) = await Translate(urlSlugElement.Value, translationLanguage); if (translated) { urlSlugElement.Value = translation.Replace(" ", "-"); } ; break; } case TextElement textElement: { var(translated, translation) = await Translate(textElement.Value, translationLanguage); if (translated) { textElement.Value = translation; } ; break; } } } await kontentRepository.UpsertLanguageVariant(new UpsertLanguageVariantParameters { LanguageReference = new CodenameReference(languageCodename), Variant = languageVariant }); }