using FluentValidation.Results; namespace zero.Configuration; public class IntegrationStore : IIntegrationStore { protected IStoreOperations Operations { get; private set; } protected IIntegrationTypeService IntegrationTypes { get; private set; } public IntegrationStore(IStoreOperationsWithInactive operations, IIntegrationTypeService integrationTypes) { IntegrationTypes = integrationTypes; Operations = operations; } /// public virtual async Task Empty(string alias) { return await Operations.Empty(alias); } /// public virtual async Task Load(string alias) { Paged result = await Operations.Load(1, 1, q => q.Where(x => x.Flavor == 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.Flavor); if (type == null) { return Result.Fail("@integration.errors.typenotfound"); } if (create && await Operations.Any(q => q.Where(x => x.Flavor == model.Flavor))) { return Result.Fail("@integration.errors.multiplenotallowed"); } if (!create && await Operations.Any(q => q.Where(x => x.Flavor == model.Flavor && 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); }