Browse Source

Configuration improved

pull/1/head
Sebastian 9 years ago
parent
commit
639d00af24
  1. 78
      src/Squidex/Config/Domain/EventBusModule.cs
  2. 72
      src/Squidex/Config/Domain/EventStoreModule.cs
  3. 22
      src/Squidex/Config/Domain/InfrastructureModule.cs
  4. 8
      src/Squidex/Config/Domain/ReadModule.cs
  5. 6
      src/Squidex/Config/Domain/Serializers.cs
  6. 44
      src/Squidex/Config/Domain/StoreModule.cs
  7. 131
      src/Squidex/Config/Domain/StoreMongoDbModule.cs
  8. 20
      src/Squidex/Config/Domain/Usages.cs
  9. 37
      src/Squidex/Config/Domain/WriteModule.cs
  10. 28
      src/Squidex/Config/EventStore/MongoDbEventStoreModule.cs
  11. 15
      src/Squidex/Config/EventStore/MyRabbitMqOptions.cs
  12. 39
      src/Squidex/Config/EventStore/RabbitMqEventChannelModule.cs
  13. 17
      src/Squidex/Config/Identity/IdentityServices.cs
  14. 2
      src/Squidex/Config/Identity/MyIdentityOptions.cs
  15. 1
      src/Squidex/Controllers/ContentApi/Models/ContentDto.cs
  16. 21
      src/Squidex/Program.cs
  17. 1
      src/Squidex/Properties/launchSettings.json
  18. 5
      src/Squidex/Squidex.xproj
  19. 26
      src/Squidex/Startup.cs
  20. 40
      src/Squidex/appsettings.json

78
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<string>("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<bool>("squidex:eventBus:catch");
builder.RegisterType<EventReceiver>()
.WithParameter(new NamedParameter("canCatch", canCatch))
.AsSelf()
.SingleInstance();
if (string.Equals(storeType, "Memory", StringComparison.OrdinalIgnoreCase))
{
builder.RegisterType<InMemoryEventBus>()
.As<IEventStream>()
.As<IEventPublisher>()
.SingleInstance();
}
if (string.Equals(storeType, "RabbitMq", StringComparison.OrdinalIgnoreCase))
{
var connectionString = Configuration.GetValue<string>("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<IEventStream>()
.As<IEventPublisher>()
.SingleInstance();
}
else
{
throw new ConfigurationException($"Unsupported store type '{storeType}' for key 'squidex:eventStore:type', supported: Memory, RabbmitMq.");
}
}
}
}

72
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<string>("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<string>("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<string>("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<IExternalSystem>()
.As<IEventStore>()
.SingleInstance();
}
else
{
throw new ConfigurationException($"Unsupported store type '{storeType}' for key 'squidex:eventStore:type', supported: MongoDb.");
}
}
}
}

22
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<HttpContextAccessor>()
@ -30,10 +38,6 @@ namespace Squidex.Config.Domain
.As<IActionContextAccessor>()
.SingleInstance();
builder.RegisterType<AutofacDomainObjectFactory>()
.As<IDomainObjectFactory>()
.SingleInstance();
builder.RegisterType<DefaultDomainObjectRepository>()
.As<IDomainObjectRepository>()
.SingleInstance();
@ -46,7 +50,15 @@ namespace Squidex.Config.Domain
.As<ICommandBus>()
.SingleInstance();
builder.RegisterType<DefaultNameResolver>()
.As<IStreamNameResolver>()
.SingleInstance();
builder.RegisterType<ReplayGenerator>()
.As<ICliCommand>()
.SingleInstance();
builder.RegisterType<EventDataFormatter>()
.AsSelf()
.SingleInstance();

8
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<CachingAppProvider>()

6
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<JsonSerializerSettings>()));
services.AddSingleton<EventDataFormatter>();
return services;
}

44
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<string>("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.");
}
}
}
}

