// ========================================================================== // Squidex Headless CMS // ========================================================================== // Copyright (c) Squidex UG (haftungsbeschränkt) // All rights reserved. Licensed under the MIT license. // ========================================================================== using System; using System.Globalization; using System.Threading; using System.Threading.Tasks; using MongoDB.Driver; using Squidex.Infrastructure.Tasks; #pragma warning disable RECS0108 // Warns about static fields in generic types namespace Squidex.Infrastructure.MongoDb { public abstract class MongoRepositoryBase : IInitializable { private const string CollectionFormat = "{0}Set"; protected static readonly UpdateOptions Upsert = new UpdateOptions { IsUpsert = true }; protected static readonly SortDefinitionBuilder Sort = Builders.Sort; protected static readonly UpdateDefinitionBuilder Update = Builders.Update; protected static readonly FieldDefinitionBuilder Fields = FieldDefinitionBuilder.Instance; protected static readonly FilterDefinitionBuilder Filter = Builders.Filter; protected static readonly IndexKeysDefinitionBuilder Index = Builders.IndexKeys; protected static readonly ProjectionDefinitionBuilder Projection = Builders.Projection; private readonly IMongoDatabase mongoDatabase; private Lazy> mongoCollection; protected IMongoCollection Collection { get { return mongoCollection.Value; } } protected IMongoDatabase Database { get { return mongoDatabase; } } static MongoRepositoryBase() { RefTokenSerializer.Register(); InstantSerializer.Register(); } protected MongoRepositoryBase(IMongoDatabase database) { Guard.NotNull(database, nameof(database)); mongoDatabase = database; mongoCollection = CreateCollection(); } protected virtual MongoCollectionSettings CollectionSettings() { return new MongoCollectionSettings(); } protected virtual string CollectionName() { return string.Format(CultureInfo.InvariantCulture, CollectionFormat, typeof(TEntity).Name); } private Lazy> CreateCollection() { return new Lazy>(() => mongoDatabase.GetCollection( CollectionName(), CollectionSettings() ?? new MongoCollectionSettings())); } protected virtual Task SetupCollectionAsync(IMongoCollection collection, CancellationToken ct = default(CancellationToken)) { return TaskHelper.Done; } public virtual async Task ClearAsync() { await Database.DropCollectionAsync(CollectionName()); await SetupCollectionAsync(Collection); } public async Task DropCollectionIfExistsAsync(CancellationToken ct = default(CancellationToken)) { try { await mongoDatabase.DropCollectionAsync(CollectionName()); mongoCollection = CreateCollection(); await SetupCollectionAsync(Collection, ct); return true; } catch { return false; } } public async Task InitializeAsync(CancellationToken ct = default(CancellationToken)) { try { await SetupCollectionAsync(Collection, ct); } catch (Exception ex) { throw new ConfigurationException($"MongoDb connection failed to connect to database {Database.DatabaseNamespace.DatabaseName}", ex); } } } }