DFO 3.1.0 - Scheduled task - update index

This scheduled task will keep the Find index up to date regarding Digizuite types (Image, DigizuiteFile and Video).
First we collect all assetIds from Digizuite that has been published to the Optimizely channel, then we collect all the Digizuite types (Image, DigizuiteFile and Video) from the index.
Then we can calculate if we should delete assets from the index and the other way around, we can calculate if there are missing assets in the index and then add them.

using System; using System.Collections.Generic; using EPiServer.PlugIn; using EPiServer.Scheduler; using EPiServer.ServiceLocation; using System.Linq; using Digizuite.Episerver.Extensions; using Digizuite.Episerver.Models; using Digizuite.Episerver.Models.Media; using EPiServer.Core; using EPiServer.Find; using EPiServer.Find.Cms; using EPiServer.Find.Framework; namespace Digizuite.Episerver.Jobs { [ScheduledPlugIn(DisplayName = "Digizuite Update Find", SortIndex = 1003)] public class RemoveAssetsFromFindJob : ScheduledJobBase { private bool _stopSignaled; public Injected<IDigizuiteClient> DigizuiteClient { get; set; } public RemoveAssetsFromFindJob() { IsStoppable = true; } /// <summary> /// Called when a user clicks on Stop for a manually started job, or when ASP.NET shuts down. /// </summary> public override void Stop() { _stopSignaled = true; } /// <summary> /// Called when a scheduled job executes /// </summary> /// <returns>A status message to be stored in the database log and visible from admin mode</returns> public override string Execute() { // Call OnStatusChanged to periodically notify progress of job for manually started jobs OnStatusChanged($"Cleaning Digizuite assets from index {this.GetType()}"); var allAssetsInDigizuiteList = DigizuiteClient.Service.GetAllAssetIds(); if (allAssetsInDigizuiteList == null) { return $"Could not retrieve the assets from Digizuite, no action to the index has occurred."; } var allAssetsFromIndex = this.GetAllDigizuiteAssetsFromIndex(); // Delete digizuite assets from the index, that's no longer available for the Episerver channel in Digizuite. foreach (var basicContent in allAssetsFromIndex) { var dzAsset = allAssetsInDigizuiteList.Find(x => x.AssetId == basicContent.ContentLink.ID); if (dzAsset == null) { OnStatusChanged($"Remove asset from the index: AssetId:{basicContent.ContentLink.ID}"); SearchClient.Instance.Delete<BasicContent>(x => x.ContentLink.ID.Match(basicContent.ContentLink.ID)); } if (_stopSignaled) { return "Job was stopped"; } } // Add missing digizuite assets to the index List<int> missingAssets = new List<int>(); foreach (var asset in allAssetsInDigizuiteList) { var dzAsset = allAssetsFromIndex.Find(x => x.ContentLink.ID == asset.AssetId); if (dzAsset == null) { missingAssets.Add(asset.AssetId); } } if (missingAssets.Count > 0) { // The asset does not exists in the index, add to index. List<IContent> assets = DigizuiteClient.Service.Search(new AssetQueryParameters { AssetIds = missingAssets }).ToList(); if (assets.Count > 0) { // Add to index SearchClient.Instance.Index(assets); } } return $"Digizuite successfully cleaned up index"; } private List<BasicContent> GetAllDigizuiteAssetsFromIndex() { var pageSize = 1000; var query = SearchClient.Instance.Search<BasicContent>().Filter(x => x.MatchType(typeof(Image)) | x.MatchType(typeof(Video)) | x.MatchType(typeof(DigizuiteFile))).Take(pageSize); var batch = query.GetContentResult(); List<BasicContent> totalResult = new List<BasicContent>(); if (batch.TotalMatching == 0) { return totalResult; } totalResult.AddRange(batch.Items); var totalMatching = batch.TotalMatching; var nextBatchFrom = pageSize; while (nextBatchFrom < totalMatching) { batch = query.Skip(nextBatchFrom).GetContentResult(); totalResult.AddRange(batch.Items); nextBatchFrom += pageSize; } return totalResult; } } }