// ========================================================================== // 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.Identity; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Migrate_01.Migrations.MongoDb; using MongoDB.Driver; using MongoDB.Driver.GridFS; using Squidex.Domain.Apps.Entities; 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; 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.EventSourcing; using Squidex.Infrastructure.Json; using Squidex.Infrastructure.Migrations; using Squidex.Infrastructure.Reflection; 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(_ => Singletons.GetOrAdd(mongoConfiguration, s => new MongoClient(s))) .As(); services.AddSingletonAs(c => c.GetRequiredService().GetDatabase(mongoDatabaseName)) .As(); services.AddTransientAs(c => new DeleteContentCollections(c.GetRequiredService().GetDatabase(mongoContentDatabaseName))) .As(); services.AddTransientAs(c => new RestructureContentCollection(c.GetRequiredService().GetDatabase(mongoContentDatabaseName))) .As(); services.AddSingletonAs() .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>() .As(); services.AddSingletonAs() .As() .As>(); services.AddSingletonAs() .As() .As>(); services.AddSingletonAs(c => new MongoContentRepository( c.GetRequiredService().GetDatabase(mongoContentDatabaseName), c.GetRequiredService(), c.GetRequiredService(), c.GetRequiredService(), c.GetRequiredService())) .As() .As>() .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<>)); } } }