Browse Source

Remove cosmos support.

pull/397/head
Sebastian Stehle 6 years ago
parent
commit
7b43d77017
  1. 13
      src/Squidex.Domain.Apps.Entities.MongoDb/Assets/MongoAssetRepository.cs
  2. 5
      src/Squidex.Domain.Apps.Entities.MongoDb/Contents/MongoContentCollection.cs
  3. 6
      src/Squidex.Domain.Apps.Entities.MongoDb/Contents/MongoContentRepository.cs
  4. 10
      src/Squidex.Domain.Apps.Entities.MongoDb/History/MongoHistoryEventRepository.cs
  5. 5
      src/Squidex.Domain.Apps.Entities.MongoDb/Rules/MongoRuleEventRepository.cs
  6. 5
      src/Squidex.Domain.Users.MongoDb/Infrastructure/MongoPersistedGrantStore.cs
  7. 20
      src/Squidex.Domain.Users.MongoDb/MongoRoleStore.cs
  8. 32
      src/Squidex.Domain.Users.MongoDb/MongoUserStore.cs
  9. 14
      src/Squidex.Infrastructure.Azure/EventSourcing/CosmosDbEventStore.cs
  10. 5
      src/Squidex.Infrastructure.MongoDb/EventSourcing/MongoEventStore.cs
  11. 5
      src/Squidex.Infrastructure.MongoDb/Migrations/MongoMigrationStatus.cs
  12. 1
      src/Squidex.Infrastructure.MongoDb/MongoDb/MongoDbEngine.cs
  13. 5
      src/Squidex.Infrastructure.MongoDb/MongoDb/MongoDbOptions.cs
  14. 18
      src/Squidex.Infrastructure.MongoDb/MongoDb/MongoRepositoryBase.cs
  15. 5
      src/Squidex.Infrastructure.MongoDb/States/MongoSnapshotStore.cs
  16. 5
      src/Squidex.Infrastructure.MongoDb/UsageTracking/MongoUsageRepository.cs
  17. 4
      src/Squidex/Config/Domain/EventStoreServices.cs
  18. 2
      src/Squidex/Config/Domain/StoreServices.cs
  19. 2
      src/Squidex/Squidex.csproj
  20. 4
      src/Squidex/appsettings.json
  21. 3
      tests/Squidex.Infrastructure.Tests/EventSourcing/MongoEventStoreFixture.cs
  22. 12
      tools/Migrate_01/Migrations/MongoDb/ConvertOldSnapshotStores.cs
  23. 12
      tools/Migrate_01/Migrations/MongoDb/RenameSlugField.cs

13
src/Squidex.Domain.Apps.Entities.MongoDb/Assets/MongoAssetRepository.cs

@ -24,14 +24,9 @@ namespace Squidex.Domain.Apps.Entities.MongoDb.Assets
{ {
public sealed partial class MongoAssetRepository : MongoRepositoryBase<MongoAssetEntity>, IAssetRepository public sealed partial class MongoAssetRepository : MongoRepositoryBase<MongoAssetEntity>, IAssetRepository
{ {
private readonly MongoDbOptions options;
public MongoAssetRepository(IMongoDatabase database, IOptions<MongoDbOptions> options) public MongoAssetRepository(IMongoDatabase database, IOptions<MongoDbOptions> options)
: base(database) : base(database, options)
{ {
Guard.NotNull(options, nameof(options));
this.options = options.Value;
} }
protected override string CollectionName() protected override string CollectionName()
@ -53,7 +48,7 @@ namespace Squidex.Domain.Apps.Entities.MongoDb.Assets
.Descending(x => x.LastModified), .Descending(x => x.LastModified),
new CreateIndexOptions new CreateIndexOptions
{ {
Name = options.IsDocumentDb ? "FileName_Tags" : null Name = Options.IsDocumentDb ? "FileName_Tags" : null
}), }),
new CreateIndexModel<MongoAssetEntity>( new CreateIndexModel<MongoAssetEntity>(
Index Index
@ -62,7 +57,7 @@ namespace Squidex.Domain.Apps.Entities.MongoDb.Assets
.Ascending(x => x.FileHash), .Ascending(x => x.FileHash),
new CreateIndexOptions new CreateIndexOptions
{ {
Name = options.IsDocumentDb ? "FileHash" : null Name = Options.IsDocumentDb ? "FileHash" : null
}), }),
new CreateIndexModel<MongoAssetEntity>( new CreateIndexModel<MongoAssetEntity>(
Index Index
@ -71,7 +66,7 @@ namespace Squidex.Domain.Apps.Entities.MongoDb.Assets
.Ascending(x => x.Slug), .Ascending(x => x.Slug),
new CreateIndexOptions new CreateIndexOptions
{ {
Name = options.IsDocumentDb ? "Slug" : null Name = Options.IsDocumentDb ? "Slug" : null
}) })
}, },
ct); ct);

