/// <summary> /// Starts <paramref name="entity"/> synchronization action for users that has synchronization. /// </summary> /// <param name="entity"><see cref="Entity"/> instance.</param> /// <param name="e"><paramref name="entity"/> event arguments instance.</param> /// <param name="action">Synchronization action.</param> protected void SyncEntity(Entity entity, EntityAfterEventArgs e, SyncAction action) { var userConnection = entity.UserConnection; if (!userConnection.GetIsFeatureEnabled("ExchangeCalendarWithoutMetadata") || !ClassFactory.HasBinding(typeof(ISynchronizationUCManager))) { return; } var asyncExecutor = ClassFactory.Get <IEntityEventAsyncExecutor>(new ConstructorArgument("userConnection", userConnection)); foreach (var user in GetUsers(entity, action, entity.UserConnection)) { var controllerNames = user.Value; if (e.ModifiedColumnValues == null) { e.ModifiedColumnValues = new EntityColumnValueCollection(userConnection); } var operationArgs = new SyncEntityEventAsyncOperationArgs(entity, e); operationArgs.Controllers = controllerNames; operationArgs.UserContactId = user.Key; operationArgs.Action = action; asyncExecutor.ExecuteAsync <SynchronizationControllerManager>(operationArgs); } }
/// <summary> /// Returns related entity ModifiedOn column value. Returns <c>DateTime.UtcNow</c> if ModifiedOn column value not avaliable. /// </summary> /// <param name="userConnection"><see cref="UserConnection"/> instance.</param> /// <param name="arguments">Changed entity synchronization events.</param> /// <returns>ModifiedOn column value.</returns> protected DateTime GetModifiedOnColumnValue(UserConnection userConnection, SyncEntityEventAsyncOperationArgs arguments) { if (!arguments.EntityColumnValues.ContainsKey("ModifiedOn")) { return(DateTime.UtcNow); } var modifiedOn = (DateTime)arguments.EntityColumnValues["ModifiedOn"]; return(modifiedOn.Kind == DateTimeKind.Utc ? modifiedOn : TimeZoneInfo.ConvertTimeToUtc(modifiedOn, userConnection.CurrentUser.TimeZone)); }
/// <summary> /// Creates parameters collection for synchronization controllers execution. /// </summary> /// <param name="userConnection"><see cref="UserConnection"/> instance.</param> /// <param name="arguments">Changed entity synchronization events.</param> /// <returns>Parameters collection for synchronization controllers execution.</returns> protected virtual Dictionary <string, object> GetSynchronizationParams(UserConnection userConnection, SyncEntityEventAsyncOperationArgs arguments) { return(new Dictionary <string, object> { { "EntityId", arguments.EntityId }, { "EntitySchemaName", arguments.EntitySchemaName }, { "ModifiedOn", GetModifiedOnColumnValue(userConnection, arguments) }, { "SyncAction", (int)arguments.Action }, { "UserContactId", arguments.UserContactId }, { "ColumnValues", arguments.EntityColumnValues } }); }