using Raven.Client.Documents; using Raven.Client.Documents.Linq; using Raven.Client.Documents.Session; using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using zero.Core.Api; using zero.Core.Database; using zero.Core.Entities; using zero.Core.Extensions; using zero.Core.Options; namespace zero.Core.Integrations { public class IntegrationService : BackofficeApi, IIntegrationService { protected IZeroOptions Options { get; private set; } public IntegrationService(IZeroOptions options, IBackofficeStore bstore) : base(bstore) { Options = options; } /// public IIntegration GetByAlias(string alias) { return GetAll().FirstOrDefault(x => x.Alias.Equals(alias, StringComparison.InvariantCultureIgnoreCase)); } /// public IIntegration GetBy() where T : class, IIntegrationSettings { Type type = typeof(T); return GetAll().FirstOrDefault(x => x.SettingsType == type); } /// public IReadOnlyCollection GetAll() { return Options.Integrations.GetAllItems(); } /// public async Task> GetActivated() { using IAsyncDocumentSession session = Store.OpenAsyncSession(); string[] activated = await session.Query().Where(x => x.IsActive).Select(x => x.IntegrationAlias).ToArrayAsync(); return GetAll().Where(x => x.IsAutoActivated || activated.Contains(x.Alias)).ToList(); } /// public async Task> GetAvailable() { using IAsyncDocumentSession session = Store.OpenAsyncSession(); string[] activated = await session.Query().Where(x => x.IsActive).Select(x => x.IntegrationAlias).ToArrayAsync(); return GetAll().Where(x => x.IsAutoActivated || !activated.Contains(x.Alias)).ToList(); } /// public async Task GetSettingsByAlias(string alias) { IIntegration integration = GetByAlias(alias); if (integration == null) { return default; } using IAsyncDocumentSession session = Store.OpenAsyncSession(); return await session.Query() .Where(x => x.IntegrationAlias == integration.Alias) .FirstOrDefaultAsync(); } /// public async Task GetSettingsById(string id) { using IAsyncDocumentSession session = Store.OpenAsyncSession(); return await session.LoadAsync(id); } /// public async Task GetSettingsById(string id) where T : class, IIntegrationSettings { using IAsyncDocumentSession session = Store.OpenAsyncSession(); return await session.LoadAsync(id); } /// public async Task> Save(IIntegrationSettings model) { return await SaveModel(model, null); } /// public async Task> Delete(string id) { return await DeleteById(id); } } public interface IIntegrationService { /// /// Get an integration by the specified alias /// IIntegration GetByAlias(string alias); /// /// Get an integration by the settings type /// IIntegration GetBy() where T : class, IIntegrationSettings; /// /// Get all available app integrations /// IReadOnlyCollection GetAll(); /// /// Get already activated app integrations /// Task> GetActivated(); /// /// Get available app integrations /// Task> GetAvailable(); /// /// Get settings for a specific integration /// Task GetSettingsByAlias(string alias); /// /// Get settings for a specific integration /// Task GetSettingsById(string id); /// /// Get settings for a specific integration /// Task GetSettingsById(string id) where T : class, IIntegrationSettings; /// /// Saves settings for an integration /// Task> Save(IIntegrationSettings model); /// /// Deletes an integration (therefore its settings) /// Task> Delete(string id); } }