From f39c83ef1105be5983c5ca8e2c11d56c050e98df Mon Sep 17 00:00:00 2001 From: Sebastian Stehle Date: Fri, 24 Nov 2017 00:56:04 +0100 Subject: [PATCH] Swagger improved. --- src/Squidex/AppServices.cs | 1 + .../Api/Config/Swagger/SwaggerServices.cs | 2 +- .../Swagger/XmlResponseTypesProcessor.cs | 2 +- .../Areas/Api/Controllers/ApiController.cs | 1 + .../EventConsumersController.cs | 27 +++--- .../Areas/Api/Views/Shared/Docs.cshtml | 20 +---- ...rleansDashboardAuthenticationMiddleware.cs | 44 --------- src/Squidex/Areas/OrleansDashboard/Startup.cs | 28 ------ src/Squidex/Config/Domain/PubSubServices.cs | 41 +++++++++ src/Squidex/Config/Domain/ReadServices.cs | 29 +++++- src/Squidex/Config/Domain/StoreServices.cs | 6 ++ src/Squidex/Config/Orleans/ClientServices.cs | 57 ------------ .../Config/Orleans/CustomJsonSerializer.cs | 22 ----- .../Orleans/CustomMongoDbStorageProvider.cs | 23 ----- src/Squidex/Config/Orleans/SiloExtensions.cs | 43 --------- src/Squidex/Config/Orleans/SiloServices.cs | 89 ------------------- src/Squidex/Pipeline/Swagger/SwaggerHelper.cs | 2 +- src/Squidex/Program.cs | 61 ++----------- src/Squidex/Squidex.csproj | 4 +- src/Squidex/WebStartup.cs | 6 +- src/Squidex/appsettings.json | 35 +++++--- src/Squidex/package.json | 3 +- 22 files changed, 128 insertions(+), 418 deletions(-) delete mode 100644 src/Squidex/Areas/OrleansDashboard/Middlewares/OrleansDashboardAuthenticationMiddleware.cs delete mode 100644 src/Squidex/Areas/OrleansDashboard/Startup.cs create mode 100644 src/Squidex/Config/Domain/PubSubServices.cs delete mode 100644 src/Squidex/Config/Orleans/ClientServices.cs delete mode 100644 src/Squidex/Config/Orleans/CustomJsonSerializer.cs delete mode 100644 src/Squidex/Config/Orleans/CustomMongoDbStorageProvider.cs delete mode 100644 src/Squidex/Config/Orleans/SiloExtensions.cs delete mode 100644 src/Squidex/Config/Orleans/SiloServices.cs diff --git a/src/Squidex/AppServices.cs b/src/Squidex/AppServices.cs index b005ceb21..88a370b5b 100644 --- a/src/Squidex/AppServices.cs +++ b/src/Squidex/AppServices.cs @@ -32,6 +32,7 @@ namespace Squidex services.AddMyIdentityServer(); services.AddMyInfrastructureServices(config); services.AddMyMvc(); + services.AddMyPubSubServices(config); services.AddMyReadServices(config); services.AddMySerializers(); services.AddMyStoreServices(config); diff --git a/src/Squidex/Areas/Api/Config/Swagger/SwaggerServices.cs b/src/Squidex/Areas/Api/Config/Swagger/SwaggerServices.cs index 7adccca64..d34d09d7b 100644 --- a/src/Squidex/Areas/Api/Config/Swagger/SwaggerServices.cs +++ b/src/Squidex/Areas/Api/Config/Swagger/SwaggerServices.cs @@ -30,7 +30,7 @@ namespace Squidex.Areas.Api.Config.Swagger var urlOptions = s.GetService>().Value; var settings = - new SwaggerSettings { Title = "Squidex API Specification", IsAspNetCore = false } + new SwaggerSettings { Title = "Squidex API", Version = "1.0", IsAspNetCore = false } .ConfigurePaths(urlOptions) .ConfigureSchemaSettings() .ConfigureIdentity(urlOptions); diff --git a/src/Squidex/Areas/Api/Config/Swagger/XmlResponseTypesProcessor.cs b/src/Squidex/Areas/Api/Config/Swagger/XmlResponseTypesProcessor.cs index c5c0f8dd3..0242c3891 100644 --- a/src/Squidex/Areas/Api/Config/Swagger/XmlResponseTypesProcessor.cs +++ b/src/Squidex/Areas/Api/Config/Swagger/XmlResponseTypesProcessor.cs @@ -21,7 +21,7 @@ namespace Squidex.Areas.Api.Config.Swagger { public sealed class XmlResponseTypesProcessor : IOperationProcessor { - private static readonly Regex ResponseRegex = new Regex("(?[0-9]{3}) => (?.*)", RegexOptions.Compiled); + private static readonly Regex ResponseRegex = new Regex("(?[0-9]{3}) => (?.*)", RegexOptions.Compiled); public async Task ProcessAsync(OperationProcessorContext context) { diff --git a/src/Squidex/Areas/Api/Controllers/ApiController.cs b/src/Squidex/Areas/Api/Controllers/ApiController.cs index aa05ed4f2..eaca70e1f 100644 --- a/src/Squidex/Areas/Api/Controllers/ApiController.cs +++ b/src/Squidex/Areas/Api/Controllers/ApiController.cs @@ -16,6 +16,7 @@ using Squidex.Pipeline; namespace Squidex.Areas.Api.Controllers { + [Area("Api")] public abstract class ApiController : Controller { protected ICommandBus CommandBus { get; } diff --git a/src/Squidex/Areas/Api/Controllers/EventConsumers/EventConsumersController.cs b/src/Squidex/Areas/Api/Controllers/EventConsumers/EventConsumersController.cs index 8e44579f3..6a042222e 100644 --- a/src/Squidex/Areas/Api/Controllers/EventConsumers/EventConsumersController.cs +++ b/src/Squidex/Areas/Api/Controllers/EventConsumers/EventConsumersController.cs @@ -6,14 +6,15 @@ // All rights reserved. // ========================================================================== +using System; using System.Linq; using System.Threading.Tasks; using Microsoft.AspNetCore.Mvc; using NSwag.Annotations; -using Orleans; using Squidex.Areas.Api.Controllers.EventConsumers.Models; +using Squidex.Infrastructure; using Squidex.Infrastructure.CQRS.Commands; -using Squidex.Infrastructure.CQRS.Events.Orleans.Grains; +using Squidex.Infrastructure.CQRS.Events.Actors.Messages; using Squidex.Infrastructure.Reflection; using Squidex.Pipeline; @@ -25,12 +26,12 @@ namespace Squidex.Areas.Api.Controllers.EventConsumers [SwaggerIgnore] public sealed class EventConsumersController : ApiController { - private readonly IEventConsumerRegistryGrain eventConsumerRegistryGrain; + private readonly IPubSub pubSub; - public EventConsumersController(ICommandBus commandBus, IClusterClient orleans) + public EventConsumersController(ICommandBus commandBus, IPubSub pubSub) : base(commandBus) { - eventConsumerRegistryGrain = orleans.GetGrain("Default"); + this.pubSub = pubSub; } [HttpGet] @@ -38,9 +39,9 @@ namespace Squidex.Areas.Api.Controllers.EventConsumers [ApiCosts(0)] public async Task GetEventConsumers() { - var entities = await eventConsumerRegistryGrain.GetConsumersAsync(); + var entities = await pubSub.RequestAsync(new GetStatesRequest(), TimeSpan.FromSeconds(2), true); - var models = entities.Value.Select(x => SimpleMapper.Map(x, new EventConsumerDto())).ToList(); + var models = entities.States.Select(x => SimpleMapper.Map(x, new EventConsumerDto())).ToList(); return Ok(models); } @@ -48,9 +49,9 @@ namespace Squidex.Areas.Api.Controllers.EventConsumers [HttpPut] [Route("event-consumers/{name}/start/")] [ApiCosts(0)] - public async Task Start(string name) + public IActionResult Start(string name) { - await eventConsumerRegistryGrain.StartAsync(name); + pubSub.Publish(new StartConsumerMessage { ConsumerName = name }, true); return NoContent(); } @@ -58,9 +59,9 @@ namespace Squidex.Areas.Api.Controllers.EventConsumers [HttpPut] [Route("event-consumers/{name}/stop/")] [ApiCosts(0)] - public async Task Stop(string name) + public IActionResult Stop(string name) { - await eventConsumerRegistryGrain.StopAsync(name); + pubSub.Publish(new StopConsumerMessage { ConsumerName = name }, true); return NoContent(); } @@ -68,9 +69,9 @@ namespace Squidex.Areas.Api.Controllers.EventConsumers [HttpPut] [Route("event-consumers/{name}/reset/")] [ApiCosts(0)] - public async Task Reset(string name) + public IActionResult Reset(string name) { - await eventConsumerRegistryGrain.ResetAsync(name); + pubSub.Publish(new ResetConsumerMessage { ConsumerName = name }, true); return NoContent(); } diff --git a/src/Squidex/Areas/Api/Views/Shared/Docs.cshtml b/src/Squidex/Areas/Api/Views/Shared/Docs.cshtml index 9a26e1bcf..889bad8fc 100644 --- a/src/Squidex/Areas/Api/Views/Shared/Docs.cshtml +++ b/src/Squidex/Areas/Api/Views/Shared/Docs.cshtml @@ -9,32 +9,16 @@ API Docs + - + \ No newline at end of file diff --git a/src/Squidex/Areas/OrleansDashboard/Middlewares/OrleansDashboardAuthenticationMiddleware.cs b/src/Squidex/Areas/OrleansDashboard/Middlewares/OrleansDashboardAuthenticationMiddleware.cs deleted file mode 100644 index 5c970bc38..000000000 --- a/src/Squidex/Areas/OrleansDashboard/Middlewares/OrleansDashboardAuthenticationMiddleware.cs +++ /dev/null @@ -1,44 +0,0 @@ -// ========================================================================== -// LazyClientStore.cs -// Squidex Headless CMS -// ========================================================================== -// Copyright (c) Squidex Group -// All rights reserved. -// ========================================================================== - -using System.Threading.Tasks; -using Microsoft.AspNetCore.Authentication; -using Microsoft.AspNetCore.Authentication.Cookies; -using Microsoft.AspNetCore.Authentication.OpenIdConnect; -using Microsoft.AspNetCore.Http; -using Squidex.Shared.Identity; - -namespace Squidex.Areas.OrleansDashboard.Middlewares -{ - public sealed class OrleansDashboardAuthenticationMiddleware - { - private readonly RequestDelegate next; - - public OrleansDashboardAuthenticationMiddleware(RequestDelegate next) - { - this.next = next; - } - - public async Task Invoke(HttpContext context) - { - var authentication = await context.AuthenticateAsync(CookieAuthenticationDefaults.AuthenticationScheme); - - if (!authentication.Succeeded || !authentication.Principal.IsInRole(SquidexRoles.Administrator)) - { - await context.ChallengeAsync(OpenIdConnectDefaults.AuthenticationScheme, new AuthenticationProperties - { - RedirectUri = context.Request.PathBase + context.Request.Path - }); - } - else - { - await next(context); - } - } - } -} diff --git a/src/Squidex/Areas/OrleansDashboard/Startup.cs b/src/Squidex/Areas/OrleansDashboard/Startup.cs deleted file mode 100644 index 788c90337..000000000 --- a/src/Squidex/Areas/OrleansDashboard/Startup.cs +++ /dev/null @@ -1,28 +0,0 @@ -// ========================================================================== -// Startup.cs -// Squidex Headless CMS -// ========================================================================== -// Copyright (c) Squidex Group -// All rights reserved. -// ========================================================================== - -using Microsoft.AspNetCore.Builder; -using Orleans; -using Squidex.Areas.OrleansDashboard.Middlewares; -using Squidex.Config; - -namespace Squidex.Areas.OrleansDashboard -{ - public static class Startup - { - public static void ConfigureOrleansDashboard(this IApplicationBuilder app) - { - app.Map(Constants.OrleansPrefix, orleansApp => - { - orleansApp.UseAuthentication(); - orleansApp.UseMiddleware(); - orleansApp.UseOrleansDashboard(); - }); - } - } -} diff --git a/src/Squidex/Config/Domain/PubSubServices.cs b/src/Squidex/Config/Domain/PubSubServices.cs new file mode 100644 index 000000000..b19b462ba --- /dev/null +++ b/src/Squidex/Config/Domain/PubSubServices.cs @@ -0,0 +1,41 @@ +// ========================================================================== +// PubSubServices.cs +// Squidex Headless CMS +// ========================================================================== +// Copyright (c) Squidex Group +// All rights reserved. +// ========================================================================== + +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; +using Squidex.Infrastructure; +using Squidex.Infrastructure.Log; +using StackExchange.Redis; + +namespace Squidex.Config.Domain +{ + public static class PubSubServices + { + public static void AddMyPubSubServices(this IServiceCollection services, IConfiguration config) + { + config.ConfigureByOption("pubSub:type", new Options + { + ["InMemory"] = () => + { + services.AddSingletonAs() + .As(); + }, + ["Redis"] = () => + { + var configuration = config.GetRequiredValue("pubsub:redis:configuration"); + + var redis = Singletons.GetOrAddLazy(configuration, s => ConnectionMultiplexer.Connect(s)); + + services.AddSingletonAs(c => new RedisPubSub(redis, c.GetRequiredService())) + .As() + .As(); + } + }); + } + } +} diff --git a/src/Squidex/Config/Domain/ReadServices.cs b/src/Squidex/Config/Domain/ReadServices.cs index b5c5649fe..19c646379 100644 --- a/src/Squidex/Config/Domain/ReadServices.cs +++ b/src/Squidex/Config/Domain/ReadServices.cs @@ -25,11 +25,13 @@ using Squidex.Domain.Apps.Read.History; using Squidex.Domain.Apps.Read.Rules; using Squidex.Domain.Apps.Read.Schemas; using Squidex.Domain.Apps.Read.State.Orleans; +using Squidex.Domain.Apps.Read.State.Orleans.Grains; using Squidex.Domain.Users; using Squidex.Infrastructure; using Squidex.Infrastructure.Assets; using Squidex.Infrastructure.CQRS.Events; -using Squidex.Infrastructure.CQRS.Events.Orleans; +using Squidex.Infrastructure.CQRS.Events.Actors; +using Squidex.Infrastructure.States; using Squidex.Pipeline; namespace Squidex.Config.Domain @@ -38,6 +40,18 @@ namespace Squidex.Config.Domain { public static void AddMyReadServices(this IServiceCollection services, IConfiguration config) { + var consumeEvents = config.GetOptionalValue("eventStore:consume", false); + + if (consumeEvents) + { + services.AddTransient(); + + services.AddSingletonAs() + .As(); + services.AddSingletonAs() + .As(); + } + var exposeSourceUrl = config.GetOptionalValue("assetStore:exposeSourceUrl", true); services.AddSingletonAs(c => new GraphQLUrlGenerator( @@ -72,10 +86,10 @@ namespace Squidex.Config.Domain services.AddSingletonAs() .As(); - services.AddSingletonAs() + services.AddSingletonAs() .As(); - services.AddSingletonAs() + services.AddSingletonAs() .As(); services.AddSingletonAs() @@ -84,6 +98,9 @@ namespace Squidex.Config.Domain services.AddSingletonAs() .As(); + services.AddSingletonAs() + .As(); + services.AddSingletonAs() .As(); @@ -100,8 +117,12 @@ namespace Squidex.Config.Domain return new EventConsumerFactory(n => allEventConsumers.FirstOrDefault(x => x.Name == n)); }); - services.AddSingletonAs(); services.AddSingletonAs(); + + services.AddTransient(); + services.AddTransient(); + + services.AddSingleton(); } } } diff --git a/src/Squidex/Config/Domain/StoreServices.cs b/src/Squidex/Config/Domain/StoreServices.cs index 8f72fde69..7caee4325 100644 --- a/src/Squidex/Config/Domain/StoreServices.cs +++ b/src/Squidex/Config/Domain/StoreServices.cs @@ -12,6 +12,7 @@ using Microsoft.AspNetCore.Identity; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using MongoDB.Driver; +using Newtonsoft.Json; using Squidex.Domain.Apps.Read; using Squidex.Domain.Apps.Read.Assets; using Squidex.Domain.Apps.Read.Assets.Repositories; @@ -28,6 +29,7 @@ using Squidex.Domain.Users.MongoDb; using Squidex.Domain.Users.MongoDb.Infrastructure; using Squidex.Infrastructure; using Squidex.Infrastructure.CQRS.Events; +using Squidex.Infrastructure.States; using Squidex.Infrastructure.UsageTracking; using Squidex.Shared.Users; @@ -53,6 +55,10 @@ namespace Squidex.Config.Domain .As() .As(); + services.AddSingletonAs(c => new MongoStateStore(mongoDatabase, c.GetRequiredService())) + .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 deleted file mode 100644 index 27dfe912c..000000000 --- a/src/Squidex/Config/Orleans/ClientServices.cs +++ /dev/null @@ -1,57 +0,0 @@ -// ========================================================================== -// ClientServices.cs -// Squidex Headless CMS -// ========================================================================== -// Copyright (c) Squidex Group -// All rights reserved. -// ========================================================================== - -using System; -using System.Reflection; -using Microsoft.Extensions.DependencyInjection; -using Orleans; -using Orleans.Runtime.Configuration; -using Squidex.Domain.Apps.Read.State.Orleans.Grains.Implementations; -using Squidex.Infrastructure.CQRS.Events.Orleans.Grains.Implementation; - -namespace Squidex.Config.Orleans -{ - public static class ClientServices - { - public static void AddAppClient(this IServiceCollection services) - { - services.AddSingletonAs(c => c.GetRequiredService()) - .As(); - - services.AddServicesForSelfHostedDashboard(null, options => - { - options.HideTrace = true; - }); - - services.AddSingletonAs(c => - { - var client = new ClientBuilder() - .UseConfiguration(ClientConfiguration.LocalhostSilo().WithJsonSerializer()) - .UseDashboard() - .AddApplicationPartsFromReferences(typeof(AppStateGrain).Assembly) - .AddApplicationPartsFromReferences(typeof(EventConsumerGrain).Assembly) - .UseStaticGatewayListProvider(options => - { - options.Gateways.Add(new Uri("gwy.tcp://127.0.0.1:40000/0")); - }) - .Build(); - - client.Connect().Wait(); - - return client; - }); - } - - public static ClientConfiguration WithJsonSerializer(this ClientConfiguration config) - { - config.SerializationProviders.Add(typeof(CustomJsonSerializer).GetTypeInfo()); - - return config; - } - } -} diff --git a/src/Squidex/Config/Orleans/CustomJsonSerializer.cs b/src/Squidex/Config/Orleans/CustomJsonSerializer.cs deleted file mode 100644 index 7fd8334ce..000000000 --- a/src/Squidex/Config/Orleans/CustomJsonSerializer.cs +++ /dev/null @@ -1,22 +0,0 @@ -// ========================================================================== -// CustomJsonSerializer.cs -// Squidex Headless CMS -// ========================================================================== -// Copyright (c) Squidex Group -// All rights reserved. -// ========================================================================== - -using Newtonsoft.Json; -using Squidex.Config.Domain; -using Squidex.Infrastructure.Json.Orleans; - -namespace Squidex.Config.Orleans -{ - public class CustomJsonSerializer : JsonExternalSerializer - { - public CustomJsonSerializer() - : base(JsonSerializer.Create(SerializationServices.DefaultJsonSettings)) - { - } - } -} diff --git a/src/Squidex/Config/Orleans/CustomMongoDbStorageProvider.cs b/src/Squidex/Config/Orleans/CustomMongoDbStorageProvider.cs deleted file mode 100644 index c643a0fd4..000000000 --- a/src/Squidex/Config/Orleans/CustomMongoDbStorageProvider.cs +++ /dev/null @@ -1,23 +0,0 @@ -// ========================================================================== -// CustomMongoDbStorageProvider.cs -// Squidex Headless CMS -// ========================================================================== -// Copyright (c) Squidex Group -// All rights reserved. -// ========================================================================== - -using Newtonsoft.Json; -using Orleans.Providers; -using Orleans.Providers.MongoDB.StorageProviders; -using Squidex.Config.Domain; - -namespace Squidex.Config.Orleans -{ - public sealed class CustomMongoDbStorageProvider : MongoStorageProvider - { - protected override JsonSerializerSettings ReturnSerializerSettings(IProviderRuntime providerRuntime, IProviderConfiguration config) - { - return SerializationServices.DefaultJsonSettings; - } - } -} \ No newline at end of file diff --git a/src/Squidex/Config/Orleans/SiloExtensions.cs b/src/Squidex/Config/Orleans/SiloExtensions.cs deleted file mode 100644 index c58028dd8..000000000 --- a/src/Squidex/Config/Orleans/SiloExtensions.cs +++ /dev/null @@ -1,43 +0,0 @@ -// ========================================================================== -// SiloExtensions.cs -// Squidex Headless CMS -// ========================================================================== -// Copyright (c) Squidex Group -// All rights reserved. -// ========================================================================== - -using System.Reflection; -using Microsoft.Extensions.Configuration; -using Orleans; -using Orleans.Hosting; -using Orleans.Runtime.Configuration; - -namespace Squidex.Config.Orleans -{ - public static class SiloExtensions - { - public static ISiloHostBuilder UseContentRoot(this ISiloHostBuilder builder, string path) - { - builder.ConfigureAppConfiguration(config => - { - config.SetBasePath(path); - }); - - return builder; - } - - public static ClusterConfiguration WithJsonSerializer(this ClusterConfiguration config) - { - config.Globals.SerializationProviders.Add(typeof(CustomJsonSerializer).GetTypeInfo()); - - return config; - } - - public static ClusterConfiguration WithDashboard(this ClusterConfiguration config) - { - config.RegisterDashboard(); - - return config; - } - } -} diff --git a/src/Squidex/Config/Orleans/SiloServices.cs b/src/Squidex/Config/Orleans/SiloServices.cs deleted file mode 100644 index eaffea049..000000000 --- a/src/Squidex/Config/Orleans/SiloServices.cs +++ /dev/null @@ -1,89 +0,0 @@ -// ========================================================================== -// SiloServices.cs -// Squidex Headless CMS -// ========================================================================== -// Copyright (c) Squidex Group -// All rights reserved. -// ========================================================================== - -using System; -using System.Linq; -using System.Net; -using Microsoft.Extensions.Configuration; -using Microsoft.Extensions.DependencyInjection; -using Orleans; -using Orleans.Runtime.Configuration; -using Squidex.Domain.Apps.Read.Rules.Orleans; -using Squidex.Infrastructure.CQRS.Events.Orleans.Grains; - -namespace Squidex.Config.Orleans -{ - public static class SiloServices - { - public static void AddAppSiloServices(this IServiceCollection services, IConfiguration config) - { - var clusterConfiguration = - services.Where(x => x.ServiceType == typeof(ClusterConfiguration)) - .Select(x => x.ImplementationInstance) - .Select(x => (ClusterConfiguration)x) - .FirstOrDefault(); - - if (clusterConfiguration != null) - { - clusterConfiguration.Globals.RegisterBootstrapProvider("EventConsumers"); - clusterConfiguration.Globals.RegisterBootstrapProvider("RuleDequeuer"); - - var ipConfig = config.GetRequiredValue("orleans:hostNameOrIPAddress"); - - if (ipConfig.Equals("Host", StringComparison.OrdinalIgnoreCase)) - { - ipConfig = Dns.GetHostName(); - } - else if (ipConfig.Equals("FirstIPAddressOfHost")) - { - var ips = Dns.GetHostAddressesAsync(Dns.GetHostName()).Result; - - ipConfig = ips.FirstOrDefault()?.ToString(); - } - - clusterConfiguration.Defaults.PropagateActivityId = true; - clusterConfiguration.Defaults.ProxyGatewayEndpoint = new IPEndPoint(IPAddress.Any, 40000); - clusterConfiguration.Defaults.HostNameOrIPAddress = ipConfig; - } - - config.ConfigureByOption("store:type", new Options - { - ["MongoDB"] = () => - { - var mongoConfiguration = config.GetRequiredValue("store:mongoDb:configuration"); - var mongoDatabaseName = config.GetRequiredValue("store:mongoDb:database"); - - if (clusterConfiguration != null) - { - clusterConfiguration.AddMongoDBStorageProvider("Default", c => - { - c.ConnectionString = mongoConfiguration; - c.CollectionPrefix = "States_"; - c.DatabaseName = mongoDatabaseName; - c.UseJsonFormat = true; - }); - } - - services.AddMongoDBMembershipTable(c => - { - c.ConnectionString = mongoConfiguration; - c.CollectionPrefix = "Orleans_"; - c.DatabaseName = mongoDatabaseName; - }); - - services.AddMongoDBReminders(c => - { - c.ConnectionString = mongoConfiguration; - c.CollectionPrefix = "Orleans_"; - c.DatabaseName = mongoDatabaseName; - }); - } - }); - } - } -} \ No newline at end of file diff --git a/src/Squidex/Pipeline/Swagger/SwaggerHelper.cs b/src/Squidex/Pipeline/Swagger/SwaggerHelper.cs index 7cf8d2553..0f4155868 100644 --- a/src/Squidex/Pipeline/Swagger/SwaggerHelper.cs +++ b/src/Squidex/Pipeline/Swagger/SwaggerHelper.cs @@ -63,7 +63,7 @@ namespace Squidex.Pipeline.Swagger { ["x-logo"] = new { url = urlOptions.BuildUrl("images/logo-white.png", false), backgroundColor = "#3f83df" } }, - Title = $"Suidex API for {appName} App" + Title = $"Squidex API for {appName} App", Version = "1.0" }, BasePath = "/api" }; diff --git a/src/Squidex/Program.cs b/src/Squidex/Program.cs index d52f52666..b5c16717e 100644 --- a/src/Squidex/Program.cs +++ b/src/Squidex/Program.cs @@ -6,15 +6,8 @@ // All rights reserved. // ========================================================================== -using System; using System.IO; using Microsoft.AspNetCore.Hosting; -using Orleans; -using Orleans.Hosting; -using Orleans.Runtime.Configuration; -using Squidex.Config.Orleans; -using Squidex.Domain.Apps.Read.State.Orleans.Grains.Implementations; -using Squidex.Infrastructure.CQRS.Events.Orleans.Grains.Implementation; using Squidex.Infrastructure.Log.Adapter; namespace Squidex @@ -23,61 +16,21 @@ namespace Squidex { public static void Main(string[] args) { - var silo = new SiloHostBuilder() - .AddApplicationPartsFromReferences(typeof(AppStateGrain).Assembly) - .AddApplicationPartsFromReferences(typeof(EventConsumerGrain).Assembly) - .UseDashboard(options => { options.HostSelf = false; }) + new WebHostBuilder() + .UseKestrel(k => { k.AddServerHeader = false; }) .UseContentRoot(Directory.GetCurrentDirectory()) - .UseConfiguration( - ClusterConfiguration.LocalhostPrimarySilo(33333) - .WithJsonSerializer() - .WithDashboard()) - .ConfigureServices((context, services) => - { - services.AddAppSiloServices(context.Configuration); - services.AddAppServices(context.Configuration); - }) + .UseIISIntegration() + .UseStartup() .ConfigureLogging(builder => { builder.AddSemanticLog(); }) .ConfigureAppConfiguration((hostContext, builder) => { - builder.AddAppConfiguration(GetEnvironment(), args); + builder.AddAppConfiguration(hostContext.HostingEnvironment.EnvironmentName, args); }) - .Build(); - - silo.StartAsync().Wait(); - - try - { - new WebHostBuilder() - .UseKestrel(k => { k.AddServerHeader = false; }) - .UseContentRoot(Directory.GetCurrentDirectory()) - .UseIISIntegration() - .UseStartup() - .ConfigureLogging(builder => - { - builder.AddSemanticLog(); - }) - .ConfigureAppConfiguration((hostContext, builder) => - { - builder.AddAppConfiguration(hostContext.HostingEnvironment.EnvironmentName, args); - }) - .Build() - .Run(); - } - finally - { - silo.StopAsync().Wait(); - } - } - - private static string GetEnvironment() - { - var environment = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT"); - - return environment ?? "Development"; + .Build() + .Run(); } } } diff --git a/src/Squidex/Squidex.csproj b/src/Squidex/Squidex.csproj index f93eb1f10..6af8f926a 100644 --- a/src/Squidex/Squidex.csproj +++ b/src/Squidex/Squidex.csproj @@ -49,7 +49,7 @@ - + @@ -72,8 +72,6 @@ - - diff --git a/src/Squidex/WebStartup.cs b/src/Squidex/WebStartup.cs index 7d90480e5..2abdbadc3 100644 --- a/src/Squidex/WebStartup.cs +++ b/src/Squidex/WebStartup.cs @@ -14,15 +14,13 @@ using Microsoft.Extensions.DependencyInjection; using Squidex.Areas.Api; using Squidex.Areas.Frontend; using Squidex.Areas.IdentityServer; -using Squidex.Areas.OrleansDashboard; using Squidex.Areas.Portal; using Squidex.Config.Domain; -using Squidex.Config.Orleans; using Squidex.Config.Web; namespace Squidex { - public class WebStartup : IStartup + public sealed class WebStartup : IStartup { private readonly IConfiguration configuration; @@ -33,7 +31,6 @@ namespace Squidex public IServiceProvider ConfigureServices(IServiceCollection services) { - services.AddAppClient(); services.AddAppServices(configuration); return services.BuildServiceProvider(); @@ -49,7 +46,6 @@ namespace Squidex app.UseMyTracking(); app.ConfigureApi(); - app.ConfigureOrleansDashboard(); app.ConfigurePortal(); app.ConfigureIdentityServer(); diff --git a/src/Squidex/appsettings.json b/src/Squidex/appsettings.json index 30221c2cc..2709ed69d 100644 --- a/src/Squidex/appsettings.json +++ b/src/Squidex/appsettings.json @@ -29,6 +29,26 @@ "human": true }, + /* + * The pub sub mechanmism distributes messages between the nodes. + */ + "pubSub": { + /* + * Define the type of the read store. + * + * Supported: InMemory (for single node only), Redis (for cluster) + */ + "type": "InMemory", + "redis": { + /* + * Connection string to your redis server. + * + * Read More: https://github.com/ServiceStack/ServiceStack.Redis#redis-connection-strings + */ + "configuration": "localhost:6379,resolveDns=1" + } + }, + "assetStore": { /* * Define the type of the read store. @@ -64,15 +84,6 @@ "exposeSourceUrl": false }, - "orleans": { - /* - * Define the IP address or host name that is used for inter-silo communication. - * - * Special values: FirstIPAddressOfHost, Host - */ - "hostNameOrIPAddress": "localhost" - }, - "eventStore": { /* * Define the type of the event store. @@ -107,7 +118,11 @@ * Prefix for all streams and projections (for multiple installations). */ "prefix": "squidex" - } + }, + /* + * Consume the events on this server (Ensure that it is only enabled on a single node). + */ + "consume": true }, "eventPublishers": { diff --git a/src/Squidex/package.json b/src/Squidex/package.json index 6d6007411..88402f9ea 100644 --- a/src/Squidex/package.json +++ b/src/Squidex/package.json @@ -11,7 +11,7 @@ "dev": "cpx node_modules/oidc-client/dist/oidc-client.min.js wwwroot/scripts/ & cpx node_modules/redoc/dist/redoc.min.js wwwroot/scripts/ && webpack-dev-server --config app-config/webpack.run.dev.js --inline --port 3000", "build": "webpack --config app-config/webpack.run.prod.js --display-error-details --bail", "build:nobail": "webpack --config app-config/webpack.run.prod.js --display-error-details", - "build:copy": "cpx node_modules/oidc-client/dist/oidc-client.min.js wwwroot/scripts/ & cpx node_modules/redoc/dist/redoc.min.js wwwroot/scripts/", + "build:copy": "cpx node_modules/oidc-client/dist/oidc-client.min.js wwwroot/scripts/", "build:clean": "rimraf wwwroot/build" }, "dependencies": { @@ -38,7 +38,6 @@ "progressbar.js": "1.0.1", "react": "16.0.0", "react-dom": "16.0.0", - "redoc": "1.19.1", "rxjs": "5.5.2", "zone.js": "0.8.18" },