// ========================================================================== // MongoRepositoryBase.cs // Squidex Headless CMS // ========================================================================== // Copyright (c) Squidex Group // All rights reserved. // ========================================================================== using System; using System.Globalization; using System.Threading.Tasks; using MongoDB.Driver; namespace Squidex.Infrastructure.MongoDb { public abstract class MongoRepositoryBase : IExternalSystem { private const string CollectionFormat = "{0}Set"; private Lazy> mongoCollection; private readonly IMongoDatabase mongoDatabase; private readonly string typeName; protected string TypeName { get { return typeName; } } protected ProjectionDefinitionBuilder Projection { get { return Builders.Projection; } } protected SortDefinitionBuilder Sort { get { return Builders.Sort; } } protected UpdateDefinitionBuilder Update { get { return Builders.Update; } } protected FilterDefinitionBuilder Filter { get { return Builders.Filter; } } protected IndexKeysDefinitionBuilder IndexKeys { get { return Builders.IndexKeys; } } protected IMongoCollection Collection { get { return mongoCollection.Value; } } protected IMongoDatabase Database { get { return mongoDatabase; } } static MongoRepositoryBase() { RefTokenSerializer.Register(); } protected MongoRepositoryBase(IMongoDatabase database) { Guard.NotNull(database, nameof(database)); mongoDatabase = database; mongoCollection = CreateCollection(); typeName = GetType().Name; } 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 Task.FromResult(true); } public async Task TryDropCollectionAsync() { try { await mongoDatabase.DropCollectionAsync(CollectionName()); mongoCollection = CreateCollection(); return true; } catch { return false; } } public void CheckConnection() { try { Database.ListCollections(); } catch (Exception ex) { throw new ConfigurationException($"MongoDb connection failed to connect to database {Database.DatabaseNamespace.DatabaseName}", ex); } } } }