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); }
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)); }
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())); }
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); } }