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-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>
2016-10-07 14:34:55 +02:00
[RuntimeLevel(MinLevel = RuntimeLevel.Run)]
2016-12-15 13:15:49 +01:00
[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 ) ;
// bind to user and user type events
Bind ( ( ) = > UserService . SavedUserType + = UserService_SavedUserType ,
( ) = > UserService . SavedUserType - = UserService_SavedUserType ) ;
Bind ( ( ) = > UserService . DeletedUserType + = UserService_DeletedUserType ,
( ) = > UserService . DeletedUserType - = UserService_DeletedUserType ) ;
Bind ( ( ) = > UserService . SavedUser + = UserService_SavedUser ,
( ) = > UserService . SavedUser - = UserService_SavedUser ) ;
Bind ( ( ) = > UserService . DeletedUser + = UserService_DeletedUser ,
( ) = > UserService . DeletedUser - = UserService_DeletedUser ) ;
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 permission events
2017-05-12 14:49:44 +02:00
// fixme see v7 events? the PermissionNew/Updated/Deleted are not supported here?
Bind ( ( ) = > PermissionRepository < IContent > . AssignedPermissions + = PermissionRepository_AssignedPermissions ,
( ) = > PermissionRepository < IContent > . AssignedPermissions - = PermissionRepository_AssignedPermissions ) ;
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
// 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 )
2016-09-08 18:43:58 +02:00
{
//check if permissions have changed
var permissionsChanged = ( ( Content ) e . Copy ) . WasPropertyDirty ( "PermissionsChanged" ) ;
if ( permissionsChanged )
{
2017-07-11 19:13:45 +02:00
_distributedCache . RefreshAllUserPermissionsCache ( ) ;
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.
///
/// When an entity is created 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_Saved ( IContentService sender , SaveEventArgs < IContent > e )
2016-09-08 18:43:58 +02:00
{
var clearUserPermissions = false ;
2017-05-12 14:49:44 +02:00
foreach ( var entity in e . SavedEntities )
2016-09-08 18:43:58 +02:00
{
//check if it is new
2017-05-12 14:49:44 +02:00
if ( entity . IsNewEntity ( ) )
2016-09-08 18:43:58 +02:00
{
//check if permissions have changed
2017-05-12 14:49:44 +02:00
var permissionsChanged = ( ( Content ) entity ) . WasPropertyDirty ( "PermissionsChanged" ) ;
2016-09-08 18:43:58 +02:00
if ( permissionsChanged )
{
clearUserPermissions = true ;
}
}
2017-05-12 14:49:44 +02:00
}
2016-09-08 18:43:58 +02:00
if ( clearUserPermissions )
{
2017-07-11 19:13:45 +02:00
_distributedCache . RefreshAllUserPermissionsCache ( ) ;
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
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 UserService / UserType
2017-07-11 19:13:45 +02:00
private void UserService_DeletedUserType ( IUserService sender , DeleteEventArgs < IUserType > 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 . RemoveUserTypeCache ( entity . Id ) ;
2016-09-08 18:43:58 +02:00
}
2017-07-11 19:13:45 +02:00
private void UserService_SavedUserType ( IUserService sender , SaveEventArgs < IUserType > 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 . RefreshUserTypeCache ( entity . Id ) ;
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
2017-07-11 19:13:45 +02:00
private void DataTypeService_Saved ( IDataTypeService sender , SaveEventArgs < IDataTypeDefinition > 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
}
2017-07-11 19:13:45 +02:00
private void DataTypeService_Deleted ( IDataTypeService sender , DeleteEventArgs < IDataTypeDefinition > 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
#region UserService & PermissionRepository
2017-07-11 19:13:45 +02:00
private void PermissionRepository_AssignedPermissions ( PermissionRepository < IContent > sender , SaveEventArgs < EntityPermission > e )
2016-09-08 18:43:58 +02:00
{
var userIds = e . SavedEntities . Select ( x = > x . UserId ) . Distinct ( ) ;
2017-05-12 14:49:44 +02:00
foreach ( var id in userIds )
2017-07-11 19:13:45 +02:00
_distributedCache . RefreshUserPermissionsCache ( id ) ;
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 ) ;
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
}