Files
mixtape/zero.Core/Communication/Interceptors/Interceptor.cs
T

207 lines
6.8 KiB
C#
Raw Normal View History

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