Browse Source

Xml repository

pull/169/head
Sebastian Stehle 9 years ago
parent
commit
28714179a6
  1. 25
      src/Squidex.Domain.Users.MongoDb/MongoXmlDocument.cs
  2. 47
      src/Squidex.Domain.Users.MongoDb/MongoXmlRepository.cs
  3. 20
      src/Squidex.Domain.Users/DataProtection/Orleans/Grains/IXmlRepositoryGrain.cs
  4. 55
      src/Squidex.Domain.Users/DataProtection/Orleans/Grains/Implementations/XmlRepositoryGrain.cs
  5. 41
      src/Squidex.Domain.Users/DataProtection/Orleans/OrleansXmlRepository.cs
  6. 2
      src/Squidex.Domain.Users/Squidex.Domain.Users.csproj
  7. 14
      src/Squidex/Areas/IdentityServer/Config/IdentityServerServices.cs
  8. 5
      src/Squidex/Config/Domain/StoreServices.cs
  9. 2
      src/Squidex/Config/Orleans/ClientServices.cs
  10. 2
      src/Squidex/Config/Orleans/SiloExtensions.cs
  11. 4
      src/Squidex/Config/Orleans/SiloServices.cs
  12. 4
      src/Squidex/Program.cs

25
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; }
}
}

47
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<MongoXmlDocument>, 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<XElement> 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);
}
}
}

20
src/Squidex.Domain.Users/DataProtection/Orleans/Grains/IXmlRepositoryGrain.cs

@ -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<string[]> GetAllElementsAsync();
Task StoreElementAsync(string element, string friendlyName);
}
}

55
src/Squidex.Domain.Users/DataProtection/Orleans/Grains/Implementations/XmlRepositoryGrain.cs

@ -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<Dictionary<string, string>>, 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<string, string>();
log.LogError(ex, w => w.WriteProperty("action", "LoadXmlRepository"));
}
}
public Task<string[]> GetAllElementsAsync()
{
return Task.FromResult(State.Values.ToArray());
}
public Task StoreElementAsync(string element, string friendlyName)
{
State[friendlyName] = element;
return WriteStateAsync();
}
}
}

41
src/Squidex.Domain.Users/DataProtection/Orleans/OrleansXmlRepository.cs

@ -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<IXmlRepositoryGrain> grain;
public OrleansXmlRepository(IClusterClient orleans)
{
Guard.NotNull(orleans, nameof(orleans));
grain = new Lazy<IXmlRepositoryGrain>(() => orleans.GetGrain<IXmlRepositoryGrain>("Default"));
}
public IReadOnlyCollection<XElement> 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();
}
}
}

2
src/Squidex.Domain.Users/Squidex.Domain.Users.csproj

@ -12,8 +12,6 @@
</ItemGroup>
<ItemGroup>
<PackageReference Include="Microsoft.AspNetCore.Identity" Version="2.0.1" />
<PackageReference Include="Microsoft.Orleans.Client" Version="2.0.0-beta1" />
<PackageReference Include="Microsoft.Orleans.OrleansCodeGenerator.Build" Version="2.0.0-beta1-fix" />
<PackageReference Include="Microsoft.Win32.Registry" Version="4.4.0" />
<PackageReference Include="RefactoringEssentials" Version="5.4.0" />
<PackageReference Include="StyleCop.Analyzers" Version="1.0.2" />

14
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<IUser, IRole>()
.AddDefaultTokenProviders();
services.AddDataProtection().SetApplicationName("Squidex");
services.AddSingleton<OrleansXmlRepository>();
services.AddSingleton<IConfigureOptions<KeyManagementOptions>>(s =>
{
return new ConfigureOptions<KeyManagementOptions>(options =>
{
options.XmlRepository = s.GetRequiredService<OrleansXmlRepository>();
options.XmlRepository = s.GetRequiredService<IXmlRepository>();
});
});
services.AddDataProtection().SetApplicationName("Squidex");
services.AddSingleton(GetApiResources());
services.AddSingleton(GetIdentityResources());
services.AddSingleton<IXmlRepository,
OrleansXmlRepository>();
services.AddIdentity<IUser, IRole>()
.AddDefaultTokenProviders();
services.AddSingleton<IUserClaimsPrincipalFactory<IUser>,
UserClaimsPrincipalFactoryWithEmail>();
services.AddSingleton<IClientStore,

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

@ -7,6 +7,7 @@
// ==========================================================================
using IdentityServer4.Stores;
using Microsoft.AspNetCore.DataProtection.Repositories;
using Microsoft.AspNetCore.Identity;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
@ -48,6 +49,10 @@ namespace Squidex.Config.Domain
var mongoDatabase = mongoClient.GetDatabase(mongoDatabaseName);
var mongoContentDatabase = mongoClient.GetDatabase(mongoContentDatabaseName);
services.AddSingletonAs(c => new MongoXmlRepository(mongoDatabase))
.As<IXmlRepository>()
.As<IExternalSystem>();
services.AddSingletonAs(c => new MongoUserStore(mongoDatabase))
.As<IUserStore<IUser>>()
.As<IUserFactory>()

2
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"));

2
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;
}

4
src/Squidex/Config/Orleans/SiloServices.cs

@ -30,8 +30,8 @@ namespace Squidex.Config.Orleans
if (clusterConfiguration != null)
{
// clusterConfiguration.Globals.RegisterBootstrapProvider<EventConsumerBootstrap>("EventConsumers");
// clusterConfiguration.Globals.RegisterBootstrapProvider<RuleDequeuerBootstrap>("RuleDequeuer");
clusterConfiguration.Globals.RegisterBootstrapProvider<EventConsumerBootstrap>("EventConsumers");
clusterConfiguration.Globals.RegisterBootstrapProvider<RuleDequeuerBootstrap>("RuleDequeuer");
var ipConfig = config.GetRequiredValue("orleans:hostNameOrIPAddress");

4
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)

Loading…
Cancel
Save