5
src/Squidex.Domain.Apps.Entities.MongoDb/Contents/MongoContentCollection.cs

@ -10,6 +10,7 @@ using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Threading; using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
using Microsoft.Extensions.Options;
using MongoDB.Bson; using MongoDB.Bson;
using MongoDB.Driver; using MongoDB.Driver;
using NodaTime; using NodaTime;
@ -33,8 +34,8 @@ namespace Squidex.Domain.Apps.Entities.MongoDb.Contents
private readonly IAppProvider appProvider; private readonly IAppProvider appProvider;
private readonly IJsonSerializer serializer; private readonly IJsonSerializer serializer;
public MongoContentCollection(IMongoDatabase database, IJsonSerializer serializer, IAppProvider appProvider) public MongoContentCollection(IMongoDatabase database, IOptions<MongoDbOptions> options, IJsonSerializer serializer, IAppProvider appProvider)
: base(database) : base(database, options)
{ {
this.appProvider = appProvider; this.appProvider = appProvider;

6
src/Squidex.Domain.Apps.Entities.MongoDb/Contents/MongoContentRepository.cs

@ -9,6 +9,7 @@ using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Threading; using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
using Microsoft.Extensions.Options;
using MongoDB.Driver; using MongoDB.Driver;
using NodaTime; using NodaTime;
using Squidex.Domain.Apps.Core.Contents; using Squidex.Domain.Apps.Core.Contents;
@ -22,6 +23,7 @@ using Squidex.Domain.Apps.Events.Contents;
using Squidex.Infrastructure; using Squidex.Infrastructure;
using Squidex.Infrastructure.Json; using Squidex.Infrastructure.Json;
using Squidex.Infrastructure.Log; using Squidex.Infrastructure.Log;
using Squidex.Infrastructure.MongoDb;
using Squidex.Infrastructure.Queries; using Squidex.Infrastructure.Queries;
namespace Squidex.Domain.Apps.Entities.MongoDb.Contents namespace Squidex.Domain.Apps.Entities.MongoDb.Contents
@ -41,7 +43,7 @@ namespace Squidex.Domain.Apps.Entities.MongoDb.Contents
StatusSerializer.Register(); StatusSerializer.Register();
} }
public MongoContentRepository(IMongoDatabase database, IAppProvider appProvider, IJsonSerializer serializer, ITextIndexer indexer, TypeNameRegistry typeNameRegistry) public MongoContentRepository(IMongoDatabase database, IOptions<MongoDbOptions> options, IAppProvider appProvider, IJsonSerializer serializer, ITextIndexer indexer, TypeNameRegistry typeNameRegistry)
{ {
Guard.NotNull(appProvider, nameof(appProvider)); Guard.NotNull(appProvider, nameof(appProvider));
Guard.NotNull(database, nameof(database)); Guard.NotNull(database, nameof(database));
@ -57,7 +59,7 @@ namespace Squidex.Domain.Apps.Entities.MongoDb.Contents
typeAssetDeleted = typeNameRegistry.GetName<AssetDeleted>(); typeAssetDeleted = typeNameRegistry.GetName<AssetDeleted>();
typeContentDeleted = typeNameRegistry.GetName<ContentDeleted>(); typeContentDeleted = typeNameRegistry.GetName<ContentDeleted>();
contents = new MongoContentCollection(database, serializer, appProvider); contents = new MongoContentCollection(database, options, serializer, appProvider);
} }
public Task InitializeAsync(CancellationToken ct = default) public Task InitializeAsync(CancellationToken ct = default)

10
src/Squidex.Domain.Apps.Entities.MongoDb/History/MongoHistoryEventRepository.cs

