Browse Source

Config fixes

pull/249/head
Sebastian Stehle 9 years ago
parent
commit
c6481c092c
  1. 9
      src/Squidex.Domain.Apps.Core.Operations/HandleRules/Actions/WebhookActionHandler.cs
  2. 2
      src/Squidex.Domain.Apps.Core.Operations/HandleRules/Triggers/ContentChangedTriggerHandler.cs
  3. 15
      src/Squidex.Infrastructure.MongoDb/MongoDb/BsonJsonConvention.cs
  4. 2
      src/Squidex.Infrastructure.MongoDb/MongoDb/BsonJsonSerializer.cs
  5. 10
      src/Squidex/AppServices.cs
  6. 4
      src/Squidex/Config/Domain/AssetServices.cs
  7. 98
      src/Squidex/Config/Domain/EntitiesServices.cs
  8. 20
      src/Squidex/Config/Domain/EventStoreServices.cs
  9. 70
      src/Squidex/Config/Domain/InfrastructureServices.cs
  10. 64
      src/Squidex/Config/Domain/LoggingServices.cs
  11. 40
      src/Squidex/Config/Domain/PubSubServices.cs
  12. 123
      src/Squidex/Config/Domain/ReadServices.cs
  13. 55
      src/Squidex/Config/Domain/RuleServices.cs
  14. 24
      src/Squidex/Config/Domain/StoreServices.cs
  15. 34
      src/Squidex/Config/Domain/SubscriptionServices.cs
  16. 2
      src/Squidex/app/features/rules/pages/events/rule-events-page.component.ts
  17. 29
      src/Squidex/appsettings.json

9
src/Squidex.Domain.Apps.Core.Operations/HandleRules/Actions/WebhookActionHandler.cs

@ -63,7 +63,14 @@ namespace Squidex.Domain.Apps.Core.HandleRules.Actions
var responseString = await response.Content.ReadAsStringAsync();
var requestDump = DumpFormatter.BuildDump(requestMsg, response, requestBody, responseString, TimeSpan.Zero, false);
return (requestDump, null);
Exception ex = null;
if (!response.IsSuccessStatusCode)
{
ex = new HttpRequestException($"Response code does not indicate success: {(int)response.StatusCode} ({response.StatusCode}).");
}
return (requestDump, ex);
}
catch (Exception ex)
{

2
src/Squidex.Domain.Apps.Core.Operations/HandleRules/Triggers/ContentChangedTriggerHandler.cs

@ -17,7 +17,7 @@ namespace Squidex.Domain.Apps.Core.HandleRules.Triggers
{
protected override bool Triggers(Envelope<AppEvent> @event, ContentChangedTrigger trigger)
{
if (trigger.HandleAll)
if (trigger.HandleAll && @event.Payload is ContentEvent)
{
return true;
}

15
src/Squidex.Infrastructure.MongoDb/MongoDb/BsonJsonConvention.cs

@ -11,6 +11,7 @@ using System.Reflection;
using MongoDB.Bson.Serialization;
using MongoDB.Bson.Serialization.Conventions;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
namespace Squidex.Infrastructure.MongoDb
{
@ -31,9 +32,21 @@ namespace Squidex.Infrastructure.MongoDb
memberMap.SetSerializer((IBsonSerializer)bsonSerializer);
}
else if (memberMap.MemberType == typeof(JToken))
{
memberMap.SetSerializer(JTokenSerializer<JToken>.Instance);
}
else if (memberMap.MemberType == typeof(JObject))
{
memberMap.SetSerializer(JTokenSerializer<JObject>.Instance);
}
else if (memberMap.MemberType == typeof(JValue))
{
memberMap.SetSerializer(JTokenSerializer<JValue>.Instance);
}
});
ConventionRegistry.Register("json", pack, t => true);
}
}
}
}

2
src/Squidex.Infrastructure.MongoDb/MongoDb/BsonJsonSerializer.cs

