Files
Umbraco-CMS/src/Umbraco.Web/Cache/CacheRefresherComponent.cs

611 lines
26 KiB
C#
Raw Normal View History

2016-09-08 18:43:58 +02:00
using System;
2017-05-12 14:49:44 +02:00
using System.Collections.Concurrent;
using System.Collections.Generic;
2017-05-30 10:50:09 +02:00
using System.IO;
2016-09-08 18:43:58 +02:00
using Umbraco.Core;
using Umbraco.Core.Events;
using Umbraco.Core.Models;
using Umbraco.Core.Models.Membership;
using Umbraco.Core.Persistence.Repositories;
using Umbraco.Core.Services;
using System.Linq;
2017-05-12 14:49:44 +02:00
using System.Reflection;
2017-05-30 10:50:09 +02:00
using System.Web;
using System.Web.Hosting;
2016-09-08 18:43:58 +02:00
using Umbraco.Core.Components;
2017-05-30 10:50:09 +02:00
using Umbraco.Core.Configuration;
2016-09-08 18:43:58 +02:00
using Umbraco.Core.Logging;
using Umbraco.Core.Services.Changes;
2017-12-28 09:18:09 +01:00
using Umbraco.Core.Services.Implement;
2017-05-30 18:13:11 +02:00
using Umbraco.Web.Composing;
2017-05-30 10:50:09 +02:00
using Umbraco.Web.Security;
2016-09-08 18:43:58 +02:00
using Umbraco.Web.Services;
using Content = Umbraco.Core.Models.Content;
using ApplicationTree = Umbraco.Core.Models.ApplicationTree;
namespace Umbraco.Web.Cache
{
/// <summary>
/// Installs listeners on service events in order to refresh our caches.
/// </summary>
[RuntimeLevel(MinLevel = RuntimeLevel.Run)]
[RequiredComponent(typeof(IUmbracoCoreComponent))] // runs before every other IUmbracoCoreComponent!
2016-09-08 18:43:58 +02:00
public class CacheRefresherComponent : UmbracoComponentBase, IUmbracoCoreComponent
{
2017-05-12 14:49:44 +02:00
private static readonly ConcurrentDictionary<IEventDefinition, MethodInfo> FoundHandlers = new ConcurrentDictionary<IEventDefinition, MethodInfo>();
2017-07-11 19:13:45 +02:00
private DistributedCache _distributedCache;
2017-05-12 14:49:44 +02:00
private List<Action> _unbinders;
public CacheRefresherComponent()
{ }
// for tests
public CacheRefresherComponent(bool supportUnbinding)
2016-09-08 18:43:58 +02:00
{
2017-05-12 14:49:44 +02:00
if (supportUnbinding)
_unbinders = new List<Action>();
2016-09-08 18:43:58 +02:00
}
2017-07-11 19:13:45 +02:00
public void Initialize(DistributedCache distributedCache)
2016-09-08 18:43:58 +02:00
{
2017-05-12 14:49:44 +02:00
Current.Logger.Info<CacheRefresherComponent>("Initializing Umbraco internal event handlers for cache refreshing.");
2017-07-11 19:13:45 +02:00
_distributedCache = distributedCache;
2016-09-08 18:43:58 +02:00
// bind to application tree events
2017-05-12 14:49:44 +02:00
Bind(() => ApplicationTreeService.Deleted += ApplicationTreeService_Deleted,
() => ApplicationTreeService.Deleted -= ApplicationTreeService_Deleted);
Bind(() => ApplicationTreeService.Updated += ApplicationTreeService_Updated,
() => ApplicationTreeService.Updated -= ApplicationTreeService_Updated);
Bind(() => ApplicationTreeService.New += ApplicationTreeService_New,
() => ApplicationTreeService.New -= ApplicationTreeService_New);
2016-09-08 18:43:58 +02:00
// bind to application events
2017-05-12 14:49:44 +02:00
Bind(() => SectionService.Deleted += SectionService_Deleted,
() => SectionService.Deleted -= SectionService_Deleted);
Bind(() => SectionService.New += SectionService_New,
() => SectionService.New -= SectionService_New);
2017-09-14 11:41:46 +02:00
// bind to user and user group events
Bind(() => UserService.SavedUserGroup += UserService_SavedUserGroup,
() => UserService.SavedUserGroup -= UserService_SavedUserGroup);
Bind(() => UserService.DeletedUserGroup += UserService_DeletedUserGroup,
() => UserService.DeletedUserGroup -= UserService_DeletedUserGroup);
2017-05-12 14:49:44 +02:00
Bind(() => UserService.SavedUser += UserService_SavedUser,
() => UserService.SavedUser -= UserService_SavedUser);
Bind(() => UserService.DeletedUser += UserService_DeletedUser,
() => UserService.DeletedUser -= UserService_DeletedUser);
2017-09-14 11:41:46 +02:00
Bind(() => UserService.UserGroupPermissionsAssigned += UserService_UserGroupPermissionsAssigned,
() => UserService.UserGroupPermissionsAssigned -= UserService_UserGroupPermissionsAssigned);
2016-09-08 18:43:58 +02:00
// bind to dictionary events
2017-05-12 14:49:44 +02:00
Bind(() => LocalizationService.DeletedDictionaryItem += LocalizationService_DeletedDictionaryItem,
() => LocalizationService.DeletedDictionaryItem -= LocalizationService_DeletedDictionaryItem);
Bind(() => LocalizationService.SavedDictionaryItem += LocalizationService_SavedDictionaryItem,
() => LocalizationService.SavedDictionaryItem -= LocalizationService_SavedDictionaryItem);
2016-09-08 18:43:58 +02:00
// bind to data type events
2017-05-12 14:49:44 +02:00
Bind(() => DataTypeService.Deleted += DataTypeService_Deleted,
() => DataTypeService.Deleted -= DataTypeService_Deleted);
Bind(() => DataTypeService.Saved += DataTypeService_Saved,
() => DataTypeService.Saved -= DataTypeService_Saved);
2016-09-08 18:43:58 +02:00
// bind to stylesheet events
2017-05-12 14:49:44 +02:00
// fixme why not in v8?
2017-06-23 18:54:42 +02:00
Bind(() => FileService.SavedStylesheet += FileService_SavedStylesheet,
() => FileService.SavedStylesheet -= FileService_SavedStylesheet);
Bind(() => FileService.DeletedStylesheet += FileService_DeletedStylesheet,
() => FileService.DeletedStylesheet -= FileService_DeletedStylesheet);
2016-09-08 18:43:58 +02:00
// bind to domain events
2017-05-12 14:49:44 +02:00
Bind(() => DomainService.Saved += DomainService_Saved,
() => DomainService.Saved -= DomainService_Saved);
Bind(() => DomainService.Deleted += DomainService_Deleted,
() => DomainService.Deleted -= DomainService_Deleted);
2016-09-08 18:43:58 +02:00
// bind to language events
2017-05-12 14:49:44 +02:00
Bind(() => LocalizationService.SavedLanguage += LocalizationService_SavedLanguage,
() => LocalizationService.SavedLanguage -= LocalizationService_SavedLanguage);
Bind(() => LocalizationService.DeletedLanguage += LocalizationService_DeletedLanguage,
() => LocalizationService.DeletedLanguage -= LocalizationService_DeletedLanguage);
2016-09-08 18:43:58 +02:00
// bind to content type events
2017-05-12 14:49:44 +02:00
Bind(() => ContentTypeService.Changed += ContentTypeService_Changed,
() => ContentTypeService.Changed -= ContentTypeService_Changed);
2017-06-23 18:54:42 +02:00
Bind(() => MediaTypeService.Changed += MediaTypeService_Changed,
() => MediaTypeService.Changed -= MediaTypeService_Changed);
Bind(() => MemberTypeService.Changed += MemberTypeService_Changed,
() => MemberTypeService.Changed -= MemberTypeService_Changed);
2016-09-08 18:43:58 +02:00
// bind to template events
2017-05-12 14:49:44 +02:00
Bind(() => FileService.SavedTemplate += FileService_SavedTemplate,
() => FileService.SavedTemplate -= FileService_SavedTemplate);
Bind(() => FileService.DeletedTemplate += FileService_DeletedTemplate,
() => FileService.DeletedTemplate -= FileService_DeletedTemplate);
2016-09-08 18:43:58 +02:00
// bind to macro events
2017-05-12 14:49:44 +02:00
Bind(() => MacroService.Saved += MacroService_Saved,
() => MacroService.Saved -= MacroService_Saved);
Bind(() => MacroService.Deleted += MacroService_Deleted,
() => MacroService.Deleted -= MacroService_Deleted);
2016-09-08 18:43:58 +02:00
// bind to member events
2017-05-12 14:49:44 +02:00
Bind(() => MemberService.Saved += MemberService_Saved,
() => MemberService.Saved -= MemberService_Saved);
Bind(() => MemberService.Deleted += MemberService_Deleted,
() => MemberService.Deleted -= MemberService_Deleted);
Bind(() => MemberGroupService.Saved += MemberGroupService_Saved,
() => MemberGroupService.Saved -= MemberGroupService_Saved);
Bind(() => MemberGroupService.Deleted += MemberGroupService_Deleted,
() => MemberGroupService.Deleted -= MemberGroupService_Deleted);
// bind to media events - handles all media changes
Bind(() => MediaService.TreeChanged += MediaService_Changed,
() => MediaService.TreeChanged -= MediaService_Changed);
2016-09-08 18:43:58 +02:00
// bind to content events
2017-05-12 14:49:44 +02:00
Bind(() => ContentService.Saved += ContentService_Saved, // needed for permissions
() => ContentService.Saved -= ContentService_Saved);
Bind(() => ContentService.Copied += ContentService_Copied, // needed for permissions
() => ContentService.Copied -= ContentService_Copied);
Bind(() => ContentService.TreeChanged += ContentService_Changed,// handles all content changes
() => ContentService.TreeChanged -= ContentService_Changed);
2016-09-08 18:43:58 +02:00
2017-09-14 11:41:46 +02:00
// TreeChanged should also deal with this
//Bind(() => ContentService.SavedBlueprint += ContentService_SavedBlueprint,
// () => ContentService.SavedBlueprint -= ContentService_SavedBlueprint);
//Bind(() => ContentService.DeletedBlueprint += ContentService_DeletedBlueprint,
// () => ContentService.DeletedBlueprint -= ContentService_DeletedBlueprint);
2016-09-08 18:43:58 +02:00
// bind to public access events
2017-05-12 14:49:44 +02:00
Bind(() => PublicAccessService.Saved += PublicAccessService_Saved,
() => PublicAccessService.Saved -= PublicAccessService_Saved);
Bind(() => PublicAccessService.Deleted += PublicAccessService_Deleted,
() => PublicAccessService.Deleted -= PublicAccessService_Deleted);
2016-09-08 18:43:58 +02:00
2017-05-12 14:49:44 +02:00
// bind to relation type events
Bind(() => RelationService.SavedRelationType += RelationService_SavedRelationType,
() => RelationService.SavedRelationType -= RelationService_SavedRelationType);
Bind(() => RelationService.DeletedRelationType += RelationService_DeletedRelationType,
() => RelationService.DeletedRelationType -= RelationService_DeletedRelationType);
}
2016-09-08 18:43:58 +02:00
2017-05-12 14:49:44 +02:00
#region Events binding and handling
2016-09-08 18:43:58 +02:00
2017-05-12 14:49:44 +02:00
private void Bind(Action binder, Action unbinder)
{
// bind now
binder();
2016-09-08 18:43:58 +02:00
2017-05-12 14:49:44 +02:00
// and register unbinder for later, if needed
_unbinders?.Add(unbinder);
}
2016-09-08 18:43:58 +02:00
2017-05-12 14:49:44 +02:00
// for tests
internal void Unbind()
{
if (_unbinders == null)
throw new NotSupportedException();
foreach (var unbinder in _unbinders)
unbinder();
_unbinders = null;
}
2016-09-08 18:43:58 +02:00
2017-05-12 14:49:44 +02:00
internal static MethodInfo FindHandler(IEventDefinition eventDefinition)
{
var name = eventDefinition.Sender.GetType().Name + "_" + eventDefinition.EventName;
2016-09-08 18:43:58 +02:00
2017-05-12 14:49:44 +02:00
return FoundHandlers.GetOrAdd(eventDefinition, _ => CandidateHandlers.Value.FirstOrDefault(x => x.Name == name));
}
2016-09-08 18:43:58 +02:00
2017-05-12 14:49:44 +02:00
private static readonly Lazy<MethodInfo[]> CandidateHandlers = new Lazy<MethodInfo[]>(() =>
{
var underscore = new[] { '_' };
2016-09-08 18:43:58 +02:00
2017-05-12 14:49:44 +02:00
return typeof(CacheRefresherComponent)
2017-07-11 19:13:45 +02:00
.GetMethods(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic)
2017-05-12 14:49:44 +02:00
.Select(x =>
{
if (x.Name.Contains("_") == false) return null;
2016-09-08 18:43:58 +02:00
2017-05-12 14:49:44 +02:00
var parts = x.Name.Split(underscore, StringSplitOptions.RemoveEmptyEntries).Length;
if (parts != 2) return null;
2016-09-08 18:43:58 +02:00
2017-05-12 14:49:44 +02:00
var parameters = x.GetParameters();
if (parameters.Length != 2) return null;
if (typeof(EventArgs).IsAssignableFrom(parameters[1].ParameterType) == false) return null;
return x;
})
.WhereNotNull()
.ToArray();
});
2016-09-08 18:43:58 +02:00
2017-05-12 14:49:44 +02:00
internal static void HandleEvents(IEnumerable<IEventDefinition> events)
{
2017-05-30 10:50:09 +02:00
// fixme remove this in v8, this is a backwards compat hack and is needed because when we are using Deploy, the events will be raised on a background
//thread which means that cache refreshers will also execute on a background thread and in many cases developers may be using UmbracoContext.Current in their
//cache refresher handlers, so before we execute all of the events, we'll ensure a context
UmbracoContext tempContext = null;
if (UmbracoContext.Current == null)
2017-05-12 14:49:44 +02:00
{
2017-05-30 10:50:09 +02:00
var httpContext = new HttpContextWrapper(HttpContext.Current ?? new HttpContext(new SimpleWorkerRequest("temp.aspx", "", new StringWriter())));
tempContext = UmbracoContext.EnsureContext(
Current.UmbracoContextAccessor,
httpContext,
null,
new WebSecurity(httpContext, Current.Services.UserService),
UmbracoConfig.For.UmbracoSettings(),
Current.UrlProviders,
true);
}
try
{
foreach (var e in events)
{
var handler = FindHandler(e);
if (handler == null) continue;
2016-09-08 18:43:58 +02:00
2017-05-30 10:50:09 +02:00
handler.Invoke(null, new[] { e.Sender, e.Args });
}
}
finally
{
tempContext?.Dispose();
2017-05-12 14:49:44 +02:00
}
2016-09-08 18:43:58 +02:00
}
2017-05-12 14:49:44 +02:00
#endregion
2016-09-08 18:43:58 +02:00
#region PublicAccessService
2017-07-11 19:13:45 +02:00
private void PublicAccessService_Saved(IPublicAccessService sender, SaveEventArgs<PublicAccessEntry> e)
2016-09-08 18:43:58 +02:00
{
2017-07-11 19:13:45 +02:00
_distributedCache.RefreshPublicAccess();
2016-09-08 18:43:58 +02:00
}
2017-07-11 19:13:45 +02:00
private void PublicAccessService_Deleted(IPublicAccessService sender, DeleteEventArgs<PublicAccessEntry> e)
2016-09-08 18:43:58 +02:00
{
2017-07-11 19:13:45 +02:00
_distributedCache.RefreshPublicAccess();
2016-09-08 18:43:58 +02:00
}
#endregion
#region ContentService
/// <summary>
/// Handles cache refreshing for when content is copied
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
/// <remarks>
/// When an entity is copied new permissions may be assigned to it based on it's parent, if that is the
/// case then we need to clear all user permissions cache.
/// </remarks>
2017-07-11 19:13:45 +02:00
private void ContentService_Copied(IContentService sender, CopyEventArgs<IContent> e)
2017-09-14 11:41:46 +02:00
{ }
2016-09-08 18:43:58 +02:00
/// <summary>
/// Handles cache refreshing for when content is saved (not published)
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
/// <remarks>
/// When an entity is saved we need to notify other servers about the change in order for the Examine indexes to
/// stay up-to-date for unpublished content.
/// </remarks>
2017-07-11 19:13:45 +02:00
private void ContentService_Saved(IContentService sender, SaveEventArgs<IContent> e)
2017-09-14 11:41:46 +02:00
{ }
2016-09-08 18:43:58 +02:00
2017-07-11 19:13:45 +02:00
private void ContentService_Changed(IContentService sender, TreeChange<IContent>.EventArgs args)
2016-09-08 18:43:58 +02:00
{
2017-07-11 19:13:45 +02:00
_distributedCache.RefreshContentCache(args.Changes.ToArray());
2016-09-08 18:43:58 +02:00
}
2017-06-23 18:54:42 +02:00
// fixme our weird events handling wants this for now
2017-07-11 19:13:45 +02:00
private void ContentService_Deleted(IContentService sender, DeleteEventArgs<IContent> e) { }
private void ContentService_Moved(IContentService sender, MoveEventArgs<IContent> e) { }
private void ContentService_Trashed(IContentService sender, MoveEventArgs<IContent> e) { }
private void ContentService_EmptiedRecycleBin(IContentService sender, RecycleBinEventArgs e) { }
private void ContentService_Published(IContentService sender, PublishEventArgs<IContent> e) { }
private void ContentService_UnPublished(IContentService sender, PublishEventArgs<IContent> e) { }
2017-06-23 18:54:42 +02:00
2017-09-14 11:41:46 +02:00
//private void ContentService_SavedBlueprint(IContentService sender, SaveEventArgs<IContent> e)
//{
// _distributedCache.RefreshUnpublishedPageCache(e.SavedEntities.ToArray());
//}
//private void ContentService_DeletedBlueprint(IContentService sender, DeleteEventArgs<IContent> e)
//{
// _distributedCache.RemoveUnpublishedPageCache(e.DeletedEntities.ToArray());
//}
2016-09-08 18:43:58 +02:00
#endregion
#region ApplicationTreeService
2017-07-11 19:13:45 +02:00
private void ApplicationTreeService_New(ApplicationTree sender, EventArgs e)
2016-09-08 18:43:58 +02:00
{
2017-07-11 19:13:45 +02:00
_distributedCache.RefreshAllApplicationTreeCache();
2016-09-08 18:43:58 +02:00
}
2017-07-11 19:13:45 +02:00
private void ApplicationTreeService_Updated(ApplicationTree sender, EventArgs e)
2016-09-08 18:43:58 +02:00
{
2017-07-11 19:13:45 +02:00
_distributedCache.RefreshAllApplicationTreeCache();
2016-09-08 18:43:58 +02:00
}
2017-07-11 19:13:45 +02:00
private void ApplicationTreeService_Deleted(ApplicationTree sender, EventArgs e)
2016-09-08 18:43:58 +02:00
{
2017-07-11 19:13:45 +02:00
_distributedCache.RefreshAllApplicationTreeCache();
2016-09-08 18:43:58 +02:00
}
2017-07-11 19:13:45 +02:00
2016-09-08 18:43:58 +02:00
#endregion
#region Application event handlers
2017-05-12 14:49:44 +02:00
2017-07-11 19:13:45 +02:00
private void SectionService_New(Section sender, EventArgs e)
2016-09-08 18:43:58 +02:00
{
2017-07-11 19:13:45 +02:00
_distributedCache.RefreshAllApplicationCache();
2016-09-08 18:43:58 +02:00
}
2017-07-11 19:13:45 +02:00
private void SectionService_Deleted(Section sender, EventArgs e)
2016-09-08 18:43:58 +02:00
{
2017-07-11 19:13:45 +02:00
_distributedCache.RefreshAllApplicationCache();
2016-09-08 18:43:58 +02:00
}
#endregion
#region LocalizationService / Dictionary
2017-07-11 19:13:45 +02:00
private void LocalizationService_SavedDictionaryItem(ILocalizationService sender, SaveEventArgs<IDictionaryItem> e)
2016-09-08 18:43:58 +02:00
{
2017-05-12 14:49:44 +02:00
foreach (var entity in e.SavedEntities)
2017-07-11 19:13:45 +02:00
_distributedCache.RefreshDictionaryCache(entity.Id);
2016-09-08 18:43:58 +02:00
}
2017-07-11 19:13:45 +02:00
private void LocalizationService_DeletedDictionaryItem(ILocalizationService sender, DeleteEventArgs<IDictionaryItem> e)
2016-09-08 18:43:58 +02:00
{
2017-05-12 14:49:44 +02:00
foreach (var entity in e.DeletedEntities)
2017-07-11 19:13:45 +02:00
_distributedCache.RemoveDictionaryCache(entity.Id);
2016-09-08 18:43:58 +02:00
}
#endregion
#region DataTypeService
2017-05-12 14:49:44 +02:00
private void DataTypeService_Saved(IDataTypeService sender, SaveEventArgs<IDataType> e)
2016-09-08 18:43:58 +02:00
{
2017-05-12 14:49:44 +02:00
foreach (var entity in e.SavedEntities)
2017-07-11 19:13:45 +02:00
_distributedCache.RefreshDataTypeCache(entity);
2016-09-08 18:43:58 +02:00
}
private void DataTypeService_Deleted(IDataTypeService sender, DeleteEventArgs<IDataType> e)
2016-09-08 18:43:58 +02:00
{
2017-05-12 14:49:44 +02:00
foreach (var entity in e.DeletedEntities)
2017-07-11 19:13:45 +02:00
_distributedCache.RemoveDataTypeCache(entity);
2016-09-08 18:43:58 +02:00
}
#endregion
#region DomainService
2017-07-11 19:13:45 +02:00
private void DomainService_Saved(IDomainService sender, SaveEventArgs<IDomain> e)
2016-09-08 18:43:58 +02:00
{
2017-05-12 14:49:44 +02:00
foreach (var entity in e.SavedEntities)
2017-07-11 19:13:45 +02:00
_distributedCache.RefreshDomainCache(entity);
2016-09-08 18:43:58 +02:00
}
2017-07-11 19:13:45 +02:00
private void DomainService_Deleted(IDomainService sender, DeleteEventArgs<IDomain> e)
2016-09-08 18:43:58 +02:00
{
2017-05-12 14:49:44 +02:00
foreach (var entity in e.DeletedEntities)
2017-07-11 19:13:45 +02:00
_distributedCache.RemoveDomainCache(entity);
2016-09-08 18:43:58 +02:00
}
#endregion
#region LocalizationService / Language
2017-05-12 14:49:44 +02:00
2016-09-08 18:43:58 +02:00
/// <summary>
/// Fires when a langauge is deleted
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
2017-07-11 19:13:45 +02:00
private void LocalizationService_DeletedLanguage(ILocalizationService sender, DeleteEventArgs<ILanguage> e)
2016-09-08 18:43:58 +02:00
{
2017-05-12 14:49:44 +02:00
foreach (var entity in e.DeletedEntities)
2017-07-11 19:13:45 +02:00
_distributedCache.RemoveLanguageCache(entity);
2016-09-08 18:43:58 +02:00
}
/// <summary>
/// Fires when a langauge is saved
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
2017-07-11 19:13:45 +02:00
private void LocalizationService_SavedLanguage(ILocalizationService sender, SaveEventArgs<ILanguage> e)
2016-09-08 18:43:58 +02:00
{
2017-05-12 14:49:44 +02:00
foreach (var entity in e.SavedEntities)
2017-07-11 19:13:45 +02:00
_distributedCache.RefreshLanguageCache(entity);
2016-09-08 18:43:58 +02:00
}
#endregion
#region Content|Media|MemberTypeService
2017-07-11 19:13:45 +02:00
private void ContentTypeService_Changed(IContentTypeService sender, ContentTypeChange<IContentType>.EventArgs args)
2016-09-08 18:43:58 +02:00
{
2017-07-11 19:13:45 +02:00
_distributedCache.RefreshContentTypeCache(args.Changes.ToArray());
2016-09-08 18:43:58 +02:00
}
2017-07-11 19:13:45 +02:00
private void MediaTypeService_Changed(IMediaTypeService sender, ContentTypeChange<IMediaType>.EventArgs args)
2016-09-08 18:43:58 +02:00
{
2017-07-11 19:13:45 +02:00
_distributedCache.RefreshContentTypeCache(args.Changes.ToArray());
2016-09-08 18:43:58 +02:00
}
2017-07-11 19:13:45 +02:00
private void MemberTypeService_Changed(IMemberTypeService sender, ContentTypeChange<IMemberType>.EventArgs args)
2016-09-08 18:43:58 +02:00
{
2017-07-11 19:13:45 +02:00
_distributedCache.RefreshContentTypeCache(args.Changes.ToArray());
2016-09-08 18:43:58 +02:00
}
2017-06-23 18:54:42 +02:00
// fixme our weird events handling wants this for now
2017-07-11 19:13:45 +02:00
private void ContentTypeService_Saved(IContentTypeService sender, SaveEventArgs<IContentType> args) { }
private void MediaTypeService_Saved(IMediaTypeService sender, SaveEventArgs<IMediaType> args) { }
private void MemberTypeService_Saved(IMemberTypeService sender, SaveEventArgs<IMemberType> args) { }
private void ContentTypeService_Deleted(IContentTypeService sender, DeleteEventArgs<IContentType> args) { }
private void MediaTypeService_Deleted(IMediaTypeService sender, DeleteEventArgs<IMediaType> args) { }
private void MemberTypeService_Deleted(IMemberTypeService sender, DeleteEventArgs<IMemberType> args) { }
2017-06-23 18:54:42 +02:00
2016-09-08 18:43:58 +02:00
#endregion
2017-09-14 11:41:46 +02:00
#region UserService
2016-09-08 18:43:58 +02:00
2017-09-14 11:41:46 +02:00
static void UserService_UserGroupPermissionsAssigned(IUserService sender, SaveEventArgs<EntityPermission> e)
2016-09-08 18:43:58 +02:00
{
2017-09-14 11:41:46 +02:00
//TODO: Not sure if we need this yet depends if we start caching permissions
//var groupIds = e.SavedEntities.Select(x => x.UserGroupId).Distinct();
//foreach (var groupId in groupIds)
//{
// DistributedCache.Instance.RefreshUserGroupPermissionsCache(groupId);
//}
2016-09-08 18:43:58 +02:00
}
2017-07-11 19:13:45 +02:00
private void UserService_SavedUser(IUserService sender, SaveEventArgs<IUser> e)
2016-09-08 18:43:58 +02:00
{
2017-05-12 14:49:44 +02:00
foreach (var entity in e.SavedEntities)
2017-07-11 19:13:45 +02:00
_distributedCache.RefreshUserCache(entity.Id);
2016-09-08 18:43:58 +02:00
}
2017-07-11 19:13:45 +02:00
private void UserService_DeletedUser(IUserService sender, DeleteEventArgs<IUser> e)
2016-09-08 18:43:58 +02:00
{
2017-05-12 14:49:44 +02:00
foreach (var entity in e.DeletedEntities)
2017-07-11 19:13:45 +02:00
_distributedCache.RemoveUserCache(entity.Id);
2017-09-14 11:41:46 +02:00
}
private void UserService_SavedUserGroup(IUserService sender, SaveEventArgs<IUserGroup> e)
{
foreach (var entity in e.SavedEntities)
_distributedCache.RefreshUserGroupCache(entity.Id);
}
private void UserService_DeletedUserGroup(IUserService sender, DeleteEventArgs<IUserGroup> e)
{
foreach (var entity in e.DeletedEntities)
_distributedCache.RemoveUserGroupCache(entity.Id);
2016-09-08 18:43:58 +02:00
}
#endregion
2017-06-23 18:54:42 +02:00
#region FileService
2016-09-08 18:43:58 +02:00
/// <summary>
/// Removes cache for template
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
2017-07-11 19:13:45 +02:00
private void FileService_DeletedTemplate(IFileService sender, DeleteEventArgs<ITemplate> e)
2016-09-08 18:43:58 +02:00
{
2017-05-12 14:49:44 +02:00
foreach (var entity in e.DeletedEntities)
2017-07-11 19:13:45 +02:00
_distributedCache.RemoveTemplateCache(entity.Id);
2016-09-08 18:43:58 +02:00
}
/// <summary>
/// Refresh cache for template
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
2017-07-11 19:13:45 +02:00
private void FileService_SavedTemplate(IFileService sender, SaveEventArgs<ITemplate> e)
2016-09-08 18:43:58 +02:00
{
2017-05-12 14:49:44 +02:00
foreach (var entity in e.SavedEntities)
2017-07-11 19:13:45 +02:00
_distributedCache.RefreshTemplateCache(entity.Id);
2016-09-08 18:43:58 +02:00
}
2017-06-23 18:54:42 +02:00
// fixme our weird events handling wants this for now
2017-07-11 19:13:45 +02:00
private void FileService_DeletedStylesheet(IFileService sender, DeleteEventArgs<Stylesheet> e) { }
private void FileService_SavedStylesheet(IFileService sender, SaveEventArgs<Stylesheet> e) { }
2017-06-23 18:54:42 +02:00
2016-09-08 18:43:58 +02:00
#endregion
#region MacroService
2017-07-11 19:13:45 +02:00
private void MacroService_Deleted(IMacroService sender, DeleteEventArgs<IMacro> e)
2016-09-08 18:43:58 +02:00
{
foreach (var entity in e.DeletedEntities)
2017-07-11 19:13:45 +02:00
_distributedCache.RemoveMacroCache(entity);
2016-09-08 18:43:58 +02:00
}
2017-07-11 19:13:45 +02:00
private void MacroService_Saved(IMacroService sender, SaveEventArgs<IMacro> e)
2016-09-08 18:43:58 +02:00
{
foreach (var entity in e.SavedEntities)
2017-07-11 19:13:45 +02:00
_distributedCache.RefreshMacroCache(entity);
2016-09-08 18:43:58 +02:00
}
#endregion
#region MediaService
2017-07-11 19:13:45 +02:00
private void MediaService_Changed(IMediaService sender, TreeChange<IMedia>.EventArgs args)
2016-09-08 18:43:58 +02:00
{
2017-07-11 19:13:45 +02:00
_distributedCache.RefreshMediaCache(args.Changes.ToArray());
2016-09-08 18:43:58 +02:00
}
2017-06-23 18:54:42 +02:00
// fixme our weird events handling wants this for now
2017-07-11 19:13:45 +02:00
private void MediaService_Saved(IMediaService sender, SaveEventArgs<IMedia> e) { }
private void MediaService_Deleted(IMediaService sender, DeleteEventArgs<IMedia> e) { }
private void MediaService_Moved(IMediaService sender, MoveEventArgs<IMedia> e) { }
private void MediaService_Trashed(IMediaService sender, MoveEventArgs<IMedia> e) { }
private void MediaService_EmptiedRecycleBin(IMediaService sender, RecycleBinEventArgs e) { }
2017-06-23 18:54:42 +02:00
2016-09-08 18:43:58 +02:00
#endregion
#region MemberService
2017-07-11 19:13:45 +02:00
private void MemberService_Deleted(IMemberService sender, DeleteEventArgs<IMember> e)
2016-09-08 18:43:58 +02:00
{
2017-07-11 19:13:45 +02:00
_distributedCache.RemoveMemberCache(e.DeletedEntities.ToArray());
2016-09-08 18:43:58 +02:00
}
2017-07-11 19:13:45 +02:00
private void MemberService_Saved(IMemberService sender, SaveEventArgs<IMember> e)
2016-09-08 18:43:58 +02:00
{
2017-07-11 19:13:45 +02:00
_distributedCache.RefreshMemberCache(e.SavedEntities.ToArray());
2016-09-08 18:43:58 +02:00
}
#endregion
#region MemberGroupService
2017-07-11 19:13:45 +02:00
private void MemberGroupService_Deleted(IMemberGroupService sender, DeleteEventArgs<IMemberGroup> e)
2016-09-08 18:43:58 +02:00
{
foreach (var m in e.DeletedEntities.ToArray())
{
2017-07-11 19:13:45 +02:00
_distributedCache.RemoveMemberGroupCache(m.Id);
2016-09-08 18:43:58 +02:00
}
}
2017-07-11 19:13:45 +02:00
private void MemberGroupService_Saved(IMemberGroupService sender, SaveEventArgs<IMemberGroup> e)
2016-09-08 18:43:58 +02:00
{
foreach (var m in e.SavedEntities.ToArray())
{
2017-07-11 19:13:45 +02:00
_distributedCache.RemoveMemberGroupCache(m.Id);
2016-09-08 18:43:58 +02:00
}
}
#endregion
2017-05-12 14:49:44 +02:00
#region RelationType
2017-07-11 19:13:45 +02:00
private void RelationService_SavedRelationType(IRelationService sender, SaveEventArgs<IRelationType> args)
2017-05-12 14:49:44 +02:00
{
2017-07-11 19:13:45 +02:00
var dc = _distributedCache;
2017-05-12 14:49:44 +02:00
foreach (var e in args.SavedEntities)
dc.RefreshRelationTypeCache(e.Id);
}
2017-07-11 19:13:45 +02:00
private void RelationService_DeletedRelationType(IRelationService sender, DeleteEventArgs<IRelationType> args)
2017-05-12 14:49:44 +02:00
{
2017-07-11 19:13:45 +02:00
var dc = _distributedCache;
2017-05-12 14:49:44 +02:00
foreach (var e in args.DeletedEntities)
dc.RemoveRelationTypeCache(e.Id);
}
2017-07-20 11:21:28 +02:00
2017-05-12 14:49:44 +02:00
#endregion
2016-09-08 18:43:58 +02:00
}
2017-07-20 11:21:28 +02:00
}