diff --git a/backend/src/Squidex.Domain.Apps.Entities/Apps/AppDomainObject.cs b/backend/src/Squidex.Domain.Apps.Entities/Apps/AppDomainObject.cs index d32f2c77a..3aba5081a 100644 --- a/backend/src/Squidex.Domain.Apps.Entities/Apps/AppDomainObject.cs +++ b/backend/src/Squidex.Domain.Apps.Entities/Apps/AppDomainObject.cs @@ -192,7 +192,7 @@ namespace Squidex.Domain.Apps.Entities.Apps case AddLanguage addLanguage: return UpdateReturn(addLanguage, c => { - GuardAppLanguages.CanAdd(Snapshot.LanguagesConfig, c); + GuardAppLanguages.CanAdd(Snapshot.Languages, c); AddLanguage(c); @@ -202,7 +202,7 @@ namespace Squidex.Domain.Apps.Entities.Apps case RemoveLanguage removeLanguage: return UpdateReturn(removeLanguage, c => { - GuardAppLanguages.CanRemove(Snapshot.LanguagesConfig, c); + GuardAppLanguages.CanRemove(Snapshot.Languages, c); RemoveLanguage(c); @@ -212,7 +212,7 @@ namespace Squidex.Domain.Apps.Entities.Apps case UpdateLanguage updateLanguage: return UpdateReturn(updateLanguage, c => { - GuardAppLanguages.CanUpdate(Snapshot.LanguagesConfig, c); + GuardAppLanguages.CanUpdate(Snapshot.Languages, c); UpdateLanguage(c); diff --git a/backend/src/Squidex.Domain.Apps.Entities/Apps/AppEntityExtensions.cs b/backend/src/Squidex.Domain.Apps.Entities/Apps/AppEntityExtensions.cs index b03bc5aec..9185993a3 100644 --- a/backend/src/Squidex.Domain.Apps.Entities/Apps/AppEntityExtensions.cs +++ b/backend/src/Squidex.Domain.Apps.Entities/Apps/AppEntityExtensions.cs @@ -13,7 +13,7 @@ namespace Squidex.Domain.Apps.Entities.Apps { public static PartitionResolver PartitionResolver(this IAppEntity entity) { - return entity.LanguagesConfig.ToResolver(); + return entity.Languages.ToResolver(); } } } diff --git a/backend/src/Squidex.Domain.Apps.Entities/Apps/IAppEntity.cs b/backend/src/Squidex.Domain.Apps.Entities/Apps/IAppEntity.cs index 3e288efba..318344109 100644 --- a/backend/src/Squidex.Domain.Apps.Entities/Apps/IAppEntity.cs +++ b/backend/src/Squidex.Domain.Apps.Entities/Apps/IAppEntity.cs @@ -34,7 +34,7 @@ namespace Squidex.Domain.Apps.Entities.Apps AppContributors Contributors { get; } - LanguagesConfig LanguagesConfig { get; } + LanguagesConfig Languages { get; } Workflows Workflows { get; } diff --git a/backend/src/Squidex.Domain.Apps.Entities/Apps/State/AppState.cs b/backend/src/Squidex.Domain.Apps.Entities/Apps/State/AppState.cs index 5e6683b5f..f7869d4cf 100644 --- a/backend/src/Squidex.Domain.Apps.Entities/Apps/State/AppState.cs +++ b/backend/src/Squidex.Domain.Apps.Entities/Apps/State/AppState.cs @@ -40,7 +40,7 @@ namespace Squidex.Domain.Apps.Entities.Apps.State public AppContributors Contributors { get; set; } = AppContributors.Empty; - public LanguagesConfig LanguagesConfig { get; set; } = LanguagesConfig.English; + public LanguagesConfig Languages { get; set; } = LanguagesConfig.English; public Workflows Workflows { get; set; } = Workflows.Empty; @@ -138,7 +138,7 @@ namespace Squidex.Domain.Apps.Entities.Apps.State if (ev.IsMaster) { - l = LanguagesConfig.MakeMaster(ev.Language); + l = Languages.MakeMaster(ev.Language); } return l; @@ -177,11 +177,11 @@ namespace Squidex.Domain.Apps.Entities.Apps.State private bool UpdateLanguages(T @event, Func update) { - var previous = LanguagesConfig; + var previous = Languages; - LanguagesConfig = update(@event, previous); + Languages = update(@event, previous); - return !ReferenceEquals(previous, LanguagesConfig); + return !ReferenceEquals(previous, Languages); } private bool UpdatePatterns(T @event, Func update) diff --git a/backend/src/Squidex.Domain.Apps.Entities/Contents/ContentsSearchSource.cs b/backend/src/Squidex.Domain.Apps.Entities/Contents/ContentsSearchSource.cs index 295034130..c51e8e045 100644 --- a/backend/src/Squidex.Domain.Apps.Entities/Contents/ContentsSearchSource.cs +++ b/backend/src/Squidex.Domain.Apps.Entities/Contents/ContentsSearchSource.cs @@ -71,7 +71,7 @@ namespace Squidex.Domain.Apps.Entities.Contents { var url = urlGenerator.ContentUI(appId, content.SchemaId, content.Id); - var name = FormatName(content, context.App.LanguagesConfig.Master); + var name = FormatName(content, context.App.Languages.Master); result.Add(name, SearchResultType.Content, url, content.SchemaDisplayName); } diff --git a/backend/src/Squidex.Domain.Apps.Entities/Contents/GraphQL/Types/ContentResolvers.cs b/backend/src/Squidex.Domain.Apps.Entities/Contents/GraphQL/Types/ContentResolvers.cs index 9bb78100b..fc942e223 100644 --- a/backend/src/Squidex.Domain.Apps.Entities/Contents/GraphQL/Types/ContentResolvers.cs +++ b/backend/src/Squidex.Domain.Apps.Entities/Contents/GraphQL/Types/ContentResolvers.cs @@ -77,7 +77,7 @@ namespace Squidex.Domain.Apps.Entities.Contents.GraphQL.Types public static readonly IFieldResolver FlatData = Resolve((content, c, context) => { - var language = context.Context.App.LanguagesConfig.Master; + var language = context.Context.App.Languages.Master; return content.Data.ToFlatten(language); }); diff --git a/backend/src/Squidex.Domain.Apps.Entities/Contents/Queries/Steps/ConvertData.cs b/backend/src/Squidex.Domain.Apps.Entities/Contents/Queries/Steps/ConvertData.cs index de4b59a89..1cef99ef9 100644 --- a/backend/src/Squidex.Domain.Apps.Entities/Contents/Queries/Steps/ConvertData.cs +++ b/backend/src/Squidex.Domain.Apps.Entities/Contents/Queries/Steps/ConvertData.cs @@ -115,21 +115,21 @@ namespace Squidex.Domain.Apps.Entities.Contents.Queries.Steps yield return FieldConverters.ForValues(ValueConverters.ForNested(cleanReferences)); } - yield return FieldConverters.ResolveInvariant(context.App.LanguagesConfig); - yield return FieldConverters.ResolveLanguages(context.App.LanguagesConfig); + yield return FieldConverters.ResolveInvariant(context.App.Languages); + yield return FieldConverters.ResolveLanguages(context.App.Languages); if (!context.IsFrontendClient) { if (context.ShouldResolveLanguages()) { - yield return FieldConverters.ResolveFallbackLanguages(context.App.LanguagesConfig); + yield return FieldConverters.ResolveFallbackLanguages(context.App.Languages); } var languages = context.Languages(); if (languages.Any()) { - yield return FieldConverters.FilterLanguages(context.App.LanguagesConfig, languages); + yield return FieldConverters.FilterLanguages(context.App.Languages, languages); } var assetUrls = context.AssetUrls().ToList(); diff --git a/backend/src/Squidex.Domain.Apps.Entities/Contents/Queries/Steps/ResolveReferences.cs b/backend/src/Squidex.Domain.Apps.Entities/Contents/Queries/Steps/ResolveReferences.cs index 92a8b2614..9be5b8737 100644 --- a/backend/src/Squidex.Domain.Apps.Entities/Contents/Queries/Steps/ResolveReferences.cs +++ b/backend/src/Squidex.Domain.Apps.Entities/Contents/Queries/Steps/ResolveReferences.cs @@ -121,7 +121,7 @@ namespace Squidex.Domain.Apps.Entities.Contents.Queries.Steps private static JsonObject Format(IContentEntity content, Context context, ISchemaEntity referencedSchema) { - return content.Data.FormatReferences(referencedSchema.SchemaDef, context.App.LanguagesConfig); + return content.Data.FormatReferences(referencedSchema.SchemaDef, context.App.Languages); } private static JsonObject CreateFallback(Context context, List referencedContents) @@ -130,7 +130,7 @@ namespace Squidex.Domain.Apps.Entities.Contents.Queries.Steps var value = JsonValue.Object(); - foreach (var partitionKey in context.App.LanguagesConfig.AllKeys) + foreach (var partitionKey in context.App.Languages.AllKeys) { value.Add(partitionKey, text); } diff --git a/backend/src/Squidex.Infrastructure/EventSourcing/EventConsumerInfo.cs b/backend/src/Squidex.Infrastructure/EventSourcing/EventConsumerInfo.cs index 44562ada5..019285e07 100644 --- a/backend/src/Squidex.Infrastructure/EventSourcing/EventConsumerInfo.cs +++ b/backend/src/Squidex.Infrastructure/EventSourcing/EventConsumerInfo.cs @@ -5,8 +5,11 @@ // All rights reserved. Licensed under the MIT license. // ========================================================================== +using Orleans.Concurrency; + namespace Squidex.Infrastructure.EventSourcing { + [Immutable] public sealed class EventConsumerInfo { public bool IsStopped { get; set; } diff --git a/backend/src/Squidex.Infrastructure/EventSourcing/Grains/BatchSubscriber.cs b/backend/src/Squidex.Infrastructure/EventSourcing/Grains/BatchSubscriber.cs index 006533c59..1785f2358 100644 --- a/backend/src/Squidex.Infrastructure/EventSourcing/Grains/BatchSubscriber.cs +++ b/backend/src/Squidex.Infrastructure/EventSourcing/Grains/BatchSubscriber.cs @@ -17,7 +17,6 @@ namespace Squidex.Infrastructure.EventSourcing.Grains internal sealed class BatchSubscriber : IEventSubscriber { private readonly ITargetBlock pipelineStart; - private readonly IEventDataFormatter eventDataFormatter; private readonly IEventSubscription eventSubscription; private readonly IDataflowBlock pipelineEnd; @@ -46,8 +45,6 @@ namespace Squidex.Infrastructure.EventSourcing.Grains Func factory, TaskScheduler scheduler) { - this.eventDataFormatter = eventDataFormatter; - var batchSize = Math.Max(1, eventConsumer!.BatchSize); var batchDelay = Math.Max(100, eventConsumer.BatchDelay); @@ -168,6 +165,11 @@ namespace Squidex.Infrastructure.EventSourcing.Grains public Task OnErrorAsync(IEventSubscription subscription, Exception exception) { + if (exception is OperationCanceledException) + { + return Task.CompletedTask; + } + var job = new Job { Sender = subscription, diff --git a/backend/src/Squidex.Infrastructure/EventSourcing/Grains/EventConsumerGrain.cs b/backend/src/Squidex.Infrastructure/EventSourcing/Grains/EventConsumerGrain.cs index a45052bb3..0006b9fb7 100644 --- a/backend/src/Squidex.Infrastructure/EventSourcing/Grains/EventConsumerGrain.cs +++ b/backend/src/Squidex.Infrastructure/EventSourcing/Grains/EventConsumerGrain.cs @@ -10,7 +10,6 @@ using System.Collections.Generic; using System.Runtime.CompilerServices; using System.Threading; using System.Threading.Tasks; -using Orleans.Concurrency; using Squidex.Infrastructure.Log; using Squidex.Infrastructure.Orleans; @@ -71,14 +70,14 @@ namespace Squidex.Infrastructure.EventSourcing.Grains } } - public Task> GetStateAsync() + public Task GetStateAsync() { return Task.FromResult(CreateInfo()); } - private Immutable CreateInfo() + private EventConsumerInfo CreateInfo() { - return State.ToInfo(eventConsumer!.Name).AsImmutable(); + return State.ToInfo(eventConsumer!.Name); } public Task OnEventsAsync(object sender, IReadOnlyList> events, string position) @@ -128,7 +127,7 @@ namespace Squidex.Infrastructure.EventSourcing.Grains } } - public async Task> StartAsync() + public async Task StartAsync() { if (!State.IsStopped) { @@ -145,7 +144,7 @@ namespace Squidex.Infrastructure.EventSourcing.Grains return CreateInfo(); } - public async Task> StopAsync() + public async Task StopAsync() { if (State.IsStopped) { @@ -162,7 +161,7 @@ namespace Squidex.Infrastructure.EventSourcing.Grains return CreateInfo(); } - public async Task> ResetAsync() + public async Task ResetAsync() { await DoAndUpdateStateAsync(async () => { diff --git a/backend/src/Squidex.Infrastructure/EventSourcing/Grains/EventConsumerManagerGrain.cs b/backend/src/Squidex.Infrastructure/EventSourcing/Grains/EventConsumerManagerGrain.cs index 660dde9d8..bb0d04cf4 100644 --- a/backend/src/Squidex.Infrastructure/EventSourcing/Grains/EventConsumerManagerGrain.cs +++ b/backend/src/Squidex.Infrastructure/EventSourcing/Grains/EventConsumerManagerGrain.cs @@ -67,7 +67,7 @@ namespace Squidex.Infrastructure.EventSourcing.Grains var consumerInfos = await Task.WhenAll(tasks); - return new Immutable>(consumerInfos.Select(r => r.Value).ToList()); + return consumerInfos.ToList().AsImmutable(); } public Task StartAllAsync() @@ -84,21 +84,21 @@ namespace Squidex.Infrastructure.EventSourcing.Grains .Select(c => StopAsync(c.Name))); } - public Task> ResetAsync(string consumerName) + public Task ResetAsync(string consumerName) { var eventConsumer = GrainFactory.GetGrain(consumerName); return eventConsumer.ResetAsync(); } - public Task> StartAsync(string consumerName) + public Task StartAsync(string consumerName) { var eventConsumer = GrainFactory.GetGrain(consumerName); return eventConsumer.StartAsync(); } - public Task> StopAsync(string consumerName) + public Task StopAsync(string consumerName) { var eventConsumer = GrainFactory.GetGrain(consumerName); diff --git a/backend/src/Squidex.Infrastructure/EventSourcing/Grains/IEventConsumerGrain.cs b/backend/src/Squidex.Infrastructure/EventSourcing/Grains/IEventConsumerGrain.cs index 590daea27..f9509994c 100644 --- a/backend/src/Squidex.Infrastructure/EventSourcing/Grains/IEventConsumerGrain.cs +++ b/backend/src/Squidex.Infrastructure/EventSourcing/Grains/IEventConsumerGrain.cs @@ -6,19 +6,18 @@ // ========================================================================== using System.Threading.Tasks; -using Orleans.Concurrency; using Squidex.Infrastructure.Orleans; namespace Squidex.Infrastructure.EventSourcing.Grains { public interface IEventConsumerGrain : IBackgroundGrain { - Task> GetStateAsync(); + Task GetStateAsync(); - Task> StopAsync(); + Task StopAsync(); - Task> StartAsync(); + Task StartAsync(); - Task> ResetAsync(); + Task ResetAsync(); } } diff --git a/backend/src/Squidex.Infrastructure/EventSourcing/Grains/IEventConsumerManagerGrain.cs b/backend/src/Squidex.Infrastructure/EventSourcing/Grains/IEventConsumerManagerGrain.cs index 397db21f4..047102ce1 100644 --- a/backend/src/Squidex.Infrastructure/EventSourcing/Grains/IEventConsumerManagerGrain.cs +++ b/backend/src/Squidex.Infrastructure/EventSourcing/Grains/IEventConsumerManagerGrain.cs @@ -20,11 +20,11 @@ namespace Squidex.Infrastructure.EventSourcing.Grains Task StopAllAsync(); - Task> StopAsync(string consumerName); + Task StopAsync(string consumerName); - Task> StartAsync(string consumerName); + Task StartAsync(string consumerName); - Task> ResetAsync(string consumerName); + Task ResetAsync(string consumerName); Task>> GetConsumersAsync(); } diff --git a/backend/src/Squidex.Infrastructure/EventSourcing/RetrySubscription.cs b/backend/src/Squidex.Infrastructure/EventSourcing/RetrySubscription.cs index 1c52d9e42..26ecce026 100644 --- a/backend/src/Squidex.Infrastructure/EventSourcing/RetrySubscription.cs +++ b/backend/src/Squidex.Infrastructure/EventSourcing/RetrySubscription.cs @@ -76,6 +76,11 @@ namespace Squidex.Infrastructure.EventSourcing public async Task OnErrorAsync(IEventSubscription subscription, Exception exception) { + if (exception is OperationCanceledException) + { + return; + } + Unsubscribe(); if (retryWindow.CanRetryAfterFailure()) diff --git a/backend/src/Squidex/Areas/Api/Controllers/Apps/Models/AppLanguageDto.cs b/backend/src/Squidex/Areas/Api/Controllers/Apps/Models/AppLanguageDto.cs index 89c5faac4..8a8e011e9 100644 --- a/backend/src/Squidex/Areas/Api/Controllers/Apps/Models/AppLanguageDto.cs +++ b/backend/src/Squidex/Areas/Api/Controllers/Apps/Models/AppLanguageDto.cs @@ -69,7 +69,7 @@ namespace Squidex.Areas.Api.Controllers.Apps.Models AddPutLink("update", resources.Url(x => nameof(x.PutLanguage), values)); } - if (resources.CanDeleteLanguage && app.LanguagesConfig.Languages.Count > 1) + if (resources.CanDeleteLanguage && app.Languages.Languages.Count > 1) { AddDeleteLink("delete", resources.Url(x => nameof(x.DeleteLanguage), values)); } diff --git a/backend/src/Squidex/Areas/Api/Controllers/Apps/Models/AppLanguagesDto.cs b/backend/src/Squidex/Areas/Api/Controllers/Apps/Models/AppLanguagesDto.cs index f7377c871..de4035157 100644 --- a/backend/src/Squidex/Areas/Api/Controllers/Apps/Models/AppLanguagesDto.cs +++ b/backend/src/Squidex/Areas/Api/Controllers/Apps/Models/AppLanguagesDto.cs @@ -22,7 +22,7 @@ namespace Squidex.Areas.Api.Controllers.Apps.Models public static AppLanguagesDto FromApp(IAppEntity app, Resources resources) { - var config = app.LanguagesConfig; + var config = app.Languages; var result = new AppLanguagesDto { diff --git a/backend/src/Squidex/Areas/Api/Controllers/EventConsumers/EventConsumersController.cs b/backend/src/Squidex/Areas/Api/Controllers/EventConsumers/EventConsumersController.cs index f6c3fb0e8..c276af340 100644 --- a/backend/src/Squidex/Areas/Api/Controllers/EventConsumers/EventConsumersController.cs +++ b/backend/src/Squidex/Areas/Api/Controllers/EventConsumers/EventConsumersController.cs @@ -48,7 +48,7 @@ namespace Squidex.Areas.Api.Controllers.EventConsumers { var eventConsumer = await GetGrain().StartAsync(consumerName); - var response = EventConsumerDto.FromEventConsumerInfo(eventConsumer.Value, Resources); + var response = EventConsumerDto.FromEventConsumerInfo(eventConsumer, Resources); return Ok(response); } @@ -61,7 +61,7 @@ namespace Squidex.Areas.Api.Controllers.EventConsumers { var eventConsumer = await GetGrain().StopAsync(consumerName); - var response = EventConsumerDto.FromEventConsumerInfo(eventConsumer.Value, Resources); + var response = EventConsumerDto.FromEventConsumerInfo(eventConsumer, Resources); return Ok(response); } @@ -74,7 +74,7 @@ namespace Squidex.Areas.Api.Controllers.EventConsumers { var eventConsumer = await GetGrain().ResetAsync(consumerName); - var response = EventConsumerDto.FromEventConsumerInfo(eventConsumer.Value, Resources); + var response = EventConsumerDto.FromEventConsumerInfo(eventConsumer, Resources); return Ok(response); } diff --git a/backend/tests/Squidex.Domain.Apps.Entities.Tests/Apps/AppDomainObjectTests.cs b/backend/tests/Squidex.Domain.Apps.Entities.Tests/Apps/AppDomainObjectTests.cs index 305f7f537..c75872414 100644 --- a/backend/tests/Squidex.Domain.Apps.Entities.Tests/Apps/AppDomainObjectTests.cs +++ b/backend/tests/Squidex.Domain.Apps.Entities.Tests/Apps/AppDomainObjectTests.cs @@ -498,7 +498,7 @@ namespace Squidex.Domain.Apps.Entities.Apps result.ShouldBeEquivalent(sut.Snapshot); - Assert.True(sut.Snapshot.LanguagesConfig.Contains(Language.DE)); + Assert.True(sut.Snapshot.Languages.Contains(Language.DE)); LastEvents .ShouldHaveSameEvents( @@ -518,7 +518,7 @@ namespace Squidex.Domain.Apps.Entities.Apps result.ShouldBeEquivalent(sut.Snapshot); - Assert.False(sut.Snapshot.LanguagesConfig.Contains(Language.DE)); + Assert.False(sut.Snapshot.Languages.Contains(Language.DE)); LastEvents .ShouldHaveSameEvents( @@ -538,7 +538,7 @@ namespace Squidex.Domain.Apps.Entities.Apps result.ShouldBeEquivalent(sut.Snapshot); - Assert.True(sut.Snapshot.LanguagesConfig.Contains(Language.DE)); + Assert.True(sut.Snapshot.Languages.Contains(Language.DE)); LastEvents .ShouldHaveSameEvents( diff --git a/backend/tests/Squidex.Domain.Apps.Entities.Tests/Contents/MongoDb/MongoDbQueryTests.cs b/backend/tests/Squidex.Domain.Apps.Entities.Tests/Contents/MongoDb/MongoDbQueryTests.cs index d224396b6..a2bcdb457 100644 --- a/backend/tests/Squidex.Domain.Apps.Entities.Tests/Contents/MongoDb/MongoDbQueryTests.cs +++ b/backend/tests/Squidex.Domain.Apps.Entities.Tests/Contents/MongoDb/MongoDbQueryTests.cs @@ -76,7 +76,7 @@ namespace Squidex.Domain.Apps.Entities.Contents.MongoDb var app = A.Dummy(); A.CallTo(() => app.Id).Returns(DomainId.NewGuid()); A.CallTo(() => app.Version).Returns(3); - A.CallTo(() => app.LanguagesConfig).Returns(languagesConfig); + A.CallTo(() => app.Languages).Returns(languagesConfig); } [Fact] diff --git a/backend/tests/Squidex.Domain.Apps.Entities.Tests/TestHelpers/Mocks.cs b/backend/tests/Squidex.Domain.Apps.Entities.Tests/TestHelpers/Mocks.cs index c1d25dcc0..2e9520a2b 100644 --- a/backend/tests/Squidex.Domain.Apps.Entities.Tests/TestHelpers/Mocks.cs +++ b/backend/tests/Squidex.Domain.Apps.Entities.Tests/TestHelpers/Mocks.cs @@ -32,7 +32,7 @@ namespace Squidex.Domain.Apps.Entities.TestHelpers A.CallTo(() => app.Id).Returns(appId.Id); A.CallTo(() => app.Name).Returns(appId.Name); - A.CallTo(() => app.LanguagesConfig).Returns(config); + A.CallTo(() => app.Languages).Returns(config); A.CallTo(() => app.UniqueId).Returns(appId.Id); return app;