@ -12,7 +12,7 @@ using Newtonsoft.Json;
namespace Squidex.Infrastructure.MongoDb
{
public class BsonJsonSerializer<T> : ClassSerializerBase<T> where T : class
public sealed class BsonJsonSerializer<T> : ClassSerializerBase<T> where T : class
{
private readonly JsonSerializer serializer;

10
src/Squidex/AppServices.cs

@ -26,17 +26,19 @@ namespace Squidex
services.AddMyAssetServices(config);
services.AddMyAuthentication(config);
services.AddMyEntitiesServices(config);
services.AddMyEventPublishersServices(config);
services.AddMyEventStoreServices(config);
services.AddMyIdentityServer();
services.AddMyInfrastructureServices(config);
services.AddMyInfrastructureServices();
services.AddMyLoggingServices(config);
services.AddMyMigrationServices();
services.AddMyMvc();
services.AddMyPubSubServices(config);
services.AddMyReadServices(config);
services.AddMyRuleServices();
services.AddMySerializers();
services.AddMyStoreServices(config);
services.AddMySwaggerSettings();
services.AddMyWriteServices();
services.AddMySubscriptionServices(config);
services.Configure<MyUrlsOptions>(
config.GetSection("urls"));

4
src/Squidex/Config/Domain/AssetServices.cs

@ -9,6 +9,7 @@ using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Squidex.Infrastructure;
using Squidex.Infrastructure.Assets;
using Squidex.Infrastructure.Assets.ImageSharp;
using Squidex.Infrastructure.Log;
namespace Squidex.Config.Domain
@ -45,6 +46,9 @@ namespace Squidex.Config.Domain
.As<IInitializable>();
}
});
services.AddSingletonAs<ImageSharpAssetThumbnailGenerator>()
.As<IAssetThumbnailGenerator>();
}
}
}

98
src/Squidex/Config/Domain/WriteServices.cs → src/Squidex/Config/Domain/EntitiesServices.cs

