namespace zero.Communication; public abstract partial class Interceptor : Interceptor, IInterceptor where T : ZeroIdEntity { /// public Type ModelType { get; protected set; } public Interceptor() { Gravity = 0; ModelType = typeof(T); Name = ModelType.Name; } /// public override bool CanHandle(InterceptorParameters args, Type modelType) => ModelType.IsAssignableFrom(modelType); /// public virtual Task> Creating(InterceptorParameters args, T model) => Task.FromResult>(default); /// public sealed override async Task> Creating(InterceptorParameters args, ZeroIdEntity model) => Convert(await Creating(args, model as T)); /// public virtual Task> Updating(InterceptorParameters args, T model) => Task.FromResult>(default); /// public sealed override async Task> Updating(InterceptorParameters args, ZeroIdEntity model) => Convert(await Updating(args, model as T)); /// public virtual Task> Deleting(InterceptorParameters args, T model) => Task.FromResult>(default); /// public sealed override async Task> Deleting(InterceptorParameters args, ZeroIdEntity model) => Convert(await Deleting(args, model as T)); /// public virtual Task Created(InterceptorParameters args, T model) => Task.CompletedTask; /// public sealed override Task Created(InterceptorParameters args, ZeroIdEntity model) => Created(args, model as T); /// public virtual Task Updated(InterceptorParameters args, T model) => Task.CompletedTask; /// public sealed override Task Updated(InterceptorParameters args, ZeroIdEntity model) => Updated(args, model as T); /// public virtual Task Deleted(InterceptorParameters args, T model) => Task.CompletedTask; /// public sealed override Task Deleted(InterceptorParameters args, ZeroIdEntity model) => Deleted(args, model as T); InterceptorResult Convert(InterceptorResult result) { if (result == default) { return default; } return new InterceptorResult() { Continue = result.Continue, InterceptorHash = result.InterceptorHash, Result = result.Result != null ? result.Result.ConvertTo(result.Result.Model) : null }; } } public abstract partial class Interceptor : IInterceptor { /// public int Gravity { get; protected set; } /// public string Name { get; protected set; } /// public string Hash { get; protected set; } public Interceptor() { Gravity = 0; Hash = IdGenerator.Create(); } /// public virtual bool CanHandle(InterceptorParameters args, Type modelType) => true; /// public virtual Task> Creating(InterceptorParameters args, ZeroIdEntity model) => Task.FromResult>(default); /// public virtual Task> Updating(InterceptorParameters args, ZeroIdEntity model) => Task.FromResult>(default); /// public virtual Task> Deleting(InterceptorParameters args, ZeroIdEntity model) => Task.FromResult>(default); /// public virtual Task Created(InterceptorParameters args, ZeroIdEntity model) => Task.CompletedTask; /// public virtual Task Updated(InterceptorParameters args, ZeroIdEntity model) => Task.CompletedTask; /// public virtual Task Deleted(InterceptorParameters args, ZeroIdEntity model) => Task.CompletedTask; } public interface IInterceptor : IInterceptor where T : ZeroIdEntity { /// /// Type of the associated model /// Type ModelType { get; } /// /// Called after an entity has been stored but before the session has saved its changes /// Task Created(InterceptorParameters args, T model); /// /// Called before an entity is stored and validated /// Task> Creating(InterceptorParameters args, T model); /// /// Called after an entity has been deleted but before the session has saved its changes /// Task Deleted(InterceptorParameters args, T model); /// /// Called before an entity is deleted /// Task> Deleting(InterceptorParameters args, T model); /// /// Called after an entity has been updated but before the session has saved its changes /// Task Updated(InterceptorParameters args, T model); /// /// Called before an entity is stored and validated /// Task> Updating(InterceptorParameters args, T model); } public interface IInterceptor { /// /// Interceptors with a higher gravity will run before any with lower gravity /// int Gravity { get; } /// /// Readable name for this interceptor /// string Name { get; } /// /// Hash which is used for this interceptor to be able to pass results from Start to Complete methods /// string Hash { get; } /// /// Whether any of the interceptor methods is allowed to run based on the parameters /// bool CanHandle(InterceptorParameters args, Type modelType); /// /// Called after an entity has been stored but before the session has saved its changes /// Task Created(InterceptorParameters args, ZeroIdEntity model); /// /// Called before an entity is stored and validated /// Task> Creating(InterceptorParameters args, ZeroIdEntity model); /// /// Called after an entity has been deleted but before the session has saved its changes /// Task Deleted(InterceptorParameters args, ZeroIdEntity model); /// /// Called before an entity is deleted /// Task> Deleting(InterceptorParameters args, ZeroIdEntity model); /// /// Called after an entity has been updated but before the session has saved its changes /// Task Updated(InterceptorParameters args, ZeroIdEntity model); /// /// Called before an entity is stored and validated /// Task> Updating(InterceptorParameters args, ZeroIdEntity model); }