Files
Umbraco-CMS/src/Umbraco.Core/Cache/Refreshers/Implement/LanguageCacheRefresher.cs
Mole 1258962429 V15: Remove Nucache (#17166)
* Remove nucache reference from Web.Common

* Get tests building-ish

* Move ReservedFieldNamesService to the right project

* Remove IPublishedSnapshotStatus

* Added functionality to the INavigationQueryService to get root keys

* Fixed issue with navigation

* Remove IPublishedSnapshot from UmbracoContext

* Begin removing usage of IPublishedSnapshot from PublishedContentExtensions

* Fix PublishedContentExtensions.cs

* Don't use snapshots in delivery media api

* Use IPublishedMediaCache in QueryMediaApiController

* Remove more usages of IPublishedSnapshotAccessor

* Comment out tests

* Remove more usages of PublishedSnapshotAccessor

* Remove PublishedSnapshot from property

* Fixed test build

* Fix errors

* Fix some tests

* Delete NuCache 🎉

* Implement DatabaseCacheRebuilder

* Remove usage of IPublishedSnapshotService

* Remove IPublishedSnapshotService

* Remove TestPublishedSnapshotAccessor and make tests build

* Don't test Snapshot cachelevel

It's no longer supported

* Fix BlockEditorConverter

Element != Element document type

* Remember to set cachemanager

* Fix RichTextParserTests

* Implement TryGetLevel on INavigationQueryService

* Fake level and obsolete it in PublishedContent

* Remove ChildrenForAllCultures

* Hack Path property on PublishedContent

* Remove usages of IPublishedSnapshot in tests

* More ConvertersTests

* Add hybrid cache to integration tests

We can actually do this now because we no longer save files on disk

* Rename IPublishedSnapshotRebuilder to ICacheRebuilder

* Comment out tests

* V15: Replacing the usages of Parent (navigation data) from IPublishedContent (#17125)

* Fix .Parent references in PublishedContentExtensions

* Add missing methods to FriendlyPublishedContentExtensions (ones that you were able to call on the content directly as they now require extra params)

* Fix references from the extension methods

* Fix dependencies in tests

* Replace IPublishedSnapshotAccessor with the content cache in tests

* Resolving more .Parent references

* Fix unit tests

* Obsolete and use extension methods

* Remove private method and use extension instead

* Moving code around

* Fix tests

* Fix more references

* Cleanup

* Fix more usages

* Resolve merge conflict

* Fix tests

* Cleanup

* Fix more tests

* Fixed unit tests

* Cleanup

* Replace last usages

---------

Co-authored-by: Bjarke Berg <mail@bergmania.dk>

* Remove usage of IPublishedSnapshotAccessor from IRequestItemProvider

* Post merge fixup

* Remo IPublishedSnapshot

* Add HasAny to IDocumentUrlService

* Fix TextBuilder

* Fix modelsbuilder tests

* Use explicit types

* Implement GetByContentType

* Support element types in PublishedContentTypeCache

* Run enlistments before publishing notifications

* Fix elements cache refreshing

* Implement GetByUdi

* Implement GetAtRoot

* Implement GetByRoute

* Reimplement GetRouteById

* Fix blocks unit tests

* Initialize domain cache on boot

* Only return routes with domains on non default lanauges

* V15: Replacing the usages of `Children` (navigation data) from `IPublishedContent` (#17159)

* Update params in PublishedContentExtensions to the general interfaces for the published cache and navigation service, so that we can use the extension methods on both documents and media

* Introduce GetParent() which uses the right services

* Fix obsolete message on .Parent

* Obsolete .Children

* Fix usages of Children for ApiMediaQueryService

* Fix usage in internal

* Fix usages in views

* Fix indentation

* Fix issue with delete language

* Update nuget pacakges

* Clear elements cache when content is deleted

instead of trying to update it

* Reset publishedModelFactory

* Fixed publishing

---------

Co-authored-by: Bjarke Berg <mail@bergmania.dk>
Co-authored-by: Elitsa Marinovska <21998037+elit0451@users.noreply.github.com>
Co-authored-by: kjac <kja@umbraco.dk>
2024-10-01 15:03:02 +02:00

165 lines
4.7 KiB
C#

using Umbraco.Cms.Core.Events;
using Umbraco.Cms.Core.Models;
using Umbraco.Cms.Core.Notifications;
using Umbraco.Cms.Core.PublishedCache;
using Umbraco.Cms.Core.Serialization;
using Umbraco.Cms.Core.Services.Changes;
using static Umbraco.Cms.Core.Cache.LanguageCacheRefresher.JsonPayload;
namespace Umbraco.Cms.Core.Cache;
public sealed class LanguageCacheRefresher : PayloadCacheRefresherBase<LanguageCacheRefresherNotification,
LanguageCacheRefresher.JsonPayload>
{
private readonly IDomainCacheService _domainCacheService;
public LanguageCacheRefresher(
AppCaches appCaches,
IJsonSerializer serializer,
IEventAggregator eventAggregator,
IDomainCacheService domainCache,
ICacheRefresherNotificationFactory factory)
: base(appCaches, serializer, eventAggregator, factory)
{
_domainCacheService = domainCache;
}
/// <summary>
/// Clears all domain caches
/// </summary>
private void RefreshDomains()
{
ClearAllIsolatedCacheByEntityType<IDomain>();
// note: must do what's above FIRST else the repositories still have the old cached
// content and when the PublishedCachesService is notified of changes it does not see
// the new content...
DomainCacheRefresher.JsonPayload[] payloads = new[]
{
new DomainCacheRefresher.JsonPayload(0, DomainChangeTypes.RefreshAll),
};
_domainCacheService.Refresh(payloads);
}
#region Json
public class JsonPayload
{
public enum LanguageChangeType
{
/// <summary>
/// A new languages has been added
/// </summary>
Add = 0,
/// <summary>
/// A language has been deleted
/// </summary>
Remove = 1,
/// <summary>
/// A language has been updated - but it's culture remains the same
/// </summary>
Update = 2,
/// <summary>
/// A language has been updated - it's culture has changed
/// </summary>
ChangeCulture = 3,
}
public JsonPayload(int id, string isoCode, LanguageChangeType changeType)
{
Id = id;
IsoCode = isoCode;
ChangeType = changeType;
}
public int Id { get; }
public string IsoCode { get; }
public LanguageChangeType ChangeType { get; }
}
#endregion
#region Define
public static readonly Guid UniqueId = Guid.Parse("3E0F95D8-0BE5-44B8-8394-2B8750B62654");
public override Guid RefresherUniqueId => UniqueId;
public override string Name => "Language Cache Refresher";
#endregion
#region Refresher
public override void Refresh(JsonPayload[] payloads)
{
if (payloads.Length == 0)
{
return;
}
var clearDictionary = false;
var clearContent = false;
// clear all no matter what type of payload
ClearAllIsolatedCacheByEntityType<ILanguage>();
foreach (JsonPayload payload in payloads)
{
switch (payload.ChangeType)
{
case LanguageChangeType.Update:
clearDictionary = true;
break;
case LanguageChangeType.Remove:
case LanguageChangeType.ChangeCulture:
clearDictionary = true;
clearContent = true;
break;
}
}
if (clearDictionary)
{
ClearAllIsolatedCacheByEntityType<IDictionaryItem>();
}
// if this flag is set, we will tell the published snapshot service to refresh ALL content and evict ALL IContent items
if (clearContent)
{
// clear all domain caches
RefreshDomains();
ContentCacheRefresher.RefreshContentTypes(AppCaches); // we need to evict all IContent items
// now refresh all nucache
ContentCacheRefresher.JsonPayload[] clearContentPayload = new[]
{
new ContentCacheRefresher.JsonPayload()
{
ChangeTypes = TreeChangeTypes.RefreshAll
}
};
}
// then trigger event
base.Refresh(payloads);
}
// these events should never trigger
// everything should be PAYLOAD/JSON
public override void RefreshAll() => throw new NotSupportedException();
public override void Refresh(int id) => throw new NotSupportedException();
public override void Refresh(Guid id) => throw new NotSupportedException();
public override void Remove(int id) => throw new NotSupportedException();
#endregion
}