@ -6,6 +6,7 @@
// ==========================================================================
using System;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Options;
using Migrate_01;
@ -19,25 +20,55 @@ using Squidex.Domain.Apps.Entities.Apps.Templates;
using Squidex.Domain.Apps.Entities.Assets;
using Squidex.Domain.Apps.Entities.Contents;
using Squidex.Domain.Apps.Entities.Contents.Commands;
using Squidex.Domain.Apps.Entities.Contents.Edm;
using Squidex.Domain.Apps.Entities.Contents.GraphQL;
using Squidex.Domain.Apps.Entities.History;
using Squidex.Domain.Apps.Entities.Rules;
using Squidex.Domain.Apps.Entities.Rules.Commands;
using Squidex.Domain.Apps.Entities.Schemas;
using Squidex.Domain.Users;
using Squidex.Infrastructure.Assets;
using Squidex.Infrastructure.Commands;
using Squidex.Infrastructure.Migrations;
using Squidex.Pipeline;
using Squidex.Pipeline.CommandMiddlewares;
namespace Squidex.Config.Domain
{
public static class WriteServices
public static class EntitiesServices
{
public static void AddMyWriteServices(this IServiceCollection services)
public static void AddMyEntitiesServices(this IServiceCollection services, IConfiguration config)
{
services.AddSingletonAs<NoopUserEvents>()
.As<IUserEvents>();
var exposeSourceUrl = config.GetOptionalValue("assetStore:exposeSourceUrl", true);
services.AddSingletonAs<JintScriptEngine>()
.As<IScriptEngine>();
services.AddSingletonAs(c => new GraphQLUrlGenerator(
c.GetRequiredService<IOptions<MyUrlsOptions>>(),
c.GetRequiredService<IAssetStore>(),
exposeSourceUrl))
.As<IGraphQLUrlGenerator>();
services.AddSingletonAs<CachingGraphQLService>()
.As<IGraphQLService>();
services.AddSingletonAs<AppProvider>()
.As<IAppProvider>();
services.AddSingletonAs<ContentQueryService>()
.As<IContentQueryService>();
services.AddSingletonAs<AppHistoryEventsCreator>()
.As<IHistoryEventsCreator>();
services.AddSingletonAs<ContentHistoryEventsCreator>()
.As<IHistoryEventsCreator>();
services.AddSingletonAs<SchemaHistoryEventsCreator>()
.As<IHistoryEventsCreator>();
services.AddSingletonAs<EdmModelBuilder>()
.AsSelf();
services.AddSingletonAs<InMemoryCommandBus>()
.As<ICommandBus>();
services.AddSingletonAs<ETagCommandMiddleware>()
.As<ICommandMiddleware>();
@ -75,26 +106,8 @@ namespace Squidex.Config.Domain
services.AddSingletonAs<CreateProfileCommandMiddleware>()
.As<ICommandMiddleware>();
services.AddTransientAs<MigrationPath>()
.As<IMigrationPath>();
services.AddTransientAs<ConvertEventStore>()
.As<IMigration>();
services.AddTransientAs<AddPatterns>()
.As<IMigration>();
services.AddTransientAs<RebuildContents>()
.As<IMigration>();
services.AddTransientAs<RebuildSnapshots>()
.As<IMigration>();
services.AddTransientAs<RebuildAssets>()
.As<IMigration>();
services.AddTransientAs<Rebuilder>()
.AsSelf();
services.AddSingletonAs<JintScriptEngine>()
.As<IScriptEngine>();
services.AddTransientAs<AppGrain>()
.AsSelf();
@ -113,11 +126,11 @@ namespace Squidex.Config.Domain
services.AddSingleton(c =>
{
var config = c.GetRequiredService<IOptions<MyUIOptions>>();
var uiOptions = c.GetRequiredService<IOptions<MyUIOptions>>();
var result = new InitialPatterns();
foreach (var pattern in config.Value.RegexSuggestions)
foreach (var pattern in uiOptions.Value.RegexSuggestions)
{
if (!string.IsNullOrWhiteSpace(pattern.Key) &&
!string.IsNullOrWhiteSpace(pattern.Value))
@ -129,5 +142,32 @@ namespace Squidex.Config.Domain
return result;
});
}
public static void AddMyMigrationServices(this IServiceCollection services)
{
services.AddSingletonAs<Migrator>()
.AsSelf();
services.AddTransientAs<MigrationPath>()
.As<IMigrationPath>();
services.AddTransientAs<ConvertEventStore>()
.As<IMigration>();
services.AddTransientAs<AddPatterns>()
.As<IMigration>();
services.AddTransientAs<RebuildContents>()
.As<IMigration>();
services.AddTransientAs<RebuildSnapshots>()
.As<IMigration>();
services.AddTransientAs<RebuildAssets>()
.As<IMigration>();
services.AddTransientAs<Rebuilder>()
.AsSelf();
}
}
}

20
src/Squidex/Config/Domain/EventStoreServices.cs

@ -5,12 +5,15 @@
// All rights reserved. Licensed under the MIT license.
// ==========================================================================
using System.Linq;
using EventStore.ClientAPI;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using MongoDB.Driver;
using Squidex.Infrastructure;
using Squidex.Infrastructure.EventSourcing;
using Squidex.Infrastructure.EventSourcing.Grains;
using Squidex.Infrastructure.States;
namespace Squidex.Config.Domain
{
@ -48,6 +51,23 @@ namespace Squidex.Config.Domain
.As<IEventStore>();
}
});
services.AddSingletonAs<OrleansEventNotifier>()
.As<IEventNotifier>()
.As<IInitializable>();
services.AddSingletonAs<DefaultStreamNameResolver>()
.As<IStreamNameResolver>();
services.AddSingletonAs<DefaultEventDataFormatter>()
.As<IEventDataFormatter>();
services.AddSingletonAs(c =>
{
var allEventConsumers = c.GetServices<IEventConsumer>();
return new EventConsumerFactory(n => allEventConsumers.FirstOrDefault(x => x.Name == n));
});
}
}
}

70
src/Squidex/Config/Domain/InfrastructureServices.cs

