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));
            }
        }
Ejemplo n.º 2
0
        public async Task <IActionResult> Run(
            [HttpTrigger(
                 "get",
                 Route = Routes.KontentChangeTypeGetTypes
                 )] string body,
            string itemCodename
            )
        {
            try
            {
                var itemReference = new CodenameReference(itemCodename);

                var allTypes = await kontentRepository.ListContentTypes();

                foreach (var type in allTypes)
                {
                    if (type.Elements == null)
                    {
                        throw new NotImplementedException("Item type does not have elements.");
                    }

                    var newTypeElements = new List <ElementType>(type.Elements);

                    foreach (var typeElement in type.Elements)
                    {
                        if (typeElement.Snippet != null)
                        {
                            var itemTypeSnippet = await kontentRepository.RetrieveContentTypeSnippet(typeElement.Snippet);

                            if (itemTypeSnippet.Elements == null)
                            {
                                throw new NotImplementedException("Item type snippet does not have elements.");
                            }

                            foreach (var typeSnippetElement in itemTypeSnippet.Elements)
                            {
                                newTypeElements.Add(typeSnippetElement);
                            }
                        }
                    }

                    var supportingElements = new[] { "snippet", "guidelines" };

                    type.Elements = newTypeElements.Where(element => !supportingElements.Contains(element.Type)).ToList();
                }

                var item = await kontentRepository.RetrieveContentItem(itemReference);

                return(LogOkObject(new
                {
                    CurrentType = allTypes.First(type => type.Id == item.TypeReference?.Value),
                    OtherTypes = allTypes.Where(type => type.Id != item.TypeReference?.Value)
                }));
            }
            catch (Exception ex)
            {
                return(LogException(ex));
            }
        }
Ejemplo n.º 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
                        });
                    }