131
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<string>("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<string>("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<IMongoDatabase>(MongoDatabaseName).SingleInstance();
builder.Register<IUserStore<IdentityUser>>(context =>
{
var usersCollection = context.ResolveNamed<IMongoDatabase>(MongoDatabaseName).GetCollection<IdentityUser>("Identity_Users");
IndexChecks.EnsureUniqueIndexOnNormalizedEmail(usersCollection);
IndexChecks.EnsureUniqueIndexOnNormalizedUserName(usersCollection);
return new UserStore<IdentityUser>(usersCollection);
}).SingleInstance();
builder.Register<IRoleStore<IdentityRole>>(context =>
{
var rolesCollection = context.ResolveNamed<IMongoDatabase>(MongoDatabaseName).GetCollection<IdentityRole>("Identity_Roles");
IndexChecks.EnsureUniqueIndexOnNormalizedRoleName(rolesCollection);
return new RoleStore<IdentityRole>(rolesCollection);
}).SingleInstance();
builder.RegisterType<MongoUserRepository>()
.As<IUserRepository>()
.InstancePerLifetimeScope();
builder.RegisterType<MongoDbStoresExternalSystem>()
.WithParameter(ResolvedParameter.ForNamed<IMongoDatabase>(MongoDatabaseName))
.As<IExternalSystem>()
.InstancePerLifetimeScope();
builder.RegisterType<MongoPersistedGrantStore>()
.WithParameter(ResolvedParameter.ForNamed<IMongoDatabase>(MongoDatabaseName))
.As<IPersistedGrantStore>()
.SingleInstance();
builder.RegisterType<MongoContentRepository>()
.WithParameter(ResolvedParameter.ForNamed<IMongoDatabase>(MongoDatabaseName))
.As<IContentRepository>()
.As<ICatchEventConsumer>()
.As<IReplayableStore>()
.SingleInstance();
builder.RegisterType<MongoHistoryEventRepository>()
.WithParameter(ResolvedParameter.ForNamed<IMongoDatabase>(MongoDatabaseName))
.As<IHistoryEventRepository>()
.As<ICatchEventConsumer>()
.As<IReplayableStore>()
.SingleInstance();
builder.RegisterType<MongoSchemaRepository>()
.WithParameter(ResolvedParameter.ForNamed<IMongoDatabase>(MongoDatabaseName))
.As<ISchemaRepository>()
.As<ICatchEventConsumer>()
.As<IReplayableStore>()
.SingleInstance();
builder.RegisterType<MongoAppRepository>()
.WithParameter(ResolvedParameter.ForNamed<IMongoDatabase>(MongoDatabaseName))
.As<IAppRepository>()
.As<ICatchEventConsumer>()
.As<IReplayableStore>()
.SingleInstance();
}
}
}

20
src/Squidex/Config/EventStore/EventStoreUsage.cs → 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<IEnumerable<IExternalSystem>>();
foreach (var system in systems)
{
system.CheckConnection();
}
return app;
}
}
}

37
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<EnrichWithTimestampHandler>()
@ -36,6 +46,7 @@ namespace Squidex.Config.Domain
.As<ICommandHandler>()
.SingleInstance();
builder.RegisterType<EnrichWithAppIdProcessor>()
.As<IEventProcessor>()
.SingleInstance();
@ -52,35 +63,39 @@ namespace Squidex.Config.Domain
.As<IEventProcessor>()
.SingleInstance();
builder.RegisterType<AppCommandHandler>()
.As<ICommandHandler>()
.SingleInstance();
builder.RegisterType<ClientKeyGenerator>()
.AsSelf()
.InstancePerDependency();
builder.RegisterType<ContentCommandHandler>()
.As<ICommandHandler>()
.SingleInstance();
builder.RegisterType<ContentDomainObject>()
builder.RegisterType<FieldRegistry>()
.AsSelf()
.InstancePerDependency();
builder.RegisterType<AppCommandHandler>()
.As<ICommandHandler>()
.SingleInstance();
builder.RegisterType<AppDomainObject>()
.AsSelf()
.InstancePerDependency();
builder.RegisterType<ContentCommandHandler>()
.As<ICommandHandler>()
.SingleInstance();
builder.RegisterType<SchemaCommandHandler>()
.As<ICommandHandler>()
.SingleInstance();
builder.RegisterType<SchemaDomainObject>()
builder.Register<DomainObjectFactoryFunction<AppDomainObject>>(s => (id => new AppDomainObject(id, 0)))
.AsSelf()
.InstancePerDependency();
builder.Register<DomainObjectFactoryFunction<ContentDomainObject>>(s => (id => new ContentDomainObject(id, 0)))
.AsSelf()
.InstancePerDependency();
builder.Register<DomainObjectFactoryFunction<SchemaDomainObject>>(s => (id => new SchemaDomainObject(id, 0, s.Resolve<FieldRegistry>())))
.AsSelf()
.InstancePerDependency();
}