@ -10,7 +10,6 @@ using System.Collections.Generic;
using System.Threading; using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
using Microsoft.Extensions.Options; using Microsoft.Extensions.Options;
using MongoDB.Bson.Serialization;
using MongoDB.Driver; using MongoDB.Driver;
using Squidex.Domain.Apps.Entities.History; using Squidex.Domain.Apps.Entities.History;
using Squidex.Domain.Apps.Entities.History.Repositories; using Squidex.Domain.Apps.Entities.History.Repositories;
@ -21,15 +20,8 @@ namespace Squidex.Domain.Apps.Entities.MongoDb.History
public class MongoHistoryEventRepository : MongoRepositoryBase<HistoryEvent>, IHistoryEventRepository public class MongoHistoryEventRepository : MongoRepositoryBase<HistoryEvent>, IHistoryEventRepository
{ {
public MongoHistoryEventRepository(IMongoDatabase database, IOptions<MongoDbOptions> options) public MongoHistoryEventRepository(IMongoDatabase database, IOptions<MongoDbOptions> options)
: base(database) : base(database, options)
{ {
if (options.Value.IsCosmosDb)
{
var classMap = BsonClassMap.RegisterClassMap<HistoryEvent>();
classMap.MapProperty(x => x.Created).SetElementName("_ts");
classMap.AutoMap();
}
} }
protected override string CollectionName() protected override string CollectionName()

5
src/Squidex.Domain.Apps.Entities.MongoDb/Rules/MongoRuleEventRepository.cs

@ -9,6 +9,7 @@ using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Threading; using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
using Microsoft.Extensions.Options;
using MongoDB.Driver; using MongoDB.Driver;
using NodaTime; using NodaTime;
using Squidex.Domain.Apps.Core.HandleRules; using Squidex.Domain.Apps.Core.HandleRules;
@ -22,8 +23,8 @@ namespace Squidex.Domain.Apps.Entities.MongoDb.Rules
{ {
public sealed class MongoRuleEventRepository : MongoRepositoryBase<MongoRuleEventEntity>, IRuleEventRepository public sealed class MongoRuleEventRepository : MongoRepositoryBase<MongoRuleEventEntity>, IRuleEventRepository
{ {
public MongoRuleEventRepository(IMongoDatabase database) public MongoRuleEventRepository(IMongoDatabase database, IOptions<MongoDbOptions> options)
: base(database) : base(database, options)
{ {
} }

5
src/Squidex.Domain.Users.MongoDb/Infrastructure/MongoPersistedGrantStore.cs

@ -10,6 +10,7 @@ using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
using IdentityServer4.Models; using IdentityServer4.Models;
using IdentityServer4.Stores; using IdentityServer4.Stores;
using Microsoft.Extensions.Options;
using MongoDB.Bson; using MongoDB.Bson;
using MongoDB.Bson.Serialization; using MongoDB.Bson.Serialization;
using MongoDB.Bson.Serialization.Serializers; using MongoDB.Bson.Serialization.Serializers;
@ -30,8 +31,8 @@ namespace Squidex.Domain.Users.MongoDb.Infrastructure
}); });
} }
public MongoPersistedGrantStore(IMongoDatabase database) public MongoPersistedGrantStore(IMongoDatabase database, IOptions<MongoDbOptions> options)
: base(database) : base(database, options)
{ {
} }

20
src/Squidex.Domain.Users.MongoDb/MongoRoleStore.cs

@ -8,6 +8,7 @@
using System.Threading; using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
using Microsoft.AspNetCore.Identity; using Microsoft.AspNetCore.Identity;
using Microsoft.Extensions.Options;
using MongoDB.Bson; using MongoDB.Bson;
using MongoDB.Bson.Serialization; using MongoDB.Bson.Serialization;
using MongoDB.Bson.Serialization.Serializers; using MongoDB.Bson.Serialization.Serializers;
@ -30,8 +31,8 @@ namespace Squidex.Domain.Users.MongoDb
}); });
} }
public MongoRoleStore(IMongoDatabase database) public MongoRoleStore(IMongoDatabase database, IOptions<MongoDbOptions> options)
: base(database) : base(database, options)
{ {
} }
@ -40,10 +41,23 @@ namespace Squidex.Domain.Users.MongoDb
return "Identity_Roles"; return "Identity_Roles";
} }
protected override string ShardKey()
{
return "Shard";
}
protected override Task SetupCollectionAsync(IMongoCollection<IdentityRole> collection, CancellationToken ct = default) protected override Task SetupCollectionAsync(IMongoCollection<IdentityRole> collection, CancellationToken ct = default)
{ {
return collection.Indexes.CreateOneAsync( return collection.Indexes.CreateOneAsync(
new CreateIndexModel<IdentityRole>(Index.Ascending(x => x.NormalizedName), new CreateIndexOptions { Unique = true }), cancellationToken: ct); new CreateIndexModel<IdentityRole>(
Index
.Ascending("Shard")
.Ascending(x => x.NormalizedName),
new CreateIndexOptions
{
Unique = true
}),
cancellationToken: ct);
} }
protected override MongoCollectionSettings CollectionSettings() protected override MongoCollectionSettings CollectionSettings()

