// ========================================================================== // MongoRepositoryBase.cs // Squidex Headless CMS // ========================================================================== // Copyright (c) Squidex Group // All rights reserved. // ========================================================================== using System; using System.Globalization; using System.Threading.Tasks; using MongoDB.Bson; 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>(() => { var databaseCollection = mongoDatabase.GetCollection( CollectionName(), CollectionSettings() ?? new MongoCollectionSettings()); SetupCollectionAsync(databaseCollection).Wait(); return databaseCollection; }); } protected virtual Task SetupCollectionAsync(IMongoCollection collection) { return TaskHelper.Done; } public virtual Task ClearAsync() { return Collection.DeleteManyAsync(new BsonDocument()); } public async Task DropCollectionIfExistsAsync() { try { await mongoDatabase.DropCollectionAsync(CollectionName()); mongoCollection = CreateCollection(); return true; } catch { return false; } } public void Initialize() { try { Database.ListCollections(); } catch (Exception ex) { throw new ConfigurationException($"MongoDb connection failed to connect to database {Database.DatabaseNamespace.DatabaseName}", ex); } } } }