private static ObjectEnterspeedProperty ConvertToEnterspeedProperty(JToken item)
        {
            if (item == null)
            {
                return(null);
            }

            var properties = new Dictionary <string, IEnterspeedProperty>();

            var caption    = item.Value <string>("caption");
            var title      = item.Value <string>("title");
            var newWindow  = item.Value <bool>("newWindow");
            var isInternal = item.Value <bool>("isInternal");

            string url;

            if (isInternal)
            {
                var nodeId = item.Value <int>("internal");
                url = UmbracoContextHelper.GetUmbracoHelper().UrlAbsolute(nodeId);
            }
            else
            {
                url = item.Value <string>("link");
            }

            properties.Add("caption", new StringEnterspeedProperty(caption));
            properties.Add("title", new StringEnterspeedProperty(title));
            properties.Add("newWindow", new BooleanEnterspeedProperty(newWindow));
            properties.Add("url", new StringEnterspeedProperty(url));

            return(new ObjectEnterspeedProperty(properties));
        }
        public IEnterspeedProperty Convert(IPublishedProperty property)
        {
            var nodeIds    = property.GetValue <string>()?.Split(new[] { "," }, StringSplitOptions.RemoveEmptyEntries).Select(int.Parse);
            var arrayItems = new List <IEnterspeedProperty>();

            if (nodeIds != null)
            {
                var umbracoHelper = UmbracoContextHelper.GetUmbracoHelper();
                foreach (var nodeId in nodeIds)
                {
                    var node = umbracoHelper.TypedContent(nodeId);

                    if (node == null)
                    {
                        node = umbracoHelper.TypedMember(nodeId);
                    }

                    if (node == null)
                    {
                        node = umbracoHelper.TypedMedia(nodeId);
                    }

                    var convertedNode = ConvertToEnterspeedProperty(node);
                    if (convertedNode != null)
                    {
                        arrayItems.Add(convertedNode);
                    }
                }
            }

            return(new ArrayEnterspeedProperty(property.PropertyTypeAlias, arrayItems.ToArray()));
        }
        private static void CacheRefresherBaseOnCacheUpdated(PageCacheRefresher sender, CacheRefresherEventArgs cacheRefresherEventArgs)
        {
            // Do not configure if Enterspeed is not configured in Umbraco
            if (EnterspeedContext.Current?.Configuration == null ||
                !EnterspeedContext.Current.Configuration.IsConfigured)
            {
                return;
            }

            var umbracoHelper = UmbracoContextHelper.GetUmbracoHelper();
            var jobs          = new List <EnterspeedJob>();

            switch (cacheRefresherEventArgs.MessageType)
            {
            case MessageType.RefreshById:
                var refreshContent =
                    umbracoHelper.TypedContent((int)cacheRefresherEventArgs.MessageObject);
                if (refreshContent != null)
                {
                    var culture = refreshContent.GetCulture()?.IetfLanguageTag?.ToLowerInvariant();
                    var now     = DateTime.UtcNow;
                    jobs.Add(new EnterspeedJob
                    {
                        ContentId = refreshContent.Id,
                        Culture   = culture,
                        JobType   = EnterspeedJobType.Publish,
                        State     = EnterspeedJobState.Pending,
                        CreatedAt = now,
                        UpdatedAt = now,
                    });
                }

                break;

            case MessageType.RefreshByInstance:
                var node = umbracoHelper.TypedContent(((IContent)cacheRefresherEventArgs.MessageObject).Id);
                if (node != null)
                {
                    var culture = node.GetCulture()?.IetfLanguageTag?.ToLowerInvariant();
                    var now     = DateTime.UtcNow;
                    jobs.Add(new EnterspeedJob
                    {
                        ContentId = node.Id,
                        Culture   = culture,
                        JobType   = EnterspeedJobType.Publish,
                        State     = EnterspeedJobState.Pending,
                        CreatedAt = now,
                        UpdatedAt = now,
                    });
                }

                break;
            }

            EnqueueJobs(jobs);
        }
