diff --git a/src/Squidex.Domain.Apps.Entities/Apps/Templates/AlwaysCreateClientCommandMiddleware.cs b/src/Squidex.Domain.Apps.Entities/Apps/Templates/AlwaysCreateClientCommandMiddleware.cs new file mode 100644 index 000000000..6d131dbef --- /dev/null +++ b/src/Squidex.Domain.Apps.Entities/Apps/Templates/AlwaysCreateClientCommandMiddleware.cs @@ -0,0 +1,30 @@ +// ========================================================================== +// Squidex Headless CMS +// ========================================================================== +// Copyright (c) Squidex UG (haftungsbeschraenkt) +// All rights reserved. Licensed under the MIT license. +// ========================================================================== + +using System; +using System.Threading.Tasks; +using Squidex.Domain.Apps.Entities.Apps.Commands; +using Squidex.Infrastructure.Commands; +using Squidex.Infrastructure.Tasks; + +namespace Squidex.Domain.Apps.Entities.Apps.Templates +{ + public sealed class AlwaysCreateClientCommandMiddleware : ICommandMiddleware + { + public Task HandleAsync(CommandContext context, Func next) + { + if (context.IsCompleted && context.Command is CreateApp createApp) + { + var command = new AttachClient { Id = "default", AppId = createApp.AppId }; + + context.CommandBus.PublishAsync(command).Forget(); + } + + return next(); + } + } +} diff --git a/src/Squidex.Domain.Apps.Entities/Apps/Templates/CreateBlogCommandMiddleware.cs b/src/Squidex.Domain.Apps.Entities/Apps/Templates/CreateBlogCommandMiddleware.cs index c701d8340..bac7d168f 100644 --- a/src/Squidex.Domain.Apps.Entities/Apps/Templates/CreateBlogCommandMiddleware.cs +++ b/src/Squidex.Domain.Apps.Entities/Apps/Templates/CreateBlogCommandMiddleware.cs @@ -39,8 +39,7 @@ namespace Squidex.Domain.Apps.Entities.Apps.Templates await Task.WhenAll( CreatePagesAsync(publish), - CreatePostsAsync(publish), - CreateClientAsync(publish, appId.Id)); + CreatePostsAsync(publish)); } await next(); @@ -51,11 +50,6 @@ namespace Squidex.Domain.Apps.Entities.Apps.Templates return string.Equals(createApp.Template, TemplateName, StringComparison.OrdinalIgnoreCase); } - private static async Task CreateClientAsync(Func publish, Guid appId) - { - await publish(new AttachClient { Id = "sample-client", AppId = appId }); - } - private static async Task CreatePostsAsync(Func publish) { var postsId = await CreatePostsSchemaAsync(publish); diff --git a/src/Squidex.Domain.Apps.Entities/Apps/Templates/CreateIdentityCommandMiddleware.cs b/src/Squidex.Domain.Apps.Entities/Apps/Templates/CreateIdentityCommandMiddleware.cs index 9e244906f..616b8a3ff 100644 --- a/src/Squidex.Domain.Apps.Entities/Apps/Templates/CreateIdentityCommandMiddleware.cs +++ b/src/Squidex.Domain.Apps.Entities/Apps/Templates/CreateIdentityCommandMiddleware.cs @@ -53,8 +53,7 @@ namespace Squidex.Domain.Apps.Entities.Apps.Templates CreateClientsSchemaAsync(publish), CreateIdentityResourcesSchemaAsync(publish), CreateSettingsSchemaAsync(publish), - CreateUsersSchemaAsync(publish), - CreateClientAsync(publish, appId.Id)); + CreateUsersSchemaAsync(publish)); } await next(); @@ -65,11 +64,6 @@ namespace Squidex.Domain.Apps.Entities.Apps.Templates return string.Equals(createApp.Template, TemplateName, StringComparison.OrdinalIgnoreCase); } - private static async Task CreateClientAsync(Func publish, Guid appId) - { - await publish(new AttachClient { Id = "default", AppId = appId }); - } - private static async Task> CreateAuthenticationSchemeSchemaAsync(Func publish) { var schema = diff --git a/src/Squidex.Domain.Apps.Entities/Apps/Templates/CreateProfileCommandMiddleware.cs b/src/Squidex.Domain.Apps.Entities/Apps/Templates/CreateProfileCommandMiddleware.cs index 51c3e34ed..85cac0c86 100644 --- a/src/Squidex.Domain.Apps.Entities/Apps/Templates/CreateProfileCommandMiddleware.cs +++ b/src/Squidex.Domain.Apps.Entities/Apps/Templates/CreateProfileCommandMiddleware.cs @@ -42,8 +42,7 @@ namespace Squidex.Domain.Apps.Entities.Apps.Templates CreateExperienceSchemaAsync(publish), CreateProjectsSchemaAsync(publish), CreatePublicationsSchemaAsync(publish), - CreateSkillsSchemaAsync(publish), - CreateClientAsync(publish, appId.Id)); + CreateSkillsSchemaAsync(publish)); } await next(); @@ -54,11 +53,6 @@ namespace Squidex.Domain.Apps.Entities.Apps.Templates return string.Equals(createApp.Template, TemplateName, StringComparison.OrdinalIgnoreCase); } - private static async Task CreateClientAsync(Func publish, Guid appId) - { - await publish(new AttachClient { Id = "sample-client", AppId = appId }); - } - private static async Task CreateBasicsAsync(Func publish) { var postsId = await CreateBasicsSchemaAsync(publish); diff --git a/src/Squidex/Config/Domain/EntitiesServices.cs b/src/Squidex/Config/Domain/EntitiesServices.cs index c1596553d..faa19dd39 100644 --- a/src/Squidex/Config/Domain/EntitiesServices.cs +++ b/src/Squidex/Config/Domain/EntitiesServices.cs @@ -196,6 +196,9 @@ namespace Squidex.Config.Domain services.AddSingletonAs() .As(); + services.AddSingletonAs() + .As(); + services.AddSingletonAs() .As(); diff --git a/src/Squidex/Config/Domain/SystemExtensions.cs b/src/Squidex/Config/Domain/SystemExtensions.cs index 87cb4654e..c11bd99fd 100644 --- a/src/Squidex/Config/Domain/SystemExtensions.cs +++ b/src/Squidex/Config/Domain/SystemExtensions.cs @@ -20,22 +20,31 @@ namespace Squidex.Config.Domain public sealed class InitializeHostedService : IHostedService { private readonly IEnumerable targets; + private readonly IApplicationLifetime lifetime; private readonly ISemanticLog log; - public InitializeHostedService(IEnumerable targets, ISemanticLog log) + public InitializeHostedService(IEnumerable targets, IApplicationLifetime lifetime, ISemanticLog log) { this.targets = targets; - + this.lifetime = lifetime; this.log = log; } public async Task StartAsync(CancellationToken cancellationToken) { - foreach (var target in targets) + try { - await target.InitializeAsync(cancellationToken); + foreach (var target in targets) + { + await target.InitializeAsync(cancellationToken); - log.LogInformation(w => w.WriteProperty("initializedSystem", target.GetType().Name)); + log.LogInformation(w => w.WriteProperty("initializedSystem", target.GetType().Name)); + } + } + catch + { + lifetime.StopApplication(); + throw; } } @@ -47,16 +56,26 @@ namespace Squidex.Config.Domain public sealed class MigratorHostedService : IHostedService { + private readonly IApplicationLifetime lifetime; private readonly Migrator migrator; - public MigratorHostedService(Migrator migrator) + public MigratorHostedService(IApplicationLifetime lifetime, Migrator migrator) { + this.lifetime = lifetime; this.migrator = migrator; } - public Task StartAsync(CancellationToken cancellationToken) + public async Task StartAsync(CancellationToken cancellationToken) { - return migrator.MigrateAsync(); + try + { + await migrator.MigrateAsync(); + } + catch + { + lifetime.StopApplication(); + throw; + } } public Task StopAsync(CancellationToken cancellationToken) diff --git a/src/Squidex/Config/Orleans/SiloWrapper.cs b/src/Squidex/Config/Orleans/SiloWrapper.cs index 4a1150289..334993f1e 100644 --- a/src/Squidex/Config/Orleans/SiloWrapper.cs +++ b/src/Squidex/Config/Orleans/SiloWrapper.cs @@ -30,6 +30,7 @@ namespace Squidex.Config.Orleans { private readonly Lazy lazySilo; private readonly ISemanticLog log; + private readonly IApplicationLifetime lifetime; private bool isStopping; internal sealed class Source : IConfigurationSource @@ -54,6 +55,7 @@ namespace Squidex.Config.Orleans public SiloWrapper(IConfiguration config, ISemanticLog log, IApplicationLifetime lifetime) { + this.lifetime = lifetime; this.log = log; lazySilo = new Lazy(() => @@ -158,6 +160,11 @@ namespace Squidex.Config.Orleans { await lazySilo.Value.StartAsync(cancellationToken); } + catch + { + lifetime.StopApplication(); + throw; + } finally { var elapsedMs = watch.Stop(); diff --git a/src/Squidex/appsettings.json b/src/Squidex/appsettings.json index cf56a9497..1b571af54 100644 --- a/src/Squidex/appsettings.json +++ b/src/Squidex/appsettings.json @@ -68,8 +68,8 @@ /* * The maximum number of megabyte that the process can consume until it is marked as not healthy. */ - "threshold": 4096 - } + "threshold": 4096 + } }, "contentsController": { @@ -78,13 +78,13 @@ * * Nginx Has problems with long headers. It might make sense to disable this feature if you do not use a CDN. */ - "enableSurrogateKeys": true, + "enableSurrogateKeys": true, - /* + /* * Restrict the surrogate keys to results that have less than 200 items. */ - "maxItemsForSurrogateKeys": 200 - }, + "maxItemsForSurrogateKeys": 200 + }, "content": { /*