From 639d00af247b56f33089e2b2e11181352d1902ba Mon Sep 17 00:00:00 2001 From: Sebastian Date: Sat, 4 Feb 2017 18:02:53 +0100 Subject: [PATCH] Configuration improved --- src/Squidex/Config/Domain/EventBusModule.cs | 78 +++++++++++ src/Squidex/Config/Domain/EventStoreModule.cs | 72 ++++++++++ .../Config/Domain/InfrastructureModule.cs | 22 ++- src/Squidex/Config/Domain/ReadModule.cs | 8 ++ src/Squidex/Config/Domain/Serializers.cs | 6 +- src/Squidex/Config/Domain/StoreModule.cs | 44 ++++++ .../Config/Domain/StoreMongoDbModule.cs | 131 ++++++++++++++++++ .../EventStoreUsage.cs => Domain/Usages.cs} | 20 ++- src/Squidex/Config/Domain/WriteModule.cs | 37 +++-- .../EventStore/MongoDbEventStoreModule.cs | 28 ---- .../Config/EventStore/MyRabbitMqOptions.cs | 15 -- .../EventStore/RabbitMqEventChannelModule.cs | 39 ------ .../Config/Identity/IdentityServices.cs | 17 +++ .../Config/Identity/MyIdentityOptions.cs | 2 + .../ContentApi/Models/ContentDto.cs | 1 - src/Squidex/Program.cs | 21 ++- src/Squidex/Properties/launchSettings.json | 1 - src/Squidex/Squidex.xproj | 5 + src/Squidex/Startup.cs | 26 ++-- src/Squidex/appsettings.json | 40 ++++-- 20 files changed, 475 insertions(+), 138 deletions(-) create mode 100644 src/Squidex/Config/Domain/EventBusModule.cs create mode 100644 src/Squidex/Config/Domain/EventStoreModule.cs create mode 100644 src/Squidex/Config/Domain/StoreModule.cs create mode 100644 src/Squidex/Config/Domain/StoreMongoDbModule.cs rename src/Squidex/Config/{EventStore/EventStoreUsage.cs => Domain/Usages.cs} (57%) delete mode 100644 src/Squidex/Config/EventStore/MongoDbEventStoreModule.cs delete mode 100644 src/Squidex/Config/EventStore/MyRabbitMqOptions.cs delete mode 100644 src/Squidex/Config/EventStore/RabbitMqEventChannelModule.cs diff --git a/src/Squidex/Config/Domain/EventBusModule.cs b/src/Squidex/Config/Domain/EventBusModule.cs new file mode 100644 index 000000000..225269be8 --- /dev/null +++ b/src/Squidex/Config/Domain/EventBusModule.cs @@ -0,0 +1,78 @@ +// ========================================================================== +// EventStoreModule.cs +// Squidex Headless CMS +// ========================================================================== +// Copyright (c) Squidex Group +// All rights reserved. +// ========================================================================== + +using System; +using Autofac; +using Microsoft.Extensions.Configuration; +using RabbitMQ.Client; +using Squidex.Infrastructure; +using Squidex.Infrastructure.CQRS.Events; +using Squidex.Infrastructure.RabbitMq; + +namespace Squidex.Config.Domain +{ + public class EventBusModule : Module + { + public IConfiguration Configuration { get; } + + public EventBusModule(IConfiguration configuration) + { + Configuration = configuration; + } + + protected override void Load(ContainerBuilder builder) + { + var storeType = Configuration.GetValue("squidex:eventBus:type"); + + if (string.IsNullOrWhiteSpace(storeType)) + { + throw new ConfigurationException("You must specify the event bus type in the 'squidex:eventBus:type' configuration section."); + } + + var canCatch = Configuration.GetValue("squidex:eventBus:catch"); + + builder.RegisterType() + .WithParameter(new NamedParameter("canCatch", canCatch)) + .AsSelf() + .SingleInstance(); + + if (string.Equals(storeType, "Memory", StringComparison.OrdinalIgnoreCase)) + { + builder.RegisterType() + .As() + .As() + .SingleInstance(); + } + if (string.Equals(storeType, "RabbitMq", StringComparison.OrdinalIgnoreCase)) + { + var connectionString = Configuration.GetValue("squidex:eventBus:rabbitMq:connectionString"); + + if (string.IsNullOrWhiteSpace(connectionString) || !Uri.IsWellFormedUriString(connectionString, UriKind.Absolute)) + { + throw new ConfigurationException("You must specify the RabbitMq connection string in the 'squidex:eventBus:rabbitMq:connectionString' configuration section."); + } + + builder.Register(c => + { + var connectionFactory = new ConnectionFactory(); + + connectionFactory.SetUri(new Uri(connectionString)); + + return new RabbitMqEventBus(connectionFactory, canCatch); + }) + .As() + .As() + .SingleInstance(); + } + else + { + throw new ConfigurationException($"Unsupported store type '{storeType}' for key 'squidex:eventStore:type', supported: Memory, RabbmitMq."); + } + } + } +} diff --git a/src/Squidex/Config/Domain/EventStoreModule.cs b/src/Squidex/Config/Domain/EventStoreModule.cs new file mode 100644 index 000000000..a2b03aae7 --- /dev/null +++ b/src/Squidex/Config/Domain/EventStoreModule.cs @@ -0,0 +1,72 @@ +// ========================================================================== +// EventStoreModule.cs +// Squidex Headless CMS +// ========================================================================== +// Copyright (c) Squidex Group +// All rights reserved. +// ========================================================================== + +using System; +using Autofac; +using Microsoft.Extensions.Configuration; +using MongoDB.Driver; +using Squidex.Infrastructure; +using Squidex.Infrastructure.CQRS.Events; +using Squidex.Infrastructure.MongoDb.EventStore; + +namespace Squidex.Config.Domain +{ + public class EventStoreModule : Module + { + public IConfiguration Configuration { get; } + + public EventStoreModule(IConfiguration configuration) + { + Configuration = configuration; + } + + protected override void Load(ContainerBuilder builder) + { + var storeType = Configuration.GetValue("squidex:eventStore:type"); + + if (string.IsNullOrWhiteSpace(storeType)) + { + throw new ConfigurationException("You must specify the store type in the 'squidex:eventStore:type' configuration section."); + } + + if (string.Equals(storeType, "MongoDb", StringComparison.OrdinalIgnoreCase)) + { + var databaseName = Configuration.GetValue("squidex:eventStore:mongoDb:databaseName"); + + if (string.IsNullOrWhiteSpace(databaseName)) + { + throw new ConfigurationException("You must specify the MongoDB database name in the 'squidex:eventStore:mongoDb:databaseName' configuration section."); + } + + var connectionString = Configuration.GetValue("squidex:eventStore:mongoDb:connectionString"); + + if (string.IsNullOrWhiteSpace(connectionString)) + { + throw new ConfigurationException("You must specify the MongoDB connection string in the 'squidex:eventStore:mongoDb:connectionString' configuration section."); + } + + builder.Register(context => + { + var mongoDbClient = new MongoClient(connectionString); + var mongoDatabase = mongoDbClient.GetDatabase(databaseName); + + var eventStore = new MongoEventStore(mongoDatabase); + + return eventStore; + }) + .As() + .As() + .SingleInstance(); + } + else + { + throw new ConfigurationException($"Unsupported store type '{storeType}' for key 'squidex:eventStore:type', supported: MongoDb."); + } + } + } +} diff --git a/src/Squidex/Config/Domain/InfrastructureModule.cs b/src/Squidex/Config/Domain/InfrastructureModule.cs index 5a06aa583..6c52aa3d4 100644 --- a/src/Squidex/Config/Domain/InfrastructureModule.cs +++ b/src/Squidex/Config/Domain/InfrastructureModule.cs @@ -9,9 +9,10 @@ using Autofac; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc.Infrastructure; +using Microsoft.Extensions.Configuration; using Squidex.Core.Schemas; using Squidex.Core.Schemas.Json; -using Squidex.Infrastructure.CQRS.Autofac; +using Squidex.Infrastructure; using Squidex.Infrastructure.CQRS.Commands; using Squidex.Infrastructure.CQRS.Events; using Squidex.Infrastructure.CQRS.Replay; @@ -20,6 +21,13 @@ namespace Squidex.Config.Domain { public class InfrastructureModule : Module { + public IConfiguration Configuration { get; } + + public InfrastructureModule(IConfiguration configuration) + { + Configuration = configuration; + } + protected override void Load(ContainerBuilder builder) { builder.RegisterType() @@ -30,10 +38,6 @@ namespace Squidex.Config.Domain .As() .SingleInstance(); - builder.RegisterType() - .As() - .SingleInstance(); - builder.RegisterType() .As() .SingleInstance(); @@ -46,7 +50,15 @@ namespace Squidex.Config.Domain .As() .SingleInstance(); + builder.RegisterType() + .As() + .SingleInstance(); + builder.RegisterType() + .As() + .SingleInstance(); + + builder.RegisterType() .AsSelf() .SingleInstance(); diff --git a/src/Squidex/Config/Domain/ReadModule.cs b/src/Squidex/Config/Domain/ReadModule.cs index 0b205dedb..7ccba963d 100644 --- a/src/Squidex/Config/Domain/ReadModule.cs +++ b/src/Squidex/Config/Domain/ReadModule.cs @@ -7,6 +7,7 @@ // ========================================================================== using Autofac; +using Microsoft.Extensions.Configuration; using Squidex.Infrastructure.CQRS.Events; using Squidex.Read.Apps; using Squidex.Read.Apps.Services; @@ -20,6 +21,13 @@ namespace Squidex.Config.Domain { public sealed class ReadModule : Module { + public IConfiguration Configuration { get; } + + public ReadModule(IConfiguration configuration) + { + Configuration = configuration; + } + protected override void Load(ContainerBuilder builder) { builder.RegisterType() diff --git a/src/Squidex/Config/Domain/Serializers.cs b/src/Squidex/Config/Domain/Serializers.cs index 9ea2ca4c6..b7f5c444e 100644 --- a/src/Squidex/Config/Domain/Serializers.cs +++ b/src/Squidex/Config/Domain/Serializers.cs @@ -11,9 +11,8 @@ using Microsoft.Extensions.DependencyInjection; using Newtonsoft.Json; using Newtonsoft.Json.Serialization; using Squidex.Core.Schemas; -using Squidex.Events.Schemas; +using Squidex.Events; using Squidex.Infrastructure; -using Squidex.Infrastructure.CQRS.Events; using Squidex.Infrastructure.Json; namespace Squidex.Config.Domain @@ -48,11 +47,10 @@ namespace Squidex.Config.Domain public static IServiceCollection AddMyEventFormatter(this IServiceCollection services) { TypeNameRegistry.Map(typeof(Schema).GetTypeInfo().Assembly); - TypeNameRegistry.Map(typeof(SchemaCreated).GetTypeInfo().Assembly); + TypeNameRegistry.Map(typeof(EventExtensions).GetTypeInfo().Assembly); services.AddSingleton(t => CreateSettings()); services.AddSingleton(t => CreateSerializer(t.GetRequiredService())); - services.AddSingleton(); return services; } diff --git a/src/Squidex/Config/Domain/StoreModule.cs b/src/Squidex/Config/Domain/StoreModule.cs new file mode 100644 index 000000000..6da92ede5 --- /dev/null +++ b/src/Squidex/Config/Domain/StoreModule.cs @@ -0,0 +1,44 @@ +// ========================================================================== +// StoreModule.cs +// Squidex Headless CMS +// ========================================================================== +// Copyright (c) Squidex Group +// All rights reserved. +// ========================================================================== + +using System; +using Autofac; +using Microsoft.Extensions.Configuration; +using Squidex.Infrastructure; + +namespace Squidex.Config.Domain +{ + public class StoreModule : Module + { + public IConfiguration Configuration { get; } + + public StoreModule(IConfiguration configuration) + { + Configuration = configuration; + } + + protected override void Load(ContainerBuilder builder) + { + var storeType = Configuration.GetValue("squidex:stores:type"); + + if (string.IsNullOrWhiteSpace(storeType)) + { + throw new ConfigurationException("You must specify the store type in the 'squidex:stores:type' configuration section."); + } + + if (string.Equals(storeType, "MongoDB", StringComparison.OrdinalIgnoreCase)) + { + builder.RegisterModule(new StoreMongoDbModule(Configuration)); + } + else + { + throw new ConfigurationException($"Unsupported store type '{storeType}' for key 'squidex:stores:type', supported: MongoDb."); + } + } + } +} diff --git a/src/Squidex/Config/Domain/StoreMongoDbModule.cs b/src/Squidex/Config/Domain/StoreMongoDbModule.cs new file mode 100644 index 000000000..d8810882f --- /dev/null +++ b/src/Squidex/Config/Domain/StoreMongoDbModule.cs @@ -0,0 +1,131 @@ +// ========================================================================== +// StoreMongoDbModule.cs +// Squidex Headless CMS +// ========================================================================== +// Copyright (c) Squidex Group +// All rights reserved. +// ========================================================================== + +using Autofac; +using Autofac.Core; +using IdentityServer4.Stores; +using Microsoft.AspNetCore.Identity; +using Microsoft.AspNetCore.Identity.MongoDB; +using Microsoft.Extensions.Configuration; +using MongoDB.Driver; +using Squidex.Infrastructure; +using Squidex.Infrastructure.CQRS.Events; +using Squidex.Infrastructure.CQRS.Replay; +using Squidex.Read.Apps.Repositories; +using Squidex.Read.Contents.Repositories; +using Squidex.Read.History.Repositories; +using Squidex.Read.MongoDb; +using Squidex.Read.MongoDb.Apps; +using Squidex.Read.MongoDb.Contents; +using Squidex.Read.MongoDb.History; +using Squidex.Read.MongoDb.Infrastructure; +using Squidex.Read.MongoDb.Schemas; +using Squidex.Read.MongoDb.Users; +using Squidex.Read.Schemas.Repositories; +using Squidex.Read.Users.Repositories; + +namespace Squidex.Config.Domain +{ + public class StoreMongoDbModule : Module + { + private const string MongoDatabaseName = "string"; + + public IConfiguration Configuration { get; } + + public StoreMongoDbModule(IConfiguration configuration) + { + Configuration = configuration; + } + + protected override void Load(ContainerBuilder builder) + { + var databaseName = Configuration.GetValue("squidex:stores:mongoDb:databaseName"); + + if (string.IsNullOrWhiteSpace(databaseName)) + { + throw new ConfigurationException("You must specify the MongoDB database name in the 'squidex:stores:mongoDb:databaseName' configuration section."); + } + + var connectionString = Configuration.GetValue("squidex:stores:mongoDb:connectionString"); + + if (string.IsNullOrWhiteSpace(connectionString)) + { + throw new ConfigurationException("You must specify the MongoDB connection string in the 'squidex:stores:mongoDb:connectionString' configuration section."); + } + + builder.Register(context => + { + var mongoDbClient = new MongoClient(connectionString); + var mongoDatabase = mongoDbClient.GetDatabase(databaseName); + + return mongoDatabase; + }).Named(MongoDatabaseName).SingleInstance(); + + builder.Register>(context => + { + var usersCollection = context.ResolveNamed(MongoDatabaseName).GetCollection("Identity_Users"); + + IndexChecks.EnsureUniqueIndexOnNormalizedEmail(usersCollection); + IndexChecks.EnsureUniqueIndexOnNormalizedUserName(usersCollection); + + return new UserStore(usersCollection); + }).SingleInstance(); + + builder.Register>(context => + { + var rolesCollection = context.ResolveNamed(MongoDatabaseName).GetCollection("Identity_Roles"); + + IndexChecks.EnsureUniqueIndexOnNormalizedRoleName(rolesCollection); + + return new RoleStore(rolesCollection); + }).SingleInstance(); + + builder.RegisterType() + .As() + .InstancePerLifetimeScope(); + + builder.RegisterType() + .WithParameter(ResolvedParameter.ForNamed(MongoDatabaseName)) + .As() + .InstancePerLifetimeScope(); + + builder.RegisterType() + .WithParameter(ResolvedParameter.ForNamed(MongoDatabaseName)) + .As() + .SingleInstance(); + + builder.RegisterType() + .WithParameter(ResolvedParameter.ForNamed(MongoDatabaseName)) + .As() + .As() + .As() + .SingleInstance(); + + builder.RegisterType() + .WithParameter(ResolvedParameter.ForNamed(MongoDatabaseName)) + .As() + .As() + .As() + .SingleInstance(); + + builder.RegisterType() + .WithParameter(ResolvedParameter.ForNamed(MongoDatabaseName)) + .As() + .As() + .As() + .SingleInstance(); + + builder.RegisterType() + .WithParameter(ResolvedParameter.ForNamed(MongoDatabaseName)) + .As() + .As() + .As() + .SingleInstance(); + } + } +} diff --git a/src/Squidex/Config/EventStore/EventStoreUsage.cs b/src/Squidex/Config/Domain/Usages.cs similarity index 57% rename from src/Squidex/Config/EventStore/EventStoreUsage.cs rename to src/Squidex/Config/Domain/Usages.cs index 65387a7f3..03ea56e57 100644 --- a/src/Squidex/Config/EventStore/EventStoreUsage.cs +++ b/src/Squidex/Config/Domain/Usages.cs @@ -1,18 +1,20 @@ // ========================================================================== -// EventStoreUsage.cs +// Usages.cs // Squidex Headless CMS // ========================================================================== // Copyright (c) Squidex Group // All rights reserved. // ========================================================================== +using System.Collections.Generic; using Microsoft.AspNetCore.Builder; using Microsoft.Extensions.DependencyInjection; +using Squidex.Infrastructure; using Squidex.Infrastructure.CQRS.Events; -namespace Squidex.Config.EventStore +namespace Squidex.Config.Domain { - public static class EventStoreUsage + public static class Usages { public static IApplicationBuilder UseMyEventStore(this IApplicationBuilder app) { @@ -20,5 +22,17 @@ namespace Squidex.Config.EventStore return app; } + + public static IApplicationBuilder TestExternalSystems(this IApplicationBuilder app) + { + var systems = app.ApplicationServices.GetRequiredService>(); + + foreach (var system in systems) + { + system.CheckConnection(); + } + + return app; + } } } diff --git a/src/Squidex/Config/Domain/WriteModule.cs b/src/Squidex/Config/Domain/WriteModule.cs index c04f595f4..66b339578 100644 --- a/src/Squidex/Config/Domain/WriteModule.cs +++ b/src/Squidex/Config/Domain/WriteModule.cs @@ -5,7 +5,10 @@ // Copyright (c) Squidex Group // All rights reserved. // ========================================================================== + using Autofac; +using Microsoft.Extensions.Configuration; +using Squidex.Core.Schemas; using Squidex.Infrastructure.CQRS.Commands; using Squidex.Infrastructure.CQRS.Events; using Squidex.Pipeline.CommandHandlers; @@ -18,6 +21,13 @@ namespace Squidex.Config.Domain { public class WriteModule : Module { + public IConfiguration Configuration { get; } + + public WriteModule(IConfiguration configuration) + { + Configuration = configuration; + } + protected override void Load(ContainerBuilder builder) { builder.RegisterType() @@ -36,6 +46,7 @@ namespace Squidex.Config.Domain .As() .SingleInstance(); + builder.RegisterType() .As() .SingleInstance(); @@ -52,35 +63,39 @@ namespace Squidex.Config.Domain .As() .SingleInstance(); - builder.RegisterType() - .As() - .SingleInstance(); builder.RegisterType() .AsSelf() .InstancePerDependency(); - builder.RegisterType() - .As() - .SingleInstance(); - builder.RegisterType() + builder.RegisterType() .AsSelf() .InstancePerDependency(); + builder.RegisterType() .As() .SingleInstance(); - builder.RegisterType() - .AsSelf() - .InstancePerDependency(); + builder.RegisterType() + .As() + .SingleInstance(); builder.RegisterType() .As() .SingleInstance(); - builder.RegisterType() + + builder.Register>(s => (id => new AppDomainObject(id, 0))) + .AsSelf() + .InstancePerDependency(); + + builder.Register>(s => (id => new ContentDomainObject(id, 0))) + .AsSelf() + .InstancePerDependency(); + + builder.Register>(s => (id => new SchemaDomainObject(id, 0, s.Resolve()))) .AsSelf() .InstancePerDependency(); } diff --git a/src/Squidex/Config/EventStore/MongoDbEventStoreModule.cs b/src/Squidex/Config/EventStore/MongoDbEventStoreModule.cs deleted file mode 100644 index cf3ad0945..000000000 --- a/src/Squidex/Config/EventStore/MongoDbEventStoreModule.cs +++ /dev/null @@ -1,28 +0,0 @@ -// ========================================================================== -// MongoDbEventStoreModule.cs -// Squidex Headless CMS -// ========================================================================== -// Copyright (c) Squidex Group -// All rights reserved. -// ========================================================================== - -using Autofac; -using Squidex.Infrastructure.CQRS.Events; -using Squidex.Infrastructure.MongoDb.EventStore; - -namespace Squidex.Config.EventStore -{ - public class MongoDbEventStoreModule : Module - { - protected override void Load(ContainerBuilder builder) - { - builder.RegisterType() - .As() - .SingleInstance(); - - builder.RegisterType() - .As() - .SingleInstance(); - } - } -} diff --git a/src/Squidex/Config/EventStore/MyRabbitMqOptions.cs b/src/Squidex/Config/EventStore/MyRabbitMqOptions.cs deleted file mode 100644 index aa8b50534..000000000 --- a/src/Squidex/Config/EventStore/MyRabbitMqOptions.cs +++ /dev/null @@ -1,15 +0,0 @@ -// ========================================================================== -// MyRabbitMqOptions.cs -// Squidex Headless CMS -// ========================================================================== -// Copyright (c) Squidex Group -// All rights reserved. -// ========================================================================== - -namespace Squidex.Config.EventStore -{ - public sealed class MyRabbitMqOptions - { - public string ConnectionString { get; set; } - } -} \ No newline at end of file diff --git a/src/Squidex/Config/EventStore/RabbitMqEventChannelModule.cs b/src/Squidex/Config/EventStore/RabbitMqEventChannelModule.cs deleted file mode 100644 index ca2c38c36..000000000 --- a/src/Squidex/Config/EventStore/RabbitMqEventChannelModule.cs +++ /dev/null @@ -1,39 +0,0 @@ -// ========================================================================== -// RabbitMqEventChannelModule.cs -// Squidex Headless CMS -// ========================================================================== -// Copyright (c) Squidex Group -// All rights reserved. -// ========================================================================== - -using System; -using Autofac; -using Microsoft.Extensions.Options; -using RabbitMQ.Client; -using Squidex.Infrastructure.CQRS.Events; -using Squidex.Infrastructure.RabbitMq; - -namespace Squidex.Config.EventStore -{ - public class RabbitMqEventChannelModule : Module - { - protected override void Load(ContainerBuilder builder) - { - builder.Register(context => - { - var options = context.Resolve>().Value; - - var factory = new ConnectionFactory(); - - factory.SetUri(new Uri(options.ConnectionString)); - - return factory; - }).As().SingleInstance(); - - builder.RegisterType() - .As() - .As() - .SingleInstance(); - } - } -} diff --git a/src/Squidex/Config/Identity/IdentityServices.cs b/src/Squidex/Config/Identity/IdentityServices.cs index 5ac4a6365..4ce228006 100644 --- a/src/Squidex/Config/Identity/IdentityServices.cs +++ b/src/Squidex/Config/Identity/IdentityServices.cs @@ -7,12 +7,15 @@ // ========================================================================== using System.Collections.Generic; +using System.IO; using System.Reflection; using System.Security.Cryptography.X509Certificates; using IdentityServer4.Models; using IdentityServer4.Stores; +using Microsoft.AspNetCore.DataProtection; using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Identity.MongoDB; +using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Squidex.Infrastructure.Security; @@ -20,6 +23,20 @@ namespace Squidex.Config.Identity { public static class IdentityServices { + public static IServiceCollection AddMyDataProtectection(this IServiceCollection services, IConfiguration configuration) + { + var dataProtection = services.AddDataProtection().SetApplicationName("Squidex"); + + var keysFolder = configuration.GetValue("squidex:identity:keysFolder"); + + if (!string.IsNullOrWhiteSpace(keysFolder)) + { + dataProtection.PersistKeysToFileSystem(new DirectoryInfo(keysFolder)); + } + + return services; + } + public static IServiceCollection AddMyIdentityServer(this IServiceCollection services, IHostingEnvironment env) { X509Certificate2 certificate; diff --git a/src/Squidex/Config/Identity/MyIdentityOptions.cs b/src/Squidex/Config/Identity/MyIdentityOptions.cs index 8b2cc4cf6..775a924d7 100644 --- a/src/Squidex/Config/Identity/MyIdentityOptions.cs +++ b/src/Squidex/Config/Identity/MyIdentityOptions.cs @@ -18,6 +18,8 @@ namespace Squidex.Config.Identity public string GoogleSecret { get; set; } + public string KeysFolder { get; set; } + public bool RequiresHttps { get; set; } } } diff --git a/src/Squidex/Controllers/ContentApi/Models/ContentDto.cs b/src/Squidex/Controllers/ContentApi/Models/ContentDto.cs index 404835998..095699663 100644 --- a/src/Squidex/Controllers/ContentApi/Models/ContentDto.cs +++ b/src/Squidex/Controllers/ContentApi/Models/ContentDto.cs @@ -8,7 +8,6 @@ using System; using System.ComponentModel.DataAnnotations; -using Squidex.Core.Contents; using Squidex.Infrastructure; namespace Squidex.Controllers.ContentApi.Models diff --git a/src/Squidex/Program.cs b/src/Squidex/Program.cs index 989c4d65a..534c8f983 100644 --- a/src/Squidex/Program.cs +++ b/src/Squidex/Program.cs @@ -6,10 +6,14 @@ // All rights reserved. // ========================================================================== +using System; +using System.Collections.Generic; using System.IO; +using System.Linq; using Microsoft.AspNetCore.Hosting; using Microsoft.Extensions.DependencyInjection; -using Squidex.Infrastructure.CQRS.Replay; +using Squidex.Infrastructure; +// ReSharper disable InvertIf namespace Squidex { @@ -24,9 +28,20 @@ namespace Squidex .UseStartup() .Build(); - if (args.Length == 1 && args[0] == "--replay") + if (args.Length > 0) { - host.Services.GetService().ReplayAllAsync().Wait(); + var commands = host.Services.GetService>(); + + foreach (var command in commands) + { + if (string.Equals(args[0], command.Name, StringComparison.OrdinalIgnoreCase)) + { + command.Execute(args.Skip(1).ToArray()); + return; + } + } + + Console.WriteLine("Unknown command: {0}", args[0]); } else { diff --git a/src/Squidex/Properties/launchSettings.json b/src/Squidex/Properties/launchSettings.json index 81325951e..1aa5504bd 100644 --- a/src/Squidex/Properties/launchSettings.json +++ b/src/Squidex/Properties/launchSettings.json @@ -16,7 +16,6 @@ }, "Squidex": { "commandName": "Project", - "commandLineArgs": "--replay", "launchUrl": "http://localhost:5000", "environmentVariables": { "ASPNETCORE_ENVIRONMENT": "Development" diff --git a/src/Squidex/Squidex.xproj b/src/Squidex/Squidex.xproj index 46f0ee3f9..36b67c180 100644 --- a/src/Squidex/Squidex.xproj +++ b/src/Squidex/Squidex.xproj @@ -27,4 +27,9 @@ + + + + + \ No newline at end of file diff --git a/src/Squidex/Startup.cs b/src/Squidex/Startup.cs index 1d5f9a036..36d0b6e65 100644 --- a/src/Squidex/Startup.cs +++ b/src/Squidex/Startup.cs @@ -19,12 +19,10 @@ using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using Squidex.Config; using Squidex.Config.Domain; -using Squidex.Config.EventStore; using Squidex.Config.Identity; using Squidex.Config.Swagger; using Squidex.Config.Web; using Squidex.Pipeline; -using Squidex.Read.MongoDb; // ReSharper disable ConvertClosureToMethodGroup // ReSharper disable AccessToModifiedClosure @@ -60,6 +58,7 @@ namespace Squidex { services.AddMySwaggerSettings(); services.AddMyEventFormatter(); + services.AddMyDataProtectection(Configuration); services.AddMyIdentity(); services.AddMyIdentityServer(Environment); services.AddMyMvc(); @@ -70,24 +69,19 @@ namespace Squidex services.AddRouting(); services.AddWebpackBuilder(); - services.Configure( - Configuration.GetSection("stores:mongoDb")); - services.Configure( - Configuration.GetSection("stores:rabbitMq")); services.Configure( - Configuration.GetSection("urls")); + Configuration.GetSection("squidex:urls")); services.Configure( - Configuration.GetSection("identity")); + Configuration.GetSection("squidex:identity")); var builder = new ContainerBuilder(); builder.Populate(services); - builder.RegisterModule(); - builder.RegisterModule(); - builder.RegisterModule(); - builder.RegisterModule(); - builder.RegisterModule(); - builder.RegisterModule(); - builder.RegisterModule(); + builder.RegisterModule(new EventBusModule(Configuration)); + builder.RegisterModule(new EventStoreModule(Configuration)); + builder.RegisterModule(new InfrastructureModule(Configuration)); + builder.RegisterModule(new ReadModule(Configuration)); + builder.RegisterModule(new StoreModule(Configuration)); + builder.RegisterModule(new WriteModule(Configuration)); var container = builder.Build(); @@ -104,6 +98,8 @@ namespace Squidex loggerFactory.AddConsole(LogLevel.Debug); loggerFactory.AddDebug(); + app.TestExternalSystems(); + app.UseMiddleware(); MapAndUseIdentity(app); diff --git a/src/Squidex/appsettings.json b/src/Squidex/appsettings.json index d3fe357ea..9a3fcc144 100644 --- a/src/Squidex/appsettings.json +++ b/src/Squidex/appsettings.json @@ -1,18 +1,32 @@ { - "urls": { - "baseUrl": "http://localhost:5000" - }, - "stores": { - "mongoDb": { - "connectionString": "mongodb://localhost", - "databaseName": "Squidex" + "squidex": { + "urls": { + "baseUrl": "http://localhost:5000" }, - "rabbitMq": { - "connectionString": "amqp://guest:guest@localhost/" + "eventBus": { + "type": "rabbitMq", + "rabbitMq": { + "connectionString": "amqp://guest:guest@localhost" + }, + "catch": true + }, + "eventStore": { + "type": "mongoDb", + "mongoDb": { + "connectionString": "mongodb://localhost", + "databaseName": "Squidex" + } + }, + "stores": { + "type": "mongoDb", + "mongoDb": { + "connectionString": "mongodb://localhost", + "databaseName": "Squidex" + } + }, + "identity": { + "googleClient": "1006817248705-t3lb3ge808m9am4t7upqth79hulk456l.apps.googleusercontent.com", + "googleSecret": "QsEi-fHqkGw2_PjJmtNHf2wg" } - }, - "identity": { - "googleClient": "1006817248705-t3lb3ge808m9am4t7upqth79hulk456l.apps.googleusercontent.com", - "googleSecret": "QsEi-fHqkGw2_PjJmtNHf2wg" } } \ No newline at end of file