private void SetMediaPickerStartNode(HttpRequestMessage request, int nodeId, string contentTypeAlias, IEnumerable <ContentPropertyDisplay> properties)
        {
            //Get the media pickers which we want to change the start node from.
            var mediaPickers = properties.Where(x =>
                                                Constants.PropertyEditors.MediaPickerAlias.InvariantEquals(x.Editor) ||
                                                Constants.PropertyEditors.MultipleMediaPickerAlias.InvariantEquals(x.Editor)
                                                ).ToList();

            if (mediaPickers.Any())
            {
                //Get the override values for this content type.
                var contentOverrides = ContentOverrideLogic.GetContentOverrides(contentTypeAlias, configAlias: "startNodeId");

                foreach (var mediaPicker in mediaPickers)
                {
                    //Get the content override for this media picker.
                    //First check if there is a content override for this specific node and property.
                    var contentOverride = contentOverrides.Where(x =>
                                                                 x.NodeId == nodeId &&
                                                                 x.PropertyTypeAlias == mediaPicker.Alias
                                                                 ).FirstOrDefault();

                    if (contentOverride == null)
                    {
                        //If no content override is found for a specific node check if there is an override for just the property.
                        contentOverride = contentOverrides.Where(x => x.PropertyTypeAlias == mediaPicker.Alias && x.NodeId == null).FirstOrDefault();
                    }

                    if (contentOverride != null)
                    {
                        //Set the start node id.
                        if (mediaPicker.Config.ContainsKey(contentOverride.ConfigAlias))
                        {
                            mediaPicker.Config[contentOverride.ConfigAlias] = contentOverride.Value;
                        }
                        else
                        {
                            mediaPicker.Config.Add(contentOverride.ConfigAlias, contentOverride.Value);
                        }
                    }
                }
            }
        }
        private void ContentService_Saved(IContentService sender, SaveEventArgs <IContent> e)
        {
            foreach (var entity in e.SavedEntities)
            {
                try
                {
                    if (entity.ContentType.Alias == "Gallery")
                    {
                        //Check if a media folder is already linked to the gallery.
                        bool hasContentOverride = ContentOverrideLogic.HasContentOverride(
                            "Gallery",
                            "images",
                            nodeId: entity.Id,
                            configAlias: "startNodeId"
                            );

                        if (!hasContentOverride)
                        {
                            //Create a media folder for the gallery.
                            var mediaFolder = Services.MediaService.CreateMedia(entity.Name, -1, "Folder");
                            Services.MediaService.Save(mediaFolder);

                            //Set the media folder as the start node for the Gallery images media picker.
                            ContentOverrideLogic.CreateContentOverride(
                                mediaFolder.Id.ToString(),
                                "Gallery",
                                "images",
                                nodeId: entity.Id,
                                configAlias: "startNodeId"
                                );
                        }
                    }
                }
                catch (Exception ex)
                {
                    Umbraco.LogException <UmbracoEvents>(ex);
                }
            }

            ClearCache();
        }
        private Task <HttpResponseMessage> SetArchetypeMediaPickerStartNode(HttpRequestMessage request, CancellationToken cancellationToken)
        {
            return(base.SendAsync(request, cancellationToken)
                   .ContinueWith(task =>
            {
                var response = task.Result;
                try
                {
                    //Get the content that we want to modify.
                    var data = response.Content;
                    var value = ((ObjectContent)(data)).Value;

                    //Use reflection to get the values of the anonymous type that the Archetype WebAPI returns.
                    Type type = value.GetType();
                    var selectedEditor = (string)type.GetProperty("selectedEditor").GetValue(value, null);

                    //Check if the property editor in Archetype is a media picker.
                    if (Constants.PropertyEditors.MediaPickerAlias.InvariantEquals(selectedEditor) ||
                        Constants.PropertyEditors.MultipleMediaPickerAlias.InvariantEquals(selectedEditor))
                    {
                        //Get the start node prevalue.
                        var prevalues = (IEnumerable <PreValueFieldDisplay>)type.GetProperty("preValues").GetValue(value, null);
                        var prevalue = prevalues.Where(x => x.Key == "startNodeId").FirstOrDefault();
                        if (prevalue != null)
                        {
                            //Get the properties we need to find the correct content override.
                            var contentTypeAlias = (string)type.GetProperty("contentTypeAlias").GetValue(value, null);
                            var propertyTypeAlias = (string)type.GetProperty("propertyTypeAlias").GetValue(value, null);
                            var archetypeAlias = (string)type.GetProperty("archetypeAlias").GetValue(value, null);
                            var nodeId = (int)type.GetProperty("nodeId").GetValue(value, null);

                            //Get the override values for this content type.
                            var contentOverrides = ContentOverrideLogic.GetContentOverrides(contentTypeAlias, configAlias: "startNodeId");

                            //Get the content override for this media picker.
                            //First check if there is a content override for this specific node, property and archetype.
                            var contentOverride = contentOverrides.Where(x =>
                                                                         x.NodeId == nodeId &&
                                                                         HasArchetypePropertyTypeAlias(x.PropertyTypeAlias, propertyTypeAlias) &&
                                                                         x.ArchetypeAlias == archetypeAlias
                                                                         ).FirstOrDefault();

                            if (contentOverride == null)
                            {
                                //If no content override is found for a specific node check if there is an override for just the property and archetype.
                                contentOverride = contentOverrides.Where(x =>
                                                                         HasArchetypePropertyTypeAlias(x.PropertyTypeAlias, propertyTypeAlias) &&
                                                                         x.ArchetypeAlias == archetypeAlias &&
                                                                         x.NodeId == null
                                                                         ).FirstOrDefault();
                            }

                            if (contentOverride != null)
                            {
                                //Set the start node.
                                prevalue.Value = contentOverride.Value;
                            }
                        }
                    }
                }
                catch (Exception ex)
                {
                    LogHelper.Error <WebApiHandler>("Could not change the media picker start node.", ex);
                }
                return response;
            }
                                 ));
        }