// ========================================================================== // Squidex Headless CMS // ========================================================================== // Copyright (c) Squidex UG (haftungsbeschränkt) // All rights reserved. Licensed under the MIT license. // ========================================================================== using System; using System.Linq; using IdentityServer4.Stores; using Microsoft.AspNetCore.DataProtection.Repositories; using Microsoft.AspNetCore.Identity; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Migrations.Migrations.MongoDb; using MongoDB.Driver; using MongoDB.Driver.GridFS; using Squidex.Domain.Apps.Entities.Assets.Repositories; using Squidex.Domain.Apps.Entities.Assets.State; using Squidex.Domain.Apps.Entities.Contents.Repositories; using Squidex.Domain.Apps.Entities.Contents.State; using Squidex.Domain.Apps.Entities.Contents.Text.Lucene; using Squidex.Domain.Apps.Entities.Contents.Text.State; using Squidex.Domain.Apps.Entities.History.Repositories; using Squidex.Domain.Apps.Entities.MongoDb.Assets; using Squidex.Domain.Apps.Entities.MongoDb.Contents; using Squidex.Domain.Apps.Entities.MongoDb.FullText; using Squidex.Domain.Apps.Entities.MongoDb.History; using Squidex.Domain.Apps.Entities.MongoDb.Rules; using Squidex.Domain.Apps.Entities.Rules.Repositories; using Squidex.Domain.Users; using Squidex.Domain.Users.MongoDb; using Squidex.Domain.Users.MongoDb.Infrastructure; using Squidex.Infrastructure; using Squidex.Infrastructure.Diagnostics; using Squidex.Infrastructure.Log; using Squidex.Infrastructure.Log.Store; using Squidex.Infrastructure.Migrations; 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.AddTransientAs(c => new DeleteContentCollections(GetDatabase(c, mongoContentDatabaseName))) .As(); services.AddTransientAs(c => new RestructureContentCollection(GetDatabase(c, mongoContentDatabaseName))) .As(); services.AddSingletonAs() .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(); services.AddSingletonAs() .As(); services.AddSingletonAs() .As>(); services.AddSingletonAs() .As>().As(); services.AddSingletonAs() .As(); services.AddSingletonAs() .As().As(); services.AddSingletonAs() .As().As>(); services.AddSingletonAs() .As().As>(); services.AddSingletonAs(c => ActivatorUtilities.CreateInstance(c, GetDatabase(c, mongoContentDatabaseName))) .As().As>(); services.AddSingletonAs() .As(); var registration = services.FirstOrDefault(x => x.ServiceType == typeof(IPersistedGrantStore)); if (registration == null || registration.ImplementationType == typeof(InMemoryPersistedGrantStore)) { services.AddSingletonAs() .As(); } services.AddSingletonAs(c => { var database = c.GetRequiredService(); var mongoBucket = new GridFSBucket(database, new GridFSBucketOptions { BucketName = "fullText" }); return new MongoIndexStorage(mongoBucket); }).As(); } }); services.AddSingleton(typeof(IStore<>), 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); } } }