using FluentValidation.Results; namespace zero.Configuration; public class IntegrationStore : IIntegrationStore { protected IStoreOperations Operations { get; private set; } protected IIntegrationTypeService IntegrationTypes { get; private set; } public IntegrationStore(IStoreContext context, IIntegrationTypeService integrationTypes) { IntegrationTypes = integrationTypes; Operations = new StoreOperations(context.Context, context.Interceptors, context.Options, new StoreConfig() { IncludeInactive = true }); } /// public virtual Task Empty(string alias) { IntegrationType type = IntegrationTypes.GetByAlias(alias); Integration integration = type?.Construct(type); if (integration != null) { integration.TypeAlias = alias; } return Task.FromResult(integration); } /// public virtual async Task Load(string alias) { Paged result = await Operations.Load(1, 1, q => q.Where(x => x.TypeAlias == alias)); return result.Items.FirstOrDefault(); } /// public virtual string GetChangeToken(Integration model) => Operations.GetChangeToken(model); /// public virtual async Task> Create(Integration model) => await Save(model, true); /// public virtual async Task> Update(Integration model) => await Save(model, false); /// public virtual async Task> Activate(string alias) { Integration model = await Load(alias); if (model != null) { model.IsActive = true; } return await Update(model); } /// public virtual async Task> Deactivate(string alias) { Integration model = await Load(alias); if (model != null) { model.IsActive = false; } return await Update(model); } /// public async Task> Delete(string alias) { Integration integration = await Load(alias); return await Operations.Delete(integration); } // protected virtual async Task Validate(Integration model) { await Task.Delay(0); return new ValidationResult(); //ZeroValidator validator = new(); //ValidationRules(validator); //return await validator.ValidateAsync(model); //return base.Validate(model); } /// protected virtual async Task> Save(Integration model, bool create = false) { if (model == null) { return Result.Fail("@integration.errors.notfound"); } IntegrationType type = IntegrationTypes.GetByAlias(model.TypeAlias); if (type == null) { return Result.Fail("@integration.errors.typenotfound"); } if (create && await Operations.Any(q => q.Where(x => x.TypeAlias == model.TypeAlias))) { return Result.Fail("@integration.errors.multiplenotallowed"); } if (!create && await Operations.Any(q => q.Where(x => x.TypeAlias == model.TypeAlias && x.Id != model.Id))) { return Result.Fail("@integration.errors.alreadycreated"); } return await Operations.Create(model, async x => await Validate(x)); } } public interface IIntegrationStore { /// /// Get new instance of an integration by integration alias /// Task Empty(string alias); /// /// Get an integration by integration alias /// Task Load(string alias); /// /// Get the change vector for a model (Proxy to IAsyncDocumentSession.GetChangeVectorFor<>) /// string GetChangeToken(Integration model); /// /// Creates a new integration /// Task> Create(Integration model); /// /// Updates an integration /// Task> Update(Integration model); /// /// Activates a configured integration /// Task> Activate(string alias); /// /// Disables a configured integration /// Task> Deactivate(string alias); /// /// Deletes configuration of an integration and disables it /// Task> Delete(string alias); }