28
src/Squidex/Config/EventStore/MongoDbEventStoreModule.cs

@ -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<MongoEventStore>()
.As<IEventStore>()
.SingleInstance();
builder.RegisterType<DefaultNameResolver>()
.As<IStreamNameResolver>()
.SingleInstance();
}
}
}

15
src/Squidex/Config/EventStore/MyRabbitMqOptions.cs

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

39
src/Squidex/Config/EventStore/RabbitMqEventChannelModule.cs

@ -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<IOptions<MyRabbitMqOptions>>().Value;
var factory = new ConnectionFactory();
factory.SetUri(new Uri(options.ConnectionString));
return factory;
}).As<IConnectionFactory>().SingleInstance();
builder.RegisterType<RabbitMqEventChannel>()
.As<IEventPublisher>()
.As<IEventStream>()
.SingleInstance();
}
}
}

17
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<string>("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;

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

1
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

21
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<Startup>()
.Build();
if (args.Length == 1 && args[0] == "--replay")
if (args.Length > 0)
{
host.Services.GetService<ReplayGenerator>().ReplayAllAsync().Wait();
var commands = host.Services.GetService<IEnumerable<ICliCommand>>();
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
{

1
src/Squidex/Properties/launchSettings.json

@ -16,7 +16,6 @@
},
"Squidex": {
"commandName": "Project",
"commandLineArgs": "--replay",
"launchUrl": "http://localhost:5000",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"

5
src/Squidex/Squidex.xproj

@ -27,4 +27,9 @@
<DnxInvisibleFolder Include="_test-output\" />
</ItemGroup>
<Import Project="$(VSToolsPath)\DotNet.Web\Microsoft.DotNet.Web.targets" Condition="'$(VSToolsPath)' != ''" />
<ProjectExtensions>
<VisualStudio>
<UserProperties appsettings_1json__JSONSchema="http://json.schemastore.org/babelrc" />
</VisualStudio>
</ProjectExtensions>
</Project>

26
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<MyMongoDbOptions>(
Configuration.GetSection("stores:mongoDb"));
services.Configure<MyRabbitMqOptions>(
Configuration.GetSection("stores:rabbitMq"));
services.Configure<MyUrlsOptions>(
Configuration.GetSection("urls"));
Configuration.GetSection("squidex:urls"));
services.Configure<MyIdentityOptions>(
Configuration.GetSection("identity"));
Configuration.GetSection("squidex:identity"));
var builder = new ContainerBuilder();
builder.Populate(services);
builder.RegisterModule<InfrastructureModule>();
builder.RegisterModule<MongoDbEventStoreModule>();
builder.RegisterModule<MongoDbModule>();
builder.RegisterModule<RabbitMqEventChannelModule>();
builder.RegisterModule<ReadModule>();
builder.RegisterModule<WebModule>();
builder.RegisterModule<WriteModule>();
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<SingleUrlsMiddleware>();
MapAndUseIdentity(app);

40
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"
}
}
Loading…
Cancel
Save