diff --git a/src/Squidex.Domain.Apps.Core.Model/Apps/AppPlan.cs b/src/Squidex.Domain.Apps.Core.Model/Apps/AppPlan.cs index 01b2c3a25..ab23055bf 100644 --- a/src/Squidex.Domain.Apps.Core.Model/Apps/AppPlan.cs +++ b/src/Squidex.Domain.Apps.Core.Model/Apps/AppPlan.cs @@ -24,5 +24,17 @@ namespace Squidex.Domain.Apps.Core.Apps PlanId = planId; } + + public static AppPlan Build(RefToken owner, string planId) + { + if (planId == null) + { + return null; + } + else + { + return new AppPlan(owner, planId); + } + } } } diff --git a/src/Squidex.Domain.Apps.Core.Model/Apps/LanguagesConfig.cs b/src/Squidex.Domain.Apps.Core.Model/Apps/LanguagesConfig.cs index 8a9d6febe..cb83980f7 100644 --- a/src/Squidex.Domain.Apps.Core.Model/Apps/LanguagesConfig.cs +++ b/src/Squidex.Domain.Apps.Core.Model/Apps/LanguagesConfig.cs @@ -95,6 +95,14 @@ namespace Squidex.Domain.Apps.Core.Apps return new LanguagesConfig(languages, languages[language]); } + [Pure] + public LanguagesConfig Set(Language language, bool isOptional = false, IEnumerable fallback = null) + { + Guard.NotNull(language, nameof(language)); + + return Set(new LanguageConfig(language, isOptional, fallback)); + } + [Pure] public LanguagesConfig Set(LanguageConfig config) { diff --git a/src/Squidex.Domain.Apps.Entities/Apps/State/AppState.cs b/src/Squidex.Domain.Apps.Entities/Apps/State/AppState.cs index ff4f8c293..569ad468e 100644 --- a/src/Squidex.Domain.Apps.Entities/Apps/State/AppState.cs +++ b/src/Squidex.Domain.Apps.Entities/Apps/State/AppState.cs @@ -52,7 +52,7 @@ namespace Squidex.Domain.Apps.Entities.Apps.State protected void On(AppPlanChanged @event) { - Plan = @event.PlanId == null ? null : new AppPlan(@event.Actor, @event.PlanId); + Plan = AppPlan.Build(@event.Actor, @event.PlanId); } protected void On(AppContributorAssigned @event) @@ -117,7 +117,7 @@ namespace Squidex.Domain.Apps.Entities.Apps.State protected void On(AppLanguageAdded @event) { - LanguagesConfig = LanguagesConfig.Set(new LanguageConfig(@event.Language)); + LanguagesConfig = LanguagesConfig.Set(@event.Language); } protected void On(AppLanguageRemoved @event) @@ -127,7 +127,7 @@ namespace Squidex.Domain.Apps.Entities.Apps.State protected void On(AppLanguageUpdated @event) { - LanguagesConfig = LanguagesConfig.Set(new LanguageConfig(@event.Language, @event.IsOptional, @event.Fallback)); + LanguagesConfig = LanguagesConfig.Set(@event.Language, @event.IsOptional, @event.Fallback); if (@event.IsMaster) { diff --git a/src/Squidex.Domain.Apps.Entities/Assets/State/AssetState.cs b/src/Squidex.Domain.Apps.Entities/Assets/State/AssetState.cs index 278c4e666..4361f04a5 100644 --- a/src/Squidex.Domain.Apps.Entities/Assets/State/AssetState.cs +++ b/src/Squidex.Domain.Apps.Entities/Assets/State/AssetState.cs @@ -63,8 +63,6 @@ namespace Squidex.Domain.Apps.Entities.Assets.State SimpleMapper.Map(@event, this); TotalSize += @event.FileSize; - - AppId = @event.AppId; } protected void On(AssetUpdated @event) diff --git a/src/Squidex.Domain.Apps.Entities/Contents/State/ContentState.cs b/src/Squidex.Domain.Apps.Entities/Contents/State/ContentState.cs index bb297f27e..0745d6f55 100644 --- a/src/Squidex.Domain.Apps.Entities/Contents/State/ContentState.cs +++ b/src/Squidex.Domain.Apps.Entities/Contents/State/ContentState.cs @@ -47,40 +47,14 @@ namespace Squidex.Domain.Apps.Entities.Contents.State { SimpleMapper.Map(@event, this); - DataDraft = @event.Data; - } - - protected void On(ContentUpdated @event) - { - DataDraft = @event.Data; - - if (Data != null) - { - Data = @event.Data; - } - } - - protected void On(ContentUpdateProposed @event) - { - DataDraft = @event.Data; - - IsPending = true; - } - - protected void On(ContentChangesDiscarded @event) - { - DataDraft = Data; - - IsPending = false; + UpdateData(null, @event.Data, false); } protected void On(ContentChangesPublished @event) { ScheduleJob = null; - Data = DataDraft; - - IsPending = false; + UpdateData(DataDraft, null, false); } protected void On(ContentStatusChanged @event) @@ -91,12 +65,25 @@ namespace Squidex.Domain.Apps.Entities.Contents.State if (@event.Status == Status.Published) { - Data = DataDraft; - - IsPending = false; + UpdateData(DataDraft, null, false); } } + protected void On(ContentUpdated @event) + { + UpdateData(@event.Data, @event.Data, false); + } + + protected void On(ContentUpdateProposed @event) + { + UpdateData(null, @event.Data, true); + } + + protected void On(ContentChangesDiscarded @event) + { + UpdateData(null, Data, false); + } + protected void On(ContentSchedulingCancelled @event) { ScheduleJob = null; @@ -118,5 +105,20 @@ namespace Squidex.Domain.Apps.Entities.Contents.State return Clone().Update(payload, @event.Headers, r => r.DispatchAction(payload)); } + + private void UpdateData(NamedContentData data, NamedContentData dataDraft, bool isPending) + { + if (data != null) + { + Data = data; + } + + if (dataDraft != null) + { + DataDraft = dataDraft; + } + + IsPending = isPending; + } } } diff --git a/src/Squidex.Domain.Apps.Entities/Contents/Text/GrainTextIndexer.cs b/src/Squidex.Domain.Apps.Entities/Contents/Text/GrainTextIndexer.cs index 7ee503460..c9186c25c 100644 --- a/src/Squidex.Domain.Apps.Entities/Contents/Text/GrainTextIndexer.cs +++ b/src/Squidex.Domain.Apps.Entities/Contents/Text/GrainTextIndexer.cs @@ -56,25 +56,6 @@ namespace Squidex.Domain.Apps.Entities.Contents.Text return Task.CompletedTask; } - public async Task IndexAsync(Guid schemaId, Guid id, NamedContentData dataDraft, NamedContentData data) - { - var index = grainFactory.GetGrain(schemaId); - - using (Profiler.TraceMethod()) - { - try - { - await index.IndexAsync(id, new IndexData { DataDraft = dataDraft, Data = data }, false); - } - catch (Exception ex) - { - log.LogError(ex, w => w - .WriteProperty("action", "UpdateTextEntry") - .WriteProperty("status", "Failed")); - } - } - } - public async Task On(Envelope @event) { try @@ -126,7 +107,7 @@ namespace Squidex.Domain.Apps.Entities.Contents.Text private J Data(NamedContentData data) { - return new IndexData { DataDraft = data }; + return new IndexData { Data = data }; } public async Task> SearchAsync(string queryText, IAppEntity app, Guid schemaId, Scope scope = Scope.Published) diff --git a/src/Squidex.Domain.Apps.Entities/Contents/Text/ITextIndexer.cs b/src/Squidex.Domain.Apps.Entities/Contents/Text/ITextIndexer.cs index 69eb6449c..443d5c58e 100644 --- a/src/Squidex.Domain.Apps.Entities/Contents/Text/ITextIndexer.cs +++ b/src/Squidex.Domain.Apps.Entities/Contents/Text/ITextIndexer.cs @@ -15,8 +15,6 @@ namespace Squidex.Domain.Apps.Entities.Contents.Text { public interface ITextIndexer { - Task IndexAsync(Guid schemaId, Guid contentId, NamedContentData draftData, NamedContentData data); - Task> SearchAsync(string queryText, IAppEntity app, Guid schemaId, Scope scope = Scope.Published); } } diff --git a/src/Squidex.Domain.Apps.Entities/Contents/Text/IndexData.cs b/src/Squidex.Domain.Apps.Entities/Contents/Text/IndexData.cs index e6c469ddc..240cc0fda 100644 --- a/src/Squidex.Domain.Apps.Entities/Contents/Text/IndexData.cs +++ b/src/Squidex.Domain.Apps.Entities/Contents/Text/IndexData.cs @@ -12,7 +12,5 @@ namespace Squidex.Domain.Apps.Entities.Contents.Text public sealed class IndexData { public NamedContentData Data { get; set; } - - public NamedContentData DataDraft { get; set; } } } diff --git a/src/Squidex.Domain.Apps.Entities/Contents/Text/TextIndexContent.cs b/src/Squidex.Domain.Apps.Entities/Contents/Text/TextIndexContent.cs index e79d23791..9571c1349 100644 --- a/src/Squidex.Domain.Apps.Entities/Contents/Text/TextIndexContent.cs +++ b/src/Squidex.Domain.Apps.Entities/Contents/Text/TextIndexContent.cs @@ -74,34 +74,27 @@ namespace Squidex.Domain.Apps.Entities.Contents.Text return true; } - public void Index(NamedContentData dataDraft, NamedContentData data, bool onlyDraft) + public void Index(NamedContentData data, bool onlyDraft) { - var converted = CreateDocument(dataDraft); + var converted = CreateDocument(data); Upsert(converted, 1, 1, 0); var docId = GetPublishedDocument(); - if (data != null) + var isPublished = IsForPublished(docId); + + if (!onlyDraft && docId > 0 && isPublished) + { + Upsert(converted, 0, 0, 1); + } + else if (!onlyDraft) { - Upsert(CreateDocument(data), 0, 0, 1); + Upsert(converted, 0, 0, 0); } else { - var isPublished = IsForPublished(docId); - - if (!onlyDraft && docId > 0 && isPublished) - { - Upsert(converted, 0, 0, 1); - } - else if (!onlyDraft) - { - Upsert(converted, 0, 0, 0); - } - else - { - Update(0, 0, isPublished ? (byte)1 : (byte)0); - } + Update(0, 0, isPublished ? (byte)1 : (byte)0); } } diff --git a/src/Squidex.Domain.Apps.Entities/Contents/Text/TextIndexerGrain.cs b/src/Squidex.Domain.Apps.Entities/Contents/Text/TextIndexerGrain.cs index b60ac7b89..b2398267b 100644 --- a/src/Squidex.Domain.Apps.Entities/Contents/Text/TextIndexerGrain.cs +++ b/src/Squidex.Domain.Apps.Entities/Contents/Text/TextIndexerGrain.cs @@ -91,7 +91,7 @@ namespace Squidex.Domain.Apps.Entities.Contents.Text { var content = new TextIndexContent(indexWriter, indexSearcher, indexState, id); - content.Index(data.Value.DataDraft, data.Value.Data, onlyDraft); + content.Index(data.Value.Data, onlyDraft); return TryFlushAsync(); } diff --git a/tests/Squidex.Domain.Apps.Entities.Tests/Contents/Text/GrainTextIndexerTests.cs b/tests/Squidex.Domain.Apps.Entities.Tests/Contents/Text/GrainTextIndexerTests.cs index 9b44668f5..8cdc51fde 100644 --- a/tests/Squidex.Domain.Apps.Entities.Tests/Contents/Text/GrainTextIndexerTests.cs +++ b/tests/Squidex.Domain.Apps.Entities.Tests/Contents/Text/GrainTextIndexerTests.cs @@ -38,18 +38,6 @@ namespace Squidex.Domain.Apps.Entities.Contents.Text sut = new GrainTextIndexer(grainFactory, A.Fake()); } - [Fact] - public async Task Should_call_grain_when_indexing_data() - { - var data = new NamedContentData(); - var dataDraft = new NamedContentData(); - - await sut.IndexAsync(schemaId, contentId, dataDraft, data); - - A.CallTo(() => grain.IndexAsync(contentId, A>.That.Matches(x => x.Value.Data == data && x.Value.DataDraft == dataDraft), false)) - .MustHaveHappened(); - } - [Fact] public async Task Should_call_grain_when_content_deleted() { @@ -66,7 +54,7 @@ namespace Squidex.Domain.Apps.Entities.Contents.Text await sut.On(E(new ContentCreated { Data = data })); - A.CallTo(() => grain.IndexAsync(contentId, A>.That.Matches(x => x.Value.DataDraft == data), true)) + A.CallTo(() => grain.IndexAsync(contentId, A>.That.Matches(x => x.Value.Data == data), true)) .MustHaveHappened(); } @@ -77,7 +65,7 @@ namespace Squidex.Domain.Apps.Entities.Contents.Text await sut.On(E(new ContentUpdated { Data = data })); - A.CallTo(() => grain.IndexAsync(contentId, A>.That.Matches(x => x.Value.DataDraft == data), false)) + A.CallTo(() => grain.IndexAsync(contentId, A>.That.Matches(x => x.Value.Data == data), false)) .MustHaveHappened(); } @@ -88,7 +76,7 @@ namespace Squidex.Domain.Apps.Entities.Contents.Text await sut.On(E(new ContentUpdateProposed { Data = data })); - A.CallTo(() => grain.IndexAsync(contentId, A>.That.Matches(x => x.Value.DataDraft == data), true)) + A.CallTo(() => grain.IndexAsync(contentId, A>.That.Matches(x => x.Value.Data == data), true)) .MustHaveHappened(); } diff --git a/tests/Squidex.Domain.Apps.Entities.Tests/Contents/Text/TextIndexerGrainTests.cs b/tests/Squidex.Domain.Apps.Entities.Tests/Contents/Text/TextIndexerGrainTests.cs index 0a29b4978..33596f736 100644 --- a/tests/Squidex.Domain.Apps.Entities.Tests/Contents/Text/TextIndexerGrainTests.cs +++ b/tests/Squidex.Domain.Apps.Entities.Tests/Contents/Text/TextIndexerGrainTests.cs @@ -211,8 +211,8 @@ namespace Squidex.Domain.Apps.Entities.Contents.Text new ContentFieldData() .AddValue("en", "City and Surroundings und sonstiges")); - await sut.IndexAsync(ids1[0], new IndexData { DataDraft = germanData }, true); - await sut.IndexAsync(ids2[0], new IndexData { DataDraft = englishData }, true); + await sut.IndexAsync(ids1[0], new IndexData { Data = germanData }, true); + await sut.IndexAsync(ids2[0], new IndexData { Data = englishData }, true); } private async Task AddInvariantContent(string text1, string text2, bool onlyDraft = false) @@ -229,8 +229,8 @@ namespace Squidex.Domain.Apps.Entities.Contents.Text new ContentFieldData() .AddValue("iv", text2)); - await sut.IndexAsync(ids1[0], new IndexData { DataDraft = data1 }, onlyDraft); - await sut.IndexAsync(ids2[0], new IndexData { DataDraft = data2 }, onlyDraft); + await sut.IndexAsync(ids1[0], new IndexData { Data = data1 }, onlyDraft); + await sut.IndexAsync(ids2[0], new IndexData { Data = data2 }, onlyDraft); } private async Task DeleteAsync(Guid id) diff --git a/tools/Migrate_01/Migrations/BuildFullTextIndices.cs b/tools/Migrate_01/Migrations/BuildFullTextIndices.cs deleted file mode 100644 index de7e9f754..000000000 --- a/tools/Migrate_01/Migrations/BuildFullTextIndices.cs +++ /dev/null @@ -1,56 +0,0 @@ -// ========================================================================== -// Squidex Headless CMS -// ========================================================================== -// Copyright (c) Squidex UG (haftungsbeschraenkt) -// All rights reserved. Licensed under the MIT license. -// ========================================================================== - -using System; -using System.Threading; -using System.Threading.Tasks; -using System.Threading.Tasks.Dataflow; -using Squidex.Domain.Apps.Entities.Contents.State; -using Squidex.Domain.Apps.Entities.Contents.Text; -using Squidex.Infrastructure.Migrations; -using Squidex.Infrastructure.States; - -namespace Migrate_01.Migrations -{ - public sealed class BuildFullTextIndices : IMigration - { - private readonly ITextIndexer textIndexer; - private readonly IStore store; - - public BuildFullTextIndices(ITextIndexer textIndexer, IStore store) - { - this.textIndexer = textIndexer; - - this.store = store; - } - - public Task UpdateAsync() - { - return UpdateAsync(CancellationToken.None); - } - - public async Task UpdateAsync(CancellationToken ct) - { - var snapshotStore = store.GetSnapshotStore(); - - var worker = new ActionBlock(state => - { - return textIndexer.IndexAsync(state.SchemaId.Id, state.Id, state.DataDraft, state.Data); - }, - new ExecutionDataflowBlockOptions - { - MaxDegreeOfParallelism = Environment.ProcessorCount * 2 - }); - - await snapshotStore.ReadAllAsync((state, version) => worker.SendAsync(state), ct); - - worker.Complete(); - - await worker.Completion; - } - } -} diff --git a/tools/Migrate_01/RebuildOptions.cs b/tools/Migrate_01/RebuildOptions.cs index 9b1bb1a63..436841883 100644 --- a/tools/Migrate_01/RebuildOptions.cs +++ b/tools/Migrate_01/RebuildOptions.cs @@ -15,8 +15,6 @@ namespace Migrate_01 public bool Contents { get; set; } - public bool Indices { get; set; } - public bool Rules { get; set; } public bool Schemas { get; set; } diff --git a/tools/Migrate_01/RebuildRunner.cs b/tools/Migrate_01/RebuildRunner.cs index f180ecc78..742e9e670 100644 --- a/tools/Migrate_01/RebuildRunner.cs +++ b/tools/Migrate_01/RebuildRunner.cs @@ -8,7 +8,6 @@ using System.Threading; using System.Threading.Tasks; using Microsoft.Extensions.Options; -using Migrate_01.Migrations; using Squidex.Infrastructure; namespace Migrate_01 @@ -16,18 +15,15 @@ namespace Migrate_01 public sealed class RebuildRunner { private readonly Rebuilder rebuilder; - private readonly BuildFullTextIndices fullTextIndices; private readonly RebuildOptions rebuildOptions; - public RebuildRunner(Rebuilder rebuilder, BuildFullTextIndices fullTextIndices, IOptions rebuildOptions) + public RebuildRunner(Rebuilder rebuilder, IOptions rebuildOptions) { Guard.NotNull(rebuilder, nameof(rebuilder)); Guard.NotNull(rebuildOptions, nameof(rebuildOptions)); - Guard.NotNull(fullTextIndices, nameof(fullTextIndices)); this.rebuilder = rebuilder; this.rebuildOptions = rebuildOptions.Value; - this.fullTextIndices = fullTextIndices; } public async Task RunAsync(CancellationToken ct) @@ -56,11 +52,6 @@ namespace Migrate_01 { await rebuilder.RebuildContentAsync(ct); } - - if (rebuildOptions.Indices) - { - await fullTextIndices.UpdateAsync(ct); - } } } }