32
src/Squidex.Domain.Users.MongoDb/MongoUserStore.cs

@ -17,7 +17,6 @@ using MongoDB.Bson;
using MongoDB.Bson.Serialization; using MongoDB.Bson.Serialization;
using MongoDB.Bson.Serialization.Serializers; using MongoDB.Bson.Serialization.Serializers;
using MongoDB.Driver; using MongoDB.Driver;
using Squidex.Infrastructure;
using Squidex.Infrastructure.MongoDb; using Squidex.Infrastructure.MongoDb;
using Squidex.Infrastructure.Tasks; using Squidex.Infrastructure.Tasks;
@ -43,7 +42,6 @@ namespace Squidex.Domain.Users.MongoDb
private const string InternalLoginProvider = "[AspNetUserStore]"; private const string InternalLoginProvider = "[AspNetUserStore]";
private const string AuthenticatorKeyTokenName = "AuthenticatorKey"; private const string AuthenticatorKeyTokenName = "AuthenticatorKey";
private const string RecoveryCodeTokenName = "RecoveryCodes"; private const string RecoveryCodeTokenName = "RecoveryCodes";
private readonly MongoDbOptions options;
static MongoUserStore() static MongoUserStore()
{ {
@ -108,11 +106,8 @@ namespace Squidex.Domain.Users.MongoDb
} }
public MongoUserStore(IMongoDatabase database, IOptions<MongoDbOptions> options) public MongoUserStore(IMongoDatabase database, IOptions<MongoDbOptions> options)
: base(database) : base(database, options)
{ {
Guard.NotNull(options, nameof(options));
this.options = options.Value;
} }
protected override string CollectionName() protected override string CollectionName()
@ -120,16 +115,35 @@ namespace Squidex.Domain.Users.MongoDb
return "Identity_Users"; return "Identity_Users";
} }
protected override string ShardKey()
{
return "Shard";
}
protected override Task SetupCollectionAsync(IMongoCollection<MongoUser> collection, CancellationToken ct = default) protected override Task SetupCollectionAsync(IMongoCollection<MongoUser> collection, CancellationToken ct = default)
{ {
return collection.Indexes.CreateManyAsync( return collection.Indexes.CreateManyAsync(
new[] new[]
{ {
options.IsDocumentDb ? Options.IsDocumentDb ?
new CreateIndexModel<MongoUser>(Index.Ascending("Logins.LoginProvider")) : new CreateIndexModel<MongoUser>(Index.Ascending("Logins.LoginProvider")) :
new CreateIndexModel<MongoUser>(Index.Ascending("Logins.LoginProvider").Ascending("Logins.ProviderKey")), new CreateIndexModel<MongoUser>(Index.Ascending("Logins.LoginProvider").Ascending("Logins.ProviderKey")),
new CreateIndexModel<MongoUser>(Index.Ascending(x => x.NormalizedUserName), new CreateIndexOptions { Unique = true }), new CreateIndexModel<MongoUser>(
new CreateIndexModel<MongoUser>(Index.Ascending(x => x.NormalizedEmail), new CreateIndexOptions { Unique = true }) Index
.Ascending("Shard")
.Ascending(x => x.NormalizedUserName),
new CreateIndexOptions
{
Unique = true
}),
new CreateIndexModel<MongoUser>(
Index
.Ascending("Shard")
.Ascending(x => x.NormalizedEmail),
new CreateIndexOptions
{
Unique = true
})
}, ct); }, ct);
} }

14
src/Squidex.Infrastructure.Azure/EventSourcing/CosmosDbEventStore.cs

