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));
            }
        }
Пример #2
0
        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
            });
        }
Пример #3
0
        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
                        });
                    }
Пример #4
0
        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
            });
        }