Beispiel #4
0
        public IEnterspeedProperty Convert(IPublishedProperty property)
        {
            var value = property.GetValue <string>();

            ObjectEnterspeedProperty mediaValue = null;

            if (!string.IsNullOrWhiteSpace(value) && int.TryParse(value, out var mediaId))
            {
                var media = UmbracoContextHelper.GetUmbracoHelper().TypedMedia(mediaId);
                mediaValue = ConvertToEnterspeedProperty(media);
            }

            return(new ObjectEnterspeedProperty(property.PropertyTypeAlias, mediaValue?.Properties));
        }
        public IEnterspeedProperty Convert(IPublishedProperty property)
        {
            var value = property.GetValue <string>();

            if (!string.IsNullOrWhiteSpace(value) && int.TryParse(value, out var prevalueId))
            {
                value = UmbracoContextHelper.GetUmbracoHelper().GetPreValueAsString(prevalueId);
            }
            else
            {
                value = null;
            }

            return(new StringEnterspeedProperty(property.PropertyTypeAlias, value));
        }
        private ObjectEnterspeedProperty ConvertToEnterspeedProperty(IPublishedContent node)
        {
            if (node == null)
            {
                return(null);
            }

            Dictionary <string, IEnterspeedProperty> properties;

            if (node.ItemType == PublishedItemType.Member)
            {
                properties = new Dictionary <string, IEnterspeedProperty>
                {
                    { "id", new NumberEnterspeedProperty(node.Id) },
                    { "name", new StringEnterspeedProperty(node.Name) },
                    { "memberType", new StringEnterspeedProperty(node.ContentType.Alias) }
                };
            }
            else
            {
                var url = node.Url;
                var id  = node.Id.ToString();
                if (node.ItemType == PublishedItemType.Content)
                {
                    id  = _entityIdentityService.GetId(node);
                    url = UmbracoContextHelper.GetUmbracoHelper().UrlAbsolute(node.Id);
                }
                else if (node.ItemType == PublishedItemType.Media)
                {
                    url = _mediaUrlProvider.GetUrl(node);
                }

                properties = new Dictionary <string, IEnterspeedProperty>
                {
                    { "id", new StringEnterspeedProperty(id) },
                    { "name", new StringEnterspeedProperty(node.Name) },
                    { "url", new StringEnterspeedProperty(url) }
                };
            }

            return(new ObjectEnterspeedProperty(properties));
        }
Beispiel #7
0
        public IEnterspeedProperty Convert(IPublishedProperty property)
        {
            var mediaIds   = property.GetValue <string>()?.Split(new[] { "," }, StringSplitOptions.RemoveEmptyEntries);
            var arrayItems = new List <IEnterspeedProperty>();

            if (mediaIds != null)
            {
                var umbracoHelper = UmbracoContextHelper.GetUmbracoHelper();
                foreach (var mediaId in mediaIds)
                {
                    var media          = umbracoHelper.TypedMedia(mediaId);
                    var convertedMedia = ConvertToEnterspeedProperty(media);
                    if (convertedMedia != null)
                    {
                        arrayItems.Add(convertedMedia);
                    }
                }
            }

            return(new ArrayEnterspeedProperty(property.PropertyTypeAlias, arrayItems.ToArray()));
        }
        public IEnterspeedProperty Convert(IPublishedProperty property)
        {
            var values     = property.GetValue <string>()?.Split(new[] { "," }, StringSplitOptions.RemoveEmptyEntries);
            var arrayItems = new List <IEnterspeedProperty>();

            if (values != null)
            {
                foreach (var value in values)
                {
                    if (int.TryParse(value, out var prevalueId))
                    {
                        var prevalue = UmbracoContextHelper.GetUmbracoHelper().GetPreValueAsString(prevalueId);
                        if (!string.IsNullOrWhiteSpace(prevalue))
                        {
                            arrayItems.Add(new StringEnterspeedProperty(value));
                        }
                    }
                }
            }

            return(new ArrayEnterspeedProperty(property.PropertyTypeAlias, arrayItems.ToArray()));
        }