@ -78,12 +78,26 @@ namespace Squidex.Infrastructure.EventSourcing
await documentClient.CreateDocumentCollectionIfNotExistsAsync(databaseUri, await documentClient.CreateDocumentCollectionIfNotExistsAsync(databaseUri,
new DocumentCollection new DocumentCollection
{ {
PartitionKey = new PartitionKeyDefinition
{
Paths = new Collection<string>
{
"/PartitionId"
}
},
Id = Constants.LeaseCollection Id = Constants.LeaseCollection
}); });
await documentClient.CreateDocumentCollectionIfNotExistsAsync(databaseUri, await documentClient.CreateDocumentCollectionIfNotExistsAsync(databaseUri,
new DocumentCollection new DocumentCollection
{ {
PartitionKey = new PartitionKeyDefinition
{
Paths = new Collection<string>
{
"/eventStream"
}
},
IndexingPolicy = new IndexingPolicy IndexingPolicy = new IndexingPolicy
{ {
IncludedPaths = new Collection<IncludedPath> IncludedPaths = new Collection<IncludedPath>

5
src/Squidex.Infrastructure.MongoDb/EventSourcing/MongoEventStore.cs

@ -7,6 +7,7 @@
using System.Threading; using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
using Microsoft.Extensions.Options;
using MongoDB.Bson; using MongoDB.Bson;
using MongoDB.Driver; using MongoDB.Driver;
using Squidex.Infrastructure.MongoDb; using Squidex.Infrastructure.MongoDb;
@ -26,8 +27,8 @@ namespace Squidex.Infrastructure.EventSourcing
get { return Database.GetCollection<BsonDocument>(CollectionName()); } get { return Database.GetCollection<BsonDocument>(CollectionName()); }
} }
public MongoEventStore(IMongoDatabase database, IEventNotifier notifier) public MongoEventStore(IMongoDatabase database, IOptions<MongoDbOptions> options, IEventNotifier notifier)
: base(database) : base(database, options)
{ {
Guard.NotNull(notifier, nameof(notifier)); Guard.NotNull(notifier, nameof(notifier));

5
src/Squidex.Infrastructure.MongoDb/Migrations/MongoMigrationStatus.cs

@ -6,6 +6,7 @@
// ========================================================================== // ==========================================================================
using System.Threading.Tasks; using System.Threading.Tasks;
using Microsoft.Extensions.Options;
using MongoDB.Driver; using MongoDB.Driver;
using Squidex.Infrastructure.MongoDb; using Squidex.Infrastructure.MongoDb;
@ -16,8 +17,8 @@ namespace Squidex.Infrastructure.Migrations
private const string DefaultId = "Default"; private const string DefaultId = "Default";
private static readonly FindOneAndUpdateOptions<MongoMigrationEntity> UpsertFind = new FindOneAndUpdateOptions<MongoMigrationEntity> { IsUpsert = true }; private static readonly FindOneAndUpdateOptions<MongoMigrationEntity> UpsertFind = new FindOneAndUpdateOptions<MongoMigrationEntity> { IsUpsert = true };
public MongoMigrationStatus(IMongoDatabase database) public MongoMigrationStatus(IMongoDatabase database, IOptions<MongoDbOptions> options)
: base(database) : base(database, options)
{ {
} }

1
src/Squidex.Infrastructure.MongoDb/MongoDb/MongoDbEngine.cs

@ -9,7 +9,6 @@ namespace Squidex.Infrastructure.MongoDb
{ {
public enum MongoDbEngine public enum MongoDbEngine
{ {
CosmosDb,
DocumentDb, DocumentDb,
MongoDb, MongoDb,
} }

5
src/Squidex.Infrastructure.MongoDb/MongoDb/MongoDbOptions.cs

@ -11,11 +11,6 @@ namespace Squidex.Infrastructure.MongoDb
{ {
public MongoDbEngine Engine { get; set; } = MongoDbEngine.MongoDb; public MongoDbEngine Engine { get; set; } = MongoDbEngine.MongoDb;
public bool IsCosmosDb
{
get { return Engine == MongoDbEngine.CosmosDb; }
}
public bool IsDocumentDb public bool IsDocumentDb
{ {
get { return Engine == MongoDbEngine.DocumentDb; } get { return Engine == MongoDbEngine.DocumentDb; }

18
src/Squidex.Infrastructure.MongoDb/MongoDb/MongoRepositoryBase.cs

@ -9,6 +9,8 @@ using System;
using System.Globalization; using System.Globalization;
using System.Threading; using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
using Microsoft.Extensions.Options;
using MongoDB.Bson;
using MongoDB.Driver; using MongoDB.Driver;
using Squidex.Infrastructure.Tasks; using Squidex.Infrastructure.Tasks;
@ -29,6 +31,7 @@ namespace Squidex.Infrastructure.MongoDb
protected static readonly ProjectionDefinitionBuilder<TEntity> Projection = Builders<TEntity>.Projection; protected static readonly ProjectionDefinitionBuilder<TEntity> Projection = Builders<TEntity>.Projection;
private readonly IMongoDatabase mongoDatabase; private readonly IMongoDatabase mongoDatabase;
private readonly MongoDbOptions options;
private Lazy<IMongoCollection<TEntity>> mongoCollection; private Lazy<IMongoCollection<TEntity>> mongoCollection;
protected IMongoCollection<TEntity> Collection protected IMongoCollection<TEntity> Collection
@ -41,6 +44,11 @@ namespace Squidex.Infrastructure.MongoDb
get { return mongoDatabase; } get { return mongoDatabase; }
} }
protected MongoDbOptions Options
{
get { return options; }
}
static MongoRepositoryBase() static MongoRepositoryBase()
{ {
RefTokenSerializer.Register(); RefTokenSerializer.Register();
@ -48,12 +56,15 @@ namespace Squidex.Infrastructure.MongoDb
InstantSerializer.Register(); InstantSerializer.Register();
} }
protected MongoRepositoryBase(IMongoDatabase database) protected MongoRepositoryBase(IMongoDatabase database, IOptions<MongoDbOptions> options)
{ {
Guard.NotNull(database, nameof(database)); Guard.NotNull(database, nameof(database));
Guard.NotNull(options, nameof(options));
mongoDatabase = database; mongoDatabase = database;
mongoCollection = CreateCollection(); mongoCollection = CreateCollection();
this.options = options.Value;
} }
protected virtual MongoCollectionSettings CollectionSettings() protected virtual MongoCollectionSettings CollectionSettings()
@ -61,6 +72,11 @@ namespace Squidex.Infrastructure.MongoDb
return new MongoCollectionSettings(); return new MongoCollectionSettings();
} }
protected virtual string ShardKey()
{
return "_id";
}
protected virtual string CollectionName() protected virtual string CollectionName()
{ {
return string.Format(CultureInfo.InvariantCulture, CollectionFormat, typeof(TEntity).Name); return string.Format(CultureInfo.InvariantCulture, CollectionFormat, typeof(TEntity).Name);

5
src/Squidex.Infrastructure.MongoDb/States/MongoSnapshotStore.cs

@ -9,6 +9,7 @@ using System;
using System.Linq; using System.Linq;
using System.Threading; using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
using Microsoft.Extensions.Options;
using MongoDB.Bson; using MongoDB.Bson;
using MongoDB.Driver; using MongoDB.Driver;
using Newtonsoft.Json; using Newtonsoft.Json;
@ -19,8 +20,8 @@ namespace Squidex.Infrastructure.States
{ {
public class MongoSnapshotStore<T, TKey> : MongoRepositoryBase<MongoState<T, TKey>>, ISnapshotStore<T, TKey> public class MongoSnapshotStore<T, TKey> : MongoRepositoryBase<MongoState<T, TKey>>, ISnapshotStore<T, TKey>
{ {
public MongoSnapshotStore(IMongoDatabase database, JsonSerializer jsonSerializer) public MongoSnapshotStore(IMongoDatabase database, IOptions<MongoDbOptions> options, JsonSerializer jsonSerializer)
: base(database) : base(database, options)
{ {
Guard.NotNull(jsonSerializer, nameof(jsonSerializer)); Guard.NotNull(jsonSerializer, nameof(jsonSerializer));

5
src/Squidex.Infrastructure.MongoDb/UsageTracking/MongoUsageRepository.cs

@ -10,6 +10,7 @@ using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Threading; using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
using Microsoft.Extensions.Options;
using MongoDB.Driver; using MongoDB.Driver;
using Squidex.Infrastructure.MongoDb; using Squidex.Infrastructure.MongoDb;
@ -19,8 +20,8 @@ namespace Squidex.Infrastructure.UsageTracking
{ {
private static readonly BulkWriteOptions Unordered = new BulkWriteOptions { IsOrdered = false }; private static readonly BulkWriteOptions Unordered = new BulkWriteOptions { IsOrdered = false };
public MongoUsageRepository(IMongoDatabase database) public MongoUsageRepository(IMongoDatabase database, IOptions<MongoDbOptions> options)
: base(database) : base(database, options)
{ {
} }

4
src/Squidex/Config/Domain/EventStoreServices.cs

@ -11,6 +11,7 @@ using EventStore.ClientAPI;
using Microsoft.Azure.Documents.Client; using Microsoft.Azure.Documents.Client;
using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Options;
using MongoDB.Driver; using MongoDB.Driver;
using Newtonsoft.Json; using Newtonsoft.Json;
using Squidex.Infrastructure; using Squidex.Infrastructure;
@ -18,6 +19,7 @@ using Squidex.Infrastructure.Diagnostics;
using Squidex.Infrastructure.EventSourcing; using Squidex.Infrastructure.EventSourcing;
using Squidex.Infrastructure.EventSourcing.Grains; using Squidex.Infrastructure.EventSourcing.Grains;
using Squidex.Infrastructure.Json; using Squidex.Infrastructure.Json;
using Squidex.Infrastructure.MongoDb;
using Squidex.Infrastructure.States; using Squidex.Infrastructure.States;
namespace Squidex.Config.Domain namespace Squidex.Config.Domain
@ -38,7 +40,7 @@ namespace Squidex.Config.Domain
var mongoClient = Singletons<IMongoClient>.GetOrAdd(mongoConfiguration, s => new MongoClient(s)); var mongoClient = Singletons<IMongoClient>.GetOrAdd(mongoConfiguration, s => new MongoClient(s));
var mongDatabase = mongoClient.GetDatabase(mongoDatabaseName); var mongDatabase = mongoClient.GetDatabase(mongoDatabaseName);
return new MongoEventStore(mongDatabase, c.GetRequiredService<IEventNotifier>()); return new MongoEventStore(mongDatabase, c.GetRequiredService<IOptions<MongoDbOptions>>(), c.GetRequiredService<IEventNotifier>());
}) })
.As<IEventStore>(); .As<IEventStore>();
}, },

2
src/Squidex/Config/Domain/StoreServices.cs

@ -11,6 +11,7 @@ using IdentityServer4.Stores;
using Microsoft.AspNetCore.Identity; using Microsoft.AspNetCore.Identity;
using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Options;
using Migrate_01.Migrations.MongoDb; using Migrate_01.Migrations.MongoDb;
using MongoDB.Driver; using MongoDB.Driver;
using Squidex.Domain.Apps.Entities; using Squidex.Domain.Apps.Entities;
@ -104,6 +105,7 @@ namespace Squidex.Config.Domain
services.AddSingletonAs(c => new MongoContentRepository( services.AddSingletonAs(c => new MongoContentRepository(
c.GetRequiredService<IMongoClient>().GetDatabase(mongoContentDatabaseName), c.GetRequiredService<IMongoClient>().GetDatabase(mongoContentDatabaseName),
c.GetRequiredService<IOptions<MongoDbOptions>>(),
c.GetRequiredService<IAppProvider>(), c.GetRequiredService<IAppProvider>(),
c.GetRequiredService<IJsonSerializer>(), c.GetRequiredService<IJsonSerializer>(),
c.GetRequiredService<ITextIndexer>(), c.GetRequiredService<ITextIndexer>(),

2
src/Squidex/Squidex.csproj

@ -72,7 +72,7 @@
<PackageReference Include="NJsonSchema" Version="10.0.21" /> <PackageReference Include="NJsonSchema" Version="10.0.21" />
<PackageReference Include="NSwag.AspNetCore" Version="13.0.4" /> <PackageReference Include="NSwag.AspNetCore" Version="13.0.4" />
<PackageReference Include="OpenCover" Version="4.7.922" PrivateAssets="all" /> <PackageReference Include="OpenCover" Version="4.7.922" PrivateAssets="all" />
<PackageReference Include="Orleans.Providers.MongoDB" Version="2.4.0" /> <PackageReference Include="Orleans.Providers.MongoDB" Version="2.5.0" />
<PackageReference Include="Orleans.WebHostCompatibilityLayer" Version="2.3.1" /> <PackageReference Include="Orleans.WebHostCompatibilityLayer" Version="2.3.1" />
<PackageReference Include="OrleansDashboard" Version="2.3.6" /> <PackageReference Include="OrleansDashboard" Version="2.3.6" />
<PackageReference Include="RefactoringEssentials" Version="5.6.0" PrivateAssets="all" /> <PackageReference Include="RefactoringEssentials" Version="5.6.0" PrivateAssets="all" />

4
src/Squidex/appsettings.json

@ -296,7 +296,7 @@
* *
* Supported: MongoDB, Development * Supported: MongoDB, Development
*/ */
"clustering": "MongoDB", "clustering": "Development",
/* /*
* The port is used to share messages between all cluster members. Must be accessible within your cluster or network. * The port is used to share messages between all cluster members. Must be accessible within your cluster or network.
*/ */
@ -397,7 +397,7 @@
*/ */
"database": "Squidex", "database": "Squidex",
/* /*
* The MongoDb Engine. Supported: MongoDb, CosmosDb, DocumentDb * The MongoDb Engine. Supported: MongoDb, DocumentDb
*/ */
"engine": "MongoDb" "engine": "MongoDb"
} }

3
tests/Squidex.Infrastructure.Tests/EventSourcing/MongoEventStoreFixture.cs

@ -7,6 +7,7 @@
using System; using System;
using FakeItEasy; using FakeItEasy;
using Microsoft.Extensions.Options;
using MongoDB.Driver; using MongoDB.Driver;
using Newtonsoft.Json; using Newtonsoft.Json;
using Squidex.Infrastructure.MongoDb; using Squidex.Infrastructure.MongoDb;
@ -28,7 +29,7 @@ namespace Squidex.Infrastructure.EventSourcing
BsonJsonConvention.Register(JsonSerializer.Create(JsonHelper.DefaultSettings())); BsonJsonConvention.Register(JsonSerializer.Create(JsonHelper.DefaultSettings()));
EventStore = new MongoEventStore(mongoDatabase, notifier); EventStore = new MongoEventStore(mongoDatabase, Options.Create(new MongoDbOptions()), notifier);
EventStore.InitializeAsync().Wait(); EventStore.InitializeAsync().Wait();
} }

12
tools/Migrate_01/Migrations/MongoDb/ConvertOldSnapshotStores.cs

@ -7,33 +7,23 @@
using System.Linq; using System.Linq;
using System.Threading.Tasks; using System.Threading.Tasks;
using Microsoft.Extensions.Options;
using MongoDB.Bson; using MongoDB.Bson;
using MongoDB.Driver; using MongoDB.Driver;
using Squidex.Infrastructure.Migrations; using Squidex.Infrastructure.Migrations;
using Squidex.Infrastructure.MongoDb;
using Squidex.Infrastructure.Tasks;
namespace Migrate_01.Migrations.MongoDb namespace Migrate_01.Migrations.MongoDb
{ {
public sealed class ConvertOldSnapshotStores : IMigration public sealed class ConvertOldSnapshotStores : IMigration
{ {
private readonly IMongoDatabase database; private readonly IMongoDatabase database;
private readonly MongoDbOptions options;
public ConvertOldSnapshotStores(IMongoDatabase database, IOptions<MongoDbOptions> options) public ConvertOldSnapshotStores(IMongoDatabase database)
{ {
this.database = database; this.database = database;
this.options = options.Value;
} }
public Task UpdateAsync() public Task UpdateAsync()
{ {
if (options.IsCosmosDb)
{
return TaskHelper.Done;
}
var collections = new[] var collections = new[]
{ {
"States_Apps", "States_Apps",

12
tools/Migrate_01/Migrations/MongoDb/RenameSlugField.cs

@ -6,33 +6,23 @@
// ========================================================================== // ==========================================================================
using System.Threading.Tasks; using System.Threading.Tasks;
using Microsoft.Extensions.Options;
using MongoDB.Bson; using MongoDB.Bson;
using MongoDB.Driver; using MongoDB.Driver;
using Squidex.Infrastructure.Migrations; using Squidex.Infrastructure.Migrations;
using Squidex.Infrastructure.MongoDb;
using Squidex.Infrastructure.Tasks;
namespace Migrate_01.Migrations.MongoDb namespace Migrate_01.Migrations.MongoDb
{ {
public sealed class RenameSlugField : IMigration public sealed class RenameSlugField : IMigration
{ {
private readonly IMongoDatabase database; private readonly IMongoDatabase database;
private readonly MongoDbOptions options;
public RenameSlugField(IMongoDatabase database, IOptions<MongoDbOptions> options) public RenameSlugField(IMongoDatabase database)
{ {
this.database = database; this.database = database;
this.options = options.Value;
} }
public Task UpdateAsync() public Task UpdateAsync()
{ {
if (options.IsCosmosDb)
{
return TaskHelper.Done;
}
var collection = database.GetCollection<BsonDocument>("States_Assets"); var collection = database.GetCollection<BsonDocument>("States_Assets");
var update = Builders<BsonDocument>.Update.Rename("FileNameSlug", "Slug"); var update = Builders<BsonDocument>.Update.Rename("FileNameSlug", "Slug");

Loading…
Cancel
Save