@ -5,23 +5,11 @@
// All rights reserved. Licensed under the MIT license.
// ==========================================================================
using System;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc.Infrastructure;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Newtonsoft.Json;
using NodaTime;
using Squidex.Infrastructure;
using Squidex.Infrastructure.Assets;
using Squidex.Infrastructure.Assets.ImageSharp;
using Squidex.Infrastructure.Commands;
using Squidex.Infrastructure.EventSourcing;
using Squidex.Infrastructure.Log;
using Squidex.Infrastructure.Migrations;
using Squidex.Infrastructure.States;
using Squidex.Infrastructure.UsageTracking;
using Squidex.Pipeline;
#pragma warning disable RECS0092 // Convert field to readonly
@ -29,47 +17,8 @@ namespace Squidex.Config.Domain
{
public static class InfrastructureServices
{
private static ILogChannel console = new ConsoleLogChannel();
private static ILogChannel file;
public static void AddMyInfrastructureServices(this IServiceCollection services, IConfiguration config)
public static void AddMyInfrastructureServices(this IServiceCollection services)
{
if (config.GetValue<bool>("logging:human"))
{
services.AddSingletonAs(c => new Func<IObjectWriter>(() => new JsonLogWriter(Formatting.Indented, true)));
}
else
{
services.AddSingletonAs(c => new Func<IObjectWriter>(() => new JsonLogWriter()));
}
var loggingFile = config.GetValue<string>("logging:file");
if (!string.IsNullOrWhiteSpace(loggingFile))
{
services.AddSingletonAs(file ?? (file = new FileChannel(loggingFile)))
.As<ILogChannel>()
.As<IInitializable>();
}
services.AddSingletonAs(console)
.As<ILogChannel>();
services.AddSingletonAs(c => new ApplicationInfoLogAppender(typeof(Program).Assembly, Guid.NewGuid()))
.As<ILogAppender>();
services.AddSingletonAs<ActionContextLogAppender>()
.As<ILogAppender>();
services.AddSingletonAs<TimestampLogAppender>()
.As<ILogAppender>();
services.AddSingletonAs<DebugLogChannel>()
.As<ILogChannel>();
services.AddSingletonAs<SemanticLog>()
.As<ISemanticLog>();
services.AddSingletonAs(SystemClock.Instance)
.As<IClock>();
@ -81,23 +30,6 @@ namespace Squidex.Config.Domain
services.AddSingletonAs<ActionContextAccessor>()
.As<IActionContextAccessor>();
services.AddSingletonAs<InMemoryCommandBus>()
.As<ICommandBus>();
services.AddSingletonAs<DefaultStreamNameResolver>()
.As<IStreamNameResolver>();
services.AddSingletonAs<ImageSharpAssetThumbnailGenerator>()
.As<IAssetThumbnailGenerator>();
services.AddSingletonAs<DefaultEventDataFormatter>()
.As<IEventDataFormatter>();
services.AddSingletonAs<Migrator>()
.AsSelf();
services.AddSingleton(typeof(IStore<>), typeof(Store<>));
}
}
}

64
src/Squidex/Config/Domain/LoggingServices.cs

@ -0,0 +1,64 @@
// ==========================================================================
// Squidex Headless CMS
// ==========================================================================
// Copyright (c) Squidex UG (haftungsbeschränkt)
// All rights reserved. Licensed under the MIT license.
// ==========================================================================
using System;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Newtonsoft.Json;
using Squidex.Infrastructure;
using Squidex.Infrastructure.Log;
using Squidex.Pipeline;
#pragma warning disable RECS0092 // Convert field to readonly
namespace Squidex.Config.Domain
{
public static class LoggingServices
{
private static ILogChannel console = new ConsoleLogChannel();
private static ILogChannel file;
public static void AddMyLoggingServices(this IServiceCollection services, IConfiguration config)
{
if (config.GetValue<bool>("logging:human"))
{
services.AddSingletonAs(c => new Func<IObjectWriter>(() => new JsonLogWriter(Formatting.Indented, true)));
}
else
{
services.AddSingletonAs(c => new Func<IObjectWriter>(() => new JsonLogWriter()));
}
var loggingFile = config.GetValue<string>("logging:file");
if (!string.IsNullOrWhiteSpace(loggingFile))
{
services.AddSingletonAs(file ?? (file = new FileChannel(loggingFile)))
.As<ILogChannel>()
.As<IInitializable>();
}
services.AddSingletonAs(console)
.As<ILogChannel>();
services.AddSingletonAs(c => new ApplicationInfoLogAppender(typeof(Program).Assembly, Guid.NewGuid()))
.As<ILogAppender>();
services.AddSingletonAs<ActionContextLogAppender>()
.As<ILogAppender>();
services.AddSingletonAs<TimestampLogAppender>()
.As<ILogAppender>();
services.AddSingletonAs<DebugLogChannel>()
.As<ILogChannel>();
services.AddSingletonAs<SemanticLog>()
.As<ISemanticLog>();
}
}
}

