Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

sdsdfsdfsdfsdfsdfsdfsdfsdf sdfsdf sdf

sdfsd

fsd

f

Code Block
languagec#
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;
        }
    }
}