diff --git a/src/Squidex.Domain.Users.MongoDb/MongoXmlDocument.cs b/src/Squidex.Domain.Users.MongoDb/MongoXmlDocument.cs new file mode 100644 index 000000000..05181bde7 --- /dev/null +++ b/src/Squidex.Domain.Users.MongoDb/MongoXmlDocument.cs @@ -0,0 +1,25 @@ +// ========================================================================== +// MongoXmlDocument.cs +// Squidex Headless CMS +// ========================================================================== +// Copyright (c) Squidex Group +// All rights reserved. +// ========================================================================== + +using MongoDB.Bson; +using MongoDB.Bson.Serialization.Attributes; + +namespace Squidex.Domain.Users.MongoDb +{ + public sealed class MongoXmlDocument + { + [BsonId] + [BsonElement] + [BsonRepresentation(BsonType.String)] + public string Id { get; set; } + + [BsonRequired] + [BsonElement] + public string Xml { get; set; } + } +} diff --git a/src/Squidex.Domain.Users.MongoDb/MongoXmlRepository.cs b/src/Squidex.Domain.Users.MongoDb/MongoXmlRepository.cs new file mode 100644 index 000000000..ad7b7c953 --- /dev/null +++ b/src/Squidex.Domain.Users.MongoDb/MongoXmlRepository.cs @@ -0,0 +1,47 @@ +// ========================================================================== +// MongoXmlRepository.cs +// Squidex Headless CMS +// ========================================================================== +// Copyright (c) Squidex Group +// All rights reserved. +// ========================================================================== + +using System.Collections.Generic; +using System.Linq; +using System.Xml.Linq; +using Microsoft.AspNetCore.DataProtection.Repositories; +using MongoDB.Bson; +using MongoDB.Driver; +using Squidex.Infrastructure.MongoDb; + +namespace Squidex.Domain.Users.MongoDb +{ + public sealed class MongoXmlRepository : MongoRepositoryBase, IXmlRepository + { + private static readonly UpdateOptions Upsert = new UpdateOptions { IsUpsert = true }; + + public MongoXmlRepository(IMongoDatabase database) + : base(database) + { + } + + protected override string CollectionName() + { + return "Identity_XmlRepository"; + } + + public IReadOnlyCollection GetAllElements() + { + var elements = Collection.Find(new BsonDocument()).ToList(); + + return elements.Select(x => XElement.Parse(x.Xml)).ToList(); + } + + public void StoreElement(XElement element, string friendlyName) + { + Collection.UpdateOne(Filter.Eq(x => x.Id, friendlyName), + Update.Set(x => x.Xml, element.ToString()), + Upsert); + } + } +} diff --git a/src/Squidex.Domain.Users/DataProtection/Orleans/Grains/IXmlRepositoryGrain.cs b/src/Squidex.Domain.Users/DataProtection/Orleans/Grains/IXmlRepositoryGrain.cs deleted file mode 100644 index 0089f0d3d..000000000 --- a/src/Squidex.Domain.Users/DataProtection/Orleans/Grains/IXmlRepositoryGrain.cs +++ /dev/null @@ -1,20 +0,0 @@ -// ========================================================================== -// IXmlRepositoryGrain.cs -// Squidex Headless CMS -// ========================================================================== -// Copyright (c) Squidex Group -// All rights reserved. -// ========================================================================== - -using System.Threading.Tasks; -using Orleans; - -namespace Squidex.Domain.Users.DataProtection.Orleans.Grains -{ - public interface IXmlRepositoryGrain : IGrainWithStringKey - { - Task GetAllElementsAsync(); - - Task StoreElementAsync(string element, string friendlyName); - } -} diff --git a/src/Squidex.Domain.Users/DataProtection/Orleans/Grains/Implementations/XmlRepositoryGrain.cs b/src/Squidex.Domain.Users/DataProtection/Orleans/Grains/Implementations/XmlRepositoryGrain.cs deleted file mode 100644 index 0a104976b..000000000 --- a/src/Squidex.Domain.Users/DataProtection/Orleans/Grains/Implementations/XmlRepositoryGrain.cs +++ /dev/null @@ -1,55 +0,0 @@ -// ========================================================================== -// XmlRepositoryGrain.cs -// Squidex Headless CMS -// ========================================================================== -// Copyright (c) Squidex Group -// All rights reserved. -// ========================================================================== - -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading.Tasks; -using Orleans.Runtime; -using Squidex.Infrastructure.Log; -using Squidex.Infrastructure.Orleans; - -namespace Squidex.Domain.Users.DataProtection.Orleans.Grains.Implementations -{ - public sealed class XmlRepositoryGrain : GrainV2>, IXmlRepositoryGrain - { - private readonly ISemanticLog log; - - public XmlRepositoryGrain(IGrainRuntime runtime, ISemanticLog log) - : base(runtime) - { - this.log = log; - } - - protected override async Task ReadStateAsync() - { - try - { - await base.ReadStateAsync(); - } - catch (Exception ex) - { - State = new Dictionary(); - - log.LogError(ex, w => w.WriteProperty("action", "LoadXmlRepository")); - } - } - - public Task GetAllElementsAsync() - { - return Task.FromResult(State.Values.ToArray()); - } - - public Task StoreElementAsync(string element, string friendlyName) - { - State[friendlyName] = element; - - return WriteStateAsync(); - } - } -} diff --git a/src/Squidex.Domain.Users/DataProtection/Orleans/OrleansXmlRepository.cs b/src/Squidex.Domain.Users/DataProtection/Orleans/OrleansXmlRepository.cs deleted file mode 100644 index edce8fc3f..000000000 --- a/src/Squidex.Domain.Users/DataProtection/Orleans/OrleansXmlRepository.cs +++ /dev/null @@ -1,41 +0,0 @@ -// ========================================================================== -// OrleansXmlRepository.cs -// Squidex Headless CMS -// ========================================================================== -// Copyright (c) Squidex Group -// All rights reserved. -// ========================================================================== - -using System; -using System.Collections.Generic; -using System.Linq; -using System.Xml.Linq; -using Microsoft.AspNetCore.DataProtection.Repositories; -using Orleans; -using Squidex.Domain.Users.DataProtection.Orleans.Grains; -using Squidex.Infrastructure; - -namespace Squidex.Domain.Users.DataProtection.Orleans -{ - public sealed class OrleansXmlRepository : IXmlRepository - { - private readonly Lazy grain; - - public OrleansXmlRepository(IClusterClient orleans) - { - Guard.NotNull(orleans, nameof(orleans)); - - grain = new Lazy(() => orleans.GetGrain("Default")); - } - - public IReadOnlyCollection GetAllElements() - { - return grain.Value.GetAllElementsAsync().ContinueWith(x => x.Result.Select(XElement.Parse).ToList()).Result; - } - - public void StoreElement(XElement element, string friendlyName) - { - grain.Value.StoreElementAsync(element.ToString(), friendlyName).Wait(); - } - } -} diff --git a/src/Squidex.Domain.Users/Squidex.Domain.Users.csproj b/src/Squidex.Domain.Users/Squidex.Domain.Users.csproj index f1e6e0bd3..987174138 100644 --- a/src/Squidex.Domain.Users/Squidex.Domain.Users.csproj +++ b/src/Squidex.Domain.Users/Squidex.Domain.Users.csproj @@ -12,8 +12,6 @@ - - diff --git a/src/Squidex/Areas/IdentityServer/Config/IdentityServerServices.cs b/src/Squidex/Areas/IdentityServer/Config/IdentityServerServices.cs index 1e22658d1..95c689f14 100644 --- a/src/Squidex/Areas/IdentityServer/Config/IdentityServerServices.cs +++ b/src/Squidex/Areas/IdentityServer/Config/IdentityServerServices.cs @@ -20,7 +20,6 @@ using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Options; using Squidex.Config; using Squidex.Domain.Users; -using Squidex.Domain.Users.DataProtection.Orleans; using Squidex.Shared.Identity; using Squidex.Shared.Users; @@ -45,25 +44,20 @@ namespace Squidex.Areas.IdentityServer.Config X509KeyStorageFlags.Exportable); } - services.AddIdentity() - .AddDefaultTokenProviders(); - - services.AddDataProtection().SetApplicationName("Squidex"); - services.AddSingleton(); - services.AddSingleton>(s => { return new ConfigureOptions(options => { - options.XmlRepository = s.GetRequiredService(); + options.XmlRepository = s.GetRequiredService(); }); }); + services.AddDataProtection().SetApplicationName("Squidex"); services.AddSingleton(GetApiResources()); services.AddSingleton(GetIdentityResources()); - services.AddSingleton(); + services.AddIdentity() + .AddDefaultTokenProviders(); services.AddSingleton, UserClaimsPrincipalFactoryWithEmail>(); services.AddSingleton new MongoXmlRepository(mongoDatabase)) + .As() + .As(); + services.AddSingletonAs(c => new MongoUserStore(mongoDatabase)) .As>() .As() diff --git a/src/Squidex/Config/Orleans/ClientServices.cs b/src/Squidex/Config/Orleans/ClientServices.cs index 9949a2154..27dfe912c 100644 --- a/src/Squidex/Config/Orleans/ClientServices.cs +++ b/src/Squidex/Config/Orleans/ClientServices.cs @@ -12,7 +12,6 @@ using Microsoft.Extensions.DependencyInjection; using Orleans; using Orleans.Runtime.Configuration; using Squidex.Domain.Apps.Read.State.Orleans.Grains.Implementations; -using Squidex.Domain.Users.DataProtection.Orleans.Grains.Implementations; using Squidex.Infrastructure.CQRS.Events.Orleans.Grains.Implementation; namespace Squidex.Config.Orleans @@ -36,7 +35,6 @@ namespace Squidex.Config.Orleans .UseDashboard() .AddApplicationPartsFromReferences(typeof(AppStateGrain).Assembly) .AddApplicationPartsFromReferences(typeof(EventConsumerGrain).Assembly) - .AddApplicationPartsFromReferences(typeof(XmlRepositoryGrain).Assembly) .UseStaticGatewayListProvider(options => { options.Gateways.Add(new Uri("gwy.tcp://127.0.0.1:40000/0")); diff --git a/src/Squidex/Config/Orleans/SiloExtensions.cs b/src/Squidex/Config/Orleans/SiloExtensions.cs index ee49c1284..c58028dd8 100644 --- a/src/Squidex/Config/Orleans/SiloExtensions.cs +++ b/src/Squidex/Config/Orleans/SiloExtensions.cs @@ -35,7 +35,7 @@ namespace Squidex.Config.Orleans public static ClusterConfiguration WithDashboard(this ClusterConfiguration config) { - // config.RegisterDashboard(); + config.RegisterDashboard(); return config; } diff --git a/src/Squidex/Config/Orleans/SiloServices.cs b/src/Squidex/Config/Orleans/SiloServices.cs index 466aa8b87..eaffea049 100644 --- a/src/Squidex/Config/Orleans/SiloServices.cs +++ b/src/Squidex/Config/Orleans/SiloServices.cs @@ -30,8 +30,8 @@ namespace Squidex.Config.Orleans if (clusterConfiguration != null) { - // clusterConfiguration.Globals.RegisterBootstrapProvider("EventConsumers"); - // clusterConfiguration.Globals.RegisterBootstrapProvider("RuleDequeuer"); + clusterConfiguration.Globals.RegisterBootstrapProvider("EventConsumers"); + clusterConfiguration.Globals.RegisterBootstrapProvider("RuleDequeuer"); var ipConfig = config.GetRequiredValue("orleans:hostNameOrIPAddress"); diff --git a/src/Squidex/Program.cs b/src/Squidex/Program.cs index 33ce73c07..d52f52666 100644 --- a/src/Squidex/Program.cs +++ b/src/Squidex/Program.cs @@ -14,7 +14,6 @@ using Orleans.Hosting; using Orleans.Runtime.Configuration; using Squidex.Config.Orleans; using Squidex.Domain.Apps.Read.State.Orleans.Grains.Implementations; -using Squidex.Domain.Users.DataProtection.Orleans.Grains.Implementations; using Squidex.Infrastructure.CQRS.Events.Orleans.Grains.Implementation; using Squidex.Infrastructure.Log.Adapter; @@ -27,8 +26,7 @@ namespace Squidex var silo = new SiloHostBuilder() .AddApplicationPartsFromReferences(typeof(AppStateGrain).Assembly) .AddApplicationPartsFromReferences(typeof(EventConsumerGrain).Assembly) - .AddApplicationPartsFromReferences(typeof(XmlRepositoryGrain).Assembly) - // .UseDashboard(options => { options.HostSelf = false; }) + .UseDashboard(options => { options.HostSelf = false; }) .UseContentRoot(Directory.GetCurrentDirectory()) .UseConfiguration( ClusterConfiguration.LocalhostPrimarySilo(33333)