40
src/Squidex/Config/Domain/PubSubServices.cs

@ -1,40 +0,0 @@
// ==========================================================================
// Squidex Headless CMS
// ==========================================================================
// Copyright (c) Squidex UG (haftungsbeschränkt)
// All rights reserved. Licensed under the MIT license.
// ==========================================================================
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Squidex.Infrastructure;
using Squidex.Infrastructure.Log;
using StackExchange.Redis;
namespace Squidex.Config.Domain
{
public static class PubSubServices
{
public static void AddMyPubSubServices(this IServiceCollection services, IConfiguration config)
{
config.ConfigureByOption("pubSub:type", new Options
{
["InMemory"] = () =>
{
services.AddSingletonAs<InMemoryPubSub>()
.As<IPubSub>();
},
["Redis"] = () =>
{
var configuration = config.GetRequiredValue("pubsub:redis:configuration");
var redis = Singletons<IConnectionMultiplexer>.GetOrAddLazy(configuration, s => ConnectionMultiplexer.Connect(s));
services.AddSingletonAs(c => new RedisPubSub(redis, c.GetRequiredService<ISemanticLog>()))
.As<IPubSub>()
.As<IInitializable>();
}
});
}
}
}

123
src/Squidex/Config/Domain/ReadServices.cs

@ -1,123 +0,0 @@
// ==========================================================================
// Squidex Headless CMS
// ==========================================================================
// Copyright (c) Squidex UG (haftungsbeschränkt)
// All rights reserved. Licensed under the MIT license.
// ==========================================================================
using System.Linq;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Options;
using Squidex.Domain.Apps.Core.HandleRules;
using Squidex.Domain.Apps.Core.HandleRules.Actions;
using Squidex.Domain.Apps.Core.HandleRules.Triggers;
using Squidex.Domain.Apps.Entities;
using Squidex.Domain.Apps.Entities.Apps;
using Squidex.Domain.Apps.Entities.Apps.Services;
using Squidex.Domain.Apps.Entities.Apps.Services.Implementations;
using Squidex.Domain.Apps.Entities.Contents;
using Squidex.Domain.Apps.Entities.Contents.Edm;
using Squidex.Domain.Apps.Entities.Contents.GraphQL;
using Squidex.Domain.Apps.Entities.History;
using Squidex.Domain.Apps.Entities.Rules;
using Squidex.Domain.Apps.Entities.Schemas;
using Squidex.Domain.Users;
using Squidex.Infrastructure;
using Squidex.Infrastructure.Assets;
using Squidex.Infrastructure.EventSourcing;
using Squidex.Infrastructure.EventSourcing.Grains;
using Squidex.Pipeline;
namespace Squidex.Config.Domain
{
public static class ReadServices
{
public static void AddMyReadServices(this IServiceCollection services, IConfiguration config)
{
services.AddSingletonAs<OrleansEventNotifier>()
.As<IEventNotifier>()
.As<IInitializable>();
var exposeSourceUrl = config.GetOptionalValue("assetStore:exposeSourceUrl", true);
services.AddSingletonAs(c => new GraphQLUrlGenerator(
c.GetRequiredService<IOptions<MyUrlsOptions>>(),
c.GetRequiredService<IAssetStore>(),
exposeSourceUrl))
.As<IGraphQLUrlGenerator>();
services.AddSingletonAs(c => c.GetService<IOptions<MyUsageOptions>>()?.Value?.Plans.OrEmpty());
services.AddSingletonAs<CachingGraphQLService>()
.As<IGraphQLService>();
services.AddSingletonAs<ContentQueryService>()
.As<IContentQueryService>();
services.AddSingletonAs<ConfigAppPlansProvider>()
.As<IAppPlansProvider>();
services.AddSingletonAs<AssetUserPictureStore>()
.As<IUserPictureStore>();
services.AddSingletonAs<AppHistoryEventsCreator>()
.As<IHistoryEventsCreator>();
services.AddSingletonAs<ContentHistoryEventsCreator>()
.As<IHistoryEventsCreator>();
services.AddSingletonAs<SchemaHistoryEventsCreator>()
.As<IHistoryEventsCreator>();
services.AddSingletonAs<NoopAppPlanBillingManager>()
.As<IAppPlanBillingManager>();
services.AddSingletonAs<AppProvider>()
.As<IAppProvider>();
services.AddSingletonAs<RuleEventFormatter>()
.AsSelf();
services.AddSingletonAs<AssetChangedTriggerHandler>()
.As<IRuleTriggerHandler>();
services.AddSingletonAs<ContentChangedTriggerHandler>()
.As<IRuleTriggerHandler>();
services.AddSingletonAs<AlgoliaActionHandler>()
.As<IRuleActionHandler>();
services.AddSingletonAs<AzureQueueActionHandler>()
.As<IRuleActionHandler>();
services.AddSingletonAs<ElasticSearchActionHandler>()
.As<IRuleActionHandler>();
services.AddSingletonAs<FastlyActionHandler>()
.As<IRuleActionHandler>();
services.AddSingletonAs<SlackActionHandler>()
.As<IRuleActionHandler>();
services.AddSingletonAs<WebhookActionHandler>()
.As<IRuleActionHandler>();
services.AddSingletonAs<RuleEnqueuer>()
.As<IEventConsumer>();
services.AddSingletonAs(c =>
{
var allEventConsumers = c.GetServices<IEventConsumer>();
return new EventConsumerFactory(n => allEventConsumers.FirstOrDefault(x => x.Name == n));
});
services.AddSingletonAs<EdmModelBuilder>()
.AsSelf();
services.AddSingletonAs<RuleService>()
.AsSelf();
}
}
}

