public void OnPreUpdateCollection(PreCollectionUpdateEvent @event) { var affectedOwnerEntityName = @event.GetAffectedOwnerEntityName(); //var role = @event.Collection.Role; if (_authorizationObjects.Any(a => a == affectedOwnerEntityName) && @event.Collection.IsDirty) { OperationAuthorizationService.InvalidateCache(); } }
public void OnPreCollectionUpdateLogEvent(PreCollectionUpdateEvent @event) { if (IsTemporarilyDisabled) { return; } if (!_isEnabled) { return; } if (@event == null || @event.AffectedOwnerOrNull is AuditLogEntry) { return; } // Is the Parent Entity of the collection Auditable? var affectedOwnerEntityName = @event.GetAffectedOwnerEntityName(); if (!_auditableEntities.ContainsKey(affectedOwnerEntityName)) { return; } // Is the Collection Auditable? var auditableEntity = _auditableEntities[affectedOwnerEntityName]; var role = @event.Collection.Role; var key = role.Substring(role.LastIndexOf(".", StringComparison.Ordinal) + 1); if (!auditableEntity.Properties.ContainsKey(key)) { return; } var auditableProperty = auditableEntity.Properties[key]; var classMetadata = @event.Session.SessionFactory.GetClassMetadata(auditableProperty.Datatype); var identifierPropertyName = classMetadata.IdentifierPropertyName; if (!(@event.Session.SessionFactory.GetCollectionMetadata(role) is ICollectionPersister collectionPersister)) { throw new Exception("CollectionPersister is null. Not sure why."); } var type = GetTypeFromClassName(auditableProperty.Datatype); if (!(type != null)) { return; } if (collectionPersister.IsInverse) { _log.Debug($"Collection [{key}] of entity [{affectedOwnerEntityName}] is inverse!"); return; } var session = @event.Session.GetSession(EntityMode.Poco); var username = _getAuditContext().Username; var shouldFlush = false; foreach (var obj1 in @event.Collection.GetDeletes(collectionPersister, false)) { var propertyInfo = type.GetProperty(identifierPropertyName); if (propertyInfo == null) { continue; } var keyValue = propertyInfo.GetValue(obj1); var entry = new AuditLogEntry { EntityShortName = @event.AffectedOwnerOrNull.GetType().Name, EntityFullName = affectedOwnerEntityName, UserName = username, EntityId = @event.AffectedOwnerIdOrNull.ToString(), EntryTypeId = _auditLogEntryTypes["UPDATE"].Id, Timestamp = DateTime.UtcNow, ActionTypeId = _auditLogPropertyActionTypes["REMOVE"].Id, PropertyName = key, OldValue = keyValue.ToString() }; session.Save(entry); shouldFlush = true; } var i = -1; if (@event.Collection.IsDirty) { foreach (var entryAdded in @event.Collection.Entries(collectionPersister)) { ++i; var elemType = NHibernateUtil.GetSerializable(type); if ([email protected](entryAdded, i, elemType)) { continue; } var propertyInfo = type.GetProperty(identifierPropertyName); if (propertyInfo == null) { continue; } var keyValue = propertyInfo.GetValue(entryAdded); var entry = new AuditLogEntry { EntityShortName = @event.AffectedOwnerOrNull.GetType().Name, EntityFullName = affectedOwnerEntityName, UserName = username, EntityId = @event.AffectedOwnerIdOrNull.ToString(), EntryTypeId = _auditLogEntryTypes["UPDATE"].Id, Timestamp = DateTime.UtcNow, ActionTypeId = _auditLogPropertyActionTypes["ADD"].Id, PropertyName = key, NewValue = keyValue.ToString() }; session.Save(entry); shouldFlush = true; } if (i > 10) { _log.Warn($"Parsed {i} Entities for Collection [{key}] of entity [{affectedOwnerEntityName}]!"); } } else { _log.Info($"Collection [{key}] of entity [{affectedOwnerEntityName}] is not Dirty. Skipping looking for inserted entries."); } if (shouldFlush) { // Flush only once session.Flush(); } }