Beispiel #9
0
        public SeedResponse Seed()
        {
            var umbracoHelper = UmbracoContextHelper.GetUmbracoHelper();

            var allContent = umbracoHelper.TypedContentAtRoot()?.SelectMany(x => x.DescendantsOrSelf()).ToList();

            if (allContent == null || !allContent.Any())
            {
                return(new SeedResponse
                {
                    JobsAdded = 0,
                    Nodes = 0,
                });
            }

            var jobs = new List <EnterspeedJob>();

            foreach (var content in allContent)
            {
                var contentJob = GetJobForContent(content);
                if (contentJob == null)
                {
                    continue;
                }

                jobs.Add(contentJob);
            }

            _enterspeedJobRepository.Save(jobs);

            return(new SeedResponse
            {
                Nodes = allContent.Count,
                JobsAdded = jobs.Count
            });
        }
 public DefaultMemberPickerPropertyValueConverter()
 {
     _memberService = UmbracoContextHelper.GetUmbracoContext().Application.Services.MemberService;
 }
        public void HandleJobs(List <EnterspeedJob> jobs)
        {
            if (!jobs.Any())
            {
                return;
            }

            LogHelper.Debug <EnterspeedJobHandler>("Handling {jobsCount} jobs", () => jobs.Count);

            // Update jobs from pending to processing
            foreach (var job in jobs)
            {
                job.State     = EnterspeedJobState.Processing;
                job.UpdatedAt = DateTime.UtcNow;
            }

            _enterspeedJobRepository.Save(jobs);

            // Process nodes
            var failedJobs         = new List <EnterspeedJob>();
            var failedJobsToDelete = new List <EnterspeedJob>();

            // Get a dictionary of contentid and cultures to handle
            var jobsToHandle = jobs
                               .Select(x => x.ContentId)
                               .Distinct()
                               .ToDictionary(x => x, x => jobs.Where(j => j.ContentId == x).Select(j => j.Culture).Distinct().ToList());

            // Fetch all failed jobs for these content ids. We need to do this to delete the failed jobs if they no longer fails
            var failedJobsToHandle = _enterspeedJobRepository.GetFailedJobs(jobs.Select(x => x.ContentId).Distinct().ToList());
            var context            = UmbracoContextHelper.GetUmbracoContext();

            foreach (var jobInfo in jobsToHandle)
            {
                foreach (var culture in jobInfo.Value)
                {
                    // List of all jobs with this contentid and culture
                    var jobsToRun = jobs
                                    .Where(x => x.ContentId == jobInfo.Key && x.Culture == culture)
                                    .OrderBy(x => x.CreatedAt)
                                    .ToList();

                    // Get the failed jobs and add it to the batch of jobs that needs to be handled, so we can delete them afterwards
                    failedJobsToDelete.AddRange(failedJobsToHandle.Where(x =>
                                                                         x.ContentId == jobInfo.Key && x.Culture == culture));

                    // We only need to execute the latest jobs instruction.
                    var newestJob     = jobsToRun.LastOrDefault();
                    var shouldDelete  = newestJob?.JobType == EnterspeedJobType.Delete;
                    var shouldPublish = newestJob?.JobType == EnterspeedJobType.Publish;

                    if (shouldPublish)
                    {
                        var content = context.ContentCache.GetById(newestJob.ContentId);
                        if (content == null)
                        {
                            // Create a new failed job
                            var exception = $"Content with id {newestJob.ContentId} not in cache";
                            failedJobs.Add(GetFailedJob(newestJob, exception));
                            LogHelper.Warn <EnterspeedJobHandler>(exception);
                            continue;
                        }

                        // Create Umbraco Enterspeed Entity
                        UmbracoContentEntity umbracoData;
                        try
                        {
                            umbracoData = new UmbracoContentEntity(content);
                        }
                        catch (Exception e)
                        {
                            // Create a new failed job
                            var exception = $"Failed creating entity ({newestJob.ContentId}/{newestJob.Culture}). Message: {e.Message}. StackTrace: {e.StackTrace}";
                            failedJobs.Add(GetFailedJob(newestJob, exception));
                            LogHelper.Warn <EnterspeedJobHandler>(exception);
                            continue;
                        }

                        var ingestResponse = _enterspeedIngestService.Save(umbracoData);
                        if (!ingestResponse.Success)
                        {
                            // Create a new failed job
                            var message = ingestResponse.Exception != null
                                ? ingestResponse.Exception.Message
                                : ingestResponse.Message;

                            var exception =
                                $"Failed ingesting entity ({newestJob.ContentId}/{newestJob.Culture}). Message: {message}";
                            failedJobs.Add(GetFailedJob(newestJob, exception));
                            LogHelper.Warn <EnterspeedJobHandler>(exception);
                        }
                    }
                    else if (shouldDelete)
                    {
                        var id             = _entityIdentityService.GetId(newestJob.ContentId);
                        var deleteResponse = _enterspeedIngestService.Delete(id);
                        if (!deleteResponse.Success && deleteResponse.Status != HttpStatusCode.NotFound)
                        {
                            // Create a new failed job
                            var exception = $"Failed deleting entity ({newestJob.ContentId}/{newestJob.Culture}). Message: {deleteResponse.Message}";
                            failedJobs.Add(GetFailedJob(newestJob, exception));
                            LogHelper.Warn <EnterspeedJobHandler>(exception);
                            continue;
                        }
                    }
                }
            }

            // Save all jobs that failed
            _enterspeedJobRepository.Save(failedJobs);

            // Delete all jobs - Note, that it's safe to delete all jobs because failed jobs will be created as a new job
            _enterspeedJobRepository.Delete(jobs.Select(x => x.Id).Concat(failedJobsToDelete.Select(x => x.Id)).ToList());

            // Throw exception with a combined exception message for all jobs that failed if any
            if (failedJobs.Any())
            {
                var failedJobExceptions = string.Join(Environment.NewLine, failedJobs.Select(x => x.Exception));
                throw new Exception(failedJobExceptions);
            }
        }