55
src/Squidex/Config/Domain/RuleServices.cs

@ -0,0 +1,55 @@
// ==========================================================================
// Squidex Headless CMS
// ==========================================================================
// Copyright (c) Squidex UG (haftungsbeschränkt)
// All rights reserved. Licensed under the MIT license.
// ==========================================================================
using Microsoft.Extensions.DependencyInjection;
using Squidex.Domain.Apps.Core.HandleRules;
using Squidex.Domain.Apps.Core.HandleRules.Actions;
using Squidex.Domain.Apps.Core.HandleRules.Triggers;
using Squidex.Domain.Apps.Entities.Rules;
using Squidex.Infrastructure.EventSourcing;
namespace Squidex.Config.Domain
{
public static class RuleServices
{
public static void AddMyRuleServices(this IServiceCollection services)
{
services.AddSingletonAs<AssetChangedTriggerHandler>()
.As<IRuleTriggerHandler>();
services.AddSingletonAs<ContentChangedTriggerHandler>()
.As<IRuleTriggerHandler>();
services.AddSingletonAs<AlgoliaActionHandler>()
.As<IRuleActionHandler>();
services.AddSingletonAs<AzureQueueActionHandler>()
.As<IRuleActionHandler>();
services.AddSingletonAs<ElasticSearchActionHandler>()
.As<IRuleActionHandler>();
services.AddSingletonAs<FastlyActionHandler>()
.As<IRuleActionHandler>();
services.AddSingletonAs<SlackActionHandler>()
.As<IRuleActionHandler>();
services.AddSingletonAs<WebhookActionHandler>()
.As<IRuleActionHandler>();
services.AddSingletonAs<RuleEnqueuer>()
.As<IEventConsumer>();
services.AddSingletonAs<RuleEventFormatter>()
.AsSelf();
services.AddSingletonAs<RuleService>()
.AsSelf();
}
}
}

24
src/Squidex/Config/Domain/StoreServices.cs

