using FluentValidation; using Raven.Client.Documents.Session; using System; using System.Collections.Generic; using System.Threading.Tasks; using zero.Core.Database; using zero.Core.Entities; namespace zero.Core.Collections { public abstract class CollectionInterceptor : ICollectionInterceptor { /// public virtual HashSet Types { get; } = new(); /// public virtual Task> Creating(CreateParameters args) where T : ZeroEntity => Task.FromResult>(default); /// public virtual Task> Updating(UpdateParameters args) where T : ZeroEntity => Task.FromResult>(default); /// public virtual Task> Deleting(DeleteParameters args) where T : ZeroEntity => Task.FromResult>(default); /// public virtual Task> Purging(PurgeParameters args) where T : ZeroEntity => Task.FromResult>(default); /// public virtual Task Created(CreateParameters args) where T : ZeroEntity => Task.CompletedTask; /// public virtual Task Updated(UpdateParameters args) where T : ZeroEntity => Task.CompletedTask; /// public virtual Task Deleted(DeleteParameters args) where T : ZeroEntity => Task.CompletedTask; /// public virtual Task Purged(PurgeParameters args) where T : ZeroEntity => Task.CompletedTask; public class Parameters where T : ZeroEntity { /// /// The current zero context /// public IZeroContext Context { get; set; } /// /// Raven document store /// public IZeroStore Store { get; set; } /// /// Currently loaded document session /// public IAsyncDocumentSession Session { get; set; } /// /// Validator for the affected entity /// public IValidator Validator { get; set; } } public class CreateParameters : Parameters where T : ZeroEntity { /// /// The model which is created /// public T Model { get; set; } } public class UpdateParameters : Parameters where T : ZeroEntity { /// /// The Id of the model which is updated /// public string Id { get; set; } /// /// The module which is updated /// public T Model { get; set; } } public class DeleteParameters : Parameters where T : ZeroEntity { /// /// The id of the model which is deleted /// public string Id { get; set; } /// /// The model which is deleted /// public T Model { get; set; } } public class PurgeParameters : Parameters where T : ZeroEntity { } } public interface ICollectionInterceptor { /// /// Affacted document types /// HashSet Types { get; } /// /// Called after an entity has been stored but before the session has saved its changes /// Task Created(CollectionInterceptor.CreateParameters args) where T : ZeroEntity; /// /// Called before an entity is stored and validated /// Task> Creating(CollectionInterceptor.CreateParameters args) where T : ZeroEntity; /// /// Called after an entity has been deleted but before the session has saved its changes /// Task Deleted(CollectionInterceptor.DeleteParameters args) where T : ZeroEntity; /// /// Called before an entity is deleted /// Task> Deleting(CollectionInterceptor.DeleteParameters args) where T : ZeroEntity; /// /// Called after the document collection has been purged /// Task Purged(CollectionInterceptor.PurgeParameters args) where T : ZeroEntity; /// /// Called before a collection is purged /// Task> Purging(CollectionInterceptor.PurgeParameters args) where T : ZeroEntity; /// /// Called after an entity has been updated but before the session has saved its changes /// Task Updated(CollectionInterceptor.UpdateParameters args) where T : ZeroEntity; /// /// Called before an entity is stored and validated /// Task> Updating(CollectionInterceptor.UpdateParameters args) where T : ZeroEntity; } }