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);
}
}