// ========================================================================== // Squidex Headless CMS // ========================================================================== // Copyright (c) Squidex UG (haftungsbeschraenkt) // All rights reserved. Licensed under the MIT license. // ========================================================================== using Microsoft.AspNetCore.Identity; using Migrations.Migrations.MongoDb; using MongoDB.Driver; using Newtonsoft.Json; using Squidex.Domain.Apps.Entities; using Squidex.Domain.Apps.Entities.Apps.DomainObject; using Squidex.Domain.Apps.Entities.Apps.Repositories; using Squidex.Domain.Apps.Entities.Assets.DomainObject; using Squidex.Domain.Apps.Entities.Assets.Repositories; using Squidex.Domain.Apps.Entities.Contents.DomainObject; using Squidex.Domain.Apps.Entities.Contents.Repositories; using Squidex.Domain.Apps.Entities.Contents.Text; using Squidex.Domain.Apps.Entities.Contents.Text.State; using Squidex.Domain.Apps.Entities.History.Repositories; using Squidex.Domain.Apps.Entities.MongoDb.Apps; using Squidex.Domain.Apps.Entities.MongoDb.Assets; using Squidex.Domain.Apps.Entities.MongoDb.Contents; using Squidex.Domain.Apps.Entities.MongoDb.History; using Squidex.Domain.Apps.Entities.MongoDb.Rules; using Squidex.Domain.Apps.Entities.MongoDb.Schemas; using Squidex.Domain.Apps.Entities.MongoDb.Text; using Squidex.Domain.Apps.Entities.Rules.DomainObject; using Squidex.Domain.Apps.Entities.Rules.Repositories; using Squidex.Domain.Apps.Entities.Schemas; using Squidex.Domain.Apps.Entities.Schemas.DomainObject; using Squidex.Domain.Apps.Entities.Schemas.Repositories; using Squidex.Domain.Users; using Squidex.Domain.Users.InMemory; using Squidex.Domain.Users.MongoDb; using Squidex.Infrastructure; using Squidex.Infrastructure.Diagnostics; using Squidex.Infrastructure.EventSourcing; using Squidex.Infrastructure.Log; using Squidex.Infrastructure.Migrations; using Squidex.Infrastructure.MongoDb; using Squidex.Infrastructure.States; using Squidex.Infrastructure.UsageTracking; namespace Squidex.Config.Domain { public static class StoreServices { public static void AddSquidexStoreServices(this IServiceCollection services, IConfiguration config) { config.ConfigureByOption("store:type", new Alternatives { ["MongoDB"] = () => { var mongoConfiguration = config.GetRequiredValue("store:mongoDb:configuration"); var mongoDatabaseName = config.GetRequiredValue("store:mongoDb:database"); var mongoContentDatabaseName = config.GetOptionalValue("store:mongoDb:contentDatabase", mongoDatabaseName); services.AddSingleton(typeof(ISnapshotStore<>), typeof(MongoSnapshotStore<>)); services.AddSingletonAs(c => GetClient(mongoConfiguration)) .As(); services.AddSingletonAs(c => GetDatabase(c, mongoDatabaseName)) .As(); services.AddSingletonAs() .As(); services.AddTransientAs() .As(); services.AddTransientAs(c => new DeleteContentCollections(GetDatabase(c, mongoContentDatabaseName))) .As(); services.AddTransientAs(c => new RestructureContentCollection(GetDatabase(c, mongoContentDatabaseName))) .As(); services.AddTransientAs(c => new ConvertDocumentIds(GetDatabase(c, mongoDatabaseName), GetDatabase(c, mongoContentDatabaseName))) .As(); services.AddSingletonAs(c => ActivatorUtilities.CreateInstance(c, GetDatabase(c, mongoContentDatabaseName))) .As().As>().As(); services.AddTransientAs() .As(); services.AddTransientAs() .As(); services.AddTransientAs() .As(); services.AddTransientAs() .As(); services.AddHealthChecks() .AddCheck("MongoDB", tags: new[] { "node" }); services.AddSingletonAs() .As(); services.AddSingletonAs() .As(); services.AddSingletonAs() .As().As(); services.AddSingletonAs() .As().As(); services.AddSingletonAs() .As>(); services.AddSingletonAs() .As>().As(); services.AddSingletonAs() .As().As>().As(); services.AddSingletonAs() .As().As>().As(); services.AddSingletonAs() .As().As>().As(); services.AddSingletonAs() .As().As>().As(); services.AddSingletonAs() .As().As>().As(); services.AddSingletonAs() .AsOptional().As().As(); services.AddSingletonAs() .As().As(); services.AddOpenIddict() .AddCore(builder => { builder.UseMongoDb() .SetScopesCollectionName("Identity_Scopes") .SetTokensCollectionName("Identity_Tokens"); builder.SetDefaultScopeEntity(); builder.SetDefaultApplicationEntity(); }); var atlasOptions = config.GetSection("store:mongoDb:atlas").Get() ?? new (); if (atlasOptions.IsConfigured() && atlasOptions.FullTextEnabled) { services.Configure(config.GetSection("store:mongoDb:atlas")); services.AddSingletonAs() .AsOptional().As(); } else { services.AddSingletonAs() .AsOptional().As(); } services.AddInitializer("Serializer (BSON)", jsonNetSerializer => { BsonJsonConvention.Register(jsonNetSerializer); }, -1); } }); services.AddSingleton(typeof(IStore<>), typeof(Store<>)); services.AddSingleton(typeof(IPersistenceFactory<>), typeof(Store<>)); } private static IMongoClient GetClient(string configuration) { return Singletons.GetOrAdd(configuration, s => new MongoClient(s)); } private static IMongoDatabase GetDatabase(IServiceProvider service, string name) { return service.GetRequiredService().GetDatabase(name); } } }