@ -73,17 +73,6 @@ namespace Squidex.Config.Domain
.As<ISnapshotStore<EventConsumerState, string>>()
.As<IInitializable>();
services.AddSingletonAs(c => new MongoUserStore(mongoDatabase))
.As<IUserStore<IUser>>()
.As<IUserFactory>()
.As<IUserResolver>()
.As<IInitializable>();
services.AddSingletonAs(c => new MongoRoleStore(mongoDatabase))
.As<IRoleStore<IRole>>()
.As<IRoleFactory>()
.As<IInitializable>();
services.AddSingletonAs(c => new MongoPersistedGrantStore(mongoDatabase))
.As<IPersistedGrantStore>()
.As<IInitializable>();
@ -96,6 +85,17 @@ namespace Squidex.Config.Domain
.As<IRuleEventRepository>()
.As<IInitializable>();
services.AddSingletonAs(c => new MongoUserStore(mongoDatabase))
.As<IUserStore<IUser>>()
.As<IUserFactory>()
.As<IUserResolver>()
.As<IInitializable>();
services.AddSingletonAs(c => new MongoRoleStore(mongoDatabase))
.As<IRoleStore<IRole>>()
.As<IRoleFactory>()
.As<IInitializable>();
services.AddSingletonAs(c => new MongoAppRepository(mongoDatabase))
.As<IAppRepository>()
.As<ISnapshotStore<AppState, Guid>>()
@ -133,6 +133,8 @@ namespace Squidex.Config.Domain
.As<IInitializable>();
}
});
services.AddSingleton(typeof(IStore<>), typeof(Store<>));
}
}
}

34
src/Squidex/Config/Domain/SubscriptionServices.cs

@ -0,0 +1,34 @@
// ==========================================================================
// Squidex Headless CMS
// ==========================================================================
// Copyright (c) Squidex UG (haftungsbeschraenkt)
// All rights reserved. Licensed under the MIT license.
// ==========================================================================
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Options;
using Squidex.Domain.Apps.Entities.Apps.Services;
using Squidex.Domain.Apps.Entities.Apps.Services.Implementations;
using Squidex.Domain.Users;
using Squidex.Infrastructure;
namespace Squidex.Config.Domain
{
public static class SubscriptionServices
{
public static void AddMySubscriptionServices(this IServiceCollection services, IConfiguration config)
{
services.AddSingletonAs(c => c.GetService<IOptions<MyUsageOptions>>()?.Value?.Plans.OrEmpty());
services.AddSingletonAs<ConfigAppPlansProvider>()
.As<IAppPlansProvider>();
services.AddSingletonAs<NoopAppPlanBillingManager>()
.As<IAppPlanBillingManager>();
services.AddSingletonAs<AssetUserPictureStore>()
.As<IUserPictureStore>();
}
}
}

2
src/Squidex/app/features/rules/pages/events/rule-events-page.component.ts

@ -83,7 +83,7 @@ export class RuleEventsPageComponent implements OnInit {
} else if (status === 'Failed') {
return 'danger';
} else if (status === 'Pending') {
return 'default';
return 'secondary';
} else {
return status.toLowerCase();
}

29
src/Squidex/appsettings.json

@ -42,15 +42,6 @@
}
},
"orleans": {
/*
* Define the IP address or host name that is used for inter-silo communication.
*
* Special values: FirstIPAddressOfHost, Host
*/
"hostNameOrIPAddress": "localhost"
},
"logging": {
/*
* Setting the flag to true, enables well formatteds json logs.
@ -58,26 +49,6 @@
"human": true
},
/*
* The pub sub mechanmism distributes messages between the nodes.
*/
"pubSub": {
/*
* Define the type of the read store.
*
* Supported: InMemory (for single node only), Redis (for cluster)
*/
"type": "InMemory",
"redis": {
/*
* Connection string to your redis server.
*
* Read More: https://github.com/ServiceStack/ServiceStack.Redis#redis-connection-strings
*/
"configuration": "localhost:6379,resolveDns=1"
}
},
"assetStore": {
/*
* Define the type of the read store.

Loading…
Cancel
Save