// ========================================================================== // 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.Extensions.Configuration; using MongoDB.Driver; using Squidex.Domain.Apps.Read.Apps.Repositories; using Squidex.Domain.Apps.Read.Apps.Services.Implementations; using Squidex.Domain.Apps.Read.Assets.Repositories; using Squidex.Domain.Apps.Read.Contents.GraphQL; using Squidex.Domain.Apps.Read.Contents.Repositories; using Squidex.Domain.Apps.Read.History.Repositories; using Squidex.Domain.Apps.Read.MongoDb.Apps; using Squidex.Domain.Apps.Read.MongoDb.Assets; using Squidex.Domain.Apps.Read.MongoDb.Contents; using Squidex.Domain.Apps.Read.MongoDb.History; using Squidex.Domain.Apps.Read.MongoDb.Schemas; using Squidex.Domain.Apps.Read.Schemas.Repositories; using Squidex.Domain.Apps.Read.Schemas.Services.Implementations; using Squidex.Domain.Users; using Squidex.Domain.Users.MongoDb; using Squidex.Domain.Users.MongoDb.Infrastructure; using Squidex.Infrastructure; using Squidex.Infrastructure.CQRS.Events; using Squidex.Infrastructure.UsageTracking; using Squidex.Shared.Users; namespace Squidex.Config.Domain { public class StoreMongoDbModule : Module { private const string MongoClientRegistration = "StoreMongoClient"; private const string MongoDatabaseRegistration = "StoreMongoDatabaseName"; private const string MongoContentDatabaseRegistration = "StoreMongoDatabaseNameContent"; private IConfiguration Configuration { get; } public StoreMongoDbModule(IConfiguration configuration) { Configuration = configuration; } protected override void Load(ContainerBuilder builder) { var configuration = Configuration.GetValue("store:mongoDb:configuration"); if (string.IsNullOrWhiteSpace(configuration)) { throw new ConfigurationException("Configure the Store MongoDb configuration with 'store:mongoDb:configuration'."); } var database = Configuration.GetValue("store:mongoDb:database"); if (string.IsNullOrWhiteSpace(database)) { throw new ConfigurationException("Configure the Store MongoDb database with 'store:mongoDb:database'."); } var contentDatabase = Configuration.GetValue("store:mongoDb:contentDatabase"); if (string.IsNullOrWhiteSpace(contentDatabase)) { contentDatabase = database; } builder.Register(c => Singletons.GetOrAdd(configuration, s => new MongoClient(s))) .Named(MongoClientRegistration) .SingleInstance(); builder.Register(c => c.ResolveNamed(MongoClientRegistration).GetDatabase(database)) .Named(MongoDatabaseRegistration) .SingleInstance(); builder.Register(c => c.ResolveNamed(MongoClientRegistration).GetDatabase(contentDatabase)) .Named(MongoContentDatabaseRegistration) .SingleInstance(); builder.RegisterType() .WithParameter(ResolvedParameter.ForNamed(MongoDatabaseRegistration)) .As>() .As() .As() .AsSelf() .SingleInstance(); builder.RegisterType() .WithParameter(ResolvedParameter.ForNamed(MongoDatabaseRegistration)) .As>() .As() .AsSelf() .SingleInstance(); builder.RegisterType() .WithParameter(ResolvedParameter.ForNamed(MongoDatabaseRegistration)) .As() .As() .AsSelf() .SingleInstance(); builder.RegisterType() .WithParameter(ResolvedParameter.ForNamed(MongoDatabaseRegistration)) .As() .As() .AsSelf() .SingleInstance(); builder.RegisterType() .WithParameter(ResolvedParameter.ForNamed(MongoDatabaseRegistration)) .As() .As() .AsSelf() .SingleInstance(); builder.RegisterType() .WithParameter(ResolvedParameter.ForNamed(MongoDatabaseRegistration)) .As() .As() .AsSelf() .SingleInstance(); builder.RegisterType() .WithParameter(ResolvedParameter.ForNamed(MongoContentDatabaseRegistration)) .As() .As() .AsSelf() .SingleInstance(); builder.RegisterType() .WithParameter(ResolvedParameter.ForNamed(MongoDatabaseRegistration)) .As() .As() .AsSelf() .SingleInstance(); builder.RegisterType() .WithParameter(ResolvedParameter.ForNamed(MongoDatabaseRegistration)) .As() .As() .As() .AsSelf() .SingleInstance(); builder.RegisterType() .WithParameter(ResolvedParameter.ForNamed(MongoDatabaseRegistration)) .As() .As() .As() .AsSelf() .SingleInstance(); builder.RegisterType() .WithParameter(ResolvedParameter.ForNamed(MongoDatabaseRegistration)) .As() .As() .As() .AsSelf() .SingleInstance(); builder.RegisterType() .WithParameter(ResolvedParameter.ForNamed(MongoDatabaseRegistration)) .As() .As() .As() .AsSelf() .SingleInstance(); builder.RegisterType() .WithParameter(ResolvedParameter.ForNamed(MongoDatabaseRegistration)) .As() .As() .As() .AsSelf() .SingleInstance(); builder.Register(c => new CompoundEventConsumer( c.Resolve(), c.Resolve(), c.Resolve())) .As() .AsSelf() .SingleInstance(); builder.Register(c => new CompoundEventConsumer( c.Resolve(), c.Resolve())) .As() .AsSelf() .SingleInstance(); } } }