// ========================================================================== // Squidex Headless CMS // ========================================================================== // Copyright (c) Squidex UG (haftungsbeschränkt) // All rights reserved. Licensed under the MIT license. // ========================================================================== using System; using IdentityServer4.Stores; using Microsoft.AspNetCore.Identity; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Migrate_01.Migrations; using MongoDB.Driver; 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.History.Repositories; 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.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.States; using Squidex.Infrastructure.UsageTracking; namespace Squidex.Config.Domain { public static class StoreServices { public static void AddMyStoreServices(this IServiceCollection services, IConfiguration config) { config.ConfigureByOption("store:type", new Options { ["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 => 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.AddSingletonAs() .As(); services.AddTransientAs() .As(); services.AddTransientAs() .As(); services.AddHealthChecks() .AddCheck("MongoDB", tags: new[] { "node" }); services.AddSingletonAs() .AsOptional(); services.AddSingletonAs() .AsOptional(); services.AddSingletonAs() .AsOptional(); services.AddSingletonAs() .AsOptional(); services.AddSingletonAs() .AsOptional>(); services.AddSingletonAs() .AsOptional>() .AsOptional(); services.AddSingletonAs() .AsOptional() .AsOptional>(); services.AddSingletonAs(c => new MongoContentRepository( c.GetRequiredService().GetDatabase(mongoContentDatabaseName), c.GetRequiredService(), c.GetRequiredService())) .AsOptional() .AsOptional>() .AsOptional(); } }); services.AddSingleton(typeof(IStore<>), typeof(Store<>)); } } }