Exemple #1
0
        public static async Task RaiseOnSaving(this EntityServices @this, IEntity record, CancelEventArgs e)
        {
            if (record == null)
            {
                throw new ArgumentNullException(nameof(record));
            }

            await GlobalEntityEvents.OnInstanceSaving(e);

            if (e.Cancel)
            {
                return;
            }

            await(record as Entity).OnSaving(e);

            foreach (var item in Context.Current.GetServices <IEntitySavingInterceptor>())
            {
                var task = item.Process(record);
                if (task != null)
                {
                    await task;
                }
            }
        }
Exemple #2
0
        public static async Task RaiseOnDeleting(this EntityServices @this, IEntity record, CancelEventArgs args)
        {
            await GlobalEntityEvents.OnInstanceDeleting(args);

            if (args.Cancel)
            {
                return;
            }
            await((Entity)record).OnDeleting(args);
        }
Exemple #3
0
        public static async Task RaiseOnValidating(this EntityServices @this, IEntity record, EventArgs args)
        {
            await GlobalEntityEvents.OnInstanceValidating(args);

            await((Entity)record).OnValidating(args);
        }
Exemple #4
0
 static async Task RaiseSaveEventFor(IEntity entity)
 {
     var mode = entity.IsNew ? SaveMode.Insert : SaveMode.Update;
     await GlobalEntityEvents.OnInstanceSaved(new GlobalSaveEventArgs(entity, mode));
 }
Exemple #5
0
        internal async Task Import(ReplicateDataMessage message)
        {
            if (message.CreationUtc < RefreshRequestUtc?.Subtract(TimeSyncTolerance))
            {
                // Ignore this. We will receive a full table after this anyway.
                Log.Info("Ignored importing expired ReplicateDataMessage " + message.DeduplicationId + " because it's older the last refresh request.");
                return;
            }

            if (message.IsClearSignal)
            {
                Log.Debug($"Received Clear Signal for {message.TypeFullName}");

                await Database.GetAccess(DomainType).ExecuteNonQuery($"truncate table {SchemaAttribute.GetSchema(DomainType).WithSuffix(".")}{TableNameAttribute.GetTableName(DomainType)}");

                return;
            }

            Log.Debug($"Beginning to import ReplicateDataMessage for {message.TypeFullName}:\n{message.Entity}\n\n");

            IEntity entity;

            try { entity = await Deserialize(message.Entity); }
            catch (Exception ex)
            {
                Log.Error(ex, "Failed to deserialize a message of :> " + message.TypeFullName + " message : " + message.Entity);
                throw;
            }

            try
            {
                if (message.ToDelete)
                {
                    if (await Endpoint.OnDeleting(message, entity))
                    {
                        await Database.Delete(entity);

                        await Endpoint.OnDeleted(message, entity);
                    }
                }
                else
                {
                    var mode = entity.IsNew ? SaveMode.Insert : SaveMode.Update;

                    if (mode == SaveMode.Update && !await IsActuallyChanged(entity))
                    {
                        return;
                    }

                    if (!await Endpoint.OnSaving(message, entity, mode))
                    {
                        return;
                    }

                    var bypass = SaveBehaviour.BypassAll;

                    if (Config.Get("Database:Audit:EnableForEndpointDataReplication", defaultValue: false))
                    {
                        bypass &= ~SaveBehaviour.BypassLogging;
                    }

                    await Database.Save(entity, bypass);

                    await GlobalEntityEvents.OnInstanceSaved(new GlobalSaveEventArgs(entity, mode));

                    await Endpoint.OnSaved(message, entity, mode);

                    Log.Debug("Saved the " + entity.GetType().FullName + " " + entity.GetId());
                }
            }
            catch (Exception ex)
            {
                Log.Error(ex, "Failed to import.");
                throw;
            }
        }
        internal async Task Import(ReplicateDataMessage message)
        {
            if (message.CreationUtc < RefreshRequestUtc?.Subtract(TimeSyncTolerance))
            {
                // Ignore this. We will receive a full table after this anyway.
                Log.Info("Ignored importing expired ReplicateDataMessage " + message.DeduplicationId + " because it's older the last refresh request.");
                return;
            }

            if (message.IsClearSignal)
            {
                Log.Debug($"Received Clear Signal for {message.TypeFullName}");
                var existingRecords = await Database.Of(DomainType).GetList();

                Log.Debug($"Deleting all {message.TypeFullName} ({existingRecords.Count()} records)");

                foreach (var item in existingRecords)
                {
                    await Database.Delete(item, DeleteBehaviour.BypassAll);
                }

                return;
            }

            Log.Debug($"Beginning to import ReplicateDataMessage for {message.TypeFullName}:\n{message.Entity}\n\n");

            IEntity entity;

            try { entity = await Deserialize(message.Entity); }
            catch (Exception ex)
            {
                Log.Error(ex, "Failed to deserialize a message of :> " + message.TypeFullName + " message : " + message.Entity);
                throw;
            }

            try
            {
                if (message.ToDelete)
                {
                    if (await Endpoint.OnDeleting(message, entity))
                    {
                        await Database.Delete(entity);

                        await Endpoint.OnDeleted(message, entity);
                    }
                }
                else
                {
                    var mode = entity.IsNew ? SaveMode.Insert : SaveMode.Update;

                    if (mode == SaveMode.Update && !await IsActuallyChanged(entity))
                    {
                        return;
                    }

                    if (!await Endpoint.OnSaving(message, entity, mode))
                    {
                        return;
                    }

                    await Database.Save(entity, SaveBehaviour.BypassAll);

                    await GlobalEntityEvents.OnInstanceSaved(new GlobalSaveEventArgs(entity, mode));

                    await Endpoint.OnSaved(message, entity, mode);

                    Log.Debug("Saved the " + entity.GetType().FullName + " " + entity.GetId());
                }
            }
            catch (Exception ex)
            {
                Log.Error(ex, "Failed to import.");
                throw;
            }
        }