diff --git a/src/Squidex.Domain.Apps.Core.Operations/HandleRules/Actions/WebhookActionHandler.cs b/src/Squidex.Domain.Apps.Core.Operations/HandleRules/Actions/WebhookActionHandler.cs index afc865466..ab955eef1 100644 --- a/src/Squidex.Domain.Apps.Core.Operations/HandleRules/Actions/WebhookActionHandler.cs +++ b/src/Squidex.Domain.Apps.Core.Operations/HandleRules/Actions/WebhookActionHandler.cs @@ -17,7 +17,7 @@ using Squidex.Domain.Apps.Core.Rules; using Squidex.Domain.Apps.Core.Rules.Actions; using Squidex.Domain.Apps.Events; using Squidex.Infrastructure; -using Squidex.Infrastructure.CQRS.Events; +using Squidex.Infrastructure.EventSourcing; using Squidex.Infrastructure.Http; namespace Squidex.Domain.Apps.Core.HandleRules.Actions diff --git a/src/Squidex.Domain.Apps.Core.Operations/HandleRules/IRuleActionHandler.cs b/src/Squidex.Domain.Apps.Core.Operations/HandleRules/IRuleActionHandler.cs index e2078e988..a8ba6326a 100644 --- a/src/Squidex.Domain.Apps.Core.Operations/HandleRules/IRuleActionHandler.cs +++ b/src/Squidex.Domain.Apps.Core.Operations/HandleRules/IRuleActionHandler.cs @@ -10,7 +10,7 @@ using System; using System.Threading.Tasks; using Squidex.Domain.Apps.Core.Rules; using Squidex.Domain.Apps.Events; -using Squidex.Infrastructure.CQRS.Events; +using Squidex.Infrastructure.EventSourcing; namespace Squidex.Domain.Apps.Core.HandleRules { diff --git a/src/Squidex.Domain.Apps.Core.Operations/HandleRules/IRuleTriggerHandler.cs b/src/Squidex.Domain.Apps.Core.Operations/HandleRules/IRuleTriggerHandler.cs index a1507bc5a..3bf27a4f1 100644 --- a/src/Squidex.Domain.Apps.Core.Operations/HandleRules/IRuleTriggerHandler.cs +++ b/src/Squidex.Domain.Apps.Core.Operations/HandleRules/IRuleTriggerHandler.cs @@ -9,7 +9,7 @@ using System; using Squidex.Domain.Apps.Core.Rules; using Squidex.Domain.Apps.Events; -using Squidex.Infrastructure.CQRS.Events; +using Squidex.Infrastructure.EventSourcing; namespace Squidex.Domain.Apps.Core.HandleRules { diff --git a/src/Squidex.Domain.Apps.Core.Operations/HandleRules/RuleActionHandler.cs b/src/Squidex.Domain.Apps.Core.Operations/HandleRules/RuleActionHandler.cs index a97957bdc..5f7a6ced0 100644 --- a/src/Squidex.Domain.Apps.Core.Operations/HandleRules/RuleActionHandler.cs +++ b/src/Squidex.Domain.Apps.Core.Operations/HandleRules/RuleActionHandler.cs @@ -10,7 +10,7 @@ using System; using System.Threading.Tasks; using Squidex.Domain.Apps.Core.Rules; using Squidex.Domain.Apps.Events; -using Squidex.Infrastructure.CQRS.Events; +using Squidex.Infrastructure.EventSourcing; namespace Squidex.Domain.Apps.Core.HandleRules { diff --git a/src/Squidex.Domain.Apps.Core.Operations/HandleRules/RuleService.cs b/src/Squidex.Domain.Apps.Core.Operations/HandleRules/RuleService.cs index 35fecb5ac..79ad0a013 100644 --- a/src/Squidex.Domain.Apps.Core.Operations/HandleRules/RuleService.cs +++ b/src/Squidex.Domain.Apps.Core.Operations/HandleRules/RuleService.cs @@ -16,7 +16,7 @@ using NodaTime; using Squidex.Domain.Apps.Core.Rules; using Squidex.Domain.Apps.Events; using Squidex.Infrastructure; -using Squidex.Infrastructure.CQRS.Events; +using Squidex.Infrastructure.EventSourcing; namespace Squidex.Domain.Apps.Core.HandleRules { diff --git a/src/Squidex.Domain.Apps.Core.Operations/HandleRules/RuleTriggerHandler.cs b/src/Squidex.Domain.Apps.Core.Operations/HandleRules/RuleTriggerHandler.cs index 131bf9ac1..332f26531 100644 --- a/src/Squidex.Domain.Apps.Core.Operations/HandleRules/RuleTriggerHandler.cs +++ b/src/Squidex.Domain.Apps.Core.Operations/HandleRules/RuleTriggerHandler.cs @@ -9,7 +9,7 @@ using System; using Squidex.Domain.Apps.Core.Rules; using Squidex.Domain.Apps.Events; -using Squidex.Infrastructure.CQRS.Events; +using Squidex.Infrastructure.EventSourcing; namespace Squidex.Domain.Apps.Core.HandleRules { diff --git a/src/Squidex.Domain.Apps.Core.Operations/HandleRules/Triggers/ContentChangedTriggerHandler.cs b/src/Squidex.Domain.Apps.Core.Operations/HandleRules/Triggers/ContentChangedTriggerHandler.cs index e0b8ef424..219d309c1 100644 --- a/src/Squidex.Domain.Apps.Core.Operations/HandleRules/Triggers/ContentChangedTriggerHandler.cs +++ b/src/Squidex.Domain.Apps.Core.Operations/HandleRules/Triggers/ContentChangedTriggerHandler.cs @@ -10,7 +10,7 @@ using Squidex.Domain.Apps.Core.Contents; using Squidex.Domain.Apps.Core.Rules.Triggers; using Squidex.Domain.Apps.Events; using Squidex.Domain.Apps.Events.Contents; -using Squidex.Infrastructure.CQRS.Events; +using Squidex.Infrastructure.EventSourcing; namespace Squidex.Domain.Apps.Core.HandleRules.Triggers { diff --git a/src/Squidex.Domain.Apps.Events/Apps/AppClientAttached.cs b/src/Squidex.Domain.Apps.Events/Apps/AppClientAttached.cs index 04c07f839..b4567589c 100644 --- a/src/Squidex.Domain.Apps.Events/Apps/AppClientAttached.cs +++ b/src/Squidex.Domain.Apps.Events/Apps/AppClientAttached.cs @@ -6,7 +6,7 @@ // All rights reserved. // ========================================================================== -using Squidex.Infrastructure.CQRS.Events; +using Squidex.Infrastructure.EventSourcing; namespace Squidex.Domain.Apps.Events.Apps { diff --git a/src/Squidex.Domain.Apps.Events/Apps/AppClientRenamed.cs b/src/Squidex.Domain.Apps.Events/Apps/AppClientRenamed.cs index 7e238f4b5..cc25bfa0f 100644 --- a/src/Squidex.Domain.Apps.Events/Apps/AppClientRenamed.cs +++ b/src/Squidex.Domain.Apps.Events/Apps/AppClientRenamed.cs @@ -6,7 +6,7 @@ // All rights reserved. // ========================================================================== -using Squidex.Infrastructure.CQRS.Events; +using Squidex.Infrastructure.EventSourcing; namespace Squidex.Domain.Apps.Events.Apps { diff --git a/src/Squidex.Domain.Apps.Events/Apps/AppClientRevoked.cs b/src/Squidex.Domain.Apps.Events/Apps/AppClientRevoked.cs index 4dedfa106..5e7c843c7 100644 --- a/src/Squidex.Domain.Apps.Events/Apps/AppClientRevoked.cs +++ b/src/Squidex.Domain.Apps.Events/Apps/AppClientRevoked.cs @@ -6,7 +6,7 @@ // All rights reserved. // ========================================================================== -using Squidex.Infrastructure.CQRS.Events; +using Squidex.Infrastructure.EventSourcing; namespace Squidex.Domain.Apps.Events.Apps { diff --git a/src/Squidex.Domain.Apps.Events/Apps/AppClientUpdated.cs b/src/Squidex.Domain.Apps.Events/Apps/AppClientUpdated.cs index 2289d594e..c0f64a933 100644 --- a/src/Squidex.Domain.Apps.Events/Apps/AppClientUpdated.cs +++ b/src/Squidex.Domain.Apps.Events/Apps/AppClientUpdated.cs @@ -7,7 +7,7 @@ // ========================================================================== using Squidex.Domain.Apps.Core.Apps; -using Squidex.Infrastructure.CQRS.Events; +using Squidex.Infrastructure.EventSourcing; namespace Squidex.Domain.Apps.Events.Apps { diff --git a/src/Squidex.Domain.Apps.Events/Apps/AppContributorAssigned.cs b/src/Squidex.Domain.Apps.Events/Apps/AppContributorAssigned.cs index d4eb3bcb1..ab642a7b0 100644 --- a/src/Squidex.Domain.Apps.Events/Apps/AppContributorAssigned.cs +++ b/src/Squidex.Domain.Apps.Events/Apps/AppContributorAssigned.cs @@ -7,7 +7,7 @@ // ========================================================================== using Squidex.Domain.Apps.Core.Apps; -using Squidex.Infrastructure.CQRS.Events; +using Squidex.Infrastructure.EventSourcing; namespace Squidex.Domain.Apps.Events.Apps { diff --git a/src/Squidex.Domain.Apps.Events/Apps/AppContributorRemoved.cs b/src/Squidex.Domain.Apps.Events/Apps/AppContributorRemoved.cs index ade3e8582..e25c175e8 100644 --- a/src/Squidex.Domain.Apps.Events/Apps/AppContributorRemoved.cs +++ b/src/Squidex.Domain.Apps.Events/Apps/AppContributorRemoved.cs @@ -6,7 +6,7 @@ // All rights reserved. // ========================================================================== -using Squidex.Infrastructure.CQRS.Events; +using Squidex.Infrastructure.EventSourcing; namespace Squidex.Domain.Apps.Events.Apps { diff --git a/src/Squidex.Domain.Apps.Events/Apps/AppCreated.cs b/src/Squidex.Domain.Apps.Events/Apps/AppCreated.cs index 6ec2efb8d..06813f093 100644 --- a/src/Squidex.Domain.Apps.Events/Apps/AppCreated.cs +++ b/src/Squidex.Domain.Apps.Events/Apps/AppCreated.cs @@ -6,7 +6,7 @@ // All rights reserved. // ========================================================================== -using Squidex.Infrastructure.CQRS.Events; +using Squidex.Infrastructure.EventSourcing; namespace Squidex.Domain.Apps.Events.Apps { diff --git a/src/Squidex.Domain.Apps.Events/Apps/AppLanguageAdded.cs b/src/Squidex.Domain.Apps.Events/Apps/AppLanguageAdded.cs index 72c6a2b88..08e052d11 100644 --- a/src/Squidex.Domain.Apps.Events/Apps/AppLanguageAdded.cs +++ b/src/Squidex.Domain.Apps.Events/Apps/AppLanguageAdded.cs @@ -7,7 +7,7 @@ // ========================================================================== using Squidex.Infrastructure; -using Squidex.Infrastructure.CQRS.Events; +using Squidex.Infrastructure.EventSourcing; namespace Squidex.Domain.Apps.Events.Apps { diff --git a/src/Squidex.Domain.Apps.Events/Apps/AppLanguageRemoved.cs b/src/Squidex.Domain.Apps.Events/Apps/AppLanguageRemoved.cs index 740023863..ca3646957 100644 --- a/src/Squidex.Domain.Apps.Events/Apps/AppLanguageRemoved.cs +++ b/src/Squidex.Domain.Apps.Events/Apps/AppLanguageRemoved.cs @@ -7,7 +7,7 @@ // ========================================================================== using Squidex.Infrastructure; -using Squidex.Infrastructure.CQRS.Events; +using Squidex.Infrastructure.EventSourcing; namespace Squidex.Domain.Apps.Events.Apps { diff --git a/src/Squidex.Domain.Apps.Events/Apps/AppMasterLanguageSet.cs b/src/Squidex.Domain.Apps.Events/Apps/AppMasterLanguageSet.cs index 14000e296..867600447 100644 --- a/src/Squidex.Domain.Apps.Events/Apps/AppMasterLanguageSet.cs +++ b/src/Squidex.Domain.Apps.Events/Apps/AppMasterLanguageSet.cs @@ -7,7 +7,7 @@ // ========================================================================== using Squidex.Infrastructure; -using Squidex.Infrastructure.CQRS.Events; +using Squidex.Infrastructure.EventSourcing; namespace Squidex.Domain.Apps.Events.Apps { diff --git a/src/Squidex.Domain.Apps.Events/Apps/Old/AppClientChanged.cs b/src/Squidex.Domain.Apps.Events/Apps/Old/AppClientChanged.cs index 6370c47d7..7e459b244 100644 --- a/src/Squidex.Domain.Apps.Events/Apps/Old/AppClientChanged.cs +++ b/src/Squidex.Domain.Apps.Events/Apps/Old/AppClientChanged.cs @@ -7,7 +7,7 @@ // ========================================================================== using Squidex.Domain.Apps.Core.Apps; -using Squidex.Infrastructure.CQRS.Events; +using Squidex.Infrastructure.EventSourcing; using Squidex.Infrastructure.Reflection; namespace Squidex.Domain.Apps.Events.Apps.Old diff --git a/src/Squidex.Domain.Apps.Events/Assets/AssetCreated.cs b/src/Squidex.Domain.Apps.Events/Assets/AssetCreated.cs index 3af7d4e33..97b6c6983 100644 --- a/src/Squidex.Domain.Apps.Events/Assets/AssetCreated.cs +++ b/src/Squidex.Domain.Apps.Events/Assets/AssetCreated.cs @@ -6,7 +6,7 @@ // All rights reserved. // ========================================================================== -using Squidex.Infrastructure.CQRS.Events; +using Squidex.Infrastructure.EventSourcing; namespace Squidex.Domain.Apps.Events.Assets { diff --git a/src/Squidex.Domain.Apps.Events/Assets/AssetDeleted.cs b/src/Squidex.Domain.Apps.Events/Assets/AssetDeleted.cs index 5dba605e0..036ef3747 100644 --- a/src/Squidex.Domain.Apps.Events/Assets/AssetDeleted.cs +++ b/src/Squidex.Domain.Apps.Events/Assets/AssetDeleted.cs @@ -6,7 +6,7 @@ // All rights reserved. // ========================================================================== -using Squidex.Infrastructure.CQRS.Events; +using Squidex.Infrastructure.EventSourcing; namespace Squidex.Domain.Apps.Events.Assets { diff --git a/src/Squidex.Domain.Apps.Events/Assets/AssetRenamed.cs b/src/Squidex.Domain.Apps.Events/Assets/AssetRenamed.cs index fe6b65184..af21c98e8 100644 --- a/src/Squidex.Domain.Apps.Events/Assets/AssetRenamed.cs +++ b/src/Squidex.Domain.Apps.Events/Assets/AssetRenamed.cs @@ -6,7 +6,7 @@ // All rights reserved. // ========================================================================== -using Squidex.Infrastructure.CQRS.Events; +using Squidex.Infrastructure.EventSourcing; namespace Squidex.Domain.Apps.Events.Assets { diff --git a/src/Squidex.Domain.Apps.Events/Contents/ContentCreated.cs b/src/Squidex.Domain.Apps.Events/Contents/ContentCreated.cs index 61d5b8ce2..2916de108 100644 --- a/src/Squidex.Domain.Apps.Events/Contents/ContentCreated.cs +++ b/src/Squidex.Domain.Apps.Events/Contents/ContentCreated.cs @@ -7,7 +7,7 @@ // ========================================================================== using Squidex.Domain.Apps.Core.Contents; -using Squidex.Infrastructure.CQRS.Events; +using Squidex.Infrastructure.EventSourcing; namespace Squidex.Domain.Apps.Events.Contents { diff --git a/src/Squidex.Domain.Apps.Events/Contents/ContentDeleted.cs b/src/Squidex.Domain.Apps.Events/Contents/ContentDeleted.cs index 568deb9a3..4ee78358a 100644 --- a/src/Squidex.Domain.Apps.Events/Contents/ContentDeleted.cs +++ b/src/Squidex.Domain.Apps.Events/Contents/ContentDeleted.cs @@ -6,7 +6,7 @@ // All rights reserved. // ========================================================================== -using Squidex.Infrastructure.CQRS.Events; +using Squidex.Infrastructure.EventSourcing; namespace Squidex.Domain.Apps.Events.Contents { diff --git a/src/Squidex.Domain.Apps.Events/Contents/ContentStatusChanged.cs b/src/Squidex.Domain.Apps.Events/Contents/ContentStatusChanged.cs index b7c2f7e36..5d67c7c04 100644 --- a/src/Squidex.Domain.Apps.Events/Contents/ContentStatusChanged.cs +++ b/src/Squidex.Domain.Apps.Events/Contents/ContentStatusChanged.cs @@ -7,7 +7,7 @@ // ========================================================================== using Squidex.Domain.Apps.Core.Contents; -using Squidex.Infrastructure.CQRS.Events; +using Squidex.Infrastructure.EventSourcing; namespace Squidex.Domain.Apps.Events.Contents { diff --git a/src/Squidex.Domain.Apps.Events/Contents/ContentUpdated.cs b/src/Squidex.Domain.Apps.Events/Contents/ContentUpdated.cs index 0a9c993a1..c1b0011d9 100644 --- a/src/Squidex.Domain.Apps.Events/Contents/ContentUpdated.cs +++ b/src/Squidex.Domain.Apps.Events/Contents/ContentUpdated.cs @@ -7,7 +7,7 @@ // ========================================================================== using Squidex.Domain.Apps.Core.Contents; -using Squidex.Infrastructure.CQRS.Events; +using Squidex.Infrastructure.EventSourcing; namespace Squidex.Domain.Apps.Events.Contents { diff --git a/src/Squidex.Domain.Apps.Events/Contents/Old/ContentArchived.cs b/src/Squidex.Domain.Apps.Events/Contents/Old/ContentArchived.cs index 5cd9b3eb9..7402dd378 100644 --- a/src/Squidex.Domain.Apps.Events/Contents/Old/ContentArchived.cs +++ b/src/Squidex.Domain.Apps.Events/Contents/Old/ContentArchived.cs @@ -8,7 +8,7 @@ using System; using Squidex.Domain.Apps.Core.Contents; -using Squidex.Infrastructure.CQRS.Events; +using Squidex.Infrastructure.EventSourcing; using Squidex.Infrastructure.Reflection; namespace Squidex.Domain.Apps.Events.Contents.Old diff --git a/src/Squidex.Domain.Apps.Events/Contents/Old/ContentPublished.cs b/src/Squidex.Domain.Apps.Events/Contents/Old/ContentPublished.cs index 5cba7a414..578eac373 100644 --- a/src/Squidex.Domain.Apps.Events/Contents/Old/ContentPublished.cs +++ b/src/Squidex.Domain.Apps.Events/Contents/Old/ContentPublished.cs @@ -8,7 +8,7 @@ using System; using Squidex.Domain.Apps.Core.Contents; -using Squidex.Infrastructure.CQRS.Events; +using Squidex.Infrastructure.EventSourcing; using Squidex.Infrastructure.Reflection; namespace Squidex.Domain.Apps.Events.Contents.Old diff --git a/src/Squidex.Domain.Apps.Events/Contents/Old/ContentRestored.cs b/src/Squidex.Domain.Apps.Events/Contents/Old/ContentRestored.cs index 53df84ef6..5e1526eec 100644 --- a/src/Squidex.Domain.Apps.Events/Contents/Old/ContentRestored.cs +++ b/src/Squidex.Domain.Apps.Events/Contents/Old/ContentRestored.cs @@ -8,7 +8,7 @@ using System; using Squidex.Domain.Apps.Core.Contents; -using Squidex.Infrastructure.CQRS.Events; +using Squidex.Infrastructure.EventSourcing; using Squidex.Infrastructure.Reflection; namespace Squidex.Domain.Apps.Events.Contents.Old diff --git a/src/Squidex.Domain.Apps.Events/Contents/Old/ContentUnpublished.cs b/src/Squidex.Domain.Apps.Events/Contents/Old/ContentUnpublished.cs index 8ef8430de..2908f8ee2 100644 --- a/src/Squidex.Domain.Apps.Events/Contents/Old/ContentUnpublished.cs +++ b/src/Squidex.Domain.Apps.Events/Contents/Old/ContentUnpublished.cs @@ -8,7 +8,7 @@ using System; using Squidex.Domain.Apps.Core.Contents; -using Squidex.Infrastructure.CQRS.Events; +using Squidex.Infrastructure.EventSourcing; using Squidex.Infrastructure.Reflection; namespace Squidex.Domain.Apps.Events.Contents.Old diff --git a/src/Squidex.Domain.Apps.Events/Rules/RuleCreated.cs b/src/Squidex.Domain.Apps.Events/Rules/RuleCreated.cs index 9128687ff..40178f3e8 100644 --- a/src/Squidex.Domain.Apps.Events/Rules/RuleCreated.cs +++ b/src/Squidex.Domain.Apps.Events/Rules/RuleCreated.cs @@ -7,7 +7,7 @@ // ========================================================================== using Squidex.Domain.Apps.Core.Rules; -using Squidex.Infrastructure.CQRS.Events; +using Squidex.Infrastructure.EventSourcing; namespace Squidex.Domain.Apps.Events.Rules { diff --git a/src/Squidex.Domain.Apps.Events/Rules/RuleDeleted.cs b/src/Squidex.Domain.Apps.Events/Rules/RuleDeleted.cs index 696acb36b..a6628d8cb 100644 --- a/src/Squidex.Domain.Apps.Events/Rules/RuleDeleted.cs +++ b/src/Squidex.Domain.Apps.Events/Rules/RuleDeleted.cs @@ -6,7 +6,7 @@ // All rights reserved. // ========================================================================== -using Squidex.Infrastructure.CQRS.Events; +using Squidex.Infrastructure.EventSourcing; namespace Squidex.Domain.Apps.Events.Rules { diff --git a/src/Squidex.Domain.Apps.Events/Rules/RuleDisabled.cs b/src/Squidex.Domain.Apps.Events/Rules/RuleDisabled.cs index 265d716bc..1041d6c63 100644 --- a/src/Squidex.Domain.Apps.Events/Rules/RuleDisabled.cs +++ b/src/Squidex.Domain.Apps.Events/Rules/RuleDisabled.cs @@ -6,7 +6,7 @@ // All rights reserved. // ========================================================================== -using Squidex.Infrastructure.CQRS.Events; +using Squidex.Infrastructure.EventSourcing; namespace Squidex.Domain.Apps.Events.Rules { diff --git a/src/Squidex.Domain.Apps.Events/Rules/RuleEnabled.cs b/src/Squidex.Domain.Apps.Events/Rules/RuleEnabled.cs index f94d1f58f..d477c923c 100644 --- a/src/Squidex.Domain.Apps.Events/Rules/RuleEnabled.cs +++ b/src/Squidex.Domain.Apps.Events/Rules/RuleEnabled.cs @@ -6,7 +6,7 @@ // All rights reserved. // ========================================================================== -using Squidex.Infrastructure.CQRS.Events; +using Squidex.Infrastructure.EventSourcing; namespace Squidex.Domain.Apps.Events.Rules { diff --git a/src/Squidex.Domain.Apps.Events/Rules/RuleUpdated.cs b/src/Squidex.Domain.Apps.Events/Rules/RuleUpdated.cs index e4d828138..cff34215e 100644 --- a/src/Squidex.Domain.Apps.Events/Rules/RuleUpdated.cs +++ b/src/Squidex.Domain.Apps.Events/Rules/RuleUpdated.cs @@ -7,7 +7,7 @@ // ========================================================================== using Squidex.Domain.Apps.Core.Rules; -using Squidex.Infrastructure.CQRS.Events; +using Squidex.Infrastructure.EventSourcing; namespace Squidex.Domain.Apps.Events.Rules { diff --git a/src/Squidex.Domain.Apps.Events/Schemas/FieldAdded.cs b/src/Squidex.Domain.Apps.Events/Schemas/FieldAdded.cs index 91a7e3f63..847e36d8f 100644 --- a/src/Squidex.Domain.Apps.Events/Schemas/FieldAdded.cs +++ b/src/Squidex.Domain.Apps.Events/Schemas/FieldAdded.cs @@ -7,7 +7,7 @@ // ========================================================================== using Squidex.Domain.Apps.Core.Schemas; -using Squidex.Infrastructure.CQRS.Events; +using Squidex.Infrastructure.EventSourcing; namespace Squidex.Domain.Apps.Events.Schemas { diff --git a/src/Squidex.Domain.Apps.Events/Schemas/FieldDeleted.cs b/src/Squidex.Domain.Apps.Events/Schemas/FieldDeleted.cs index 01f6bc92d..96011e3b7 100644 --- a/src/Squidex.Domain.Apps.Events/Schemas/FieldDeleted.cs +++ b/src/Squidex.Domain.Apps.Events/Schemas/FieldDeleted.cs @@ -6,7 +6,7 @@ // All rights reserved. // ========================================================================== -using Squidex.Infrastructure.CQRS.Events; +using Squidex.Infrastructure.EventSourcing; namespace Squidex.Domain.Apps.Events.Schemas { diff --git a/src/Squidex.Domain.Apps.Events/Schemas/FieldDisabled.cs b/src/Squidex.Domain.Apps.Events/Schemas/FieldDisabled.cs index c58198b4d..5cacb7484 100644 --- a/src/Squidex.Domain.Apps.Events/Schemas/FieldDisabled.cs +++ b/src/Squidex.Domain.Apps.Events/Schemas/FieldDisabled.cs @@ -6,7 +6,7 @@ // All rights reserved. // ========================================================================== -using Squidex.Infrastructure.CQRS.Events; +using Squidex.Infrastructure.EventSourcing; namespace Squidex.Domain.Apps.Events.Schemas { diff --git a/src/Squidex.Domain.Apps.Events/Schemas/FieldEnabled.cs b/src/Squidex.Domain.Apps.Events/Schemas/FieldEnabled.cs index 0a72075f3..b62340881 100644 --- a/src/Squidex.Domain.Apps.Events/Schemas/FieldEnabled.cs +++ b/src/Squidex.Domain.Apps.Events/Schemas/FieldEnabled.cs @@ -6,7 +6,7 @@ // All rights reserved. // ========================================================================== -using Squidex.Infrastructure.CQRS.Events; +using Squidex.Infrastructure.EventSourcing; namespace Squidex.Domain.Apps.Events.Schemas { diff --git a/src/Squidex.Domain.Apps.Events/Schemas/FieldHidden.cs b/src/Squidex.Domain.Apps.Events/Schemas/FieldHidden.cs index 3b6aeacca..4af27c6e2 100644 --- a/src/Squidex.Domain.Apps.Events/Schemas/FieldHidden.cs +++ b/src/Squidex.Domain.Apps.Events/Schemas/FieldHidden.cs @@ -6,7 +6,7 @@ // All rights reserved. // ========================================================================== -using Squidex.Infrastructure.CQRS.Events; +using Squidex.Infrastructure.EventSourcing; namespace Squidex.Domain.Apps.Events.Schemas { diff --git a/src/Squidex.Domain.Apps.Events/Schemas/FieldLocked.cs b/src/Squidex.Domain.Apps.Events/Schemas/FieldLocked.cs index 5a8437b62..67ae68480 100644 --- a/src/Squidex.Domain.Apps.Events/Schemas/FieldLocked.cs +++ b/src/Squidex.Domain.Apps.Events/Schemas/FieldLocked.cs @@ -6,7 +6,7 @@ // All rights reserved. // ========================================================================== -using Squidex.Infrastructure.CQRS.Events; +using Squidex.Infrastructure.EventSourcing; namespace Squidex.Domain.Apps.Events.Schemas { diff --git a/src/Squidex.Domain.Apps.Events/Schemas/FieldShown.cs b/src/Squidex.Domain.Apps.Events/Schemas/FieldShown.cs index fc9f67d02..6e4923887 100644 --- a/src/Squidex.Domain.Apps.Events/Schemas/FieldShown.cs +++ b/src/Squidex.Domain.Apps.Events/Schemas/FieldShown.cs @@ -6,7 +6,7 @@ // All rights reserved. // ========================================================================== -using Squidex.Infrastructure.CQRS.Events; +using Squidex.Infrastructure.EventSourcing; namespace Squidex.Domain.Apps.Events.Schemas { diff --git a/src/Squidex.Domain.Apps.Events/Schemas/FieldUpdated.cs b/src/Squidex.Domain.Apps.Events/Schemas/FieldUpdated.cs index bc530def2..bebd9a88e 100644 --- a/src/Squidex.Domain.Apps.Events/Schemas/FieldUpdated.cs +++ b/src/Squidex.Domain.Apps.Events/Schemas/FieldUpdated.cs @@ -7,7 +7,7 @@ // ========================================================================== using Squidex.Domain.Apps.Core.Schemas; -using Squidex.Infrastructure.CQRS.Events; +using Squidex.Infrastructure.EventSourcing; namespace Squidex.Domain.Apps.Events.Schemas { diff --git a/src/Squidex.Domain.Apps.Events/Schemas/Old/WebhookAdded.cs b/src/Squidex.Domain.Apps.Events/Schemas/Old/WebhookAdded.cs index 39926a737..f39b91618 100644 --- a/src/Squidex.Domain.Apps.Events/Schemas/Old/WebhookAdded.cs +++ b/src/Squidex.Domain.Apps.Events/Schemas/Old/WebhookAdded.cs @@ -7,7 +7,7 @@ // ========================================================================== using System; -using Squidex.Infrastructure.CQRS.Events; +using Squidex.Infrastructure.EventSourcing; namespace Squidex.Domain.Apps.Events.Schemas.Old { diff --git a/src/Squidex.Domain.Apps.Events/Schemas/Old/WebhookDeleted.cs b/src/Squidex.Domain.Apps.Events/Schemas/Old/WebhookDeleted.cs index df94a1e4c..c579d224a 100644 --- a/src/Squidex.Domain.Apps.Events/Schemas/Old/WebhookDeleted.cs +++ b/src/Squidex.Domain.Apps.Events/Schemas/Old/WebhookDeleted.cs @@ -7,7 +7,7 @@ // ========================================================================== using System; -using Squidex.Infrastructure.CQRS.Events; +using Squidex.Infrastructure.EventSourcing; namespace Squidex.Domain.Apps.Events.Schemas.Old { diff --git a/src/Squidex.Domain.Apps.Events/Schemas/SchemaCreated.cs b/src/Squidex.Domain.Apps.Events/Schemas/SchemaCreated.cs index 85afd34bd..ac98d1a37 100644 --- a/src/Squidex.Domain.Apps.Events/Schemas/SchemaCreated.cs +++ b/src/Squidex.Domain.Apps.Events/Schemas/SchemaCreated.cs @@ -7,7 +7,7 @@ // ========================================================================== using Squidex.Domain.Apps.Core.Schemas; -using Squidex.Infrastructure.CQRS.Events; +using Squidex.Infrastructure.EventSourcing; using SchemaFields = System.Collections.Generic.List; namespace Squidex.Domain.Apps.Events.Schemas diff --git a/src/Squidex.Domain.Apps.Events/Schemas/SchemaDeleted.cs b/src/Squidex.Domain.Apps.Events/Schemas/SchemaDeleted.cs index 2de168b39..284673fc0 100644 --- a/src/Squidex.Domain.Apps.Events/Schemas/SchemaDeleted.cs +++ b/src/Squidex.Domain.Apps.Events/Schemas/SchemaDeleted.cs @@ -6,7 +6,7 @@ // All rights reserved. // ========================================================================== -using Squidex.Infrastructure.CQRS.Events; +using Squidex.Infrastructure.EventSourcing; namespace Squidex.Domain.Apps.Events.Schemas { diff --git a/src/Squidex.Domain.Apps.Events/Schemas/SchemaFieldsReordered.cs b/src/Squidex.Domain.Apps.Events/Schemas/SchemaFieldsReordered.cs index 6d96e0752..447adfd96 100644 --- a/src/Squidex.Domain.Apps.Events/Schemas/SchemaFieldsReordered.cs +++ b/src/Squidex.Domain.Apps.Events/Schemas/SchemaFieldsReordered.cs @@ -7,7 +7,7 @@ // ========================================================================== using System.Collections.Generic; -using Squidex.Infrastructure.CQRS.Events; +using Squidex.Infrastructure.EventSourcing; namespace Squidex.Domain.Apps.Events.Schemas { diff --git a/src/Squidex.Domain.Apps.Events/Schemas/SchemaPublished.cs b/src/Squidex.Domain.Apps.Events/Schemas/SchemaPublished.cs index d6c9ee1c9..b69bbc620 100644 --- a/src/Squidex.Domain.Apps.Events/Schemas/SchemaPublished.cs +++ b/src/Squidex.Domain.Apps.Events/Schemas/SchemaPublished.cs @@ -6,7 +6,7 @@ // All rights reserved. // ========================================================================== -using Squidex.Infrastructure.CQRS.Events; +using Squidex.Infrastructure.EventSourcing; namespace Squidex.Domain.Apps.Events.Schemas { diff --git a/src/Squidex.Domain.Apps.Events/Schemas/SchemaUnpublished.cs b/src/Squidex.Domain.Apps.Events/Schemas/SchemaUnpublished.cs index 1618d63b2..5e72b21d8 100644 --- a/src/Squidex.Domain.Apps.Events/Schemas/SchemaUnpublished.cs +++ b/src/Squidex.Domain.Apps.Events/Schemas/SchemaUnpublished.cs @@ -6,7 +6,7 @@ // All rights reserved. // ========================================================================== -using Squidex.Infrastructure.CQRS.Events; +using Squidex.Infrastructure.EventSourcing; namespace Squidex.Domain.Apps.Events.Schemas { diff --git a/src/Squidex.Domain.Apps.Events/Schemas/SchemaUpdated.cs b/src/Squidex.Domain.Apps.Events/Schemas/SchemaUpdated.cs index aebed5b61..66bb90df8 100644 --- a/src/Squidex.Domain.Apps.Events/Schemas/SchemaUpdated.cs +++ b/src/Squidex.Domain.Apps.Events/Schemas/SchemaUpdated.cs @@ -7,7 +7,7 @@ // ========================================================================== using Squidex.Domain.Apps.Core.Schemas; -using Squidex.Infrastructure.CQRS.Events; +using Squidex.Infrastructure.EventSourcing; namespace Squidex.Domain.Apps.Events.Schemas { diff --git a/src/Squidex.Domain.Apps.Events/Schemas/ScriptsConfigured.cs b/src/Squidex.Domain.Apps.Events/Schemas/ScriptsConfigured.cs index 36764d064..05dfd417b 100644 --- a/src/Squidex.Domain.Apps.Events/Schemas/ScriptsConfigured.cs +++ b/src/Squidex.Domain.Apps.Events/Schemas/ScriptsConfigured.cs @@ -6,7 +6,7 @@ // All rights reserved. // ========================================================================== -using Squidex.Infrastructure.CQRS.Events; +using Squidex.Infrastructure.EventSourcing; namespace Squidex.Domain.Apps.Events.Schemas { diff --git a/src/Squidex.Domain.Apps.Events/SquidexEvent.cs b/src/Squidex.Domain.Apps.Events/SquidexEvent.cs index 9ef70954b..729022e8c 100644 --- a/src/Squidex.Domain.Apps.Events/SquidexEvent.cs +++ b/src/Squidex.Domain.Apps.Events/SquidexEvent.cs @@ -7,7 +7,7 @@ // ========================================================================== using Squidex.Infrastructure; -using Squidex.Infrastructure.CQRS.Events; +using Squidex.Infrastructure.EventSourcing; namespace Squidex.Domain.Apps.Events { diff --git a/src/Squidex.Domain.Apps.Read.MongoDb/Assets/MongoAssetRepository_EventHandling.cs b/src/Squidex.Domain.Apps.Read.MongoDb/Assets/MongoAssetRepository_EventHandling.cs index 2685c24fc..e8b95832e 100644 --- a/src/Squidex.Domain.Apps.Read.MongoDb/Assets/MongoAssetRepository_EventHandling.cs +++ b/src/Squidex.Domain.Apps.Read.MongoDb/Assets/MongoAssetRepository_EventHandling.cs @@ -9,7 +9,7 @@ using System.Threading.Tasks; using MongoDB.Driver; using Squidex.Domain.Apps.Events.Assets; -using Squidex.Infrastructure.CQRS.Events; +using Squidex.Infrastructure.EventSourcing; using Squidex.Infrastructure.Dispatching; using Squidex.Infrastructure.Reflection; diff --git a/src/Squidex.Domain.Apps.Read.MongoDb/Assets/MongoAssetStatsRepository_EventHandling.cs b/src/Squidex.Domain.Apps.Read.MongoDb/Assets/MongoAssetStatsRepository_EventHandling.cs index 8252e080d..73b3440b7 100644 --- a/src/Squidex.Domain.Apps.Read.MongoDb/Assets/MongoAssetStatsRepository_EventHandling.cs +++ b/src/Squidex.Domain.Apps.Read.MongoDb/Assets/MongoAssetStatsRepository_EventHandling.cs @@ -10,7 +10,7 @@ using System; using System.Threading.Tasks; using MongoDB.Driver; using Squidex.Domain.Apps.Events.Assets; -using Squidex.Infrastructure.CQRS.Events; +using Squidex.Infrastructure.EventSourcing; using Squidex.Infrastructure.Dispatching; namespace Squidex.Domain.Apps.Read.MongoDb.Assets diff --git a/src/Squidex.Domain.Apps.Read.MongoDb/Contents/MongoContentRepository.cs b/src/Squidex.Domain.Apps.Read.MongoDb/Contents/MongoContentRepository.cs index b0d763553..9f1b3b9fb 100644 --- a/src/Squidex.Domain.Apps.Read.MongoDb/Contents/MongoContentRepository.cs +++ b/src/Squidex.Domain.Apps.Read.MongoDb/Contents/MongoContentRepository.cs @@ -20,7 +20,7 @@ using Squidex.Domain.Apps.Read.Contents.Repositories; using Squidex.Domain.Apps.Read.MongoDb.Contents.Visitors; using Squidex.Domain.Apps.Read.Schemas; using Squidex.Infrastructure; -using Squidex.Infrastructure.CQRS.Events; +using Squidex.Infrastructure.EventSourcing; namespace Squidex.Domain.Apps.Read.MongoDb.Contents { diff --git a/src/Squidex.Domain.Apps.Read.MongoDb/Contents/MongoContentRepository_EventHandling.cs b/src/Squidex.Domain.Apps.Read.MongoDb/Contents/MongoContentRepository_EventHandling.cs index fabf77afc..21b6be2c6 100644 --- a/src/Squidex.Domain.Apps.Read.MongoDb/Contents/MongoContentRepository_EventHandling.cs +++ b/src/Squidex.Domain.Apps.Read.MongoDb/Contents/MongoContentRepository_EventHandling.cs @@ -13,7 +13,7 @@ using Squidex.Domain.Apps.Core.ConvertContent; using Squidex.Domain.Apps.Events.Apps; using Squidex.Domain.Apps.Events.Assets; using Squidex.Domain.Apps.Events.Contents; -using Squidex.Infrastructure.CQRS.Events; +using Squidex.Infrastructure.EventSourcing; using Squidex.Infrastructure.Dispatching; using Squidex.Infrastructure.Reflection; diff --git a/src/Squidex.Domain.Apps.Read.MongoDb/History/MongoHistoryEventRepository.cs b/src/Squidex.Domain.Apps.Read.MongoDb/History/MongoHistoryEventRepository.cs index 6b0464bc3..3404a64a7 100644 --- a/src/Squidex.Domain.Apps.Read.MongoDb/History/MongoHistoryEventRepository.cs +++ b/src/Squidex.Domain.Apps.Read.MongoDb/History/MongoHistoryEventRepository.cs @@ -14,7 +14,7 @@ using MongoDB.Driver; using Squidex.Domain.Apps.Events; using Squidex.Domain.Apps.Read.History; using Squidex.Domain.Apps.Read.History.Repositories; -using Squidex.Infrastructure.CQRS.Events; +using Squidex.Infrastructure.EventSourcing; using Squidex.Infrastructure.MongoDb; namespace Squidex.Domain.Apps.Read.MongoDb.History diff --git a/src/Squidex.Domain.Apps.Read.MongoDb/MongoCollectionExtensions.cs b/src/Squidex.Domain.Apps.Read.MongoDb/MongoCollectionExtensions.cs index 4a15254dc..3e840b8b1 100644 --- a/src/Squidex.Domain.Apps.Read.MongoDb/MongoCollectionExtensions.cs +++ b/src/Squidex.Domain.Apps.Read.MongoDb/MongoCollectionExtensions.cs @@ -11,7 +11,7 @@ using System.Threading.Tasks; using MongoDB.Driver; using Squidex.Domain.Apps.Events; using Squidex.Infrastructure; -using Squidex.Infrastructure.CQRS.Events; +using Squidex.Infrastructure.EventSourcing; using Squidex.Infrastructure.MongoDb; namespace Squidex.Domain.Apps.Read.MongoDb diff --git a/src/Squidex.Domain.Apps.Read/Apps/AppHistoryEventsCreator.cs b/src/Squidex.Domain.Apps.Read/Apps/AppHistoryEventsCreator.cs index 6c8839b5a..b374525cf 100644 --- a/src/Squidex.Domain.Apps.Read/Apps/AppHistoryEventsCreator.cs +++ b/src/Squidex.Domain.Apps.Read/Apps/AppHistoryEventsCreator.cs @@ -10,7 +10,7 @@ using System.Threading.Tasks; using Squidex.Domain.Apps.Events.Apps; using Squidex.Domain.Apps.Read.History; using Squidex.Infrastructure; -using Squidex.Infrastructure.CQRS.Events; +using Squidex.Infrastructure.EventSourcing; using Squidex.Infrastructure.Dispatching; namespace Squidex.Domain.Apps.Read.Apps diff --git a/src/Squidex.Domain.Apps.Read/Assets/IAssetEventConsumer.cs b/src/Squidex.Domain.Apps.Read/Assets/IAssetEventConsumer.cs index 28ebcf5d5..bd0a6ddb9 100644 --- a/src/Squidex.Domain.Apps.Read/Assets/IAssetEventConsumer.cs +++ b/src/Squidex.Domain.Apps.Read/Assets/IAssetEventConsumer.cs @@ -6,7 +6,7 @@ // All rights reserved. // ========================================================================== -using Squidex.Infrastructure.CQRS.Events; +using Squidex.Infrastructure.EventSourcing; namespace Squidex.Domain.Apps.Read.Assets { diff --git a/src/Squidex.Domain.Apps.Read/Contents/ContentHistoryEventsCreator.cs b/src/Squidex.Domain.Apps.Read/Contents/ContentHistoryEventsCreator.cs index 866917d8b..ab734aab4 100644 --- a/src/Squidex.Domain.Apps.Read/Contents/ContentHistoryEventsCreator.cs +++ b/src/Squidex.Domain.Apps.Read/Contents/ContentHistoryEventsCreator.cs @@ -10,7 +10,7 @@ using System.Threading.Tasks; using Squidex.Domain.Apps.Events.Contents; using Squidex.Domain.Apps.Read.History; using Squidex.Infrastructure; -using Squidex.Infrastructure.CQRS.Events; +using Squidex.Infrastructure.EventSourcing; namespace Squidex.Domain.Apps.Read.Contents { diff --git a/src/Squidex.Domain.Apps.Read/EntityMapper.cs b/src/Squidex.Domain.Apps.Read/EntityMapper.cs index 525f94ff2..829ea277c 100644 --- a/src/Squidex.Domain.Apps.Read/EntityMapper.cs +++ b/src/Squidex.Domain.Apps.Read/EntityMapper.cs @@ -8,7 +8,7 @@ using System; using Squidex.Domain.Apps.Events; -using Squidex.Infrastructure.CQRS.Events; +using Squidex.Infrastructure.EventSourcing; namespace Squidex.Domain.Apps.Read { diff --git a/src/Squidex.Domain.Apps.Read/History/HistoryEventsCreatorBase.cs b/src/Squidex.Domain.Apps.Read/History/HistoryEventsCreatorBase.cs index 89a09f45b..a267d1572 100644 --- a/src/Squidex.Domain.Apps.Read/History/HistoryEventsCreatorBase.cs +++ b/src/Squidex.Domain.Apps.Read/History/HistoryEventsCreatorBase.cs @@ -9,7 +9,7 @@ using System.Collections.Generic; using System.Threading.Tasks; using Squidex.Infrastructure; -using Squidex.Infrastructure.CQRS.Events; +using Squidex.Infrastructure.EventSourcing; namespace Squidex.Domain.Apps.Read.History { diff --git a/src/Squidex.Domain.Apps.Read/History/IHistoryEventsCreator.cs b/src/Squidex.Domain.Apps.Read/History/IHistoryEventsCreator.cs index bf7a1565d..91d37234e 100644 --- a/src/Squidex.Domain.Apps.Read/History/IHistoryEventsCreator.cs +++ b/src/Squidex.Domain.Apps.Read/History/IHistoryEventsCreator.cs @@ -8,7 +8,7 @@ using System.Collections.Generic; using System.Threading.Tasks; -using Squidex.Infrastructure.CQRS.Events; +using Squidex.Infrastructure.EventSourcing; namespace Squidex.Domain.Apps.Read.History { diff --git a/src/Squidex.Domain.Apps.Read/Rules/RuleEnqueuer.cs b/src/Squidex.Domain.Apps.Read/Rules/RuleEnqueuer.cs index 5a3a492d4..867b13937 100644 --- a/src/Squidex.Domain.Apps.Read/Rules/RuleEnqueuer.cs +++ b/src/Squidex.Domain.Apps.Read/Rules/RuleEnqueuer.cs @@ -11,7 +11,7 @@ using Squidex.Domain.Apps.Core.HandleRules; using Squidex.Domain.Apps.Events; using Squidex.Domain.Apps.Read.Rules.Repositories; using Squidex.Infrastructure; -using Squidex.Infrastructure.CQRS.Events; +using Squidex.Infrastructure.EventSourcing; using Squidex.Infrastructure.Tasks; namespace Squidex.Domain.Apps.Read.Rules diff --git a/src/Squidex.Domain.Apps.Read/Schemas/SchemaHistoryEventsCreator.cs b/src/Squidex.Domain.Apps.Read/Schemas/SchemaHistoryEventsCreator.cs index 6e2068159..426d97473 100644 --- a/src/Squidex.Domain.Apps.Read/Schemas/SchemaHistoryEventsCreator.cs +++ b/src/Squidex.Domain.Apps.Read/Schemas/SchemaHistoryEventsCreator.cs @@ -11,7 +11,7 @@ using Squidex.Domain.Apps.Events; using Squidex.Domain.Apps.Events.Schemas; using Squidex.Domain.Apps.Read.History; using Squidex.Infrastructure; -using Squidex.Infrastructure.CQRS.Events; +using Squidex.Infrastructure.EventSourcing; namespace Squidex.Domain.Apps.Read.Schemas { diff --git a/src/Squidex.Domain.Apps.Read/State/AppStateEventConsumer.cs b/src/Squidex.Domain.Apps.Read/State/AppStateEventConsumer.cs index 718cd22fb..d36b0ca08 100644 --- a/src/Squidex.Domain.Apps.Read/State/AppStateEventConsumer.cs +++ b/src/Squidex.Domain.Apps.Read/State/AppStateEventConsumer.cs @@ -11,7 +11,7 @@ using Squidex.Domain.Apps.Events; using Squidex.Domain.Apps.Events.Apps; using Squidex.Domain.Apps.Read.State.Grains; using Squidex.Infrastructure; -using Squidex.Infrastructure.CQRS.Events; +using Squidex.Infrastructure.EventSourcing; using Squidex.Infrastructure.States; using Squidex.Infrastructure.Tasks; diff --git a/src/Squidex.Domain.Apps.Read/State/Grains/AppStateGrain.cs b/src/Squidex.Domain.Apps.Read/State/Grains/AppStateGrain.cs index 5f61cae73..d7cfcfdad 100644 --- a/src/Squidex.Domain.Apps.Read/State/Grains/AppStateGrain.cs +++ b/src/Squidex.Domain.Apps.Read/State/Grains/AppStateGrain.cs @@ -16,7 +16,7 @@ using Squidex.Domain.Apps.Read.Apps; using Squidex.Domain.Apps.Read.Rules; using Squidex.Domain.Apps.Read.Schemas; using Squidex.Infrastructure; -using Squidex.Infrastructure.CQRS.Events; +using Squidex.Infrastructure.EventSourcing; using Squidex.Infrastructure.States; namespace Squidex.Domain.Apps.Read.State.Grains diff --git a/src/Squidex.Domain.Apps.Read/State/Grains/AppStateGrainState.cs b/src/Squidex.Domain.Apps.Read/State/Grains/AppStateGrainState.cs index 003ed92f6..397e89e6f 100644 --- a/src/Squidex.Domain.Apps.Read/State/Grains/AppStateGrainState.cs +++ b/src/Squidex.Domain.Apps.Read/State/Grains/AppStateGrainState.cs @@ -16,7 +16,7 @@ using Squidex.Domain.Apps.Read.Apps; using Squidex.Domain.Apps.Read.Rules; using Squidex.Domain.Apps.Read.Schemas; using Squidex.Infrastructure; -using Squidex.Infrastructure.CQRS.Events; +using Squidex.Infrastructure.EventSourcing; using Squidex.Infrastructure.Dispatching; namespace Squidex.Domain.Apps.Read.State.Grains diff --git a/src/Squidex.Domain.Apps.Read/State/Grains/AppStateGrainState_Apps.cs b/src/Squidex.Domain.Apps.Read/State/Grains/AppStateGrainState_Apps.cs index a2477c590..58789f36c 100644 --- a/src/Squidex.Domain.Apps.Read/State/Grains/AppStateGrainState_Apps.cs +++ b/src/Squidex.Domain.Apps.Read/State/Grains/AppStateGrainState_Apps.cs @@ -12,7 +12,7 @@ using Squidex.Domain.Apps.Events; using Squidex.Domain.Apps.Events.Apps; using Squidex.Domain.Apps.Events.Apps.Utils; using Squidex.Infrastructure; -using Squidex.Infrastructure.CQRS.Events; +using Squidex.Infrastructure.EventSourcing; using Squidex.Infrastructure.Reflection; namespace Squidex.Domain.Apps.Read.State.Grains diff --git a/src/Squidex.Domain.Apps.Read/State/Grains/AppStateGrainState_Rules.cs b/src/Squidex.Domain.Apps.Read/State/Grains/AppStateGrainState_Rules.cs index 052dfbd75..a2568be81 100644 --- a/src/Squidex.Domain.Apps.Read/State/Grains/AppStateGrainState_Rules.cs +++ b/src/Squidex.Domain.Apps.Read/State/Grains/AppStateGrainState_Rules.cs @@ -10,7 +10,7 @@ using System; using Squidex.Domain.Apps.Events.Rules; using Squidex.Domain.Apps.Events.Rules.Utils; using Squidex.Infrastructure; -using Squidex.Infrastructure.CQRS.Events; +using Squidex.Infrastructure.EventSourcing; namespace Squidex.Domain.Apps.Read.State.Grains { diff --git a/src/Squidex.Domain.Apps.Read/State/Grains/AppStateGrainState_Schemas.cs b/src/Squidex.Domain.Apps.Read/State/Grains/AppStateGrainState_Schemas.cs index 494307a9b..42ce9ae30 100644 --- a/src/Squidex.Domain.Apps.Read/State/Grains/AppStateGrainState_Schemas.cs +++ b/src/Squidex.Domain.Apps.Read/State/Grains/AppStateGrainState_Schemas.cs @@ -12,7 +12,7 @@ using Squidex.Domain.Apps.Events.Schemas; using Squidex.Domain.Apps.Events.Schemas.Old; using Squidex.Domain.Apps.Events.Schemas.Utils; using Squidex.Infrastructure; -using Squidex.Infrastructure.CQRS.Events; +using Squidex.Infrastructure.EventSourcing; using Squidex.Infrastructure.Reflection; #pragma warning disable CS0612 // Type or member is obsolete diff --git a/src/Squidex.Domain.Apps.Write/AppAggregateCommand.cs b/src/Squidex.Domain.Apps.Write/AppAggregateCommand.cs index ebd844c64..cc46b1dbf 100644 --- a/src/Squidex.Domain.Apps.Write/AppAggregateCommand.cs +++ b/src/Squidex.Domain.Apps.Write/AppAggregateCommand.cs @@ -7,7 +7,7 @@ // ========================================================================== using System; -using Squidex.Infrastructure.CQRS.Commands; +using Squidex.Infrastructure.Commands; namespace Squidex.Domain.Apps.Write { diff --git a/src/Squidex.Domain.Apps.Write/Apps/AppCommandMiddleware.cs b/src/Squidex.Domain.Apps.Write/Apps/AppCommandMiddleware.cs index 02042a262..7c3978cc7 100644 --- a/src/Squidex.Domain.Apps.Write/Apps/AppCommandMiddleware.cs +++ b/src/Squidex.Domain.Apps.Write/Apps/AppCommandMiddleware.cs @@ -13,7 +13,7 @@ using Squidex.Domain.Apps.Read.Apps.Services; using Squidex.Domain.Apps.Write.Apps.Commands; using Squidex.Domain.Apps.Write.Apps.Guards; using Squidex.Infrastructure; -using Squidex.Infrastructure.CQRS.Commands; +using Squidex.Infrastructure.Commands; using Squidex.Infrastructure.Dispatching; using Squidex.Shared.Users; diff --git a/src/Squidex.Domain.Apps.Write/Apps/AppDomainObject.cs b/src/Squidex.Domain.Apps.Write/Apps/AppDomainObject.cs index ce675b1e6..c500ba716 100644 --- a/src/Squidex.Domain.Apps.Write/Apps/AppDomainObject.cs +++ b/src/Squidex.Domain.Apps.Write/Apps/AppDomainObject.cs @@ -14,7 +14,7 @@ using Squidex.Domain.Apps.Events.Apps.Utils; using Squidex.Domain.Apps.Write.Apps.Commands; using Squidex.Infrastructure; using Squidex.Infrastructure.CQRS; -using Squidex.Infrastructure.CQRS.Events; +using Squidex.Infrastructure.EventSourcing; using Squidex.Infrastructure.Dispatching; using Squidex.Infrastructure.Reflection; diff --git a/src/Squidex.Domain.Apps.Write/Apps/Commands/CreateApp.cs b/src/Squidex.Domain.Apps.Write/Apps/Commands/CreateApp.cs index 95ce15743..9ef163160 100644 --- a/src/Squidex.Domain.Apps.Write/Apps/Commands/CreateApp.cs +++ b/src/Squidex.Domain.Apps.Write/Apps/Commands/CreateApp.cs @@ -7,7 +7,7 @@ // ========================================================================== using System; -using Squidex.Infrastructure.CQRS.Commands; +using Squidex.Infrastructure.Commands; namespace Squidex.Domain.Apps.Write.Apps.Commands { diff --git a/src/Squidex.Domain.Apps.Write/Assets/AssetCommandMiddleware.cs b/src/Squidex.Domain.Apps.Write/Assets/AssetCommandMiddleware.cs index ae504f17a..de46cceda 100644 --- a/src/Squidex.Domain.Apps.Write/Assets/AssetCommandMiddleware.cs +++ b/src/Squidex.Domain.Apps.Write/Assets/AssetCommandMiddleware.cs @@ -12,7 +12,7 @@ using Squidex.Domain.Apps.Write.Assets.Commands; using Squidex.Domain.Apps.Write.Assets.Guards; using Squidex.Infrastructure; using Squidex.Infrastructure.Assets; -using Squidex.Infrastructure.CQRS.Commands; +using Squidex.Infrastructure.Commands; using Squidex.Infrastructure.Dispatching; namespace Squidex.Domain.Apps.Write.Assets diff --git a/src/Squidex.Domain.Apps.Write/Assets/AssetDomainObject.cs b/src/Squidex.Domain.Apps.Write/Assets/AssetDomainObject.cs index e3da95a1a..ea75b8b73 100644 --- a/src/Squidex.Domain.Apps.Write/Assets/AssetDomainObject.cs +++ b/src/Squidex.Domain.Apps.Write/Assets/AssetDomainObject.cs @@ -11,7 +11,7 @@ using Squidex.Domain.Apps.Events.Assets; using Squidex.Domain.Apps.Write.Assets.Commands; using Squidex.Infrastructure; using Squidex.Infrastructure.CQRS; -using Squidex.Infrastructure.CQRS.Events; +using Squidex.Infrastructure.EventSourcing; using Squidex.Infrastructure.Dispatching; using Squidex.Infrastructure.Reflection; diff --git a/src/Squidex.Domain.Apps.Write/Assets/AssetSavedResult.cs b/src/Squidex.Domain.Apps.Write/Assets/AssetSavedResult.cs index 00b67ff16..5d38142c6 100644 --- a/src/Squidex.Domain.Apps.Write/Assets/AssetSavedResult.cs +++ b/src/Squidex.Domain.Apps.Write/Assets/AssetSavedResult.cs @@ -6,7 +6,7 @@ // All rights reserved. // ========================================================================== -using Squidex.Infrastructure.CQRS.Commands; +using Squidex.Infrastructure.Commands; namespace Squidex.Domain.Apps.Write.Assets { diff --git a/src/Squidex.Domain.Apps.Write/Assets/Commands/AssetAggregateCommand.cs b/src/Squidex.Domain.Apps.Write/Assets/Commands/AssetAggregateCommand.cs index 1a2dc158a..b62d9dee9 100644 --- a/src/Squidex.Domain.Apps.Write/Assets/Commands/AssetAggregateCommand.cs +++ b/src/Squidex.Domain.Apps.Write/Assets/Commands/AssetAggregateCommand.cs @@ -7,7 +7,7 @@ // ========================================================================== using System; -using Squidex.Infrastructure.CQRS.Commands; +using Squidex.Infrastructure.Commands; namespace Squidex.Domain.Apps.Write.Assets.Commands { diff --git a/src/Squidex.Domain.Apps.Write/Contents/Commands/ContentCommand.cs b/src/Squidex.Domain.Apps.Write/Contents/Commands/ContentCommand.cs index 55be9acc8..edf62f437 100644 --- a/src/Squidex.Domain.Apps.Write/Contents/Commands/ContentCommand.cs +++ b/src/Squidex.Domain.Apps.Write/Contents/Commands/ContentCommand.cs @@ -8,7 +8,7 @@ using System; using System.Security.Claims; -using Squidex.Infrastructure.CQRS.Commands; +using Squidex.Infrastructure.Commands; namespace Squidex.Domain.Apps.Write.Contents.Commands { diff --git a/src/Squidex.Domain.Apps.Write/Contents/ContentCommandMiddleware.cs b/src/Squidex.Domain.Apps.Write/Contents/ContentCommandMiddleware.cs index e4ecb773c..5c111c5bd 100644 --- a/src/Squidex.Domain.Apps.Write/Contents/ContentCommandMiddleware.cs +++ b/src/Squidex.Domain.Apps.Write/Contents/ContentCommandMiddleware.cs @@ -15,7 +15,7 @@ using Squidex.Domain.Apps.Read.Contents.Repositories; using Squidex.Domain.Apps.Write.Contents.Commands; using Squidex.Domain.Apps.Write.Contents.Guards; using Squidex.Infrastructure; -using Squidex.Infrastructure.CQRS.Commands; +using Squidex.Infrastructure.Commands; using Squidex.Infrastructure.Dispatching; namespace Squidex.Domain.Apps.Write.Contents diff --git a/src/Squidex.Domain.Apps.Write/Contents/ContentDataChangedResult.cs b/src/Squidex.Domain.Apps.Write/Contents/ContentDataChangedResult.cs index 44bce98d5..9eb6b0432 100644 --- a/src/Squidex.Domain.Apps.Write/Contents/ContentDataChangedResult.cs +++ b/src/Squidex.Domain.Apps.Write/Contents/ContentDataChangedResult.cs @@ -7,7 +7,7 @@ // ========================================================================== using Squidex.Domain.Apps.Core.Contents; -using Squidex.Infrastructure.CQRS.Commands; +using Squidex.Infrastructure.Commands; namespace Squidex.Domain.Apps.Write.Contents { diff --git a/src/Squidex.Domain.Apps.Write/Contents/ContentDomainObject.cs b/src/Squidex.Domain.Apps.Write/Contents/ContentDomainObject.cs index 0857bd78e..bd3925f50 100644 --- a/src/Squidex.Domain.Apps.Write/Contents/ContentDomainObject.cs +++ b/src/Squidex.Domain.Apps.Write/Contents/ContentDomainObject.cs @@ -12,7 +12,7 @@ using Squidex.Domain.Apps.Events.Contents; using Squidex.Domain.Apps.Write.Contents.Commands; using Squidex.Infrastructure; using Squidex.Infrastructure.CQRS; -using Squidex.Infrastructure.CQRS.Events; +using Squidex.Infrastructure.EventSourcing; using Squidex.Infrastructure.Dispatching; using Squidex.Infrastructure.Reflection; diff --git a/src/Squidex.Domain.Apps.Write/Contents/ContentVersionLoader.cs b/src/Squidex.Domain.Apps.Write/Contents/ContentVersionLoader.cs index ad7743c0a..acdd5cd84 100644 --- a/src/Squidex.Domain.Apps.Write/Contents/ContentVersionLoader.cs +++ b/src/Squidex.Domain.Apps.Write/Contents/ContentVersionLoader.cs @@ -12,7 +12,7 @@ using System.Threading.Tasks; using Squidex.Domain.Apps.Core.Contents; using Squidex.Domain.Apps.Events.Contents; using Squidex.Infrastructure; -using Squidex.Infrastructure.CQRS.Events; +using Squidex.Infrastructure.EventSourcing; namespace Squidex.Domain.Apps.Write.Contents { diff --git a/src/Squidex.Domain.Apps.Write/Rules/Commands/RuleAggregateCommand.cs b/src/Squidex.Domain.Apps.Write/Rules/Commands/RuleAggregateCommand.cs index 4af936af5..d240c8957 100644 --- a/src/Squidex.Domain.Apps.Write/Rules/Commands/RuleAggregateCommand.cs +++ b/src/Squidex.Domain.Apps.Write/Rules/Commands/RuleAggregateCommand.cs @@ -7,7 +7,7 @@ // ========================================================================== using System; -using Squidex.Infrastructure.CQRS.Commands; +using Squidex.Infrastructure.Commands; namespace Squidex.Domain.Apps.Write.Rules.Commands { diff --git a/src/Squidex.Domain.Apps.Write/Rules/RuleCommandMiddleware.cs b/src/Squidex.Domain.Apps.Write/Rules/RuleCommandMiddleware.cs index 7a29bd301..302951f90 100644 --- a/src/Squidex.Domain.Apps.Write/Rules/RuleCommandMiddleware.cs +++ b/src/Squidex.Domain.Apps.Write/Rules/RuleCommandMiddleware.cs @@ -12,7 +12,7 @@ using Squidex.Domain.Apps.Read; using Squidex.Domain.Apps.Write.Rules.Commands; using Squidex.Domain.Apps.Write.Rules.Guards; using Squidex.Infrastructure; -using Squidex.Infrastructure.CQRS.Commands; +using Squidex.Infrastructure.Commands; using Squidex.Infrastructure.Dispatching; namespace Squidex.Domain.Apps.Write.Rules diff --git a/src/Squidex.Domain.Apps.Write/Rules/RuleDomainObject.cs b/src/Squidex.Domain.Apps.Write/Rules/RuleDomainObject.cs index edf8c63d2..030c65b9e 100644 --- a/src/Squidex.Domain.Apps.Write/Rules/RuleDomainObject.cs +++ b/src/Squidex.Domain.Apps.Write/Rules/RuleDomainObject.cs @@ -13,7 +13,7 @@ using Squidex.Domain.Apps.Events.Rules.Utils; using Squidex.Domain.Apps.Write.Rules.Commands; using Squidex.Infrastructure; using Squidex.Infrastructure.CQRS; -using Squidex.Infrastructure.CQRS.Events; +using Squidex.Infrastructure.EventSourcing; using Squidex.Infrastructure.Dispatching; using Squidex.Infrastructure.Reflection; diff --git a/src/Squidex.Domain.Apps.Write/SchemaAggregateCommand.cs b/src/Squidex.Domain.Apps.Write/SchemaAggregateCommand.cs index aff4bc115..fc5e43ae8 100644 --- a/src/Squidex.Domain.Apps.Write/SchemaAggregateCommand.cs +++ b/src/Squidex.Domain.Apps.Write/SchemaAggregateCommand.cs @@ -7,7 +7,7 @@ // ========================================================================== using System; -using Squidex.Infrastructure.CQRS.Commands; +using Squidex.Infrastructure.Commands; namespace Squidex.Domain.Apps.Write { diff --git a/src/Squidex.Domain.Apps.Write/Schemas/Commands/CreateSchema.cs b/src/Squidex.Domain.Apps.Write/Schemas/Commands/CreateSchema.cs index a037119df..b8a9bbcd0 100644 --- a/src/Squidex.Domain.Apps.Write/Schemas/Commands/CreateSchema.cs +++ b/src/Squidex.Domain.Apps.Write/Schemas/Commands/CreateSchema.cs @@ -8,7 +8,7 @@ using System; using Squidex.Domain.Apps.Core.Schemas; -using Squidex.Infrastructure.CQRS.Commands; +using Squidex.Infrastructure.Commands; using SchemaFields = System.Collections.Generic.List; namespace Squidex.Domain.Apps.Write.Schemas.Commands diff --git a/src/Squidex.Domain.Apps.Write/Schemas/SchemaCommandMiddleware.cs b/src/Squidex.Domain.Apps.Write/Schemas/SchemaCommandMiddleware.cs index a651a264f..71837b91a 100644 --- a/src/Squidex.Domain.Apps.Write/Schemas/SchemaCommandMiddleware.cs +++ b/src/Squidex.Domain.Apps.Write/Schemas/SchemaCommandMiddleware.cs @@ -13,7 +13,7 @@ using Squidex.Domain.Apps.Read; using Squidex.Domain.Apps.Write.Schemas.Commands; using Squidex.Domain.Apps.Write.Schemas.Guards; using Squidex.Infrastructure; -using Squidex.Infrastructure.CQRS.Commands; +using Squidex.Infrastructure.Commands; using Squidex.Infrastructure.Dispatching; namespace Squidex.Domain.Apps.Write.Schemas diff --git a/src/Squidex.Domain.Apps.Write/Schemas/SchemaDomainObject.cs b/src/Squidex.Domain.Apps.Write/Schemas/SchemaDomainObject.cs index bd7840709..e8cb5de10 100644 --- a/src/Squidex.Domain.Apps.Write/Schemas/SchemaDomainObject.cs +++ b/src/Squidex.Domain.Apps.Write/Schemas/SchemaDomainObject.cs @@ -14,7 +14,7 @@ using Squidex.Domain.Apps.Events.Schemas.Utils; using Squidex.Domain.Apps.Write.Schemas.Commands; using Squidex.Infrastructure; using Squidex.Infrastructure.CQRS; -using Squidex.Infrastructure.CQRS.Events; +using Squidex.Infrastructure.EventSourcing; using Squidex.Infrastructure.Dispatching; using Squidex.Infrastructure.Reflection; diff --git a/src/Squidex.Domain.Apps.Write/SquidexCommand.cs b/src/Squidex.Domain.Apps.Write/SquidexCommand.cs index 80d283fdb..09507a691 100644 --- a/src/Squidex.Domain.Apps.Write/SquidexCommand.cs +++ b/src/Squidex.Domain.Apps.Write/SquidexCommand.cs @@ -7,7 +7,7 @@ // ========================================================================== using Squidex.Infrastructure; -using Squidex.Infrastructure.CQRS.Commands; +using Squidex.Infrastructure.Commands; namespace Squidex.Domain.Apps.Write { diff --git a/src/Squidex.Infrastructure.GetEventStore/CQRS/Events/Formatter.cs b/src/Squidex.Infrastructure.GetEventStore/EventSourcing/Events/Formatter.cs similarity index 96% rename from src/Squidex.Infrastructure.GetEventStore/CQRS/Events/Formatter.cs rename to src/Squidex.Infrastructure.GetEventStore/EventSourcing/Events/Formatter.cs index 465ac261a..e3cda0aef 100644 --- a/src/Squidex.Infrastructure.GetEventStore/CQRS/Events/Formatter.cs +++ b/src/Squidex.Infrastructure.GetEventStore/EventSourcing/Events/Formatter.cs @@ -10,7 +10,7 @@ using System.Text; using EventStore.ClientAPI; using EventStoreData = EventStore.ClientAPI.EventData; -namespace Squidex.Infrastructure.CQRS.Events +namespace Squidex.Infrastructure.EventSourcing { public static class Formatter { diff --git a/src/Squidex.Infrastructure.GetEventStore/CQRS/Events/GetEventStore.cs b/src/Squidex.Infrastructure.GetEventStore/EventSourcing/Events/GetEventStore.cs similarity index 95% rename from src/Squidex.Infrastructure.GetEventStore/CQRS/Events/GetEventStore.cs rename to src/Squidex.Infrastructure.GetEventStore/EventSourcing/Events/GetEventStore.cs index a86d0feed..c69497a62 100644 --- a/src/Squidex.Infrastructure.GetEventStore/CQRS/Events/GetEventStore.cs +++ b/src/Squidex.Infrastructure.GetEventStore/EventSourcing/Events/GetEventStore.cs @@ -13,7 +13,7 @@ using System.Threading; using System.Threading.Tasks; using EventStore.ClientAPI; -namespace Squidex.Infrastructure.CQRS.Events +namespace Squidex.Infrastructure.EventSourcing { public sealed class GetEventStore : IEventStore, IExternalSystem { @@ -59,11 +59,11 @@ namespace Squidex.Infrastructure.CQRS.Events throw new NotSupportedException(); } - public async Task> GetEventsAsync(string streamName, int position = -1) + public async Task> GetEventsAsync(string streamName, long streamPosition = -1) { var result = new List(); - var sliceStart = 0L; + var sliceStart = streamPosition; StreamEventsSlice currentSlice; do @@ -92,7 +92,7 @@ namespace Squidex.Infrastructure.CQRS.Events return AppendEventsInternalAsync(streamName, ExpectedVersion.Any, events); } - public Task AppendEventsAsync(Guid commitId, string streamName, int expectedVersion, ICollection events) + public Task AppendEventsAsync(Guid commitId, string streamName, long expectedVersion, ICollection events) { Guard.GreaterEquals(expectedVersion, -1, nameof(expectedVersion)); diff --git a/src/Squidex.Infrastructure.GetEventStore/CQRS/Events/GetEventStoreSubscription.cs b/src/Squidex.Infrastructure.GetEventStore/EventSourcing/Events/GetEventStoreSubscription.cs similarity index 99% rename from src/Squidex.Infrastructure.GetEventStore/CQRS/Events/GetEventStoreSubscription.cs rename to src/Squidex.Infrastructure.GetEventStore/EventSourcing/Events/GetEventStoreSubscription.cs index 53799cf95..98c0f1067 100644 --- a/src/Squidex.Infrastructure.GetEventStore/CQRS/Events/GetEventStoreSubscription.cs +++ b/src/Squidex.Infrastructure.GetEventStore/EventSourcing/Events/GetEventStoreSubscription.cs @@ -18,7 +18,7 @@ using EventStore.ClientAPI.Exceptions; using EventStore.ClientAPI.Projections; using Squidex.Infrastructure.Tasks; -namespace Squidex.Infrastructure.CQRS.Events +namespace Squidex.Infrastructure.EventSourcing { internal sealed class GetEventStoreSubscription : IEventSubscription { diff --git a/src/Squidex.Infrastructure.MongoDb/CQRS/Events/MongoEvent.cs b/src/Squidex.Infrastructure.MongoDb/EventSourcing/MongoEvent.cs similarity index 95% rename from src/Squidex.Infrastructure.MongoDb/CQRS/Events/MongoEvent.cs rename to src/Squidex.Infrastructure.MongoDb/EventSourcing/MongoEvent.cs index 09d12b024..d0eb942f5 100644 --- a/src/Squidex.Infrastructure.MongoDb/CQRS/Events/MongoEvent.cs +++ b/src/Squidex.Infrastructure.MongoDb/EventSourcing/MongoEvent.cs @@ -10,7 +10,7 @@ using System; using MongoDB.Bson.Serialization.Attributes; using Squidex.Infrastructure.Reflection; -namespace Squidex.Infrastructure.CQRS.Events +namespace Squidex.Infrastructure.EventSourcing { public class MongoEvent { diff --git a/src/Squidex.Infrastructure.MongoDb/CQRS/Events/MongoEventCommit.cs b/src/Squidex.Infrastructure.MongoDb/EventSourcing/MongoEventCommit.cs similarity index 95% rename from src/Squidex.Infrastructure.MongoDb/CQRS/Events/MongoEventCommit.cs rename to src/Squidex.Infrastructure.MongoDb/EventSourcing/MongoEventCommit.cs index 731d7a829..c2a03bd03 100644 --- a/src/Squidex.Infrastructure.MongoDb/CQRS/Events/MongoEventCommit.cs +++ b/src/Squidex.Infrastructure.MongoDb/EventSourcing/MongoEventCommit.cs @@ -10,7 +10,7 @@ using System; using MongoDB.Bson; using MongoDB.Bson.Serialization.Attributes; -namespace Squidex.Infrastructure.CQRS.Events +namespace Squidex.Infrastructure.EventSourcing { public sealed class MongoEventCommit { diff --git a/src/Squidex.Infrastructure.MongoDb/CQRS/Events/MongoEventStore.cs b/src/Squidex.Infrastructure.MongoDb/EventSourcing/MongoEventStore.cs similarity index 96% rename from src/Squidex.Infrastructure.MongoDb/CQRS/Events/MongoEventStore.cs rename to src/Squidex.Infrastructure.MongoDb/EventSourcing/MongoEventStore.cs index 7e73ffe19..6704db329 100644 --- a/src/Squidex.Infrastructure.MongoDb/CQRS/Events/MongoEventStore.cs +++ b/src/Squidex.Infrastructure.MongoDb/EventSourcing/MongoEventStore.cs @@ -8,16 +8,14 @@ using System; using System.Collections.Generic; -using System.Linq; using System.Reactive.Linq; using System.Threading; using System.Threading.Tasks; using MongoDB.Bson; using MongoDB.Driver; using Squidex.Infrastructure.MongoDb; -using Squidex.Infrastructure.Tasks; -namespace Squidex.Infrastructure.CQRS.Events +namespace Squidex.Infrastructure.EventSourcing { public class MongoEventStore : MongoRepositoryBase, IEventStore { @@ -63,9 +61,9 @@ namespace Squidex.Infrastructure.CQRS.Events return new PollingSubscription(this, notifier, subscriber, streamFilter, position); } - public async Task> GetEventsAsync(string streamName, int position = -1) + public async Task> GetEventsAsync(string streamName, long streamPosition = -1) { - var commits = await Collection.Find(x => x.EventStreamOffset > position).Sort(Sort.Ascending(TimestampField)).ToListAsync(); + var commits = await Collection.Find(x => x.EventStreamOffset >= streamPosition).Sort(Sort.Ascending(TimestampField)).ToListAsync(); var result = new List(); @@ -80,7 +78,7 @@ namespace Squidex.Infrastructure.CQRS.Events { eventStreamOffset++; - if (eventStreamOffset > position) + if (eventStreamOffset >= streamPosition) { var eventData = e.ToEventData(); var eventToken = new StreamPosition(commitTimestamp, commitOffset, commit.Events.Length); @@ -130,7 +128,7 @@ namespace Squidex.Infrastructure.CQRS.Events return AppendEventsInternalAsync(commitId, streamName, AnyVersion, events); } - public Task AppendEventsAsync(Guid commitId, string streamName, int expectedVersion, ICollection events) + public Task AppendEventsAsync(Guid commitId, string streamName, long expectedVersion, ICollection events) { Guard.GreaterEquals(expectedVersion, -1, nameof(expectedVersion)); diff --git a/src/Squidex.Infrastructure.MongoDb/CQRS/Events/StreamPosition.cs b/src/Squidex.Infrastructure.MongoDb/EventSourcing/StreamPosition.cs similarity index 97% rename from src/Squidex.Infrastructure.MongoDb/CQRS/Events/StreamPosition.cs rename to src/Squidex.Infrastructure.MongoDb/EventSourcing/StreamPosition.cs index 1ac1d3850..1bc2f1834 100644 --- a/src/Squidex.Infrastructure.MongoDb/CQRS/Events/StreamPosition.cs +++ b/src/Squidex.Infrastructure.MongoDb/EventSourcing/StreamPosition.cs @@ -8,7 +8,7 @@ using MongoDB.Bson; -namespace Squidex.Infrastructure.CQRS.Events +namespace Squidex.Infrastructure.EventSourcing { public sealed class StreamPosition { diff --git a/src/Squidex.Infrastructure.MongoDb/States/MongoSnapshotStore.cs b/src/Squidex.Infrastructure.MongoDb/States/MongoSnapshotStore.cs index 60d8529e5..c9d728434 100644 --- a/src/Squidex.Infrastructure.MongoDb/States/MongoSnapshotStore.cs +++ b/src/Squidex.Infrastructure.MongoDb/States/MongoSnapshotStore.cs @@ -40,7 +40,7 @@ namespace Squidex.Infrastructure.States } } - public async Task<(T Value, string Etag)> ReadAsync(string key) + public async Task<(T Value, long Version)> ReadAsync(string key) { var collection = GetCollection(); @@ -50,13 +50,13 @@ namespace Squidex.Infrastructure.States if (existing != null) { - return (existing.Doc, existing.Etag); + return (existing.Doc, existing.Version); } - return (default(T), null); + return (default(T), -1); } - public async Task WriteAsync(string key, T value, string oldEtag, string newEtag) + public async Task WriteAsync(string key, T value, long oldVersion, long newVersion) { var collection = GetCollection(); @@ -65,24 +65,24 @@ namespace Squidex.Infrastructure.States await collection.UpdateOneAsync( Builders>.Filter.And( Builders>.Filter.Eq(x => x.Id, key), - Builders>.Filter.Eq(x => x.Etag, oldEtag) + Builders>.Filter.Eq(x => x.Version, oldVersion) ), Builders>.Update .Set(x => x.Doc, value) - .Set(x => x.Etag, newEtag), + .Set(x => x.Version, newVersion), Upsert); } catch (MongoWriteException ex) { if (ex.WriteError.Category == ServerErrorCategory.DuplicateKey) { - var existingEtag = + var existingVersion = await collection.Find(x => x.Id == key) .Project>(Builders>.Projection.Exclude(x => x.Id)).FirstOrDefaultAsync(); - if (existingEtag != null) + if (existingVersion != null) { - throw new InconsistentStateException(existingEtag.Etag, oldEtag, ex); + throw new InconsistentStateException(existingVersion.Version, oldVersion, ex); } } else diff --git a/src/Squidex.Infrastructure.MongoDb/States/MongoState.cs b/src/Squidex.Infrastructure.MongoDb/States/MongoState.cs index 12ebab2e3..448bb45f6 100644 --- a/src/Squidex.Infrastructure.MongoDb/States/MongoState.cs +++ b/src/Squidex.Infrastructure.MongoDb/States/MongoState.cs @@ -21,7 +21,7 @@ namespace Squidex.Infrastructure.States [BsonRequired] [BsonElement] - public string Etag { get; set; } + public long Version { get; set; } [BsonRequired] [BsonElement] diff --git a/src/Squidex.Infrastructure.RabbitMq/CQRS/Events/RabbitMqEventConsumer.cs b/src/Squidex.Infrastructure.RabbitMq/CQRS/Events/RabbitMqEventConsumer.cs index df5dfdf2e..ecf9ce5e9 100644 --- a/src/Squidex.Infrastructure.RabbitMq/CQRS/Events/RabbitMqEventConsumer.cs +++ b/src/Squidex.Infrastructure.RabbitMq/CQRS/Events/RabbitMqEventConsumer.cs @@ -13,7 +13,7 @@ using Newtonsoft.Json; using RabbitMQ.Client; using Squidex.Infrastructure.Tasks; -namespace Squidex.Infrastructure.CQRS.Events +namespace Squidex.Infrastructure.EventSourcing { public sealed class RabbitMqEventConsumer : DisposableObjectBase, IExternalSystem, IEventConsumer { diff --git a/src/Squidex.Infrastructure/Commands/AggregateHandler.cs b/src/Squidex.Infrastructure/Commands/AggregateHandler.cs index 95c3932be..6badd2691 100644 --- a/src/Squidex.Infrastructure/Commands/AggregateHandler.cs +++ b/src/Squidex.Infrastructure/Commands/AggregateHandler.cs @@ -8,24 +8,22 @@ using System; using System.Threading.Tasks; -using Squidex.Infrastructure.CQRS.Events; +using Squidex.Infrastructure.States; -namespace Squidex.Infrastructure.CQRS.Commands +namespace Squidex.Infrastructure.Commands { public sealed class AggregateHandler : IAggregateHandler { - private readonly IDomainObjectRepository domainObjectRepository; - private readonly IDomainObjectFactory domainObjectFactory; + private readonly IStateFactory stateFactory; + private readonly IServiceProvider serviceProvider; - public AggregateHandler( - IDomainObjectFactory domainObjectFactory, - IDomainObjectRepository domainObjectRepository) + public AggregateHandler(IStateFactory stateFactory, IServiceProvider serviceProvider) { - Guard.NotNull(domainObjectFactory, nameof(domainObjectFactory)); - Guard.NotNull(domainObjectRepository, nameof(domainObjectRepository)); + Guard.NotNull(stateFactory, nameof(stateFactory)); + Guard.NotNull(serviceProvider, nameof(serviceProvider)); - this.domainObjectFactory = domainObjectFactory; - this.domainObjectRepository = domainObjectRepository; + this.stateFactory = stateFactory; + this.serviceProvider = serviceProvider; } public Task CreateAsync(CommandContext context, Func creator) where T : class, IAggregate @@ -47,39 +45,28 @@ namespace Squidex.Infrastructure.CQRS.Commands Guard.NotNull(context, nameof(context)); var aggregateCommand = GetCommand(context); - var aggregateObject = domainObjectFactory.CreateNew(aggregateCommand.AggregateId); + var aggregateFactory = (DomainObjectFactoryFunction)serviceProvider.GetService(typeof(DomainObjectFactoryFunction)); - if (isUpdate) - { - await domainObjectRepository.LoadAsync(aggregateObject, aggregateCommand.ExpectedVersion); - } - - await handler(aggregateObject); - - var events = aggregateObject.GetUncomittedEvents(); - - foreach (var @event in events) - { - @event.SetAggregateId(aggregateObject.Id); - } + var wrapper = await stateFactory.GetDetachedAsync>(aggregateCommand.AggregateId.ToString()); - await domainObjectRepository.SaveAsync(aggregateObject, events, Guid.NewGuid()); + var domainObject = aggregateFactory(aggregateCommand.AggregateId); - aggregateObject.ClearUncommittedEvents(); + await wrapper.LoadAsync(domainObject, isUpdate ? aggregateCommand.ExpectedVersion : -1); + await wrapper.UpdateAsync(handler); if (!context.IsCompleted) { if (isUpdate) { - context.Complete(new EntitySavedResult(aggregateObject.Version)); + context.Complete(new EntitySavedResult(domainObject.Version)); } else { - context.Complete(EntityCreatedResult.Create(aggregateObject.Id, aggregateObject.Version)); + context.Complete(EntityCreatedResult.Create(domainObject.Id, domainObject.Version)); } } - return aggregateObject; + return domainObject; } private static IAggregateCommand GetCommand(CommandContext context) diff --git a/src/Squidex.Infrastructure/Commands/CommandContext.cs b/src/Squidex.Infrastructure/Commands/CommandContext.cs index 1c89e9cf2..184360056 100644 --- a/src/Squidex.Infrastructure/Commands/CommandContext.cs +++ b/src/Squidex.Infrastructure/Commands/CommandContext.cs @@ -8,7 +8,7 @@ using System; -namespace Squidex.Infrastructure.CQRS.Commands +namespace Squidex.Infrastructure.Commands { public sealed class CommandContext { diff --git a/src/Squidex.Infrastructure/Commands/CommandingExtensions.cs b/src/Squidex.Infrastructure/Commands/CommandExtensions.cs similarity index 93% rename from src/Squidex.Infrastructure/Commands/CommandingExtensions.cs rename to src/Squidex.Infrastructure/Commands/CommandExtensions.cs index bbc75d16b..86c7640cd 100644 --- a/src/Squidex.Infrastructure/Commands/CommandingExtensions.cs +++ b/src/Squidex.Infrastructure/Commands/CommandExtensions.cs @@ -10,9 +10,9 @@ using System; using System.Threading.Tasks; using Squidex.Infrastructure.Tasks; -namespace Squidex.Infrastructure.CQRS.Commands +namespace Squidex.Infrastructure.Commands { - public static class CommandingExtensions + public static class CommandExtensions { public static Task CreateAsync(this IAggregateHandler handler, CommandContext context, Action creator) where T : class, IAggregate { diff --git a/src/Squidex.Infrastructure/Commands/DefaultDomainObjectFactory.cs b/src/Squidex.Infrastructure/Commands/DefaultDomainObjectFactory.cs deleted file mode 100644 index 4e1bbaba2..000000000 --- a/src/Squidex.Infrastructure/Commands/DefaultDomainObjectFactory.cs +++ /dev/null @@ -1,46 +0,0 @@ -// ========================================================================== -// DefaultDomainObjectFactory.cs -// Squidex Headless CMS -// ========================================================================== -// Copyright (c) Squidex Group -// All rights reserved. -// ========================================================================== - -using System; - -namespace Squidex.Infrastructure.CQRS.Commands -{ - public delegate T DomainObjectFactoryFunction(Guid id) - where T : IAggregate; - - public class DefaultDomainObjectFactory : IDomainObjectFactory - { - private readonly IServiceProvider serviceProvider; - - public DefaultDomainObjectFactory(IServiceProvider serviceProvider) - { - Guard.NotNull(serviceProvider, nameof(serviceProvider)); - - this.serviceProvider = serviceProvider; - } - - public T CreateNew(Guid id) where T : IAggregate - { - var factoryFunction = (DomainObjectFactoryFunction)serviceProvider.GetService(typeof(DomainObjectFactoryFunction)); - - if (factoryFunction == null) - { - throw new InvalidOperationException($"No factory registered for {typeof(T)}"); - } - - var domainObject = factoryFunction.Invoke(id); - - if (domainObject.Version != -1) - { - throw new InvalidOperationException("Must have a version of -1."); - } - - return domainObject; - } - } -} diff --git a/src/Squidex.Infrastructure/Commands/DefaultDomainObjectRepository.cs b/src/Squidex.Infrastructure/Commands/DefaultDomainObjectRepository.cs deleted file mode 100644 index 243fe65dc..000000000 --- a/src/Squidex.Infrastructure/Commands/DefaultDomainObjectRepository.cs +++ /dev/null @@ -1,94 +0,0 @@ -// ========================================================================== -// DefaultDomainObjectRepository.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 Squidex.Infrastructure.CQRS.Events; - -namespace Squidex.Infrastructure.CQRS.Commands -{ - public sealed class DefaultDomainObjectRepository : IDomainObjectRepository - { - private readonly IStreamNameResolver nameResolver; - private readonly IEventStore eventStore; - private readonly EventDataFormatter formatter; - - public DefaultDomainObjectRepository(IEventStore eventStore, IStreamNameResolver nameResolver, EventDataFormatter formatter) - { - Guard.NotNull(formatter, nameof(formatter)); - Guard.NotNull(eventStore, nameof(eventStore)); - Guard.NotNull(nameResolver, nameof(nameResolver)); - - this.formatter = formatter; - this.eventStore = eventStore; - this.nameResolver = nameResolver; - } - - public async Task LoadAsync(IAggregate domainObject, long? expectedVersion = null) - { - var streamName = nameResolver.GetStreamName(domainObject.GetType(), domainObject.Id.ToString()); - - var events = await eventStore.GetEventsAsync(streamName); - - if (events.Count == 0) - { - throw new DomainObjectNotFoundException(domainObject.Id.ToString(), domainObject.GetType()); - } - - foreach (var storedEvent in events) - { - var envelope = ParseKnownEvent(storedEvent); - - if (envelope != null) - { - domainObject.ApplyEvent(envelope); - } - } - - if (expectedVersion != null && domainObject.Version != expectedVersion.Value) - { - throw new DomainObjectVersionException(domainObject.Id.ToString(), domainObject.GetType(), domainObject.Version, expectedVersion.Value); - } - } - - public async Task SaveAsync(IAggregate domainObject, ICollection> events, Guid commitId) - { - Guard.NotNull(domainObject, nameof(domainObject)); - - var streamName = nameResolver.GetStreamName(domainObject.GetType(), domainObject.Id.ToString()); - - var versionCurrent = domainObject.Version; - var versionExpected = versionCurrent - events.Count; - - var eventsToSave = events.Select(x => formatter.ToEventData(x, commitId)).ToList(); - - try - { - await eventStore.AppendEventsAsync(commitId, streamName, versionExpected, eventsToSave); - } - catch (WrongEventVersionException) - { - throw new DomainObjectVersionException(domainObject.Id.ToString(), domainObject.GetType(), versionCurrent, versionExpected); - } - } - - private Envelope ParseKnownEvent(StoredEvent storedEvent) - { - try - { - return formatter.Parse(storedEvent.Data); - } - catch (TypeNameNotFoundException) - { - return null; - } - } - } -} diff --git a/src/Squidex.Infrastructure/Commands/DomainObjectBase.cs b/src/Squidex.Infrastructure/Commands/DomainObjectBase.cs index ee39eee27..bd7595cce 100644 --- a/src/Squidex.Infrastructure/Commands/DomainObjectBase.cs +++ b/src/Squidex.Infrastructure/Commands/DomainObjectBase.cs @@ -8,9 +8,9 @@ using System; using System.Collections.Generic; -using Squidex.Infrastructure.CQRS.Events; +using Squidex.Infrastructure.EventSourcing; -namespace Squidex.Infrastructure.CQRS +namespace Squidex.Infrastructure.Commands { public abstract class DomainObjectBase : IAggregate, IEquatable { diff --git a/src/Squidex.Infrastructure/Commands/DomainObjectWrapper.cs b/src/Squidex.Infrastructure/Commands/DomainObjectWrapper.cs new file mode 100644 index 000000000..9eb8a7303 --- /dev/null +++ b/src/Squidex.Infrastructure/Commands/DomainObjectWrapper.cs @@ -0,0 +1,55 @@ +// ========================================================================== +// DomainObjectWrapper.cs +// Squidex Headless CMS +// ========================================================================== +// Copyright (c) Squidex Group +// All rights reserved. +// ========================================================================== + +using System; +using System.Linq; +using System.Threading.Tasks; +using Squidex.Infrastructure.EventSourcing; +using Squidex.Infrastructure.States; +using Squidex.Infrastructure.Tasks; + +namespace Squidex.Infrastructure.Commands +{ + public delegate T DomainObjectFactoryFunction(Guid id) where T : IAggregate; + + public sealed class DomainObjectWrapper : IStatefulObject where T : IAggregate + { + private IPersistence persistence; + private T domainObject; + + public Task ActivateAsync(string key, IStore store) + { + persistence = store.WithEventSourcing(key, e => domainObject.ApplyEvent(e)); + + return TaskHelper.Done; + } + + public Task LoadAsync(T domainObject, long? expectedVersion) + { + this.domainObject = domainObject; + + return persistence.ReadAsync(expectedVersion); + } + + public async Task UpdateAsync(Func handler) + { + await handler(domainObject); + + var events = domainObject.GetUncomittedEvents(); + + foreach (var @event in events) + { + @event.SetAggregateId(domainObject.Id); + } + + await persistence.WriteEventsAsync(events.ToArray()); + + domainObject.ClearUncommittedEvents(); + } + } +} diff --git a/src/Squidex.Infrastructure/Commands/EnrichWithTimestampCommandMiddleware.cs b/src/Squidex.Infrastructure/Commands/EnrichWithTimestampCommandMiddleware.cs index 111e62e3a..aedbb20f5 100644 --- a/src/Squidex.Infrastructure/Commands/EnrichWithTimestampCommandMiddleware.cs +++ b/src/Squidex.Infrastructure/Commands/EnrichWithTimestampCommandMiddleware.cs @@ -10,7 +10,7 @@ using System; using System.Threading.Tasks; using NodaTime; -namespace Squidex.Infrastructure.CQRS.Commands +namespace Squidex.Infrastructure.Commands { public sealed class EnrichWithTimestampCommandMiddleware : ICommandMiddleware { diff --git a/src/Squidex.Infrastructure/Commands/EntityCreatedResult.cs b/src/Squidex.Infrastructure/Commands/EntityCreatedResult.cs index 259b836df..271c177c6 100644 --- a/src/Squidex.Infrastructure/Commands/EntityCreatedResult.cs +++ b/src/Squidex.Infrastructure/Commands/EntityCreatedResult.cs @@ -6,7 +6,7 @@ // All rights reserved. // ========================================================================== -namespace Squidex.Infrastructure.CQRS.Commands +namespace Squidex.Infrastructure.Commands { public static class EntityCreatedResult { diff --git a/src/Squidex.Infrastructure/Commands/EntityCreatedResult{T}.cs b/src/Squidex.Infrastructure/Commands/EntityCreatedResult{T}.cs index 7b56d620c..60cd4b5d8 100644 --- a/src/Squidex.Infrastructure/Commands/EntityCreatedResult{T}.cs +++ b/src/Squidex.Infrastructure/Commands/EntityCreatedResult{T}.cs @@ -6,7 +6,7 @@ // All rights reserved. // ========================================================================== -namespace Squidex.Infrastructure.CQRS.Commands +namespace Squidex.Infrastructure.Commands { public sealed class EntityCreatedResult : EntitySavedResult { diff --git a/src/Squidex.Infrastructure/Commands/EntitySavedResult.cs b/src/Squidex.Infrastructure/Commands/EntitySavedResult.cs index deef50b7c..a5e644640 100644 --- a/src/Squidex.Infrastructure/Commands/EntitySavedResult.cs +++ b/src/Squidex.Infrastructure/Commands/EntitySavedResult.cs @@ -6,7 +6,7 @@ // All rights reserved. // ========================================================================== -namespace Squidex.Infrastructure.CQRS.Commands +namespace Squidex.Infrastructure.Commands { public class EntitySavedResult { diff --git a/src/Squidex.Infrastructure/Commands/IAggregate.cs b/src/Squidex.Infrastructure/Commands/IAggregate.cs index adacdb095..abc522e2a 100644 --- a/src/Squidex.Infrastructure/Commands/IAggregate.cs +++ b/src/Squidex.Infrastructure/Commands/IAggregate.cs @@ -8,9 +8,9 @@ using System; using System.Collections.Generic; -using Squidex.Infrastructure.CQRS.Events; +using Squidex.Infrastructure.EventSourcing; -namespace Squidex.Infrastructure.CQRS +namespace Squidex.Infrastructure.Commands { public interface IAggregate { diff --git a/src/Squidex.Infrastructure/Commands/IAggregateCommand.cs b/src/Squidex.Infrastructure/Commands/IAggregateCommand.cs index ea306cdca..ae842838f 100644 --- a/src/Squidex.Infrastructure/Commands/IAggregateCommand.cs +++ b/src/Squidex.Infrastructure/Commands/IAggregateCommand.cs @@ -8,7 +8,7 @@ using System; -namespace Squidex.Infrastructure.CQRS.Commands +namespace Squidex.Infrastructure.Commands { public interface IAggregateCommand : ICommand { diff --git a/src/Squidex.Infrastructure/Commands/IAggregateHandler.cs b/src/Squidex.Infrastructure/Commands/IAggregateHandler.cs index 27a69d74b..77196fe19 100644 --- a/src/Squidex.Infrastructure/Commands/IAggregateHandler.cs +++ b/src/Squidex.Infrastructure/Commands/IAggregateHandler.cs @@ -9,7 +9,7 @@ using System; using System.Threading.Tasks; -namespace Squidex.Infrastructure.CQRS.Commands +namespace Squidex.Infrastructure.Commands { public interface IAggregateHandler { diff --git a/src/Squidex.Infrastructure/Commands/ICommand.cs b/src/Squidex.Infrastructure/Commands/ICommand.cs index fb3516b3b..f28392eb4 100644 --- a/src/Squidex.Infrastructure/Commands/ICommand.cs +++ b/src/Squidex.Infrastructure/Commands/ICommand.cs @@ -6,7 +6,7 @@ // All rights reserved. // ========================================================================== -namespace Squidex.Infrastructure.CQRS.Commands +namespace Squidex.Infrastructure.Commands { public interface ICommand { diff --git a/src/Squidex.Infrastructure/Commands/ICommandBus.cs b/src/Squidex.Infrastructure/Commands/ICommandBus.cs index fda57737b..da7c5af33 100644 --- a/src/Squidex.Infrastructure/Commands/ICommandBus.cs +++ b/src/Squidex.Infrastructure/Commands/ICommandBus.cs @@ -8,7 +8,7 @@ using System.Threading.Tasks; -namespace Squidex.Infrastructure.CQRS.Commands +namespace Squidex.Infrastructure.Commands { public interface ICommandBus { diff --git a/src/Squidex.Infrastructure/Commands/ICommandMiddleware.cs b/src/Squidex.Infrastructure/Commands/ICommandMiddleware.cs index 944f9f047..7856754ed 100644 --- a/src/Squidex.Infrastructure/Commands/ICommandMiddleware.cs +++ b/src/Squidex.Infrastructure/Commands/ICommandMiddleware.cs @@ -9,7 +9,7 @@ using System; using System.Threading.Tasks; -namespace Squidex.Infrastructure.CQRS.Commands +namespace Squidex.Infrastructure.Commands { public interface ICommandMiddleware { diff --git a/src/Squidex.Infrastructure/Commands/IDomainObjectRepository.cs b/src/Squidex.Infrastructure/Commands/IDomainObjectRepository.cs deleted file mode 100644 index c6dc0ee30..000000000 --- a/src/Squidex.Infrastructure/Commands/IDomainObjectRepository.cs +++ /dev/null @@ -1,22 +0,0 @@ -// ========================================================================== -// IDomainObjectRepository.cs -// Squidex Headless CMS -// ========================================================================== -// Copyright (c) Squidex Group -// All rights reserved. -// ========================================================================== - -using System; -using System.Collections.Generic; -using System.Threading.Tasks; -using Squidex.Infrastructure.CQRS.Events; - -namespace Squidex.Infrastructure.CQRS.Commands -{ - public interface IDomainObjectRepository - { - Task LoadAsync(IAggregate domainObject, long? expectedVersion = null); - - Task SaveAsync(IAggregate domainObject, ICollection> events, Guid commitId); - } -} \ No newline at end of file diff --git a/src/Squidex.Infrastructure/Commands/ITimestampCommand.cs b/src/Squidex.Infrastructure/Commands/ITimestampCommand.cs index 9dfb0a3cf..7a8990748 100644 --- a/src/Squidex.Infrastructure/Commands/ITimestampCommand.cs +++ b/src/Squidex.Infrastructure/Commands/ITimestampCommand.cs @@ -8,7 +8,7 @@ using NodaTime; -namespace Squidex.Infrastructure.CQRS.Commands +namespace Squidex.Infrastructure.Commands { public interface ITimestampCommand : ICommand { diff --git a/src/Squidex.Infrastructure/Commands/InMemoryCommandBus.cs b/src/Squidex.Infrastructure/Commands/InMemoryCommandBus.cs index d3803fad9..798cf6bb7 100644 --- a/src/Squidex.Infrastructure/Commands/InMemoryCommandBus.cs +++ b/src/Squidex.Infrastructure/Commands/InMemoryCommandBus.cs @@ -12,7 +12,7 @@ using System.Linq; using System.Threading.Tasks; using Squidex.Infrastructure.Tasks; -namespace Squidex.Infrastructure.CQRS.Commands +namespace Squidex.Infrastructure.Commands { public sealed class InMemoryCommandBus : ICommandBus { diff --git a/src/Squidex.Infrastructure/Commands/LogCommandMiddleware.cs b/src/Squidex.Infrastructure/Commands/LogCommandMiddleware.cs index 77fdad11a..7356207cb 100644 --- a/src/Squidex.Infrastructure/Commands/LogCommandMiddleware.cs +++ b/src/Squidex.Infrastructure/Commands/LogCommandMiddleware.cs @@ -10,7 +10,7 @@ using System; using System.Threading.Tasks; using Squidex.Infrastructure.Log; -namespace Squidex.Infrastructure.CQRS.Commands +namespace Squidex.Infrastructure.Commands { public sealed class LogCommandMiddleware : ICommandMiddleware { diff --git a/src/Squidex.Infrastructure/EventSourcing/CommonHeaders.cs b/src/Squidex.Infrastructure/EventSourcing/CommonHeaders.cs index 617123666..276289788 100644 --- a/src/Squidex.Infrastructure/EventSourcing/CommonHeaders.cs +++ b/src/Squidex.Infrastructure/EventSourcing/CommonHeaders.cs @@ -6,7 +6,7 @@ // All rights reserved. // ========================================================================== -namespace Squidex.Infrastructure.CQRS.Events +namespace Squidex.Infrastructure.EventSourcing { public static class CommonHeaders { diff --git a/src/Squidex.Infrastructure/EventSourcing/CompoundEventConsumer.cs b/src/Squidex.Infrastructure/EventSourcing/CompoundEventConsumer.cs index 463348dde..d13c963cb 100644 --- a/src/Squidex.Infrastructure/EventSourcing/CompoundEventConsumer.cs +++ b/src/Squidex.Infrastructure/EventSourcing/CompoundEventConsumer.cs @@ -9,7 +9,7 @@ using System.Linq; using System.Threading.Tasks; -namespace Squidex.Infrastructure.CQRS.Events +namespace Squidex.Infrastructure.EventSourcing { public sealed class CompoundEventConsumer : IEventConsumer { diff --git a/src/Squidex.Infrastructure/EventSourcing/DefaultEventNotifier.cs b/src/Squidex.Infrastructure/EventSourcing/DefaultEventNotifier.cs index d716c4b52..9514bf1bd 100644 --- a/src/Squidex.Infrastructure/EventSourcing/DefaultEventNotifier.cs +++ b/src/Squidex.Infrastructure/EventSourcing/DefaultEventNotifier.cs @@ -8,7 +8,7 @@ using System; -namespace Squidex.Infrastructure.CQRS.Events +namespace Squidex.Infrastructure.EventSourcing { public sealed class DefaultEventNotifier : IEventNotifier { diff --git a/src/Squidex.Infrastructure/EventSourcing/Envelope.cs b/src/Squidex.Infrastructure/EventSourcing/Envelope.cs index 8e00e88c0..d79701a07 100644 --- a/src/Squidex.Infrastructure/EventSourcing/Envelope.cs +++ b/src/Squidex.Infrastructure/EventSourcing/Envelope.cs @@ -9,7 +9,7 @@ using System; using NodaTime; -namespace Squidex.Infrastructure.CQRS.Events +namespace Squidex.Infrastructure.EventSourcing { public static class Envelope { diff --git a/src/Squidex.Infrastructure/EventSourcing/EnvelopeExtensions.cs b/src/Squidex.Infrastructure/EventSourcing/EnvelopeExtensions.cs index 485ae0668..e1cc4f7b5 100644 --- a/src/Squidex.Infrastructure/EventSourcing/EnvelopeExtensions.cs +++ b/src/Squidex.Infrastructure/EventSourcing/EnvelopeExtensions.cs @@ -10,7 +10,7 @@ using System; using System.Globalization; using NodaTime; -namespace Squidex.Infrastructure.CQRS.Events +namespace Squidex.Infrastructure.EventSourcing { public static class EnvelopeExtensions { diff --git a/src/Squidex.Infrastructure/EventSourcing/EnvelopeHeaders.cs b/src/Squidex.Infrastructure/EventSourcing/EnvelopeHeaders.cs index f95580f9d..9164b480d 100644 --- a/src/Squidex.Infrastructure/EventSourcing/EnvelopeHeaders.cs +++ b/src/Squidex.Infrastructure/EventSourcing/EnvelopeHeaders.cs @@ -6,7 +6,7 @@ // All rights reserved. // ========================================================================== -namespace Squidex.Infrastructure.CQRS.Events +namespace Squidex.Infrastructure.EventSourcing { public sealed class EnvelopeHeaders : PropertiesBag { diff --git a/src/Squidex.Infrastructure/EventSourcing/Envelope{T}.cs b/src/Squidex.Infrastructure/EventSourcing/Envelope{T}.cs index 64e6fa29a..109530e43 100644 --- a/src/Squidex.Infrastructure/EventSourcing/Envelope{T}.cs +++ b/src/Squidex.Infrastructure/EventSourcing/Envelope{T}.cs @@ -6,7 +6,7 @@ // All rights reserved. // ========================================================================== -namespace Squidex.Infrastructure.CQRS.Events +namespace Squidex.Infrastructure.EventSourcing { public class Envelope where T : class { diff --git a/src/Squidex.Infrastructure/EventSourcing/EventConsumerInfo.cs b/src/Squidex.Infrastructure/EventSourcing/EventConsumerInfo.cs index 08fbdf24c..81e50b9b8 100644 --- a/src/Squidex.Infrastructure/EventSourcing/EventConsumerInfo.cs +++ b/src/Squidex.Infrastructure/EventSourcing/EventConsumerInfo.cs @@ -6,7 +6,7 @@ // All rights reserved. // ========================================================================== -namespace Squidex.Infrastructure.CQRS.Events +namespace Squidex.Infrastructure.EventSourcing { public sealed class EventConsumerInfo { diff --git a/src/Squidex.Infrastructure/EventSourcing/EventData.cs b/src/Squidex.Infrastructure/EventSourcing/EventData.cs index fb96e0edf..94d72d3c0 100644 --- a/src/Squidex.Infrastructure/EventSourcing/EventData.cs +++ b/src/Squidex.Infrastructure/EventSourcing/EventData.cs @@ -8,7 +8,7 @@ using System; -namespace Squidex.Infrastructure.CQRS.Events +namespace Squidex.Infrastructure.EventSourcing { public class EventData { diff --git a/src/Squidex.Infrastructure/EventSourcing/EventTypeAttribute.cs b/src/Squidex.Infrastructure/EventSourcing/EventTypeAttribute.cs index 9723c1bdf..d4382a0c8 100644 --- a/src/Squidex.Infrastructure/EventSourcing/EventTypeAttribute.cs +++ b/src/Squidex.Infrastructure/EventSourcing/EventTypeAttribute.cs @@ -8,7 +8,7 @@ using System; -namespace Squidex.Infrastructure.CQRS.Events +namespace Squidex.Infrastructure.EventSourcing { [AttributeUsage(AttributeTargets.Class, Inherited = false)] public sealed class EventTypeAttribute : TypeNameAttribute diff --git a/src/Squidex.Infrastructure/EventSourcing/Grains/EventConsumerGrain.cs b/src/Squidex.Infrastructure/EventSourcing/Grains/EventConsumerGrain.cs index 3e8a0403b..2f5bd0cca 100644 --- a/src/Squidex.Infrastructure/EventSourcing/Grains/EventConsumerGrain.cs +++ b/src/Squidex.Infrastructure/EventSourcing/Grains/EventConsumerGrain.cs @@ -13,32 +13,32 @@ using Squidex.Infrastructure.Log; using Squidex.Infrastructure.States; using Squidex.Infrastructure.Tasks; -namespace Squidex.Infrastructure.CQRS.Events.Grains +namespace Squidex.Infrastructure.EventSourcing.Grains { public class EventConsumerGrain : DisposableObjectBase, IStatefulObject, IEventSubscriber { - private readonly EventDataFormatter formatter; + private readonly IEventDataFormatter eventDataFormatter; private readonly IEventStore eventStore; private readonly ISemanticLog log; private readonly SingleThreadedDispatcher dispatcher = new SingleThreadedDispatcher(1); private IEventSubscription currentSubscription; private IEventConsumer eventConsumer; - private IPersistence persistance; + private IPersistence persistence; private EventConsumerState state; public EventConsumerGrain( - EventDataFormatter formatter, IEventStore eventStore, + IEventDataFormatter eventDataFormatter, ISemanticLog log) { Guard.NotNull(log, nameof(log)); - Guard.NotNull(formatter, nameof(formatter)); Guard.NotNull(eventStore, nameof(eventStore)); + Guard.NotNull(eventDataFormatter, nameof(eventDataFormatter)); this.log = log; - this.formatter = formatter; this.eventStore = eventStore; + this.eventDataFormatter = eventDataFormatter; } protected override void DisposeObject(bool disposing) @@ -51,9 +51,9 @@ namespace Squidex.Infrastructure.CQRS.Events.Grains public Task ActivateAsync(string key, IStore store) { - persistance = store.WithSnapshots(key, s => state = s); + persistence = store.WithSnapshots(key, s => state = s); - return persistance.ReadAsync(); + return persistence.ReadAsync(); } protected virtual IEventSubscription CreateSubscription(IEventStore eventStore, string streamFilter, string position) @@ -219,7 +219,7 @@ namespace Squidex.Infrastructure.CQRS.Events.Grains state = state.Failed(ex); } - await persistance.WriteSnapShotAsync(state); + await persistence.WriteSnapshotAsync(state); } private async Task ClearAsync() @@ -289,7 +289,7 @@ namespace Squidex.Infrastructure.CQRS.Events.Grains { try { - var @event = formatter.Parse(message.Data); + var @event = eventDataFormatter.Parse(message.Data); @event.SetEventPosition(message.EventPosition); @event.SetEventStreamNumber(message.EventStreamNumber); diff --git a/src/Squidex.Infrastructure/EventSourcing/Grains/EventConsumerGrainManager.cs b/src/Squidex.Infrastructure/EventSourcing/Grains/EventConsumerGrainManager.cs index b7d226623..80e0686a7 100644 --- a/src/Squidex.Infrastructure/EventSourcing/Grains/EventConsumerGrainManager.cs +++ b/src/Squidex.Infrastructure/EventSourcing/Grains/EventConsumerGrainManager.cs @@ -10,10 +10,10 @@ using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; -using Squidex.Infrastructure.CQRS.Events.Grains.Messages; +using Squidex.Infrastructure.EventSourcing.Grains.Messages; using Squidex.Infrastructure.States; -namespace Squidex.Infrastructure.CQRS.Events.Grains +namespace Squidex.Infrastructure.EventSourcing.Grains { public sealed class EventConsumerGrainManager : DisposableObjectBase, IExternalSystem { diff --git a/src/Squidex.Infrastructure/EventSourcing/Grains/EventConsumerState.cs b/src/Squidex.Infrastructure/EventSourcing/Grains/EventConsumerState.cs index 094aab180..afd61a3d9 100644 --- a/src/Squidex.Infrastructure/EventSourcing/Grains/EventConsumerState.cs +++ b/src/Squidex.Infrastructure/EventSourcing/Grains/EventConsumerState.cs @@ -9,7 +9,7 @@ using System; using Squidex.Infrastructure.Reflection; -namespace Squidex.Infrastructure.CQRS.Events.Grains +namespace Squidex.Infrastructure.EventSourcing.Grains { public sealed class EventConsumerState { diff --git a/src/Squidex.Infrastructure/EventSourcing/Grains/Messages/GetStatesRequest.cs b/src/Squidex.Infrastructure/EventSourcing/Grains/Messages/GetStatesRequest.cs index d998a075f..3c59c39a0 100644 --- a/src/Squidex.Infrastructure/EventSourcing/Grains/Messages/GetStatesRequest.cs +++ b/src/Squidex.Infrastructure/EventSourcing/Grains/Messages/GetStatesRequest.cs @@ -6,7 +6,7 @@ // All rights reserved. // ========================================================================== -namespace Squidex.Infrastructure.CQRS.Events.Grains.Messages +namespace Squidex.Infrastructure.EventSourcing.Grains.Messages { public sealed class GetStatesRequest { diff --git a/src/Squidex.Infrastructure/EventSourcing/Grains/Messages/GetStatesResponse.cs b/src/Squidex.Infrastructure/EventSourcing/Grains/Messages/GetStatesResponse.cs index 22c04dbac..0e947ba58 100644 --- a/src/Squidex.Infrastructure/EventSourcing/Grains/Messages/GetStatesResponse.cs +++ b/src/Squidex.Infrastructure/EventSourcing/Grains/Messages/GetStatesResponse.cs @@ -6,7 +6,7 @@ // All rights reserved. // ========================================================================== -namespace Squidex.Infrastructure.CQRS.Events.Grains.Messages +namespace Squidex.Infrastructure.EventSourcing.Grains.Messages { public sealed class GetStatesResponse { diff --git a/src/Squidex.Infrastructure/EventSourcing/Grains/Messages/ResetConsumerMessage.cs b/src/Squidex.Infrastructure/EventSourcing/Grains/Messages/ResetConsumerMessage.cs index c99430b20..074a47e57 100644 --- a/src/Squidex.Infrastructure/EventSourcing/Grains/Messages/ResetConsumerMessage.cs +++ b/src/Squidex.Infrastructure/EventSourcing/Grains/Messages/ResetConsumerMessage.cs @@ -6,7 +6,7 @@ // All rights reserved. // ========================================================================== -namespace Squidex.Infrastructure.CQRS.Events.Grains.Messages +namespace Squidex.Infrastructure.EventSourcing.Grains.Messages { public sealed class ResetConsumerMessage { diff --git a/src/Squidex.Infrastructure/EventSourcing/Grains/Messages/StartConsumerMessage.cs b/src/Squidex.Infrastructure/EventSourcing/Grains/Messages/StartConsumerMessage.cs index af96e8ba5..437a29df3 100644 --- a/src/Squidex.Infrastructure/EventSourcing/Grains/Messages/StartConsumerMessage.cs +++ b/src/Squidex.Infrastructure/EventSourcing/Grains/Messages/StartConsumerMessage.cs @@ -6,7 +6,7 @@ // All rights reserved. // ========================================================================== -namespace Squidex.Infrastructure.CQRS.Events.Grains.Messages +namespace Squidex.Infrastructure.EventSourcing.Grains.Messages { public sealed class StartConsumerMessage { diff --git a/src/Squidex.Infrastructure/EventSourcing/Grains/Messages/StopConsumerMessage.cs b/src/Squidex.Infrastructure/EventSourcing/Grains/Messages/StopConsumerMessage.cs index d04cae113..c7d3a6eea 100644 --- a/src/Squidex.Infrastructure/EventSourcing/Grains/Messages/StopConsumerMessage.cs +++ b/src/Squidex.Infrastructure/EventSourcing/Grains/Messages/StopConsumerMessage.cs @@ -6,7 +6,7 @@ // All rights reserved. // ========================================================================== -namespace Squidex.Infrastructure.CQRS.Events.Grains.Messages +namespace Squidex.Infrastructure.EventSourcing.Grains.Messages { public sealed class StopConsumerMessage { diff --git a/src/Squidex.Infrastructure/EventSourcing/IEvent.cs b/src/Squidex.Infrastructure/EventSourcing/IEvent.cs index 11915d798..935c52686 100644 --- a/src/Squidex.Infrastructure/EventSourcing/IEvent.cs +++ b/src/Squidex.Infrastructure/EventSourcing/IEvent.cs @@ -6,7 +6,7 @@ // All rights reserved. // ========================================================================== -namespace Squidex.Infrastructure.CQRS.Events +namespace Squidex.Infrastructure.EventSourcing { public interface IEvent { diff --git a/src/Squidex.Infrastructure/EventSourcing/IEventConsumer.cs b/src/Squidex.Infrastructure/EventSourcing/IEventConsumer.cs index 565b35d50..e3d372262 100644 --- a/src/Squidex.Infrastructure/EventSourcing/IEventConsumer.cs +++ b/src/Squidex.Infrastructure/EventSourcing/IEventConsumer.cs @@ -8,7 +8,7 @@ using System.Threading.Tasks; -namespace Squidex.Infrastructure.CQRS.Events +namespace Squidex.Infrastructure.EventSourcing { public delegate IEventConsumer EventConsumerFactory(string name); diff --git a/src/Squidex.Infrastructure/EventSourcing/IEventDataFormatter.cs b/src/Squidex.Infrastructure/EventSourcing/IEventDataFormatter.cs new file mode 100644 index 000000000..dac7550a3 --- /dev/null +++ b/src/Squidex.Infrastructure/EventSourcing/IEventDataFormatter.cs @@ -0,0 +1,19 @@ +// ========================================================================== +// IEventDataFormatter.cs +// Squidex Headless CMS +// ========================================================================== +// Copyright (c) Squidex Group +// All rights reserved. +// ========================================================================== + +using System; + +namespace Squidex.Infrastructure.EventSourcing +{ + public interface IEventDataFormatter + { + Envelope Parse(EventData eventData, bool migrate = true); + + EventData ToEventData(Envelope envelope, Guid commitId, bool migrate = true); + } +} diff --git a/src/Squidex.Infrastructure/EventSourcing/IEventNotifier.cs b/src/Squidex.Infrastructure/EventSourcing/IEventNotifier.cs index 72e61b3d9..0b09e2efc 100644 --- a/src/Squidex.Infrastructure/EventSourcing/IEventNotifier.cs +++ b/src/Squidex.Infrastructure/EventSourcing/IEventNotifier.cs @@ -8,7 +8,7 @@ using System; -namespace Squidex.Infrastructure.CQRS.Events +namespace Squidex.Infrastructure.EventSourcing { public interface IEventNotifier { diff --git a/src/Squidex.Infrastructure/EventSourcing/IEventStore.cs b/src/Squidex.Infrastructure/EventSourcing/IEventStore.cs index 99bf67db9..e9182f093 100644 --- a/src/Squidex.Infrastructure/EventSourcing/IEventStore.cs +++ b/src/Squidex.Infrastructure/EventSourcing/IEventStore.cs @@ -11,17 +11,17 @@ using System.Collections.Generic; using System.Threading; using System.Threading.Tasks; -namespace Squidex.Infrastructure.CQRS.Events +namespace Squidex.Infrastructure.EventSourcing { public interface IEventStore { - Task> GetEventsAsync(string streamName, int startPosition = -1); + Task> GetEventsAsync(string streamName, long streamPosition = -1); Task GetEventsAsync(Func callback, CancellationToken cancellationToken, string streamFilter = null, string position = null); Task AppendEventsAsync(Guid commitId, string streamName, ICollection events); - Task AppendEventsAsync(Guid commitId, string streamName, int expectedVersion, ICollection events); + Task AppendEventsAsync(Guid commitId, string streamName, long expectedVersion, ICollection events); IEventSubscription CreateSubscription(IEventSubscriber subscriber, string streamFilter, string position = null); } diff --git a/src/Squidex.Infrastructure/EventSourcing/IEventSubscriber.cs b/src/Squidex.Infrastructure/EventSourcing/IEventSubscriber.cs index 6957f83c1..793bc0ede 100644 --- a/src/Squidex.Infrastructure/EventSourcing/IEventSubscriber.cs +++ b/src/Squidex.Infrastructure/EventSourcing/IEventSubscriber.cs @@ -9,7 +9,7 @@ using System; using System.Threading.Tasks; -namespace Squidex.Infrastructure.CQRS.Events +namespace Squidex.Infrastructure.EventSourcing { public interface IEventSubscriber { diff --git a/src/Squidex.Infrastructure/EventSourcing/IEventSubscription.cs b/src/Squidex.Infrastructure/EventSourcing/IEventSubscription.cs index 583e0a4ac..404683a13 100644 --- a/src/Squidex.Infrastructure/EventSourcing/IEventSubscription.cs +++ b/src/Squidex.Infrastructure/EventSourcing/IEventSubscription.cs @@ -8,7 +8,7 @@ using System.Threading.Tasks; -namespace Squidex.Infrastructure.CQRS.Events +namespace Squidex.Infrastructure.EventSourcing { public interface IEventSubscription { diff --git a/src/Squidex.Infrastructure/EventSourcing/IMigratedEvent.cs b/src/Squidex.Infrastructure/EventSourcing/IMigratedEvent.cs index 24534e5a8..1a0d4c0a3 100644 --- a/src/Squidex.Infrastructure/EventSourcing/IMigratedEvent.cs +++ b/src/Squidex.Infrastructure/EventSourcing/IMigratedEvent.cs @@ -6,7 +6,7 @@ // All rights reserved. // ========================================================================== -namespace Squidex.Infrastructure.CQRS.Events +namespace Squidex.Infrastructure.EventSourcing { public interface IMigratedEvent { diff --git a/src/Squidex.Infrastructure/EventSourcing/EventDataFormatter.cs b/src/Squidex.Infrastructure/EventSourcing/JsonEventDataFormatter.cs similarity index 83% rename from src/Squidex.Infrastructure/EventSourcing/EventDataFormatter.cs rename to src/Squidex.Infrastructure/EventSourcing/JsonEventDataFormatter.cs index 939577d31..d3c7b6d7d 100644 --- a/src/Squidex.Infrastructure/EventSourcing/EventDataFormatter.cs +++ b/src/Squidex.Infrastructure/EventSourcing/JsonEventDataFormatter.cs @@ -1,5 +1,5 @@ // ========================================================================== -// EventDataFormatter.cs +// JsonEventDataFormatter.cs // Squidex Headless CMS // ========================================================================== // Copyright (c) Squidex Group @@ -9,14 +9,14 @@ using System; using Newtonsoft.Json; -namespace Squidex.Infrastructure.CQRS.Events +namespace Squidex.Infrastructure.EventSourcing { - public class EventDataFormatter + public class JsonEventDataFormatter : IEventDataFormatter { private readonly JsonSerializerSettings serializerSettings; private readonly TypeNameRegistry typeNameRegistry; - public EventDataFormatter(TypeNameRegistry typeNameRegistry, JsonSerializerSettings serializerSettings = null) + public JsonEventDataFormatter(TypeNameRegistry typeNameRegistry, JsonSerializerSettings serializerSettings = null) { Guard.NotNull(typeNameRegistry, nameof(typeNameRegistry)); @@ -25,7 +25,7 @@ namespace Squidex.Infrastructure.CQRS.Events this.serializerSettings = serializerSettings ?? new JsonSerializerSettings(); } - public virtual Envelope Parse(EventData eventData, bool migrate = true) + public Envelope Parse(EventData eventData, bool migrate = true) { var headers = ReadJson(eventData.Metadata); @@ -42,7 +42,7 @@ namespace Squidex.Infrastructure.CQRS.Events return envelope; } - public virtual EventData ToEventData(Envelope envelope, Guid commitId, bool migrate = true) + public EventData ToEventData(Envelope envelope, Guid commitId, bool migrate = true) { var eventPayload = envelope.Payload; diff --git a/src/Squidex.Infrastructure/EventSourcing/NoopEvent.cs b/src/Squidex.Infrastructure/EventSourcing/NoopEvent.cs index c70e89334..16c1458bb 100644 --- a/src/Squidex.Infrastructure/EventSourcing/NoopEvent.cs +++ b/src/Squidex.Infrastructure/EventSourcing/NoopEvent.cs @@ -6,7 +6,7 @@ // All rights reserved. // ========================================================================== -namespace Squidex.Infrastructure.CQRS.Events +namespace Squidex.Infrastructure.EventSourcing { [TypeName(nameof(NoopEvent))] public sealed class NoopEvent : IEvent diff --git a/src/Squidex.Infrastructure/EventSourcing/PollingSubscription.cs b/src/Squidex.Infrastructure/EventSourcing/PollingSubscription.cs index e69234d47..4ca2f3ab3 100644 --- a/src/Squidex.Infrastructure/EventSourcing/PollingSubscription.cs +++ b/src/Squidex.Infrastructure/EventSourcing/PollingSubscription.cs @@ -11,7 +11,7 @@ using System.Text.RegularExpressions; using System.Threading.Tasks; using Squidex.Infrastructure.Timers; -namespace Squidex.Infrastructure.CQRS.Events +namespace Squidex.Infrastructure.EventSourcing { public sealed class PollingSubscription : IEventSubscription { diff --git a/src/Squidex.Infrastructure/EventSourcing/RetrySubscription.cs b/src/Squidex.Infrastructure/EventSourcing/RetrySubscription.cs index e14ea7e43..6939ea22b 100644 --- a/src/Squidex.Infrastructure/EventSourcing/RetrySubscription.cs +++ b/src/Squidex.Infrastructure/EventSourcing/RetrySubscription.cs @@ -11,7 +11,7 @@ using System.Threading; using System.Threading.Tasks; using Squidex.Infrastructure.Tasks; -namespace Squidex.Infrastructure.CQRS.Events +namespace Squidex.Infrastructure.EventSourcing { public sealed class RetrySubscription : IEventSubscription, IEventSubscriber { diff --git a/src/Squidex.Infrastructure/EventSourcing/StoredEvent.cs b/src/Squidex.Infrastructure/EventSourcing/StoredEvent.cs index 4886f0132..1b1fd53ce 100644 --- a/src/Squidex.Infrastructure/EventSourcing/StoredEvent.cs +++ b/src/Squidex.Infrastructure/EventSourcing/StoredEvent.cs @@ -6,7 +6,7 @@ // All rights reserved. // ========================================================================== -namespace Squidex.Infrastructure.CQRS.Events +namespace Squidex.Infrastructure.EventSourcing { public sealed class StoredEvent { diff --git a/src/Squidex.Infrastructure/EventSourcing/WrongEventVersionException.cs b/src/Squidex.Infrastructure/EventSourcing/WrongEventVersionException.cs index afa2c92ff..5a402524d 100644 --- a/src/Squidex.Infrastructure/EventSourcing/WrongEventVersionException.cs +++ b/src/Squidex.Infrastructure/EventSourcing/WrongEventVersionException.cs @@ -9,7 +9,7 @@ using System; using System.Runtime.Serialization; -namespace Squidex.Infrastructure.CQRS.Events +namespace Squidex.Infrastructure.EventSourcing { [Serializable] public class WrongEventVersionException : Exception diff --git a/src/Squidex.Infrastructure/States/DefaultStreamNameResolver.cs b/src/Squidex.Infrastructure/States/DefaultStreamNameResolver.cs index a977e18a7..4c14817ab 100644 --- a/src/Squidex.Infrastructure/States/DefaultStreamNameResolver.cs +++ b/src/Squidex.Infrastructure/States/DefaultStreamNameResolver.cs @@ -8,7 +8,7 @@ using System; -namespace Squidex.Infrastructure.CQRS.Events +namespace Squidex.Infrastructure.States { public sealed class DefaultStreamNameResolver : IStreamNameResolver { diff --git a/src/Squidex.Infrastructure/States/IPersistence.cs b/src/Squidex.Infrastructure/States/IPersistence.cs index 6de903b3f..4a36c48bf 100644 --- a/src/Squidex.Infrastructure/States/IPersistence.cs +++ b/src/Squidex.Infrastructure/States/IPersistence.cs @@ -7,7 +7,7 @@ // ========================================================================== using System.Threading.Tasks; -using Squidex.Infrastructure.CQRS.Events; +using Squidex.Infrastructure.EventSourcing; namespace Squidex.Infrastructure.States { @@ -15,8 +15,8 @@ namespace Squidex.Infrastructure.States { Task WriteEventsAsync(params Envelope[] @events); - Task WriteSnapShotAsync(TState state); + Task WriteSnapshotAsync(TState state); - Task ReadAsync(bool force = false); + Task ReadAsync(long? expectedVersion = null); } } diff --git a/src/Squidex.Infrastructure/States/ISnapshotStore.cs b/src/Squidex.Infrastructure/States/ISnapshotStore.cs index af81da4c0..8b43eed65 100644 --- a/src/Squidex.Infrastructure/States/ISnapshotStore.cs +++ b/src/Squidex.Infrastructure/States/ISnapshotStore.cs @@ -12,8 +12,8 @@ namespace Squidex.Infrastructure.States { public interface ISnapshotStore { - Task WriteAsync(string key, T value, string oldEtag, string newEtag); + Task WriteAsync(string key, T value, long oldVersion, long newVersion); - Task<(T Value, string Etag)> ReadAsync(string key); + Task<(T Value, long Version)> ReadAsync(string key); } } diff --git a/src/Squidex.Infrastructure/States/IStore.cs b/src/Squidex.Infrastructure/States/IStore.cs index c7c206f48..72017044c 100644 --- a/src/Squidex.Infrastructure/States/IStore.cs +++ b/src/Squidex.Infrastructure/States/IStore.cs @@ -8,7 +8,7 @@ using System; using System.Threading.Tasks; -using Squidex.Infrastructure.CQRS.Events; +using Squidex.Infrastructure.EventSourcing; namespace Squidex.Infrastructure.States { diff --git a/src/Squidex.Infrastructure/States/InconsistentStateException.cs b/src/Squidex.Infrastructure/States/InconsistentStateException.cs index 236919152..3b6aaab84 100644 --- a/src/Squidex.Infrastructure/States/InconsistentStateException.cs +++ b/src/Squidex.Infrastructure/States/InconsistentStateException.cs @@ -14,25 +14,25 @@ namespace Squidex.Infrastructure.States [Serializable] public class InconsistentStateException : Exception { - private readonly string currentEtag; - private readonly string expectedEtag; + private readonly long currentVersion; + private readonly long expectedVersion; - public string CurrentEtag + public long CurrentVersion { - get { return currentEtag; } + get { return currentVersion; } } - public string ExpectedEtag + public long ExpectedVersion { - get { return expectedEtag; } + get { return expectedVersion; } } - public InconsistentStateException(string currentEtag, string expectedEtag, Exception ex) - : base(FormatMessage(currentEtag, expectedEtag), ex) + public InconsistentStateException(long currentVersion, long expectedVersion, Exception ex) + : base(FormatMessage(currentVersion, expectedVersion), ex) { - this.currentEtag = currentEtag; + this.currentVersion = currentVersion; - this.expectedEtag = expectedEtag; + this.expectedVersion = expectedVersion; } protected InconsistentStateException(SerializationInfo info, StreamingContext context) @@ -40,9 +40,9 @@ namespace Squidex.Infrastructure.States { } - private static string FormatMessage(string currentEtag, string expectedEtag) + private static string FormatMessage(long currentVersion, long expectedVersion) { - return $"Requested etag {expectedEtag}, but found {currentEtag}."; + return $"Requested version {expectedVersion}, but found {currentVersion}."; } } } diff --git a/src/Squidex.Infrastructure/States/Persistance.cs b/src/Squidex.Infrastructure/States/Persistence.cs similarity index 56% rename from src/Squidex.Infrastructure/States/Persistance.cs rename to src/Squidex.Infrastructure/States/Persistence.cs index 5491535f0..28944a936 100644 --- a/src/Squidex.Infrastructure/States/Persistance.cs +++ b/src/Squidex.Infrastructure/States/Persistence.cs @@ -1,5 +1,5 @@ // ========================================================================== -// Persistance.cs +// Persistence.cs // Squidex Headless CMS // ========================================================================== // Copyright (c) Squidex Group @@ -9,30 +9,29 @@ using System; using System.Linq; using System.Threading.Tasks; -using Squidex.Infrastructure.CQRS.Events; +using Squidex.Infrastructure.EventSourcing; namespace Squidex.Infrastructure.States { - public sealed class Persistance : IPersistence + public sealed class Persistence : IPersistence { private readonly string ownerKey; private readonly ISnapshotStore snapshotStore; private readonly IStreamNameResolver streamNameResolver; private readonly IEventStore eventStore; - private readonly EventDataFormatter eventDataFormatter; + private readonly IEventDataFormatter eventDataFormatter; private readonly Action invalidate; private readonly Func applyState; private readonly Func, Task> applyEvent; - private Task readTask; - private int positionSnapshot = -1; - private int positionEvent = -1; + private long positionSnapshot = -1; + private long positionEvent = -1; - public Persistance(string ownerKey, + public Persistence(string ownerKey, + Action invalidate, + IEventStore eventStore, + IEventDataFormatter eventDataFormatter, ISnapshotStore snapshotStore, IStreamNameResolver streamNameResolver, - IEventStore eventStore, - EventDataFormatter eventDataFormatter, - Action invalidate, Func applyState, Func, Task> applyEvent) { @@ -48,61 +47,62 @@ namespace Squidex.Infrastructure.States this.streamNameResolver = streamNameResolver; } - public Task ReadAsync(bool force = false) - { - if (force) - { - return ReadInternalAsync(); - } - - if (readTask == null) - { - readTask = ReadInternalAsync(); - } - - return readTask; - } - - private async Task ReadInternalAsync() + public async Task ReadAsync(long? expectedVersion) { positionSnapshot = -1; positionEvent = -1; if (snapshotStore != null) { - var (state, etag) = await snapshotStore.ReadAsync(ownerKey); + var (state, position) = await snapshotStore.ReadAsync(ownerKey); - if (int.TryParse(etag, out var position)) - { - positionSnapshot = position; - positionEvent = position; + positionSnapshot = position; + positionEvent = position; - if (applyState != null) - { - await applyState(state); - } + if (applyState != null) + { + await applyState(state); } } if (eventStore != null && streamNameResolver != null) { - var events = await eventStore.GetEventsAsync(GetStreamName(), positionSnapshot); + var events = await eventStore.GetEventsAsync(GetStreamName(), positionEvent + 1); foreach (var @event in events) { - var parsedEvent = eventDataFormatter.Parse(@event.Data, true); + positionEvent++; - if (applyEvent != null) + if (@event.EventStreamNumber != positionEvent) + { + throw new InvalidOperationException("Events must follow the snapshot version in consecutive order with no gaps."); + } + + var parsedEvent = ParseKnownEvent(@event); + + if (parsedEvent != null && applyEvent != null) { await applyEvent(parsedEvent); } + } + } + + var maxVersion = Math.Max(positionEvent, positionSnapshot); - positionEvent = (int)@event.EventStreamNumber; + if (expectedVersion.HasValue && expectedVersion.Value != maxVersion) + { + if (maxVersion == -1) + { + throw new DomainObjectNotFoundException(ownerKey, typeof(TOwner)); + } + else + { + throw new DomainObjectVersionException(ownerKey, typeof(TOwner), maxVersion, expectedVersion.Value); } } } - public async Task WriteSnapShotAsync(TState state) + public async Task WriteSnapshotAsync(TState state) { if (snapshotStore == null) { @@ -110,13 +110,18 @@ namespace Squidex.Infrastructure.States } var newPosition = - eventStore != null ? - positionEvent : - positionSnapshot + 1; + eventStore != null ? positionEvent : positionSnapshot + 1; if (newPosition != positionSnapshot) { - await snapshotStore.WriteAsync(ownerKey, state, positionSnapshot.ToString(), newPosition.ToString()); + try + { + await snapshotStore.WriteAsync(ownerKey, state, positionSnapshot, newPosition); + } + catch (InconsistentStateException ex) + { + throw new DomainObjectVersionException(ownerKey, typeof(TOwner), ex.CurrentVersion, ex.ExpectedVersion); + } positionSnapshot = newPosition; } @@ -140,7 +145,14 @@ namespace Squidex.Infrastructure.States var eventStream = GetStreamName(); var eventData = GetEventData(events, commitId); - await eventStore.AppendEventsAsync(commitId, GetStreamName(), positionEvent, eventData); + try + { + await eventStore.AppendEventsAsync(commitId, GetStreamName(), positionEvent, eventData); + } + catch (WrongEventVersionException ex) + { + throw new DomainObjectVersionException(ownerKey, typeof(TOwner), ex.CurrentVersion, ex.ExpectedVersion); + } positionEvent += events.Length; } @@ -157,5 +169,17 @@ namespace Squidex.Infrastructure.States { return streamNameResolver.GetStreamName(typeof(TOwner), ownerKey); } + + private Envelope ParseKnownEvent(StoredEvent storedEvent) + { + try + { + return eventDataFormatter.Parse(storedEvent.Data); + } + catch (TypeNameNotFoundException) + { + return null; + } + } } } diff --git a/src/Squidex.Infrastructure/States/StateFactory.cs b/src/Squidex.Infrastructure/States/StateFactory.cs index 800724c23..883f24c4b 100644 --- a/src/Squidex.Infrastructure/States/StateFactory.cs +++ b/src/Squidex.Infrastructure/States/StateFactory.cs @@ -9,7 +9,7 @@ using System; using System.Threading.Tasks; using Microsoft.Extensions.Caching.Memory; -using Squidex.Infrastructure.CQRS.Events; +using Squidex.Infrastructure.EventSourcing; #pragma warning disable RECS0096 // Type parameter is never used @@ -24,7 +24,7 @@ namespace Squidex.Infrastructure.States private readonly ISnapshotStore snapshotStore; private readonly IStreamNameResolver streamNameResolver; private readonly IEventStore eventStore; - private readonly EventDataFormatter eventDataFormatter; + private readonly IEventDataFormatter eventDataFormatter; private readonly object lockObject = new object(); private IDisposable pubSubscription; @@ -40,20 +40,22 @@ namespace Squidex.Infrastructure.States activationTask = obj.ActivateAsync(key, store); } - public Task ActivateAsync() + public async Task ActivateAsync() { - return activationTask.ContinueWith(x => obj); + await activationTask; + + return obj; } } public StateFactory( IPubSub pubSub, IMemoryCache statesCache, + IEventStore eventStore, + IEventDataFormatter eventDataFormatter, IServiceProvider services, ISnapshotStore snapshotStore, - IStreamNameResolver streamNameResolver, - IEventStore eventStore, - EventDataFormatter eventDataFormatter) + IStreamNameResolver streamNameResolver) { Guard.NotNull(services, nameof(services)); Guard.NotNull(eventStore, nameof(eventStore)); @@ -87,7 +89,7 @@ namespace Squidex.Infrastructure.States { Guard.NotNull(key, nameof(key)); - var stateStore = new Store(snapshotStore, streamNameResolver, eventStore, eventDataFormatter, () => { }); + var stateStore = new Store(() => { }, eventStore, eventDataFormatter, snapshotStore, streamNameResolver); var state = (T)services.GetService(typeof(T)); await state.ActivateAsync(key, stateStore); @@ -108,10 +110,10 @@ namespace Squidex.Infrastructure.States var state = (T)services.GetService(typeof(T)); - var stateStore = new Store(snapshotStore, streamNameResolver, eventStore, eventDataFormatter, () => + var stateStore = new Store(() => { pubSub.Publish(new InvalidateMessage { Key = key }, false); - }); + }, eventStore, eventDataFormatter, snapshotStore, streamNameResolver); stateObj = new ObjectHolder(state, key, stateStore); diff --git a/src/Squidex.Infrastructure/States/Store.cs b/src/Squidex.Infrastructure/States/Store.cs index 6e6af5cdf..0fd3faab9 100644 --- a/src/Squidex.Infrastructure/States/Store.cs +++ b/src/Squidex.Infrastructure/States/Store.cs @@ -8,7 +8,7 @@ using System; using System.Threading.Tasks; -using Squidex.Infrastructure.CQRS.Events; +using Squidex.Infrastructure.EventSourcing; namespace Squidex.Infrastructure.States { @@ -18,14 +18,14 @@ namespace Squidex.Infrastructure.States private readonly ISnapshotStore snapshotStore; private readonly IStreamNameResolver streamNameResolver; private readonly IEventStore eventStore; - private readonly EventDataFormatter eventDataFormatter; + private readonly IEventDataFormatter eventDataFormatter; public Store( - ISnapshotStore snapshotStore, - IStreamNameResolver streamNameResolver, + Action invalidate, IEventStore eventStore, - EventDataFormatter eventDataFormatter, - Action invalidate) + IEventDataFormatter eventDataFormatter, + ISnapshotStore snapshotStore, + IStreamNameResolver streamNameResolver) { this.eventStore = eventStore; this.eventDataFormatter = eventDataFormatter; @@ -36,17 +36,17 @@ namespace Squidex.Infrastructure.States public IPersistence WithEventSourcing(string key, Func, Task> applyEvent) { - return new Persistance(key, null, streamNameResolver, eventStore, eventDataFormatter, invalidate, null, applyEvent); + return new Persistence(key, invalidate, eventStore, eventDataFormatter, null, streamNameResolver, null, applyEvent); } public IPersistence WithSnapshots(string key, Func applySnapshot) { - return new Persistance(key, snapshotStore, null, null, null, invalidate, applySnapshot, null); + return new Persistence(key, invalidate, null, null, snapshotStore, null, applySnapshot, null); } public IPersistence WithSnapshotsAndEventSourcing(string key, Func applySnapshot, Func, Task> applyEvent) { - return new Persistance(key, snapshotStore, streamNameResolver, eventStore, eventDataFormatter, invalidate, applySnapshot, applyEvent); + return new Persistence(key, invalidate, eventStore, eventDataFormatter, snapshotStore, streamNameResolver, applySnapshot, applyEvent); } } } diff --git a/src/Squidex.Infrastructure/States/StoreExtensions.cs b/src/Squidex.Infrastructure/States/StoreExtensions.cs index c90d17292..9fd7a8945 100644 --- a/src/Squidex.Infrastructure/States/StoreExtensions.cs +++ b/src/Squidex.Infrastructure/States/StoreExtensions.cs @@ -7,7 +7,7 @@ // ========================================================================== using System; -using Squidex.Infrastructure.CQRS.Events; +using Squidex.Infrastructure.EventSourcing; using Squidex.Infrastructure.Tasks; namespace Squidex.Infrastructure.States diff --git a/src/Squidex/Areas/Api/Controllers/ApiController.cs b/src/Squidex/Areas/Api/Controllers/ApiController.cs index eaca70e1f..fafbca6e0 100644 --- a/src/Squidex/Areas/Api/Controllers/ApiController.cs +++ b/src/Squidex/Areas/Api/Controllers/ApiController.cs @@ -11,7 +11,7 @@ using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.Filters; using Squidex.Domain.Apps.Read.Apps; using Squidex.Infrastructure; -using Squidex.Infrastructure.CQRS.Commands; +using Squidex.Infrastructure.Commands; using Squidex.Pipeline; namespace Squidex.Areas.Api.Controllers diff --git a/src/Squidex/Areas/Api/Controllers/Apps/AppClientsController.cs b/src/Squidex/Areas/Api/Controllers/Apps/AppClientsController.cs index e6a75104c..0c2ab7276 100644 --- a/src/Squidex/Areas/Api/Controllers/Apps/AppClientsController.cs +++ b/src/Squidex/Areas/Api/Controllers/Apps/AppClientsController.cs @@ -13,7 +13,7 @@ using Microsoft.Extensions.Primitives; using NSwag.Annotations; using Squidex.Areas.Api.Controllers.Apps.Models; using Squidex.Domain.Apps.Write.Apps.Commands; -using Squidex.Infrastructure.CQRS.Commands; +using Squidex.Infrastructure.Commands; using Squidex.Infrastructure.Reflection; using Squidex.Pipeline; diff --git a/src/Squidex/Areas/Api/Controllers/Apps/AppContributorsController.cs b/src/Squidex/Areas/Api/Controllers/Apps/AppContributorsController.cs index 6a84a1bbd..c6b6fc22c 100644 --- a/src/Squidex/Areas/Api/Controllers/Apps/AppContributorsController.cs +++ b/src/Squidex/Areas/Api/Controllers/Apps/AppContributorsController.cs @@ -14,7 +14,7 @@ using NSwag.Annotations; using Squidex.Areas.Api.Controllers.Apps.Models; using Squidex.Domain.Apps.Read.Apps.Services; using Squidex.Domain.Apps.Write.Apps.Commands; -using Squidex.Infrastructure.CQRS.Commands; +using Squidex.Infrastructure.Commands; using Squidex.Infrastructure.Reflection; using Squidex.Pipeline; diff --git a/src/Squidex/Areas/Api/Controllers/Apps/AppLanguagesController.cs b/src/Squidex/Areas/Api/Controllers/Apps/AppLanguagesController.cs index 62ee48f89..1c499ff2e 100644 --- a/src/Squidex/Areas/Api/Controllers/Apps/AppLanguagesController.cs +++ b/src/Squidex/Areas/Api/Controllers/Apps/AppLanguagesController.cs @@ -17,7 +17,7 @@ using Squidex.Areas.Api.Controllers.Apps.Models; using Squidex.Domain.Apps.Core.Apps; using Squidex.Domain.Apps.Write.Apps.Commands; using Squidex.Infrastructure; -using Squidex.Infrastructure.CQRS.Commands; +using Squidex.Infrastructure.Commands; using Squidex.Infrastructure.Reflection; using Squidex.Pipeline; diff --git a/src/Squidex/Areas/Api/Controllers/Apps/AppsController.cs b/src/Squidex/Areas/Api/Controllers/Apps/AppsController.cs index 62174f530..71aa34709 100644 --- a/src/Squidex/Areas/Api/Controllers/Apps/AppsController.cs +++ b/src/Squidex/Areas/Api/Controllers/Apps/AppsController.cs @@ -16,7 +16,7 @@ using Squidex.Domain.Apps.Core.Apps; using Squidex.Domain.Apps.Read; using Squidex.Domain.Apps.Read.Apps.Services; using Squidex.Domain.Apps.Write.Apps.Commands; -using Squidex.Infrastructure.CQRS.Commands; +using Squidex.Infrastructure.Commands; using Squidex.Infrastructure.Reflection; using Squidex.Infrastructure.Security; using Squidex.Pipeline; diff --git a/src/Squidex/Areas/Api/Controllers/Assets/AssetContentController.cs b/src/Squidex/Areas/Api/Controllers/Assets/AssetContentController.cs index 5abc38ee4..2d5e3b28e 100644 --- a/src/Squidex/Areas/Api/Controllers/Assets/AssetContentController.cs +++ b/src/Squidex/Areas/Api/Controllers/Assets/AssetContentController.cs @@ -13,7 +13,7 @@ using Microsoft.AspNetCore.Mvc; using NSwag.Annotations; using Squidex.Domain.Apps.Read.Assets.Repositories; using Squidex.Infrastructure.Assets; -using Squidex.Infrastructure.CQRS.Commands; +using Squidex.Infrastructure.Commands; using Squidex.Pipeline; #pragma warning disable 1573 diff --git a/src/Squidex/Areas/Api/Controllers/Assets/AssetsController.cs b/src/Squidex/Areas/Api/Controllers/Assets/AssetsController.cs index fe83ccc82..7f7313c40 100644 --- a/src/Squidex/Areas/Api/Controllers/Assets/AssetsController.cs +++ b/src/Squidex/Areas/Api/Controllers/Assets/AssetsController.cs @@ -22,7 +22,7 @@ using Squidex.Domain.Apps.Write.Assets; using Squidex.Domain.Apps.Write.Assets.Commands; using Squidex.Infrastructure; using Squidex.Infrastructure.Assets; -using Squidex.Infrastructure.CQRS.Commands; +using Squidex.Infrastructure.Commands; using Squidex.Infrastructure.Reflection; using Squidex.Pipeline; diff --git a/src/Squidex/Areas/Api/Controllers/Assets/Models/AssetCreatedDto.cs b/src/Squidex/Areas/Api/Controllers/Assets/Models/AssetCreatedDto.cs index 3265382b4..b2db2f78a 100644 --- a/src/Squidex/Areas/Api/Controllers/Assets/Models/AssetCreatedDto.cs +++ b/src/Squidex/Areas/Api/Controllers/Assets/Models/AssetCreatedDto.cs @@ -9,7 +9,7 @@ using System; using System.ComponentModel.DataAnnotations; using Squidex.Domain.Apps.Write.Assets.Commands; -using Squidex.Infrastructure.CQRS.Commands; +using Squidex.Infrastructure.Commands; namespace Squidex.Areas.Api.Controllers.Assets.Models { diff --git a/src/Squidex/Areas/Api/Controllers/Content/ContentSwaggerController.cs b/src/Squidex/Areas/Api/Controllers/Content/ContentSwaggerController.cs index be8fb0e6e..84a0afd57 100644 --- a/src/Squidex/Areas/Api/Controllers/Content/ContentSwaggerController.cs +++ b/src/Squidex/Areas/Api/Controllers/Content/ContentSwaggerController.cs @@ -11,7 +11,7 @@ using Microsoft.AspNetCore.Mvc; using NSwag.Annotations; using Squidex.Areas.Api.Controllers.Contents.Generator; using Squidex.Domain.Apps.Read; -using Squidex.Infrastructure.CQRS.Commands; +using Squidex.Infrastructure.Commands; using Squidex.Pipeline; namespace Squidex.Areas.Api.Controllers.Contents diff --git a/src/Squidex/Areas/Api/Controllers/Content/ContentsController.cs b/src/Squidex/Areas/Api/Controllers/Content/ContentsController.cs index 8ad56d2bc..0f8612fe5 100644 --- a/src/Squidex/Areas/Api/Controllers/Content/ContentsController.cs +++ b/src/Squidex/Areas/Api/Controllers/Content/ContentsController.cs @@ -20,7 +20,7 @@ using Squidex.Domain.Apps.Read.Contents; using Squidex.Domain.Apps.Read.Contents.GraphQL; using Squidex.Domain.Apps.Write.Contents; using Squidex.Domain.Apps.Write.Contents.Commands; -using Squidex.Infrastructure.CQRS.Commands; +using Squidex.Infrastructure.Commands; using Squidex.Infrastructure.Reflection; using Squidex.Pipeline; diff --git a/src/Squidex/Areas/Api/Controllers/Content/Models/ContentDto.cs b/src/Squidex/Areas/Api/Controllers/Content/Models/ContentDto.cs index 90daa7124..2a048594b 100644 --- a/src/Squidex/Areas/Api/Controllers/Content/Models/ContentDto.cs +++ b/src/Squidex/Areas/Api/Controllers/Content/Models/ContentDto.cs @@ -12,7 +12,7 @@ using NodaTime; using Squidex.Domain.Apps.Core.Contents; using Squidex.Domain.Apps.Write.Contents.Commands; using Squidex.Infrastructure; -using Squidex.Infrastructure.CQRS.Commands; +using Squidex.Infrastructure.Commands; namespace Squidex.Areas.Api.Controllers.Contents.Models { diff --git a/src/Squidex/Areas/Api/Controllers/Docs/DocsController.cs b/src/Squidex/Areas/Api/Controllers/Docs/DocsController.cs index a6f892596..41209d69a 100644 --- a/src/Squidex/Areas/Api/Controllers/Docs/DocsController.cs +++ b/src/Squidex/Areas/Api/Controllers/Docs/DocsController.cs @@ -8,7 +8,7 @@ using Microsoft.AspNetCore.Mvc; using NSwag.Annotations; -using Squidex.Infrastructure.CQRS.Commands; +using Squidex.Infrastructure.Commands; using Squidex.Pipeline; namespace Squidex.Areas.Api.Controllers.Docs diff --git a/src/Squidex/Areas/Api/Controllers/EventConsumers/EventConsumersController.cs b/src/Squidex/Areas/Api/Controllers/EventConsumers/EventConsumersController.cs index de8a17946..611770c60 100644 --- a/src/Squidex/Areas/Api/Controllers/EventConsumers/EventConsumersController.cs +++ b/src/Squidex/Areas/Api/Controllers/EventConsumers/EventConsumersController.cs @@ -13,8 +13,8 @@ using Microsoft.AspNetCore.Mvc; using NSwag.Annotations; using Squidex.Areas.Api.Controllers.EventConsumers.Models; using Squidex.Infrastructure; -using Squidex.Infrastructure.CQRS.Commands; -using Squidex.Infrastructure.CQRS.Events.Grains.Messages; +using Squidex.Infrastructure.Commands; +using Squidex.Infrastructure.EventSourcing.Grains.Messages; using Squidex.Infrastructure.Reflection; using Squidex.Pipeline; diff --git a/src/Squidex/Areas/Api/Controllers/History/HistoryController.cs b/src/Squidex/Areas/Api/Controllers/History/HistoryController.cs index e5a8d1775..d0e224275 100644 --- a/src/Squidex/Areas/Api/Controllers/History/HistoryController.cs +++ b/src/Squidex/Areas/Api/Controllers/History/HistoryController.cs @@ -12,7 +12,7 @@ using Microsoft.AspNetCore.Mvc; using NSwag.Annotations; using Squidex.Areas.Api.Controllers.History.Models; using Squidex.Domain.Apps.Read.History.Repositories; -using Squidex.Infrastructure.CQRS.Commands; +using Squidex.Infrastructure.Commands; using Squidex.Infrastructure.Reflection; using Squidex.Pipeline; diff --git a/src/Squidex/Areas/Api/Controllers/Languages/LanguagesController.cs b/src/Squidex/Areas/Api/Controllers/Languages/LanguagesController.cs index a52140b0c..5ae71b278 100644 --- a/src/Squidex/Areas/Api/Controllers/Languages/LanguagesController.cs +++ b/src/Squidex/Areas/Api/Controllers/Languages/LanguagesController.cs @@ -10,7 +10,7 @@ using System.Linq; using Microsoft.AspNetCore.Mvc; using NSwag.Annotations; using Squidex.Infrastructure; -using Squidex.Infrastructure.CQRS.Commands; +using Squidex.Infrastructure.Commands; using Squidex.Infrastructure.Reflection; using Squidex.Pipeline; diff --git a/src/Squidex/Areas/Api/Controllers/Ping/PingController.cs b/src/Squidex/Areas/Api/Controllers/Ping/PingController.cs index 2ae735915..b1cf16582 100644 --- a/src/Squidex/Areas/Api/Controllers/Ping/PingController.cs +++ b/src/Squidex/Areas/Api/Controllers/Ping/PingController.cs @@ -8,7 +8,7 @@ using Microsoft.AspNetCore.Mvc; using NSwag.Annotations; -using Squidex.Infrastructure.CQRS.Commands; +using Squidex.Infrastructure.Commands; using Squidex.Pipeline; namespace Squidex.Areas.Api.Controllers.Ping diff --git a/src/Squidex/Areas/Api/Controllers/Plans/AppPlansController.cs b/src/Squidex/Areas/Api/Controllers/Plans/AppPlansController.cs index 0932e7767..6481585a7 100644 --- a/src/Squidex/Areas/Api/Controllers/Plans/AppPlansController.cs +++ b/src/Squidex/Areas/Api/Controllers/Plans/AppPlansController.cs @@ -14,7 +14,7 @@ using NSwag.Annotations; using Squidex.Areas.Api.Controllers.Plans.Models; using Squidex.Domain.Apps.Read.Apps.Services; using Squidex.Domain.Apps.Write.Apps.Commands; -using Squidex.Infrastructure.CQRS.Commands; +using Squidex.Infrastructure.Commands; using Squidex.Infrastructure.Reflection; using Squidex.Pipeline; diff --git a/src/Squidex/Areas/Api/Controllers/Rules/RulesController.cs b/src/Squidex/Areas/Api/Controllers/Rules/RulesController.cs index f3efccc00..5d0e34c75 100644 --- a/src/Squidex/Areas/Api/Controllers/Rules/RulesController.cs +++ b/src/Squidex/Areas/Api/Controllers/Rules/RulesController.cs @@ -17,7 +17,7 @@ using Squidex.Areas.Api.Controllers.Rules.Models.Converters; using Squidex.Domain.Apps.Read; using Squidex.Domain.Apps.Read.Rules.Repositories; using Squidex.Domain.Apps.Write.Rules.Commands; -using Squidex.Infrastructure.CQRS.Commands; +using Squidex.Infrastructure.Commands; using Squidex.Infrastructure.Reflection; using Squidex.Pipeline; diff --git a/src/Squidex/Areas/Api/Controllers/Schemas/SchemaFieldsController.cs b/src/Squidex/Areas/Api/Controllers/Schemas/SchemaFieldsController.cs index fe08c3f8a..7fbda49ad 100644 --- a/src/Squidex/Areas/Api/Controllers/Schemas/SchemaFieldsController.cs +++ b/src/Squidex/Areas/Api/Controllers/Schemas/SchemaFieldsController.cs @@ -11,7 +11,7 @@ using Microsoft.AspNetCore.Mvc; using NSwag.Annotations; using Squidex.Areas.Api.Controllers.Schemas.Models; using Squidex.Domain.Apps.Write.Schemas.Commands; -using Squidex.Infrastructure.CQRS.Commands; +using Squidex.Infrastructure.Commands; using Squidex.Pipeline; namespace Squidex.Areas.Api.Controllers.Schemas diff --git a/src/Squidex/Areas/Api/Controllers/Schemas/SchemasController.cs b/src/Squidex/Areas/Api/Controllers/Schemas/SchemasController.cs index 65da638f2..2e5b8e00f 100644 --- a/src/Squidex/Areas/Api/Controllers/Schemas/SchemasController.cs +++ b/src/Squidex/Areas/Api/Controllers/Schemas/SchemasController.cs @@ -18,7 +18,7 @@ using Squidex.Domain.Apps.Core.Schemas; using Squidex.Domain.Apps.Read; using Squidex.Domain.Apps.Read.Schemas; using Squidex.Domain.Apps.Write.Schemas.Commands; -using Squidex.Infrastructure.CQRS.Commands; +using Squidex.Infrastructure.Commands; using Squidex.Infrastructure.Reflection; using Squidex.Pipeline; diff --git a/src/Squidex/Areas/Api/Controllers/Statistics/UsagesController.cs b/src/Squidex/Areas/Api/Controllers/Statistics/UsagesController.cs index 2be660d10..d9895c4b1 100644 --- a/src/Squidex/Areas/Api/Controllers/Statistics/UsagesController.cs +++ b/src/Squidex/Areas/Api/Controllers/Statistics/UsagesController.cs @@ -14,7 +14,7 @@ using NSwag.Annotations; using Squidex.Areas.Api.Controllers.Statistics.Models; using Squidex.Domain.Apps.Read.Apps.Services; using Squidex.Domain.Apps.Read.Assets.Repositories; -using Squidex.Infrastructure.CQRS.Commands; +using Squidex.Infrastructure.Commands; using Squidex.Infrastructure.UsageTracking; using Squidex.Pipeline; diff --git a/src/Squidex/Areas/Api/Controllers/UI/UIController.cs b/src/Squidex/Areas/Api/Controllers/UI/UIController.cs index ce0ce7018..7d4e75afc 100644 --- a/src/Squidex/Areas/Api/Controllers/UI/UIController.cs +++ b/src/Squidex/Areas/Api/Controllers/UI/UIController.cs @@ -13,7 +13,7 @@ using Microsoft.Extensions.Options; using NSwag.Annotations; using Squidex.Areas.Api.Controllers.UI.Models; using Squidex.Config; -using Squidex.Infrastructure.CQRS.Commands; +using Squidex.Infrastructure.Commands; using Squidex.Pipeline; namespace Squidex.Areas.Api.Controllers.UI diff --git a/src/Squidex/Areas/Api/Controllers/Users/UserManagementController.cs b/src/Squidex/Areas/Api/Controllers/Users/UserManagementController.cs index 5593b3b2e..baa3ff0a6 100644 --- a/src/Squidex/Areas/Api/Controllers/Users/UserManagementController.cs +++ b/src/Squidex/Areas/Api/Controllers/Users/UserManagementController.cs @@ -15,7 +15,7 @@ using NSwag.Annotations; using Squidex.Areas.Api.Controllers.Users.Models; using Squidex.Domain.Users; using Squidex.Infrastructure; -using Squidex.Infrastructure.CQRS.Commands; +using Squidex.Infrastructure.Commands; using Squidex.Infrastructure.Reflection; using Squidex.Infrastructure.Security; using Squidex.Pipeline; diff --git a/src/Squidex/Areas/Api/Controllers/Users/UsersController.cs b/src/Squidex/Areas/Api/Controllers/Users/UsersController.cs index 9b8582e81..ab5c7efc3 100644 --- a/src/Squidex/Areas/Api/Controllers/Users/UsersController.cs +++ b/src/Squidex/Areas/Api/Controllers/Users/UsersController.cs @@ -16,7 +16,7 @@ using Microsoft.AspNetCore.Mvc; using NSwag.Annotations; using Squidex.Areas.Api.Controllers.Users.Models; using Squidex.Domain.Users; -using Squidex.Infrastructure.CQRS.Commands; +using Squidex.Infrastructure.Commands; using Squidex.Infrastructure.Reflection; using Squidex.Pipeline; using Squidex.Shared.Users; diff --git a/src/Squidex/Config/Domain/EventPublishersServices.cs b/src/Squidex/Config/Domain/EventPublishersServices.cs index 76f777b95..b191350f6 100644 --- a/src/Squidex/Config/Domain/EventPublishersServices.cs +++ b/src/Squidex/Config/Domain/EventPublishersServices.cs @@ -11,7 +11,7 @@ using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Newtonsoft.Json; using Squidex.Infrastructure; -using Squidex.Infrastructure.CQRS.Events; +using Squidex.Infrastructure.EventSourcing; namespace Squidex.Config.Domain { diff --git a/src/Squidex/Config/Domain/EventStoreServices.cs b/src/Squidex/Config/Domain/EventStoreServices.cs index 09fa67231..59b2bb727 100644 --- a/src/Squidex/Config/Domain/EventStoreServices.cs +++ b/src/Squidex/Config/Domain/EventStoreServices.cs @@ -11,7 +11,7 @@ using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using MongoDB.Driver; using Squidex.Infrastructure; -using Squidex.Infrastructure.CQRS.Events; +using Squidex.Infrastructure.EventSourcing; namespace Squidex.Config.Domain { diff --git a/src/Squidex/Config/Domain/InfrastructureServices.cs b/src/Squidex/Config/Domain/InfrastructureServices.cs index bd462dba7..e7caf3529 100644 --- a/src/Squidex/Config/Domain/InfrastructureServices.cs +++ b/src/Squidex/Config/Domain/InfrastructureServices.cs @@ -16,8 +16,8 @@ using NodaTime; using Squidex.Infrastructure; using Squidex.Infrastructure.Assets; using Squidex.Infrastructure.Assets.ImageSharp; -using Squidex.Infrastructure.CQRS.Commands; -using Squidex.Infrastructure.CQRS.Events; +using Squidex.Infrastructure.Commands; +using Squidex.Infrastructure.EventSourcing; using Squidex.Infrastructure.Log; using Squidex.Infrastructure.UsageTracking; using Squidex.Pipeline; diff --git a/src/Squidex/Config/Domain/ReadServices.cs b/src/Squidex/Config/Domain/ReadServices.cs index 44ce25fef..687977823 100644 --- a/src/Squidex/Config/Domain/ReadServices.cs +++ b/src/Squidex/Config/Domain/ReadServices.cs @@ -29,8 +29,8 @@ using Squidex.Domain.Apps.Read.State.Grains; using Squidex.Domain.Users; using Squidex.Infrastructure; using Squidex.Infrastructure.Assets; -using Squidex.Infrastructure.CQRS.Events; -using Squidex.Infrastructure.CQRS.Events.Grains; +using Squidex.Infrastructure.EventSourcing; +using Squidex.Infrastructure.EventSourcing.Grains; using Squidex.Infrastructure.States; using Squidex.Pipeline; diff --git a/src/Squidex/Config/Domain/SerializationServices.cs b/src/Squidex/Config/Domain/SerializationServices.cs index a8ef0ee98..e95127b89 100644 --- a/src/Squidex/Config/Domain/SerializationServices.cs +++ b/src/Squidex/Config/Domain/SerializationServices.cs @@ -18,7 +18,7 @@ using Squidex.Domain.Apps.Core.Schemas; using Squidex.Domain.Apps.Core.Schemas.Json; using Squidex.Domain.Apps.Events; using Squidex.Infrastructure; -using Squidex.Infrastructure.CQRS.Events; +using Squidex.Infrastructure.EventSourcing; using Squidex.Infrastructure.Json; using Squidex.Infrastructure.MongoDb; diff --git a/src/Squidex/Config/Domain/StoreServices.cs b/src/Squidex/Config/Domain/StoreServices.cs index 88f0b6ce5..5c76a96e1 100644 --- a/src/Squidex/Config/Domain/StoreServices.cs +++ b/src/Squidex/Config/Domain/StoreServices.cs @@ -28,7 +28,7 @@ using Squidex.Domain.Users; using Squidex.Domain.Users.MongoDb; using Squidex.Domain.Users.MongoDb.Infrastructure; using Squidex.Infrastructure; -using Squidex.Infrastructure.CQRS.Events; +using Squidex.Infrastructure.EventSourcing; using Squidex.Infrastructure.States; using Squidex.Infrastructure.UsageTracking; using Squidex.Shared.Users; diff --git a/src/Squidex/Config/Domain/WriteServices.cs b/src/Squidex/Config/Domain/WriteServices.cs index bd9936d2e..b0b7e070d 100644 --- a/src/Squidex/Config/Domain/WriteServices.cs +++ b/src/Squidex/Config/Domain/WriteServices.cs @@ -15,7 +15,7 @@ using Squidex.Domain.Apps.Write.Contents; using Squidex.Domain.Apps.Write.Rules; using Squidex.Domain.Apps.Write.Schemas; using Squidex.Domain.Users; -using Squidex.Infrastructure.CQRS.Commands; +using Squidex.Infrastructure.Commands; using Squidex.Pipeline.CommandMiddlewares; namespace Squidex.Config.Domain diff --git a/src/Squidex/Pipeline/CommandMiddlewares/ETagCommandMiddleware.cs b/src/Squidex/Pipeline/CommandMiddlewares/ETagCommandMiddleware.cs index c77a7e509..82029aea4 100644 --- a/src/Squidex/Pipeline/CommandMiddlewares/ETagCommandMiddleware.cs +++ b/src/Squidex/Pipeline/CommandMiddlewares/ETagCommandMiddleware.cs @@ -11,7 +11,7 @@ using System.Globalization; using System.Threading.Tasks; using Microsoft.AspNetCore.Http; using Microsoft.Extensions.Primitives; -using Squidex.Infrastructure.CQRS.Commands; +using Squidex.Infrastructure.Commands; namespace Squidex.Pipeline.CommandMiddlewares { diff --git a/src/Squidex/Pipeline/CommandMiddlewares/EnrichWithActorCommandMiddleware.cs b/src/Squidex/Pipeline/CommandMiddlewares/EnrichWithActorCommandMiddleware.cs index 043ff70b5..07a24847a 100644 --- a/src/Squidex/Pipeline/CommandMiddlewares/EnrichWithActorCommandMiddleware.cs +++ b/src/Squidex/Pipeline/CommandMiddlewares/EnrichWithActorCommandMiddleware.cs @@ -12,7 +12,7 @@ using System.Threading.Tasks; using Microsoft.AspNetCore.Http; using Squidex.Domain.Apps.Write; using Squidex.Infrastructure; -using Squidex.Infrastructure.CQRS.Commands; +using Squidex.Infrastructure.Commands; using Squidex.Infrastructure.Security; namespace Squidex.Pipeline.CommandMiddlewares diff --git a/src/Squidex/Pipeline/CommandMiddlewares/EnrichWithAppIdCommandMiddleware.cs b/src/Squidex/Pipeline/CommandMiddlewares/EnrichWithAppIdCommandMiddleware.cs index 810199289..d5a277039 100644 --- a/src/Squidex/Pipeline/CommandMiddlewares/EnrichWithAppIdCommandMiddleware.cs +++ b/src/Squidex/Pipeline/CommandMiddlewares/EnrichWithAppIdCommandMiddleware.cs @@ -11,7 +11,7 @@ using System.Threading.Tasks; using Microsoft.AspNetCore.Http; using Squidex.Domain.Apps.Write; using Squidex.Infrastructure; -using Squidex.Infrastructure.CQRS.Commands; +using Squidex.Infrastructure.Commands; namespace Squidex.Pipeline.CommandMiddlewares { diff --git a/src/Squidex/Pipeline/CommandMiddlewares/EnrichWithSchemaIdCommandMiddleware.cs b/src/Squidex/Pipeline/CommandMiddlewares/EnrichWithSchemaIdCommandMiddleware.cs index fbceb8398..596ea587f 100644 --- a/src/Squidex/Pipeline/CommandMiddlewares/EnrichWithSchemaIdCommandMiddleware.cs +++ b/src/Squidex/Pipeline/CommandMiddlewares/EnrichWithSchemaIdCommandMiddleware.cs @@ -14,7 +14,7 @@ using Squidex.Domain.Apps.Read.Schemas; using Squidex.Domain.Apps.Write; using Squidex.Domain.Apps.Write.Schemas; using Squidex.Infrastructure; -using Squidex.Infrastructure.CQRS.Commands; +using Squidex.Infrastructure.Commands; namespace Squidex.Pipeline.CommandMiddlewares { diff --git a/tests/Benchmarks/Services.cs b/tests/Benchmarks/Services.cs index dae481884..4530b2f24 100644 --- a/tests/Benchmarks/Services.cs +++ b/tests/Benchmarks/Services.cs @@ -21,7 +21,7 @@ using Squidex.Domain.Apps.Core.Rules.Json; using Squidex.Domain.Apps.Core.Schemas; using Squidex.Domain.Apps.Core.Schemas.Json; using Squidex.Infrastructure; -using Squidex.Infrastructure.CQRS.Events; +using Squidex.Infrastructure.EventSourcing; using Squidex.Infrastructure.Json; using Squidex.Infrastructure.Log; using Squidex.Infrastructure.MongoDb; diff --git a/tests/Benchmarks/Tests/AppendToEventStore.cs b/tests/Benchmarks/Tests/AppendToEventStore.cs index d33e20cde..679330ade 100644 --- a/tests/Benchmarks/Tests/AppendToEventStore.cs +++ b/tests/Benchmarks/Tests/AppendToEventStore.cs @@ -9,7 +9,7 @@ using System; using Benchmarks.Utils; using Microsoft.Extensions.DependencyInjection; -using Squidex.Infrastructure.CQRS.Events; +using Squidex.Infrastructure.EventSourcing; namespace Benchmarks.Tests { diff --git a/tests/Benchmarks/Tests/AppendToEventStoreWithManyWriters.cs b/tests/Benchmarks/Tests/AppendToEventStoreWithManyWriters.cs index ede647b4f..93ca46661 100644 --- a/tests/Benchmarks/Tests/AppendToEventStoreWithManyWriters.cs +++ b/tests/Benchmarks/Tests/AppendToEventStoreWithManyWriters.cs @@ -10,7 +10,7 @@ using System; using System.Threading.Tasks; using Benchmarks.Utils; using Microsoft.Extensions.DependencyInjection; -using Squidex.Infrastructure.CQRS.Events; +using Squidex.Infrastructure.EventSourcing; namespace Benchmarks.Tests { diff --git a/tests/Benchmarks/Tests/HandleEvents.cs b/tests/Benchmarks/Tests/HandleEvents.cs index f42dd9bb5..9ebddc8ac 100644 --- a/tests/Benchmarks/Tests/HandleEvents.cs +++ b/tests/Benchmarks/Tests/HandleEvents.cs @@ -9,8 +9,8 @@ using System; using Benchmarks.Tests.TestData; using Microsoft.Extensions.DependencyInjection; -using Squidex.Infrastructure.CQRS.Events; -using Squidex.Infrastructure.CQRS.Events.Grains; +using Squidex.Infrastructure.EventSourcing; +using Squidex.Infrastructure.EventSourcing.Grains; using Squidex.Infrastructure.States; namespace Benchmarks.Tests diff --git a/tests/Benchmarks/Tests/HandleEventsWithManyWriters.cs b/tests/Benchmarks/Tests/HandleEventsWithManyWriters.cs index c2c916e37..82de9fe89 100644 --- a/tests/Benchmarks/Tests/HandleEventsWithManyWriters.cs +++ b/tests/Benchmarks/Tests/HandleEventsWithManyWriters.cs @@ -10,8 +10,8 @@ using System; using System.Threading.Tasks; using Benchmarks.Tests.TestData; using Microsoft.Extensions.DependencyInjection; -using Squidex.Infrastructure.CQRS.Events; -using Squidex.Infrastructure.CQRS.Events.Grains; +using Squidex.Infrastructure.EventSourcing; +using Squidex.Infrastructure.EventSourcing.Grains; using Squidex.Infrastructure.States; namespace Benchmarks.Tests diff --git a/tests/Benchmarks/Tests/TestData/MyEvent.cs b/tests/Benchmarks/Tests/TestData/MyEvent.cs index 6bfccb29d..a11bd99bd 100644 --- a/tests/Benchmarks/Tests/TestData/MyEvent.cs +++ b/tests/Benchmarks/Tests/TestData/MyEvent.cs @@ -7,7 +7,7 @@ // ========================================================================== using Squidex.Infrastructure; -using Squidex.Infrastructure.CQRS.Events; +using Squidex.Infrastructure.EventSourcing; namespace Benchmarks.Tests.TestData { diff --git a/tests/Benchmarks/Tests/TestData/MyEventConsumer.cs b/tests/Benchmarks/Tests/TestData/MyEventConsumer.cs index dffb48561..153910c55 100644 --- a/tests/Benchmarks/Tests/TestData/MyEventConsumer.cs +++ b/tests/Benchmarks/Tests/TestData/MyEventConsumer.cs @@ -9,7 +9,7 @@ using System; using System.Collections.Generic; using System.Threading.Tasks; -using Squidex.Infrastructure.CQRS.Events; +using Squidex.Infrastructure.EventSourcing; using Squidex.Infrastructure.Tasks; namespace Benchmarks.Tests.TestData diff --git a/tests/Benchmarks/Utils/Helper.cs b/tests/Benchmarks/Utils/Helper.cs index 080914ce1..68da44773 100644 --- a/tests/Benchmarks/Utils/Helper.cs +++ b/tests/Benchmarks/Utils/Helper.cs @@ -7,7 +7,7 @@ // ========================================================================== using System; -using Squidex.Infrastructure.CQRS.Events; +using Squidex.Infrastructure.EventSourcing; namespace Benchmarks.Utils { diff --git a/tests/Squidex.Domain.Apps.Core.Tests/Operations/HandleRules/RuleServiceTests.cs b/tests/Squidex.Domain.Apps.Core.Tests/Operations/HandleRules/RuleServiceTests.cs index 207fdf0fc..5431f178a 100644 --- a/tests/Squidex.Domain.Apps.Core.Tests/Operations/HandleRules/RuleServiceTests.cs +++ b/tests/Squidex.Domain.Apps.Core.Tests/Operations/HandleRules/RuleServiceTests.cs @@ -17,7 +17,7 @@ using Squidex.Domain.Apps.Core.Rules.Triggers; using Squidex.Domain.Apps.Events; using Squidex.Domain.Apps.Events.Contents; using Squidex.Infrastructure; -using Squidex.Infrastructure.CQRS.Events; +using Squidex.Infrastructure.EventSourcing; using Xunit; #pragma warning disable xUnit2009 // Do not use boolean check to check for string equality diff --git a/tests/Squidex.Domain.Apps.Core.Tests/Operations/HandleRules/Triggers/ContentChangedTriggerTests.cs b/tests/Squidex.Domain.Apps.Core.Tests/Operations/HandleRules/Triggers/ContentChangedTriggerTests.cs index fd21711ca..60da2c52c 100644 --- a/tests/Squidex.Domain.Apps.Core.Tests/Operations/HandleRules/Triggers/ContentChangedTriggerTests.cs +++ b/tests/Squidex.Domain.Apps.Core.Tests/Operations/HandleRules/Triggers/ContentChangedTriggerTests.cs @@ -18,7 +18,7 @@ using Squidex.Domain.Apps.Events.Contents; using Squidex.Domain.Apps.Events.Rules; using Squidex.Domain.Apps.Events.Schemas; using Squidex.Infrastructure; -using Squidex.Infrastructure.CQRS.Events; +using Squidex.Infrastructure.EventSourcing; using Xunit; namespace Squidex.Domain.Apps.Core.Operations.HandleRules.Triggers diff --git a/tests/Squidex.Domain.Apps.Read.Tests/Rules/RuleEnqueuerTests.cs b/tests/Squidex.Domain.Apps.Read.Tests/Rules/RuleEnqueuerTests.cs index 0265529e2..93a598752 100644 --- a/tests/Squidex.Domain.Apps.Read.Tests/Rules/RuleEnqueuerTests.cs +++ b/tests/Squidex.Domain.Apps.Read.Tests/Rules/RuleEnqueuerTests.cs @@ -18,7 +18,7 @@ using Squidex.Domain.Apps.Core.Rules.Triggers; using Squidex.Domain.Apps.Events.Contents; using Squidex.Domain.Apps.Read.Rules.Repositories; using Squidex.Infrastructure; -using Squidex.Infrastructure.CQRS.Events; +using Squidex.Infrastructure.EventSourcing; using Xunit; namespace Squidex.Domain.Apps.Read.Rules diff --git a/tests/Squidex.Domain.Apps.Write.Tests/Apps/AppCommandMiddlewareTests.cs b/tests/Squidex.Domain.Apps.Write.Tests/Apps/AppCommandMiddlewareTests.cs index c582046fb..0f2cc3ccb 100644 --- a/tests/Squidex.Domain.Apps.Write.Tests/Apps/AppCommandMiddlewareTests.cs +++ b/tests/Squidex.Domain.Apps.Write.Tests/Apps/AppCommandMiddlewareTests.cs @@ -16,7 +16,7 @@ using Squidex.Domain.Apps.Read.Apps.Services.Implementations; using Squidex.Domain.Apps.Write.Apps.Commands; using Squidex.Domain.Apps.Write.TestHelpers; using Squidex.Infrastructure; -using Squidex.Infrastructure.CQRS.Commands; +using Squidex.Infrastructure.Commands; using Squidex.Shared.Users; using Xunit; diff --git a/tests/Squidex.Domain.Apps.Write.Tests/Assets/AssetCommandMiddlewareTests.cs b/tests/Squidex.Domain.Apps.Write.Tests/Assets/AssetCommandMiddlewareTests.cs index d39249f13..4a7d65a86 100644 --- a/tests/Squidex.Domain.Apps.Write.Tests/Assets/AssetCommandMiddlewareTests.cs +++ b/tests/Squidex.Domain.Apps.Write.Tests/Assets/AssetCommandMiddlewareTests.cs @@ -13,7 +13,7 @@ using FakeItEasy; using Squidex.Domain.Apps.Write.Assets.Commands; using Squidex.Domain.Apps.Write.TestHelpers; using Squidex.Infrastructure.Assets; -using Squidex.Infrastructure.CQRS.Commands; +using Squidex.Infrastructure.Commands; using Squidex.Infrastructure.Tasks; using Xunit; diff --git a/tests/Squidex.Domain.Apps.Write.Tests/Contents/ContentCommandMiddlewareTests.cs b/tests/Squidex.Domain.Apps.Write.Tests/Contents/ContentCommandMiddlewareTests.cs index dc6bd24ea..21d668f7e 100644 --- a/tests/Squidex.Domain.Apps.Write.Tests/Contents/ContentCommandMiddlewareTests.cs +++ b/tests/Squidex.Domain.Apps.Write.Tests/Contents/ContentCommandMiddlewareTests.cs @@ -23,7 +23,7 @@ using Squidex.Domain.Apps.Read.Schemas; using Squidex.Domain.Apps.Write.Contents.Commands; using Squidex.Domain.Apps.Write.TestHelpers; using Squidex.Infrastructure; -using Squidex.Infrastructure.CQRS.Commands; +using Squidex.Infrastructure.Commands; using Xunit; namespace Squidex.Domain.Apps.Write.Contents diff --git a/tests/Squidex.Domain.Apps.Write.Tests/Contents/ContentVersionLoaderTests.cs b/tests/Squidex.Domain.Apps.Write.Tests/Contents/ContentVersionLoaderTests.cs index 5a4cf45ed..76892d0fc 100644 --- a/tests/Squidex.Domain.Apps.Write.Tests/Contents/ContentVersionLoaderTests.cs +++ b/tests/Squidex.Domain.Apps.Write.Tests/Contents/ContentVersionLoaderTests.cs @@ -13,7 +13,7 @@ using FakeItEasy; using Squidex.Domain.Apps.Core.Contents; using Squidex.Domain.Apps.Events.Contents; using Squidex.Infrastructure; -using Squidex.Infrastructure.CQRS.Events; +using Squidex.Infrastructure.EventSourcing; using Xunit; namespace Squidex.Domain.Apps.Write.Contents diff --git a/tests/Squidex.Domain.Apps.Write.Tests/Rules/RuleCommandMiddlewareTests.cs b/tests/Squidex.Domain.Apps.Write.Tests/Rules/RuleCommandMiddlewareTests.cs index bab2b775d..c8055837d 100644 --- a/tests/Squidex.Domain.Apps.Write.Tests/Rules/RuleCommandMiddlewareTests.cs +++ b/tests/Squidex.Domain.Apps.Write.Tests/Rules/RuleCommandMiddlewareTests.cs @@ -16,7 +16,7 @@ using Squidex.Domain.Apps.Read; using Squidex.Domain.Apps.Read.Schemas; using Squidex.Domain.Apps.Write.Rules.Commands; using Squidex.Domain.Apps.Write.TestHelpers; -using Squidex.Infrastructure.CQRS.Commands; +using Squidex.Infrastructure.Commands; using Xunit; namespace Squidex.Domain.Apps.Write.Rules diff --git a/tests/Squidex.Domain.Apps.Write.Tests/Schemas/SchemaCommandMiddlewareTests.cs b/tests/Squidex.Domain.Apps.Write.Tests/Schemas/SchemaCommandMiddlewareTests.cs index 52375dcf0..9ad2b24fc 100644 --- a/tests/Squidex.Domain.Apps.Write.Tests/Schemas/SchemaCommandMiddlewareTests.cs +++ b/tests/Squidex.Domain.Apps.Write.Tests/Schemas/SchemaCommandMiddlewareTests.cs @@ -16,7 +16,7 @@ using Squidex.Domain.Apps.Read.Schemas; using Squidex.Domain.Apps.Write.Schemas.Commands; using Squidex.Domain.Apps.Write.TestHelpers; using Squidex.Infrastructure; -using Squidex.Infrastructure.CQRS.Commands; +using Squidex.Infrastructure.Commands; using Xunit; namespace Squidex.Domain.Apps.Write.Schemas diff --git a/tests/Squidex.Domain.Apps.Write.Tests/TestHelpers/AssertHelper.cs b/tests/Squidex.Domain.Apps.Write.Tests/TestHelpers/AssertHelper.cs index 8387e7a10..f9e889f95 100644 --- a/tests/Squidex.Domain.Apps.Write.Tests/TestHelpers/AssertHelper.cs +++ b/tests/Squidex.Domain.Apps.Write.Tests/TestHelpers/AssertHelper.cs @@ -9,7 +9,7 @@ using System.Collections.Generic; using System.Linq; using FluentAssertions; -using Squidex.Infrastructure.CQRS.Events; +using Squidex.Infrastructure.EventSourcing; namespace Squidex.Domain.Apps.Write.TestHelpers { diff --git a/tests/Squidex.Domain.Apps.Write.Tests/TestHelpers/HandlerTestBase.cs b/tests/Squidex.Domain.Apps.Write.Tests/TestHelpers/HandlerTestBase.cs index 601d0d27a..ae2d37688 100644 --- a/tests/Squidex.Domain.Apps.Write.Tests/TestHelpers/HandlerTestBase.cs +++ b/tests/Squidex.Domain.Apps.Write.Tests/TestHelpers/HandlerTestBase.cs @@ -11,7 +11,7 @@ using System.Threading.Tasks; using Squidex.Domain.Apps.Events; using Squidex.Infrastructure; using Squidex.Infrastructure.CQRS; -using Squidex.Infrastructure.CQRS.Commands; +using Squidex.Infrastructure.Commands; #pragma warning disable IDE0019 // Use pattern matching diff --git a/tests/Squidex.Infrastructure.Tests/CQRS/Commands/DefaultDomainObjectFactoryTests.cs b/tests/Squidex.Infrastructure.Tests/CQRS/Commands/DefaultDomainObjectFactoryTests.cs deleted file mode 100644 index 5c51356cf..000000000 --- a/tests/Squidex.Infrastructure.Tests/CQRS/Commands/DefaultDomainObjectFactoryTests.cs +++ /dev/null @@ -1,69 +0,0 @@ -// ========================================================================== -// DefaultDomainObjectFactoryTests.cs -// Squidex Headless CMS -// ========================================================================== -// Copyright (c) Squidex Group -// All rights reserved. -// ========================================================================== - -using System; -using FakeItEasy; -using Squidex.Infrastructure.CQRS.Events; -using Xunit; - -namespace Squidex.Infrastructure.CQRS.Commands -{ - public class DefaultDomainObjectFactoryTests - { - private readonly IServiceProvider serviceProvider = A.Fake(); - - private sealed class DO : DomainObjectBase - { - public DO(Guid id, int version) - : base(id, version) - { - } - - protected override void DispatchEvent(Envelope @event) - { - } - } - - [Fact] - public void Should_create_domain_object_with_autofac() - { - var factoryFunction = new DomainObjectFactoryFunction(passedId => - { - return new DO(passedId, -1); - }); - - A.CallTo(() => serviceProvider.GetService(typeof(DomainObjectFactoryFunction))) - .Returns(factoryFunction); - - var sut = new DefaultDomainObjectFactory(serviceProvider); - - var id = Guid.NewGuid(); - - var domainObject = sut.CreateNew(id); - - Assert.Equal(id, domainObject.Id); - Assert.Equal(-1, domainObject.Version); - } - - [Fact] - public void Should_throw_exception_if_new_entity_has_invalid_version() - { - var factoryFunction = new DomainObjectFactoryFunction(passedId => - { - return new DO(passedId, 0); - }); - - A.CallTo(() => serviceProvider.GetService(typeof(DomainObjectFactoryFunction))) - .Returns(factoryFunction); - - var sut = new DefaultDomainObjectFactory(serviceProvider); - - Assert.Throws(() => sut.CreateNew(Guid.NewGuid())); - } - } -} diff --git a/tests/Squidex.Infrastructure.Tests/CQRS/Commands/DefaultDomainObjectRepositoryTests.cs b/tests/Squidex.Infrastructure.Tests/CQRS/Commands/DefaultDomainObjectRepositoryTests.cs deleted file mode 100644 index 6145bfa11..000000000 --- a/tests/Squidex.Infrastructure.Tests/CQRS/Commands/DefaultDomainObjectRepositoryTests.cs +++ /dev/null @@ -1,189 +0,0 @@ -// ========================================================================== -// DefaultDomainObjectRepositoryTests.cs -// Squidex Headless CMS -// ========================================================================== -// Copyright (c) Squidex Group -// All rights reserved. -// ========================================================================== - -using System; -using System.Collections.Generic; -using System.Threading.Tasks; -using FakeItEasy; -using Squidex.Infrastructure.CQRS.Events; -using Squidex.Infrastructure.Tasks; -using Xunit; - -namespace Squidex.Infrastructure.CQRS.Commands -{ - public class DefaultDomainObjectRepositoryTests - { - private readonly IDomainObjectFactory factory = A.Fake(); - private readonly IEventStore eventStore = A.Fake(); - private readonly IStreamNameResolver nameResolver = A.Fake(); - private readonly EventDataFormatter formatter = A.Fake(); - private readonly string streamName = Guid.NewGuid().ToString(); - private readonly Guid aggregateId = Guid.NewGuid(); - private readonly MyDomainObject domainObject; - private readonly DefaultDomainObjectRepository sut; - - public DefaultDomainObjectRepositoryTests() - { - domainObject = new MyDomainObject(aggregateId, 123); - - A.CallTo(() => nameResolver.GetStreamName(A.Ignored, aggregateId.ToString())) - .Returns(streamName); - - A.CallTo(() => factory.CreateNew(aggregateId)) - .Returns(domainObject); - - sut = new DefaultDomainObjectRepository(eventStore, nameResolver, formatter); - } - - public sealed class MyEvent : IEvent - { - } - - public sealed class MyDomainObject : DomainObjectBase - { - private readonly List appliedEvents = new List(); - - public List AppliedEvents - { - get { return appliedEvents; } - } - - public MyDomainObject(Guid id, int version) - : base(id, version) - { - } - - public void AddEvent(IEvent @event) - { - RaiseEvent(@event); - } - - protected override void DispatchEvent(Envelope @event) - { - appliedEvents.Add(@event.Payload); - } - } - - [Fact] - public async Task Should_throw_exception_when_event_store_returns_no_events() - { - A.CallTo(() => eventStore.GetEventsAsync(streamName, -1)) - .Returns(new List()); - - await Assert.ThrowsAsync(() => sut.LoadAsync(domainObject, -1)); - } - - [Fact] - public async Task Should_apply_domain_objects_to_event() - { - var eventData1 = new EventData(); - var eventData2 = new EventData(); - - var event1 = new MyEvent(); - var event2 = new MyEvent(); - - var events = new List - { - new StoredEvent("0", 0, eventData1), - new StoredEvent("1", 1, eventData2) - }; - - A.CallTo(() => eventStore.GetEventsAsync(streamName, -1)) - .Returns(events); - - A.CallTo(() => formatter.Parse(eventData1, true)) - .Returns(new Envelope(event1)); - A.CallTo(() => formatter.Parse(eventData2, true)) - .Returns(new Envelope(event2)); - - await sut.LoadAsync(domainObject); - - Assert.Equal(domainObject.AppliedEvents, new[] { event1, event2 }); - } - - [Fact] - public async Task Should_throw_exception_if_final_version_does_not_match_to_expected() - { - var eventData1 = new EventData(); - var eventData2 = new EventData(); - - var event1 = new MyEvent(); - var event2 = new MyEvent(); - - var events = new List - { - new StoredEvent("0", 0, eventData1), - new StoredEvent("1", 1, eventData2) - }; - - A.CallTo(() => eventStore.GetEventsAsync(streamName, -1)) - .Returns(events); - - A.CallTo(() => formatter.Parse(eventData1, true)) - .Returns(new Envelope(event1)); - A.CallTo(() => formatter.Parse(eventData2, true)) - .Returns(new Envelope(event2)); - - await Assert.ThrowsAsync(() => sut.LoadAsync(domainObject, 200)); - } - - [Fact] - public async Task Should_append_events_and_publish() - { - var commitId = Guid.NewGuid(); - - var event1 = new MyEvent(); - var event2 = new MyEvent(); - - var eventData1 = new EventData(); - var eventData2 = new EventData(); - - A.CallTo(() => formatter.ToEventData(A>.That.Matches(e => e.Payload == event1), commitId, true)) - .Returns(eventData1); - A.CallTo(() => formatter.ToEventData(A>.That.Matches(e => e.Payload == event2), commitId, true)) - .Returns(eventData2); - - A.CallTo(() => eventStore.AppendEventsAsync(commitId, streamName, 123, A>.That.Matches(e => e.Count == 2))) - .Returns(TaskHelper.Done); - - domainObject.AddEvent(event1); - domainObject.AddEvent(event2); - - await sut.SaveAsync(domainObject, domainObject.GetUncomittedEvents(), commitId); - - A.CallTo(() => eventStore.AppendEventsAsync(commitId, streamName, 123, A>.That.Matches(e => e.Count == 2))).MustHaveHappened(); - } - - [Fact] - public async Task Should_throw_exception_on_version_mismatch() - { - var commitId = Guid.NewGuid(); - - var event1 = new MyEvent(); - var event2 = new MyEvent(); - - var eventData1 = new EventData(); - var eventData2 = new EventData(); - - A.CallTo(() => formatter.ToEventData(A>.That.Matches(e => e.Payload == event1), commitId, true)) - .Returns(eventData1); - A.CallTo(() => formatter.ToEventData(A>.That.Matches(e => e.Payload == event2), commitId, true)) - .Returns(eventData2); - - A.CallTo(() => eventStore.AppendEventsAsync(commitId, streamName, 123, A>.That.Matches(e => e.Count == 2))) - .Throws(new WrongEventVersionException(1, 2)); - - domainObject.AddEvent(event1); - domainObject.AddEvent(event2); - - await Assert.ThrowsAsync(() => sut.SaveAsync(domainObject, domainObject.GetUncomittedEvents(), commitId)); - - A.CallTo(() => eventStore.AppendEventsAsync(commitId, streamName, 123, A>.That.Matches(e => e.Count == 2))).MustHaveHappened(); - } - } -} diff --git a/tests/Squidex.Infrastructure.Tests/CQRS/Events/DefaultStreamNameResolverTests.cs b/tests/Squidex.Infrastructure.Tests/CQRS/Events/DefaultStreamNameResolverTests.cs deleted file mode 100644 index 7930b68f5..000000000 --- a/tests/Squidex.Infrastructure.Tests/CQRS/Events/DefaultStreamNameResolverTests.cs +++ /dev/null @@ -1,64 +0,0 @@ -// ========================================================================== -// DefaultStreamNameResolverTests.cs -// Squidex Headless CMS -// ========================================================================== -// Copyright (c) Squidex Group -// All rights reserved. -// ========================================================================== - -using Squidex.Infrastructure.CQRS; -using Squidex.Infrastructure.CQRS.Events; -using System; -using Xunit; - -namespace Squidex.Infrastructure.States -{ - public class DefaultStreamNameResolverTests - { - private readonly DefaultStreamNameResolver sut = new DefaultStreamNameResolver(); - - private sealed class MyUser : DomainObjectBase - { - public MyUser(Guid id, int version) - : base(id, version) - { - } - - protected override void DispatchEvent(Envelope @event) - { - } - } - - private sealed class MyUserDomainObject : DomainObjectBase - { - public MyUserDomainObject(Guid id, int version) - : base(id, version) - { - } - - protected override void DispatchEvent(Envelope @event) - { - } - } - - [Fact] - public void Should_calculate_name() - { - var user = new MyUser(Guid.NewGuid(), 1); - - var name = sut.GetStreamName(typeof(MyUser), user.Id.ToString()); - - Assert.Equal($"myUser-{user.Id}", name); - } - - [Fact] - public void Should_calculate_name_and_remove_suffix() - { - var user = new MyUserDomainObject(Guid.NewGuid(), 1); - - var name = sut.GetStreamName(typeof(MyUserDomainObject), user.Id.ToString()); - - Assert.Equal($"myUser-{user.Id}", name); - } - } -} diff --git a/tests/Squidex.Infrastructure.Tests/CQRS/Commands/AggregateHandlerTests.cs b/tests/Squidex.Infrastructure.Tests/Commands/AggregateHandlerTests.cs similarity index 53% rename from tests/Squidex.Infrastructure.Tests/CQRS/Commands/AggregateHandlerTests.cs rename to tests/Squidex.Infrastructure.Tests/Commands/AggregateHandlerTests.cs index fd388e909..ea6bf1899 100644 --- a/tests/Squidex.Infrastructure.Tests/CQRS/Commands/AggregateHandlerTests.cs +++ b/tests/Squidex.Infrastructure.Tests/Commands/AggregateHandlerTests.cs @@ -7,65 +7,54 @@ // ========================================================================== using System; -using System.Collections.Generic; using System.Threading.Tasks; using FakeItEasy; -using Squidex.Infrastructure.CQRS.Events; +using Squidex.Infrastructure.Commands.TestHelpers; +using Squidex.Infrastructure.EventSourcing; +using Squidex.Infrastructure.States; using Squidex.Infrastructure.Tasks; using Xunit; -namespace Squidex.Infrastructure.CQRS.Commands +namespace Squidex.Infrastructure.Commands { public class AggregateHandlerTests { - private sealed class MyEvent : IEvent - { - } - - private sealed class MyCommand : IAggregateCommand - { - public Guid AggregateId { get; set; } - - public long? ExpectedVersion { get; set; } - } - - private sealed class MyDomainObject : DomainObjectBase - { - public MyDomainObject(Guid id, int version) - : base(id, version) - { - } - - public MyDomainObject RaiseNewEvent(Envelope @event) - { - RaiseEvent(@event); - - return this; - } - - protected override void DispatchEvent(Envelope @event) - { - } - } - - private readonly IDomainObjectFactory factory = A.Fake(); - private readonly IDomainObjectRepository repository = A.Fake(); + private readonly IServiceProvider serviceProvider = A.Fake(); + private readonly IStore store = A.Fake(); + private readonly IStateFactory stateFactory = A.Fake(); + private readonly IPersistence persistence = A.Fake>(); private readonly Envelope event1 = new Envelope(new MyEvent()); private readonly Envelope event2 = new Envelope(new MyEvent()); + private readonly DomainObjectFactoryFunction factory; private readonly CommandContext context; private readonly AggregateHandler sut; + private readonly DomainObjectWrapper domainObjectWrapper = new DomainObjectWrapper(); + private readonly Guid domainObjectId = Guid.NewGuid(); private readonly MyDomainObject domainObject; public AggregateHandlerTests() { - sut = new AggregateHandler(factory, repository); + factory = new DomainObjectFactoryFunction(id => domainObject); domainObject = - new MyDomainObject(Guid.NewGuid(), 1) + new MyDomainObject(domainObjectId, 1) .RaiseNewEvent(event1) .RaiseNewEvent(event2); context = new CommandContext(new MyCommand { AggregateId = domainObject.Id }); + + A.CallTo(() => store.WithEventSourcing(domainObjectId.ToString(), A, Task>>.Ignored)) + .Returns(persistence); + + A.CallTo(() => serviceProvider.GetService(factory.GetType())) + .Returns(factory); + + A.CallTo(() => stateFactory.GetDetachedAsync>(domainObject.Id.ToString())) + .Returns(Task.FromResult(domainObjectWrapper)); + + sut = new AggregateHandler(stateFactory, serviceProvider); + + domainObjectWrapper.ActivateAsync(domainObjectId.ToString(), store).Wait(); } [Fact] @@ -77,12 +66,6 @@ namespace Squidex.Infrastructure.CQRS.Commands [Fact] public async Task Create_async_should_create_domain_object_and_save() { - A.CallTo(() => factory.CreateNew(domainObject.Id)) - .Returns(domainObject); - - A.CallTo(() => repository.SaveAsync(domainObject, A>>.Ignored, A.Ignored)) - .Returns(TaskHelper.Done); - MyDomainObject passedDomainObject = null; await sut.CreateAsync(context, async x => @@ -95,18 +78,16 @@ namespace Squidex.Infrastructure.CQRS.Commands Assert.Equal(domainObject, passedDomainObject); Assert.NotNull(context.Result>()); - A.CallTo(() => repository.SaveAsync(domainObject, A>>.Ignored, A.Ignored)).MustHaveHappened(); + A.CallTo(() => persistence.ReadAsync(-1)) + .MustHaveHappened(); + + A.CallTo(() => persistence.WriteEventsAsync(A[]>.Ignored)) + .MustHaveHappened(); } [Fact] public async Task Create_sync_should_create_domain_object_and_save() { - A.CallTo(() => factory.CreateNew(domainObject.Id)) - .Returns(domainObject); - - A.CallTo(() => repository.SaveAsync(domainObject, A>>.Ignored, A.Ignored)) - .Returns(TaskHelper.Done); - MyDomainObject passedDomainObject = null; await sut.CreateAsync(context, x => @@ -117,7 +98,11 @@ namespace Squidex.Infrastructure.CQRS.Commands Assert.Equal(domainObject, passedDomainObject); Assert.NotNull(context.Result>()); - A.CallTo(() => repository.SaveAsync(domainObject, A>>.Ignored, A.Ignored)).MustHaveHappened(); + A.CallTo(() => persistence.ReadAsync(-1)) + .MustHaveHappened(); + + A.CallTo(() => persistence.WriteEventsAsync(A[]>.Ignored)) + .MustHaveHappened(); } [Fact] @@ -129,12 +114,6 @@ namespace Squidex.Infrastructure.CQRS.Commands [Fact] public async Task Update_async_should_create_domain_object_and_save() { - A.CallTo(() => factory.CreateNew(domainObject.Id)) - .Returns(domainObject); - - A.CallTo(() => repository.SaveAsync(domainObject, A>>.Ignored, A.Ignored)) - .Returns(TaskHelper.Done); - MyDomainObject passedDomainObject = null; await sut.UpdateAsync(context, async x => @@ -147,19 +126,16 @@ namespace Squidex.Infrastructure.CQRS.Commands Assert.Equal(domainObject, passedDomainObject); Assert.NotNull(context.Result()); - A.CallTo(() => repository.LoadAsync(domainObject, null)).MustHaveHappened(); - A.CallTo(() => repository.SaveAsync(domainObject, A>>.Ignored, A.Ignored)).MustHaveHappened(); + A.CallTo(() => persistence.ReadAsync(null)) + .MustHaveHappened(); + + A.CallTo(() => persistence.WriteEventsAsync(A[]>.Ignored)) + .MustHaveHappened(); } [Fact] public async Task Update_sync_should_create_domain_object_and_save() { - A.CallTo(() => factory.CreateNew(domainObject.Id)) - .Returns(domainObject); - - A.CallTo(() => repository.SaveAsync(domainObject, A>>.Ignored, A.Ignored)) - .Returns(TaskHelper.Done); - MyDomainObject passedDomainObject = null; await sut.UpdateAsync(context, x => @@ -170,8 +146,11 @@ namespace Squidex.Infrastructure.CQRS.Commands Assert.Equal(domainObject, passedDomainObject); Assert.NotNull(context.Result()); - A.CallTo(() => repository.LoadAsync(domainObject, null)).MustHaveHappened(); - A.CallTo(() => repository.SaveAsync(domainObject, A>>.Ignored, A.Ignored)).MustHaveHappened(); + A.CallTo(() => persistence.ReadAsync(null)) + .MustHaveHappened(); + + A.CallTo(() => persistence.WriteEventsAsync(A[]>.Ignored)) + .MustHaveHappened(); } } } diff --git a/tests/Squidex.Infrastructure.Tests/CQRS/Commands/CommandContextTests.cs b/tests/Squidex.Infrastructure.Tests/Commands/CommandContextTests.cs similarity index 76% rename from tests/Squidex.Infrastructure.Tests/CQRS/Commands/CommandContextTests.cs rename to tests/Squidex.Infrastructure.Tests/Commands/CommandContextTests.cs index 49b506c97..8e7256bdb 100644 --- a/tests/Squidex.Infrastructure.Tests/CQRS/Commands/CommandContextTests.cs +++ b/tests/Squidex.Infrastructure.Tests/Commands/CommandContextTests.cs @@ -7,20 +7,24 @@ // ========================================================================== using System; -using FakeItEasy; +using Squidex.Infrastructure.Commands.TestHelpers; using Xunit; -namespace Squidex.Infrastructure.CQRS.Commands +namespace Squidex.Infrastructure.Commands { public class CommandContextTests { - private readonly ICommand command = A.Dummy(); + private readonly ICommand command = new MyCommand(); + private readonly CommandContext sut; + + public CommandContextTests() + { + sut = new CommandContext(command); + } [Fact] public void Should_instantiate_and_provide_command() { - var sut = new CommandContext(command); - Assert.Equal(command, sut.Command); Assert.False(sut.IsCompleted); Assert.NotEqual(Guid.Empty, sut.ContextId); @@ -29,8 +33,6 @@ namespace Squidex.Infrastructure.CQRS.Commands [Fact] public void Should_be_handled_when_succeeded() { - var sut = new CommandContext(command); - sut.Complete(); Assert.True(sut.IsCompleted); @@ -39,8 +41,6 @@ namespace Squidex.Infrastructure.CQRS.Commands [Fact] public void Should_provide_result_valid_when_succeeded_with_value() { - var sut = new CommandContext(command); - sut.Complete("RESULT"); } } diff --git a/tests/Squidex.Infrastructure.Tests/CQRS/DomainObjectBaseTests.cs b/tests/Squidex.Infrastructure.Tests/Commands/DomainObjectBaseTests.cs similarity index 61% rename from tests/Squidex.Infrastructure.Tests/CQRS/DomainObjectBaseTests.cs rename to tests/Squidex.Infrastructure.Tests/Commands/DomainObjectBaseTests.cs index 5af8d6559..8db73aea9 100644 --- a/tests/Squidex.Infrastructure.Tests/CQRS/DomainObjectBaseTests.cs +++ b/tests/Squidex.Infrastructure.Tests/Commands/DomainObjectBaseTests.cs @@ -8,43 +8,24 @@ using System; using System.Linq; -using Squidex.Infrastructure.CQRS.Events; +using Squidex.Infrastructure.Commands.TestHelpers; +using Squidex.Infrastructure.EventSourcing; using Xunit; -namespace Squidex.Infrastructure.CQRS +namespace Squidex.Infrastructure.Commands { public class DomainObjectBaseTests { - private sealed class MyEvent : IEvent - { - } - - private sealed class DO : DomainObjectBase - { - public DO(Guid id, int version) - : base(id, version) - { - } - - public void RaiseTestEvent(IEvent @event) - { - RaiseEvent(@event); - } - - protected override void DispatchEvent(Envelope @event) - { - } - } - [Fact] public void Should_instantiate() { - var id = Guid.NewGuid(); - var ver = 123; - var sut = new DO(id, ver); + var domainObjectId = Guid.NewGuid(); + var domainObjectVersion = 123; - Assert.Equal(id, sut.Id); - Assert.Equal(ver, sut.Version); + var sut = new MyDomainObject(domainObjectId, domainObjectVersion); + + Assert.Equal(domainObjectId, sut.Id); + Assert.Equal(domainObjectVersion, sut.Version); } [Fact] @@ -53,12 +34,12 @@ namespace Squidex.Infrastructure.CQRS var event1 = new MyEvent(); var event2 = new MyEvent(); - var sut = new DO(Guid.NewGuid(), 10); + var sut = new MyDomainObject(Guid.NewGuid(), 10); IAggregate aggregate = sut; - sut.RaiseTestEvent(event1); - sut.RaiseTestEvent(event2); + sut.RaiseNewEvent(event1); + sut.RaiseNewEvent(event2); Assert.Equal(12, sut.Version); @@ -75,7 +56,7 @@ namespace Squidex.Infrastructure.CQRS var event1 = new MyEvent(); var event2 = new MyEvent(); - var sut = new DO(Guid.NewGuid(), 10); + var sut = new MyDomainObject(Guid.NewGuid(), 10); IAggregate aggregate = sut; @@ -92,13 +73,12 @@ namespace Squidex.Infrastructure.CQRS var id1 = Guid.NewGuid(); var id2 = Guid.NewGuid(); - var user1a = new DO(id1, 1); - var user1b = new DO(id1, 2); - var user2 = new DO(id2, 2); + var user1a = new MyDomainObject(id1, 1); + var user1b = new MyDomainObject(id1, 2); + var user2a = new MyDomainObject(id2, 2); Assert.True(user1a.Equals(user1b)); - - Assert.False(user1a.Equals(user2)); + Assert.False(user1a.Equals(user2a)); } [Fact] @@ -107,13 +87,12 @@ namespace Squidex.Infrastructure.CQRS var id1 = Guid.NewGuid(); var id2 = Guid.NewGuid(); - var user1a = new DO(id1, 1); + var user1a = new MyDomainObject(id1, 1); - object user1b = new DO(id1, 2); - object user2a = new DO(id2, 2); + object user1b = new MyDomainObject(id1, 2); + object user2a = new MyDomainObject(id2, 2); Assert.True(user1a.Equals(user1b)); - Assert.False(user1a.Equals(user2a)); } @@ -123,13 +102,12 @@ namespace Squidex.Infrastructure.CQRS var id1 = Guid.NewGuid(); var id2 = Guid.NewGuid(); - var user1a = new DO(id1, 1); - var user1b = new DO(id1, 2); - var user2 = new DO(id2, 2); + var user1a = new MyDomainObject(id1, 1); + var user1b = new MyDomainObject(id1, 2); + var user2a = new MyDomainObject(id2, 2); Assert.Equal(user1a.GetHashCode(), user1b.GetHashCode()); - - Assert.NotEqual(user1a.GetHashCode(), user2.GetHashCode()); + Assert.NotEqual(user1a.GetHashCode(), user2a.GetHashCode()); } } } diff --git a/tests/Squidex.Infrastructure.Tests/CQRS/Commands/EnrichWithTimestampCommandMiddlewareTests.cs b/tests/Squidex.Infrastructure.Tests/Commands/EnrichWithTimestampCommandMiddlewareTests.cs similarity index 82% rename from tests/Squidex.Infrastructure.Tests/CQRS/Commands/EnrichWithTimestampCommandMiddlewareTests.cs rename to tests/Squidex.Infrastructure.Tests/Commands/EnrichWithTimestampCommandMiddlewareTests.cs index bb09751b9..01f0dda59 100644 --- a/tests/Squidex.Infrastructure.Tests/CQRS/Commands/EnrichWithTimestampCommandMiddlewareTests.cs +++ b/tests/Squidex.Infrastructure.Tests/Commands/EnrichWithTimestampCommandMiddlewareTests.cs @@ -9,19 +9,13 @@ using System.Threading.Tasks; using FakeItEasy; using NodaTime; +using Squidex.Infrastructure.Commands.TestHelpers; using Xunit; -namespace Squidex.Infrastructure.CQRS.Commands +namespace Squidex.Infrastructure.Commands { public sealed class EnrichWithTimestampCommandMiddlewareTests { - private sealed class MyTimestampCommand : ITimestampCommand - { - public Instant Timestamp { get; set; } - - public long? ExpectedVersion { get; set; } - } - private readonly IClock clock = A.Fake(); [Fact] @@ -33,7 +27,7 @@ namespace Squidex.Infrastructure.CQRS.Commands A.CallTo(() => clock.GetCurrentInstant()) .Returns(utc); - var command = new MyTimestampCommand(); + var command = new MyCommand(); await sut.HandleAsync(new CommandContext(command)); diff --git a/tests/Squidex.Infrastructure.Tests/CQRS/Commands/InMemoryCommandBusTests.cs b/tests/Squidex.Infrastructure.Tests/Commands/InMemoryCommandBusTests.cs similarity index 98% rename from tests/Squidex.Infrastructure.Tests/CQRS/Commands/InMemoryCommandBusTests.cs rename to tests/Squidex.Infrastructure.Tests/Commands/InMemoryCommandBusTests.cs index bd45d9849..1f9fdc57d 100644 --- a/tests/Squidex.Infrastructure.Tests/CQRS/Commands/InMemoryCommandBusTests.cs +++ b/tests/Squidex.Infrastructure.Tests/Commands/InMemoryCommandBusTests.cs @@ -12,7 +12,7 @@ using FakeItEasy; using Squidex.Infrastructure.Tasks; using Xunit; -namespace Squidex.Infrastructure.CQRS.Commands +namespace Squidex.Infrastructure.Commands { public class InMemoryCommandBusTests { diff --git a/tests/Squidex.Infrastructure.Tests/CQRS/Commands/LogCommandMiddlewareTests.cs b/tests/Squidex.Infrastructure.Tests/Commands/LogCommandMiddlewareTests.cs similarity index 98% rename from tests/Squidex.Infrastructure.Tests/CQRS/Commands/LogCommandMiddlewareTests.cs rename to tests/Squidex.Infrastructure.Tests/Commands/LogCommandMiddlewareTests.cs index 992f2f98c..1a056a9c1 100644 --- a/tests/Squidex.Infrastructure.Tests/CQRS/Commands/LogCommandMiddlewareTests.cs +++ b/tests/Squidex.Infrastructure.Tests/Commands/LogCommandMiddlewareTests.cs @@ -14,7 +14,7 @@ using Squidex.Infrastructure.Log; using Squidex.Infrastructure.Tasks; using Xunit; -namespace Squidex.Infrastructure.CQRS.Commands +namespace Squidex.Infrastructure.Commands { public class LogCommandMiddlewareTests { diff --git a/tests/Squidex.Infrastructure.Tests/Commands/TestHelpers/MyCommand.cs b/tests/Squidex.Infrastructure.Tests/Commands/TestHelpers/MyCommand.cs new file mode 100644 index 000000000..c610d9d08 --- /dev/null +++ b/tests/Squidex.Infrastructure.Tests/Commands/TestHelpers/MyCommand.cs @@ -0,0 +1,22 @@ +// ========================================================================== +// MyCommand.cs +// Squidex Headless CMS +// ========================================================================== +// Copyright (c) Squidex Group +// All rights reserved. +// ========================================================================== + +using System; +using NodaTime; + +namespace Squidex.Infrastructure.Commands.TestHelpers +{ + internal sealed class MyCommand : IAggregateCommand, ITimestampCommand + { + public Guid AggregateId { get; set; } + + public long? ExpectedVersion { get; set; } + + public Instant Timestamp { get; set; } + } +} diff --git a/tests/Squidex.Infrastructure.Tests/Commands/TestHelpers/MyDomainObject.cs b/tests/Squidex.Infrastructure.Tests/Commands/TestHelpers/MyDomainObject.cs new file mode 100644 index 000000000..33d65efd8 --- /dev/null +++ b/tests/Squidex.Infrastructure.Tests/Commands/TestHelpers/MyDomainObject.cs @@ -0,0 +1,39 @@ +// ========================================================================== +// AggregateHandlerTests.cs +// Squidex Headless CMS +// ========================================================================== +// Copyright (c) Squidex Group +// All rights reserved. +// ========================================================================== + +using System; +using Squidex.Infrastructure.EventSourcing; + +namespace Squidex.Infrastructure.Commands.TestHelpers +{ + internal sealed class MyDomainObject : DomainObjectBase + { + public MyDomainObject(Guid id, int version) + : base(id, version) + { + } + + public MyDomainObject RaiseNewEvent(IEvent @event) + { + RaiseEvent(@event); + + return this; + } + + public MyDomainObject RaiseNewEvent(Envelope @event) + { + RaiseEvent(@event); + + return this; + } + + protected override void DispatchEvent(Envelope @event) + { + } + } +} diff --git a/src/Squidex.Infrastructure/Commands/IDomainObjectFactory.cs b/tests/Squidex.Infrastructure.Tests/Commands/TestHelpers/MyEvent.cs similarity index 64% rename from src/Squidex.Infrastructure/Commands/IDomainObjectFactory.cs rename to tests/Squidex.Infrastructure.Tests/Commands/TestHelpers/MyEvent.cs index bcaff2c43..e8d7e0f4b 100644 --- a/src/Squidex.Infrastructure/Commands/IDomainObjectFactory.cs +++ b/tests/Squidex.Infrastructure.Tests/Commands/TestHelpers/MyEvent.cs @@ -1,17 +1,16 @@ // ========================================================================== -// IDomainObjectFactory.cs +// AggregateHandlerTests.cs // Squidex Headless CMS // ========================================================================== // Copyright (c) Squidex Group // All rights reserved. // ========================================================================== -using System; +using Squidex.Infrastructure.EventSourcing; -namespace Squidex.Infrastructure.CQRS.Commands +namespace Squidex.Infrastructure.Commands.TestHelpers { - public interface IDomainObjectFactory + internal sealed class MyEvent : IEvent { - T CreateNew(Guid id) where T : IAggregate; } -} +} \ No newline at end of file diff --git a/tests/Squidex.Infrastructure.Tests/CQRS/Events/CompoundEventConsumerTests.cs b/tests/Squidex.Infrastructure.Tests/EventSourcing/CompoundEventConsumerTests.cs similarity index 98% rename from tests/Squidex.Infrastructure.Tests/CQRS/Events/CompoundEventConsumerTests.cs rename to tests/Squidex.Infrastructure.Tests/EventSourcing/CompoundEventConsumerTests.cs index 09176575e..817867902 100644 --- a/tests/Squidex.Infrastructure.Tests/CQRS/Events/CompoundEventConsumerTests.cs +++ b/tests/Squidex.Infrastructure.Tests/EventSourcing/CompoundEventConsumerTests.cs @@ -11,7 +11,7 @@ using FakeItEasy; using Squidex.Infrastructure.Tasks; using Xunit; -namespace Squidex.Infrastructure.CQRS.Events +namespace Squidex.Infrastructure.EventSourcing { public class CompoundEventConsumerTests { diff --git a/tests/Squidex.Infrastructure.Tests/CQRS/Events/DefaultEventNotifierTests.cs b/tests/Squidex.Infrastructure.Tests/EventSourcing/DefaultEventNotifierTests.cs similarity index 96% rename from tests/Squidex.Infrastructure.Tests/CQRS/Events/DefaultEventNotifierTests.cs rename to tests/Squidex.Infrastructure.Tests/EventSourcing/DefaultEventNotifierTests.cs index 8810c42a1..ab98ab339 100644 --- a/tests/Squidex.Infrastructure.Tests/CQRS/Events/DefaultEventNotifierTests.cs +++ b/tests/Squidex.Infrastructure.Tests/EventSourcing/DefaultEventNotifierTests.cs @@ -9,7 +9,7 @@ using System.Collections.Generic; using Xunit; -namespace Squidex.Infrastructure.CQRS.Events +namespace Squidex.Infrastructure.EventSourcing { public sealed class DefaultEventNotifierTests { diff --git a/tests/Squidex.Infrastructure.Tests/CQRS/Events/EnvelopeExtensionsTests.cs b/tests/Squidex.Infrastructure.Tests/EventSourcing/EnvelopeExtensionsTests.cs similarity index 98% rename from tests/Squidex.Infrastructure.Tests/CQRS/Events/EnvelopeExtensionsTests.cs rename to tests/Squidex.Infrastructure.Tests/EventSourcing/EnvelopeExtensionsTests.cs index f626afb6e..9c5bb6101 100644 --- a/tests/Squidex.Infrastructure.Tests/CQRS/Events/EnvelopeExtensionsTests.cs +++ b/tests/Squidex.Infrastructure.Tests/EventSourcing/EnvelopeExtensionsTests.cs @@ -11,7 +11,7 @@ using System.Globalization; using NodaTime; using Xunit; -namespace Squidex.Infrastructure.CQRS.Events +namespace Squidex.Infrastructure.EventSourcing { public class EnvelopeExtensionsTests { diff --git a/tests/Squidex.Infrastructure.Tests/CQRS/Events/EnvelopeHeaderTests.cs b/tests/Squidex.Infrastructure.Tests/EventSourcing/EnvelopeHeaderTests.cs similarity index 97% rename from tests/Squidex.Infrastructure.Tests/CQRS/Events/EnvelopeHeaderTests.cs rename to tests/Squidex.Infrastructure.Tests/EventSourcing/EnvelopeHeaderTests.cs index af879bba2..a99f41d9f 100644 --- a/tests/Squidex.Infrastructure.Tests/CQRS/Events/EnvelopeHeaderTests.cs +++ b/tests/Squidex.Infrastructure.Tests/EventSourcing/EnvelopeHeaderTests.cs @@ -9,7 +9,7 @@ using System.Linq; using Xunit; -namespace Squidex.Infrastructure.CQRS.Events +namespace Squidex.Infrastructure.EventSourcing { public class EnvelopeHeaderTests { diff --git a/tests/Squidex.Infrastructure.Tests/CQRS/Events/EnvelopeTests.cs b/tests/Squidex.Infrastructure.Tests/EventSourcing/EnvelopeTests.cs similarity index 95% rename from tests/Squidex.Infrastructure.Tests/CQRS/Events/EnvelopeTests.cs rename to tests/Squidex.Infrastructure.Tests/EventSourcing/EnvelopeTests.cs index bf86bd336..c231af058 100644 --- a/tests/Squidex.Infrastructure.Tests/CQRS/Events/EnvelopeTests.cs +++ b/tests/Squidex.Infrastructure.Tests/EventSourcing/EnvelopeTests.cs @@ -10,7 +10,7 @@ using Squidex.Infrastructure.Json; using Squidex.Infrastructure.TestHelpers; using Xunit; -namespace Squidex.Infrastructure.CQRS.Events +namespace Squidex.Infrastructure.EventSourcing { public class EnvelopeTests { diff --git a/tests/Squidex.Infrastructure.Tests/CQRS/Events/EventDataFormatterTests.cs b/tests/Squidex.Infrastructure.Tests/EventSourcing/EventDataFormatterTests.cs similarity index 95% rename from tests/Squidex.Infrastructure.Tests/CQRS/Events/EventDataFormatterTests.cs rename to tests/Squidex.Infrastructure.Tests/EventSourcing/EventDataFormatterTests.cs index a7dd55470..6c0261cf5 100644 --- a/tests/Squidex.Infrastructure.Tests/CQRS/Events/EventDataFormatterTests.cs +++ b/tests/Squidex.Infrastructure.Tests/EventSourcing/EventDataFormatterTests.cs @@ -13,7 +13,7 @@ using NodaTime; using Squidex.Infrastructure.Json; using Xunit; -namespace Squidex.Infrastructure.CQRS.Events +namespace Squidex.Infrastructure.EventSourcing { public class EventDataFormatterTests { @@ -34,7 +34,7 @@ namespace Squidex.Infrastructure.CQRS.Events private readonly JsonSerializerSettings serializerSettings = new JsonSerializerSettings(); private readonly TypeNameRegistry typeNameRegistry = new TypeNameRegistry(); - private readonly EventDataFormatter sut; + private readonly JsonEventDataFormatter sut; public EventDataFormatterTests() { @@ -43,7 +43,7 @@ namespace Squidex.Infrastructure.CQRS.Events typeNameRegistry.Map(typeof(MyEvent), "Event"); typeNameRegistry.Map(typeof(MyOldEvent), "OldEvent"); - sut = new EventDataFormatter(typeNameRegistry, serializerSettings); + sut = new JsonEventDataFormatter(typeNameRegistry, serializerSettings); } [Fact] diff --git a/tests/Squidex.Infrastructure.Tests/CQRS/Events/Actors/EventConsumerGrainTests.cs b/tests/Squidex.Infrastructure.Tests/EventSourcing/Grains/EventConsumerGrainTests.cs similarity index 80% rename from tests/Squidex.Infrastructure.Tests/CQRS/Events/Actors/EventConsumerGrainTests.cs rename to tests/Squidex.Infrastructure.Tests/EventSourcing/Grains/EventConsumerGrainTests.cs index a848df9c9..30f111093 100644 --- a/tests/Squidex.Infrastructure.Tests/CQRS/Events/Actors/EventConsumerGrainTests.cs +++ b/tests/Squidex.Infrastructure.Tests/EventSourcing/Grains/EventConsumerGrainTests.cs @@ -14,8 +14,7 @@ using Squidex.Infrastructure.Log; using Squidex.Infrastructure.States; using Xunit; -/* -namespace Squidex.Infrastructure.CQRS.Events.Grains +namespace Squidex.Infrastructure.EventSourcing.Grains { public class EventConsumerGrainTests { @@ -25,8 +24,8 @@ namespace Squidex.Infrastructure.CQRS.Events.Grains public sealed class MyEventConsumerGrain : EventConsumerGrain { - public MyEventConsumerGrain(EventDataFormatter formatter, IEventStore eventStore, ISemanticLog log) - : base(formatter, eventStore, log) + public MyEventConsumerGrain(IEventStore eventStore, IEventDataFormatter eventDataFormatter, ISemanticLog log) + : base(eventStore, eventDataFormatter, log) { } @@ -40,14 +39,16 @@ namespace Squidex.Infrastructure.CQRS.Events.Grains private readonly IEventStore eventStore = A.Fake(); private readonly IEventSubscriber sutSubscriber; private readonly IEventSubscription eventSubscription = A.Fake(); + private readonly IPersistence persistence = A.Fake>(); private readonly ISemanticLog log = A.Fake(); - private readonly IStateHolder stateHolder = A.Fake>(); - private readonly EventDataFormatter formatter = A.Fake(); + private readonly IStore store = A.Fake(); + private readonly IEventDataFormatter formatter = A.Fake(); private readonly EventData eventData = new EventData(); private readonly Envelope envelope = new Envelope(new MyEvent()); private readonly EventConsumerGrain sut; private readonly string consumerName; private readonly string initialPosition = Guid.NewGuid().ToString(); + private Func apply; private EventConsumerState state = new EventConsumerState(); public EventConsumerGrainTests() @@ -56,24 +57,26 @@ namespace Squidex.Infrastructure.CQRS.Events.Grains consumerName = eventConsumer.GetType().Name; + A.CallTo(() => store.WithSnapshots(consumerName, A>.Ignored)) + .Invokes(new Action>((key, a) => apply = a)) + .Returns(persistence); + A.CallTo(() => eventStore.CreateSubscription(A.Ignored, A.Ignored, A.Ignored)) .Returns(eventSubscription); - A.CallTo(() => eventConsumer.Name). - Returns(consumerName); + A.CallTo(() => eventConsumer.Name) + .Returns(consumerName); - A.CallTo(() => stateHolder.State) - .ReturnsLazily(() => state); + A.CallTo(() => persistence.ReadAsync(null)) + .Invokes(new Action(s => apply(state))); - A.CallToSet(() => stateHolder.State) + A.CallTo(() => persistence.WriteSnapshotAsync(A.Ignored)) .Invokes(new Action(s => state = s)); A.CallTo(() => formatter.Parse(eventData, true)).Returns(envelope); - sut = new MyEventConsumerGrain(formatter, eventStore, log); + sut = new MyEventConsumerGrain(eventStore, formatter, log); sutSubscriber = sut; - - sut.ActivateAsync(consumerName, stateHolder).Wait(); } [Fact] @@ -81,6 +84,7 @@ namespace Squidex.Infrastructure.CQRS.Events.Grains { state = state.Stopped(); + sut.ActivateAsync(consumerName, store).Wait(); sut.Activate(eventConsumer); sut.Dispose(); @@ -93,6 +97,7 @@ namespace Squidex.Infrastructure.CQRS.Events.Grains [Fact] public void Should_subscribe_to_event_store_when_not_found_in_db() { + sut.ActivateAsync(consumerName, store).Wait(); sut.Activate(eventConsumer); sut.Dispose(); @@ -105,6 +110,7 @@ namespace Squidex.Infrastructure.CQRS.Events.Grains [Fact] public void Should_subscribe_to_event_store_when_not_stopped_in_db() { + sut.ActivateAsync(consumerName, store).Wait(); sut.Activate(eventConsumer); sut.Dispose(); @@ -117,6 +123,7 @@ namespace Squidex.Infrastructure.CQRS.Events.Grains [Fact] public void Should_stop_subscription_when_stopped() { + sut.ActivateAsync(consumerName, store).Wait(); sut.Activate(eventConsumer); sut.Stop(); sut.Stop(); @@ -125,7 +132,7 @@ namespace Squidex.Infrastructure.CQRS.Events.Grains state.ShouldBeEquivalentTo(new EventConsumerState { IsStopped = true, Position = initialPosition, Error = null }); - A.CallTo(() => stateHolder.WriteAsync()) + A.CallTo(() => persistence.WriteSnapshotAsync(A.Ignored)) .MustHaveHappened(Repeated.Exactly.Once); A.CallTo(() => eventSubscription.StopAsync()) @@ -135,6 +142,7 @@ namespace Squidex.Infrastructure.CQRS.Events.Grains [Fact] public void Should_reset_consumer_when_resetting() { + sut.ActivateAsync(consumerName, store).Wait(); sut.Activate(eventConsumer); sut.Stop(); sut.Reset(); @@ -142,7 +150,7 @@ namespace Squidex.Infrastructure.CQRS.Events.Grains state.ShouldBeEquivalentTo(new EventConsumerState { IsStopped = false, Position = null, Error = null }); - A.CallTo(() => stateHolder.WriteAsync()) + A.CallTo(() => persistence.WriteSnapshotAsync(A.Ignored)) .MustHaveHappened(Repeated.Exactly.Twice); A.CallTo(() => eventConsumer.ClearAsync()) @@ -161,6 +169,7 @@ namespace Squidex.Infrastructure.CQRS.Events.Grains [Fact] public async Task Should_invoke_and_update_position_when_event_received() { + sut.ActivateAsync(consumerName, store).Wait(); sut.Activate(eventConsumer); var @event = new StoredEvent(Guid.NewGuid().ToString(), 123, eventData); @@ -171,7 +180,7 @@ namespace Squidex.Infrastructure.CQRS.Events.Grains state.ShouldBeEquivalentTo(new EventConsumerState { IsStopped = false, Position = @event.EventPosition, Error = null }); - A.CallTo(() => stateHolder.WriteAsync()) + A.CallTo(() => persistence.WriteSnapshotAsync(A.Ignored)) .MustHaveHappened(Repeated.Exactly.Once); A.CallTo(() => eventConsumer.On(envelope)) @@ -181,6 +190,7 @@ namespace Squidex.Infrastructure.CQRS.Events.Grains [Fact] public async Task Should_ignore_old_events() { + sut.ActivateAsync(consumerName, store).Wait(); sut.Activate(eventConsumer); A.CallTo(() => formatter.Parse(eventData, true)) @@ -194,7 +204,7 @@ namespace Squidex.Infrastructure.CQRS.Events.Grains state.ShouldBeEquivalentTo(new EventConsumerState { IsStopped = false, Position = @event.EventPosition, Error = null }); - A.CallTo(() => stateHolder.WriteAsync()) + A.CallTo(() => persistence.WriteSnapshotAsync(A.Ignored)) .MustHaveHappened(Repeated.Exactly.Once); A.CallTo(() => eventConsumer.On(envelope)) @@ -204,6 +214,7 @@ namespace Squidex.Infrastructure.CQRS.Events.Grains [Fact] public async Task Should_not_invoke_and_update_position_when_event_is_from_another_subscription() { + sut.ActivateAsync(consumerName, store).Wait(); sut.Activate(eventConsumer); var @event = new StoredEvent(Guid.NewGuid().ToString(), 123, eventData); @@ -221,6 +232,7 @@ namespace Squidex.Infrastructure.CQRS.Events.Grains [Fact] public async Task Should_not_make_error_handling_when_exception_is_from_another_subscription() { + sut.ActivateAsync(consumerName, store).Wait(); sut.Activate(eventConsumer); var ex = new InvalidOperationException(); @@ -231,13 +243,14 @@ namespace Squidex.Infrastructure.CQRS.Events.Grains state.ShouldBeEquivalentTo(new EventConsumerState { IsStopped = false, Position = initialPosition, Error = null }); - A.CallTo(() => stateHolder.WriteAsync()) + A.CallTo(() => persistence.WriteSnapshotAsync(A.Ignored)) .MustNotHaveHappened(); } [Fact] public void Should_stop_if_resetting_failed() { + sut.ActivateAsync(consumerName, store).Wait(); sut.Activate(eventConsumer); var ex = new InvalidOperationException(); @@ -250,7 +263,7 @@ namespace Squidex.Infrastructure.CQRS.Events.Grains state.ShouldBeEquivalentTo(new EventConsumerState { IsStopped = true, Position = initialPosition, Error = ex.ToString() }); - A.CallTo(() => stateHolder.WriteAsync()) + A.CallTo(() => persistence.WriteSnapshotAsync(A.Ignored)) .MustHaveHappened(Repeated.Exactly.Once); A.CallTo(() => eventSubscription.StopAsync()) @@ -260,6 +273,7 @@ namespace Squidex.Infrastructure.CQRS.Events.Grains [Fact] public async Task Should_stop_if_handling_failed() { + sut.ActivateAsync(consumerName, store).Wait(); sut.Activate(eventConsumer); var ex = new InvalidOperationException(); @@ -278,7 +292,7 @@ namespace Squidex.Infrastructure.CQRS.Events.Grains A.CallTo(() => eventConsumer.On(envelope)) .MustHaveHappened(); - A.CallTo(() => stateHolder.WriteAsync()) + A.CallTo(() => persistence.WriteSnapshotAsync(A.Ignored)) .MustHaveHappened(Repeated.Exactly.Once); A.CallTo(() => eventSubscription.StopAsync()) @@ -288,6 +302,7 @@ namespace Squidex.Infrastructure.CQRS.Events.Grains [Fact] public async Task Should_stop_if_deserialization_failed() { + sut.ActivateAsync(consumerName, store).Wait(); sut.Activate(eventConsumer); var ex = new InvalidOperationException(); @@ -306,7 +321,7 @@ namespace Squidex.Infrastructure.CQRS.Events.Grains A.CallTo(() => eventConsumer.On(envelope)) .MustNotHaveHappened(); - A.CallTo(() => stateHolder.WriteAsync()) + A.CallTo(() => persistence.WriteSnapshotAsync(A.Ignored)) .MustHaveHappened(Repeated.Exactly.Once); A.CallTo(() => eventSubscription.StopAsync()) @@ -316,6 +331,7 @@ namespace Squidex.Infrastructure.CQRS.Events.Grains [Fact] public async Task Should_start_after_stop_when_handling_failed() { + sut.ActivateAsync(consumerName, store).Wait(); sut.Activate(eventConsumer); var exception = new InvalidOperationException(); @@ -336,7 +352,7 @@ namespace Squidex.Infrastructure.CQRS.Events.Grains A.CallTo(() => eventConsumer.On(envelope)) .MustHaveHappened(); - A.CallTo(() => stateHolder.WriteAsync()) + A.CallTo(() => persistence.WriteSnapshotAsync(A.Ignored)) .MustHaveHappened(Repeated.Exactly.Twice); A.CallTo(() => eventSubscription.StopAsync()) @@ -356,5 +372,4 @@ namespace Squidex.Infrastructure.CQRS.Events.Grains return sutSubscriber.OnEventAsync(subscriber, ev); } } -} -*/ \ No newline at end of file +} \ No newline at end of file diff --git a/tests/Squidex.Infrastructure.Tests/CQRS/Events/Actors/EventConsumerManagerTests.cs b/tests/Squidex.Infrastructure.Tests/EventSourcing/Grains/EventConsumerManagerTests.cs similarity index 97% rename from tests/Squidex.Infrastructure.Tests/CQRS/Events/Actors/EventConsumerManagerTests.cs rename to tests/Squidex.Infrastructure.Tests/EventSourcing/Grains/EventConsumerManagerTests.cs index d16ae68cb..db9602b0c 100644 --- a/tests/Squidex.Infrastructure.Tests/CQRS/Events/Actors/EventConsumerManagerTests.cs +++ b/tests/Squidex.Infrastructure.Tests/EventSourcing/Grains/EventConsumerManagerTests.cs @@ -10,11 +10,11 @@ using System; using System.Threading.Tasks; using FakeItEasy; using FluentAssertions; -using Squidex.Infrastructure.CQRS.Events.Grains.Messages; +using Squidex.Infrastructure.EventSourcing.Grains.Messages; using Squidex.Infrastructure.States; using Xunit; -namespace Squidex.Infrastructure.CQRS.Events.Grains +namespace Squidex.Infrastructure.EventSourcing.Grains { public class EventConsumerManagerTests { diff --git a/tests/Squidex.Infrastructure.Tests/CQRS/Events/PollingSubscriptionTests.cs b/tests/Squidex.Infrastructure.Tests/EventSourcing/PollingSubscriptionTests.cs similarity index 98% rename from tests/Squidex.Infrastructure.Tests/CQRS/Events/PollingSubscriptionTests.cs rename to tests/Squidex.Infrastructure.Tests/EventSourcing/PollingSubscriptionTests.cs index e5e2c063b..ac30ec586 100644 --- a/tests/Squidex.Infrastructure.Tests/CQRS/Events/PollingSubscriptionTests.cs +++ b/tests/Squidex.Infrastructure.Tests/EventSourcing/PollingSubscriptionTests.cs @@ -12,7 +12,7 @@ using System.Threading.Tasks; using FakeItEasy; using Xunit; -namespace Squidex.Infrastructure.CQRS.Events +namespace Squidex.Infrastructure.EventSourcing { public class PollingSubscriptionTests { diff --git a/tests/Squidex.Infrastructure.Tests/CQRS/Events/RetrySubscriptionTests.cs b/tests/Squidex.Infrastructure.Tests/EventSourcing/RetrySubscriptionTests.cs similarity index 98% rename from tests/Squidex.Infrastructure.Tests/CQRS/Events/RetrySubscriptionTests.cs rename to tests/Squidex.Infrastructure.Tests/EventSourcing/RetrySubscriptionTests.cs index 2a619ac4e..e3e35aefc 100644 --- a/tests/Squidex.Infrastructure.Tests/CQRS/Events/RetrySubscriptionTests.cs +++ b/tests/Squidex.Infrastructure.Tests/EventSourcing/RetrySubscriptionTests.cs @@ -11,7 +11,7 @@ using System.Threading.Tasks; using FakeItEasy; using Xunit; -namespace Squidex.Infrastructure.CQRS.Events +namespace Squidex.Infrastructure.EventSourcing { public class RetrySubscriptionTests { diff --git a/tests/Squidex.Infrastructure.Tests/States/DefaultStreamNameResolverTests.cs b/tests/Squidex.Infrastructure.Tests/States/DefaultStreamNameResolverTests.cs new file mode 100644 index 000000000..b58684a95 --- /dev/null +++ b/tests/Squidex.Infrastructure.Tests/States/DefaultStreamNameResolverTests.cs @@ -0,0 +1,48 @@ +// ========================================================================== +// DefaultStreamNameResolverTests.cs +// Squidex Headless CMS +// ========================================================================== +// Copyright (c) Squidex Group +// All rights reserved. +// ========================================================================== + +using System; +using Xunit; + +namespace Squidex.Infrastructure.States +{ + public class DefaultStreamNameResolverTests + { + private readonly DefaultStreamNameResolver sut = new DefaultStreamNameResolver(); + + private sealed class MyUser + { + } + + private sealed class MyUserDomainObject + { + } + + private readonly string id = Guid.NewGuid().ToString(); + + [Fact] + public void Should_calculate_name() + { + var user = new MyUser(); + + var name = sut.GetStreamName(typeof(MyUser), id); + + Assert.Equal($"myUser-{id}", name); + } + + [Fact] + public void Should_calculate_name_and_remove_suffix() + { + var user = new MyUserDomainObject(); + + var name = sut.GetStreamName(typeof(MyUserDomainObject), id); + + Assert.Equal($"myUser-{id}", name); + } + } +} diff --git a/tests/Squidex.Infrastructure.Tests/States/StateEventSourcingTests.cs b/tests/Squidex.Infrastructure.Tests/States/StateEventSourcingTests.cs new file mode 100644 index 000000000..6a27dc263 --- /dev/null +++ b/tests/Squidex.Infrastructure.Tests/States/StateEventSourcingTests.cs @@ -0,0 +1,348 @@ +// ========================================================================== +// StateEventSourcingTests.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 FakeItEasy; +using Microsoft.Extensions.Caching.Memory; +using Microsoft.Extensions.Options; +using Squidex.Infrastructure.EventSourcing; +using Squidex.Infrastructure.Tasks; +using Xunit; + +namespace Squidex.Infrastructure.States +{ + public class StateEventSourcingTests + { + public sealed class MyEvent : IEvent + { + } + + private class MyStatefulObject : IStatefulObject + { + private readonly List appliedEvents = new List(); + private IPersistence persistence; + + public long? ExpectedVersion { get; set; } + + public List AppliedEvents + { + get { return appliedEvents; } + } + + public Task ActivateAsync(string key, IStore store) + { + persistence = store.WithEventSourcing(key, e => appliedEvents.Add(e.Payload)); + + return persistence.ReadAsync(ExpectedVersion); + } + + public Task WriteEventsAsync(params IEvent[] events) + { + return persistence.WriteEventsAsync(events.Select(Envelope.Create).ToArray()); + } + } + + private class MyStatefulObjectWithSnapshot : IStatefulObject + { + private IPersistence persistence; + + public long? ExpectedVersion { get; set; } + + public Task ActivateAsync(string key, IStore store) + { + persistence = store.WithSnapshotsAndEventSourcing(key, s => TaskHelper.Done, s => TaskHelper.Done); + + return persistence.ReadAsync(ExpectedVersion); + } + } + + private readonly string key = Guid.NewGuid().ToString(); + private readonly MyStatefulObject statefulObject = new MyStatefulObject(); + private readonly MyStatefulObjectWithSnapshot statefulObjectWithSnapShot = new MyStatefulObjectWithSnapshot(); + private readonly IEventDataFormatter eventDataFormatter = A.Fake(); + private readonly IEventStore eventStore = A.Fake(); + private readonly IMemoryCache cache = new MemoryCache(Options.Create(new MemoryCacheOptions())); + private readonly IPubSub pubSub = new InMemoryPubSub(true); + private readonly IServiceProvider services = A.Fake(); + private readonly ISnapshotStore snapshotStore = A.Fake(); + private readonly IStreamNameResolver streamNameResolver = A.Fake(); + private readonly StateFactory sut; + + public StateEventSourcingTests() + { + A.CallTo(() => services.GetService(typeof(MyStatefulObject))) + .Returns(statefulObject); + A.CallTo(() => services.GetService(typeof(MyStatefulObjectWithSnapshot))) + .Returns(statefulObjectWithSnapShot); + + A.CallTo(() => streamNameResolver.GetStreamName(typeof(MyStatefulObject), key)) + .Returns(key); + A.CallTo(() => streamNameResolver.GetStreamName(typeof(MyStatefulObjectWithSnapshot), key)) + .Returns(key); + + sut = new StateFactory(pubSub, cache, eventStore, eventDataFormatter, services, snapshotStore, streamNameResolver); + sut.Connect(); + } + + [Fact] + public async Task Should_read_from_store() + { + statefulObject.ExpectedVersion = 1; + + var event1 = new MyEvent(); + var event2 = new MyEvent(); + + SetupEventStore(event1, event2); + + var actualObject = await sut.GetSynchronizedAsync(key); + + Assert.Same(statefulObject, actualObject); + Assert.NotNull(cache.Get(key)); + + Assert.Equal(actualObject.AppliedEvents, new[] { event1, event2 }); + } + + [Fact] + public async Task Should_read_events_from_snapshot() + { + statefulObjectWithSnapShot.ExpectedVersion = null; + + A.CallTo(() => snapshotStore.ReadAsync(key)) + .Returns((2, 2L)); + + SetupEventStore(3, 2); + + await sut.GetSynchronizedAsync(key); + + A.CallTo(() => eventStore.GetEventsAsync(key, 3)) + .MustHaveHappened(); + } + + [Fact] + public async Task Should_throw_exception_if_events_are_older_than_snapshot() + { + statefulObjectWithSnapShot.ExpectedVersion = null; + + A.CallTo(() => snapshotStore.ReadAsync(key)) + .Returns((2, 2L)); + + SetupEventStore(3, 0, 3); + + await Assert.ThrowsAsync(() => sut.GetSynchronizedAsync(key)); + } + + [Fact] + public async Task Should_throw_exception_if_events_have_gaps_to_snapshot() + { + statefulObjectWithSnapShot.ExpectedVersion = null; + + A.CallTo(() => snapshotStore.ReadAsync(key)) + .Returns((2, 2L)); + + SetupEventStore(3, 4, 3); + + await Assert.ThrowsAsync(() => sut.GetSynchronizedAsync(key)); + } + + [Fact] + public async Task Should_throw_exception_if_not_found() + { + statefulObject.ExpectedVersion = 0; + + SetupEventStore(0); + + await Assert.ThrowsAsync(() => sut.GetSynchronizedAsync(key)); + } + + [Fact] + public async Task Should_throw_exception_if_other_version_found() + { + statefulObject.ExpectedVersion = 1; + + SetupEventStore(3); + + await Assert.ThrowsAsync(() => sut.GetSynchronizedAsync(key)); + } + + [Fact] + public async Task Should_not_throw_exception_if_noting_expected() + { + statefulObject.ExpectedVersion = null; + + SetupEventStore(0); + + await sut.GetSynchronizedAsync(key); + } + + [Fact] + public async Task Should_provide_state_from_services_and_add_to_cache() + { + statefulObject.ExpectedVersion = null; + + SetupEventStore(0); + + var actualObject = await sut.GetSynchronizedAsync(key); + + Assert.Same(statefulObject, actualObject); + Assert.NotNull(cache.Get(key)); + } + + [Fact] + public async Task Should_serve_next_request_from_cache() + { + statefulObject.ExpectedVersion = null; + + SetupEventStore(0); + + var actualObject1 = await sut.GetSynchronizedAsync(key); + + Assert.Same(statefulObject, actualObject1); + Assert.NotNull(cache.Get(key)); + + var actualObject2 = await sut.GetSynchronizedAsync(key); + + Assert.Same(statefulObject, actualObject2); + + A.CallTo(() => services.GetService(typeof(MyStatefulObject))) + .MustHaveHappened(Repeated.Exactly.Once); + } + + [Fact] + public async Task Should_write_to_store_with_previous_position() + { + statefulObject.ExpectedVersion = null; + + InvalidateMessage message = null; + + pubSub.Subscribe(m => + { + message = m; + }); + + SetupEventStore(3); + + var actualObject = await sut.GetSynchronizedAsync(key); + + Assert.Same(statefulObject, actualObject); + + await statefulObject.WriteEventsAsync(new MyEvent(), new MyEvent()); + await statefulObject.WriteEventsAsync(new MyEvent(), new MyEvent()); + + A.CallTo(() => eventStore.AppendEventsAsync(A.Ignored, key, 2, A>.That.Matches(x => x.Count == 2))) + .MustHaveHappened(); + A.CallTo(() => eventStore.AppendEventsAsync(A.Ignored, key, 4, A>.That.Matches(x => x.Count == 2))) + .MustHaveHappened(); + + Assert.NotNull(message); + Assert.Equal(key, message.Key); + } + + [Fact] + public async Task Should_wrap_exception_when_writing_to_store_with_previous_position() + { + statefulObject.ExpectedVersion = null; + + SetupEventStore(3); + + var actualObject = await sut.GetSynchronizedAsync(key); + + A.CallTo(() => eventStore.AppendEventsAsync(A.Ignored, key, 2, A>.That.Matches(x => x.Count == 2))) + .Throws(new WrongEventVersionException(1, 1)); + + await Assert.ThrowsAsync(() => statefulObject.WriteEventsAsync(new MyEvent(), new MyEvent())); + } + + [Fact] + public async Task Should_remove_from_cache_when_invalidation_message_received() + { + statefulObject.ExpectedVersion = null; + + var actualObject = await sut.GetSynchronizedAsync(key); + + await InvalidateCacheAsync(); + + Assert.False(cache.TryGetValue(key, out var t)); + } + + [Fact] + public async Task Should_return_same_instance_for_parallel_requests() + { + statefulObject.ExpectedVersion = null; + + A.CallTo(() => snapshotStore.ReadAsync(key)) + .ReturnsLazily(() => Task.Delay(1).ContinueWith(x => (1, 1L))); + + var tasks = new List>(); + + for (var i = 0; i < 1000; i++) + { + tasks.Add(Task.Run(() => sut.GetSynchronizedAsync(key))); + } + + var retrievedStates = await Task.WhenAll(tasks); + + foreach (var retrievedState in retrievedStates) + { + Assert.Same(retrievedStates[0], retrievedState); + } + + A.CallTo(() => eventStore.GetEventsAsync(key, 0)) + .MustHaveHappened(Repeated.Exactly.Once); + } + + private async Task RemoveFromCacheAsync() + { + cache.Remove(key); + + await Task.Delay(400); + } + + private async Task InvalidateCacheAsync() + { + pubSub.Publish(new InvalidateMessage { Key = key }, true); + + await Task.Delay(400); + } + + private void SetupEventStore(int count, int eventOffset = 0, int readPosition = 0) + { + SetupEventStore(Enumerable.Repeat(0, count).Select(x => new MyEvent()).ToArray(), eventOffset, readPosition); + } + + private void SetupEventStore(params MyEvent[] events) + { + SetupEventStore(events, 0, 0); + } + + private void SetupEventStore(MyEvent[] events, int eventOffset = 0, int readPosition = 0) + { + var eventsStored = new List(); + + var i = eventOffset; + + foreach (var @event in events) + { + var eventData = new EventData(); + var eventStored = new StoredEvent(i.ToString(), i, eventData); + + eventsStored.Add(eventStored); + + A.CallTo(() => eventDataFormatter.Parse(eventData, true)) + .Returns(new Envelope(@event)); + + i++; + } + + A.CallTo(() => eventStore.GetEventsAsync(key, readPosition)) + .Returns(eventsStored); + } + } +} \ No newline at end of file diff --git a/tests/Squidex.Infrastructure.Tests/States/StateSnapshotTests.cs b/tests/Squidex.Infrastructure.Tests/States/StateSnapshotTests.cs new file mode 100644 index 000000000..23bfa3743 --- /dev/null +++ b/tests/Squidex.Infrastructure.Tests/States/StateSnapshotTests.cs @@ -0,0 +1,253 @@ +// ========================================================================== +// StateSnapshotTests.cs +// Squidex Headless CMS +// ========================================================================== +// Copyright (c) Squidex Group +// All rights reserved. +// ========================================================================== + +using System; +using System.Collections.Generic; +using System.Threading.Tasks; +using FakeItEasy; +using Microsoft.Extensions.Caching.Memory; +using Microsoft.Extensions.Options; +using Squidex.Infrastructure.EventSourcing; +using Xunit; + +namespace Squidex.Infrastructure.States +{ + public class StateSnapshotTests + { + private class MyStatefulObject : IStatefulObject + { + private IPersistence persistence; + private int state; + + public long? ExpectedVersion { get; set; } + + public int State + { + get { return state; } + } + + public Task ActivateAsync(string key, IStore store) + { + persistence = store.WithSnapshots(key, s => state = s); + + return persistence.ReadAsync(ExpectedVersion); + } + + public void SetState(int value) + { + state = value; + } + + public Task WriteStateAsync() + { + return persistence.WriteSnapshotAsync(state); + } + } + + private readonly string key = Guid.NewGuid().ToString(); + private readonly MyStatefulObject statefulObject = new MyStatefulObject(); + private readonly IEventDataFormatter eventDataFormatter = A.Fake(); + private readonly IEventStore eventStore = A.Fake(); + private readonly IMemoryCache cache = new MemoryCache(Options.Create(new MemoryCacheOptions())); + private readonly IPubSub pubSub = new InMemoryPubSub(true); + private readonly IServiceProvider services = A.Fake(); + private readonly ISnapshotStore snapshotStore = A.Fake(); + private readonly IStreamNameResolver streamNameResolver = A.Fake(); + private readonly StateFactory sut; + + public StateSnapshotTests() + { + A.CallTo(() => services.GetService(typeof(MyStatefulObject))) + .Returns(statefulObject); + + sut = new StateFactory(pubSub, cache, eventStore, eventDataFormatter, services, snapshotStore, streamNameResolver); + sut.Connect(); + } + + [Fact] + public async Task Should_read_from_store() + { + statefulObject.ExpectedVersion = 1; + + A.CallTo(() => snapshotStore.ReadAsync(key)) + .Returns((123, 1)); + + var actualObject = await sut.GetSynchronizedAsync(key); + + Assert.Same(statefulObject, actualObject); + Assert.NotNull(cache.Get(key)); + + Assert.Equal(123, statefulObject.State); + } + + [Fact] + public async Task Should_throw_exception_if_not_found() + { + statefulObject.ExpectedVersion = 0; + + A.CallTo(() => snapshotStore.ReadAsync(key)) + .Returns((0, -1)); + + await Assert.ThrowsAsync(() => sut.GetSynchronizedAsync(key)); + } + + [Fact] + public async Task Should_throw_exception_if_other_version_found() + { + statefulObject.ExpectedVersion = 1; + + A.CallTo(() => snapshotStore.ReadAsync(key)) + .Returns((2, 2)); + + await Assert.ThrowsAsync(() => sut.GetSynchronizedAsync(key)); + } + + [Fact] + public async Task Should_not_throw_exception_if_noting_expected() + { + statefulObject.ExpectedVersion = null; + + A.CallTo(() => snapshotStore.ReadAsync(key)) + .Returns((0, -1)); + + await sut.GetSynchronizedAsync(key); + } + + [Fact] + public async Task Should_provide_state_from_services_and_add_to_cache() + { + statefulObject.ExpectedVersion = null; + + var actualObject = await sut.GetSynchronizedAsync(key); + + Assert.Same(statefulObject, actualObject); + Assert.NotNull(cache.Get(key)); + } + + [Fact] + public async Task Should_serve_next_request_from_cache() + { + statefulObject.ExpectedVersion = null; + + var actualObject1 = await sut.GetSynchronizedAsync(key); + + Assert.Same(statefulObject, actualObject1); + Assert.NotNull(cache.Get(key)); + + var actualObject2 = await sut.GetSynchronizedAsync(key); + + Assert.Same(statefulObject, actualObject2); + + A.CallTo(() => services.GetService(typeof(MyStatefulObject))) + .MustHaveHappened(Repeated.Exactly.Once); + } + + [Fact] + public async Task Should_write_to_store_with_previous_version() + { + statefulObject.ExpectedVersion = null; + + var version = 1; + + InvalidateMessage message = null; + + pubSub.Subscribe(m => + { + message = m; + }); + + A.CallTo(() => snapshotStore.ReadAsync(key)) + .Returns((123, version)); + + var actualObject = await sut.GetSynchronizedAsync(key); + + Assert.Same(statefulObject, actualObject); + Assert.Equal(123, statefulObject.State); + + statefulObject.SetState(456); + + await statefulObject.WriteStateAsync(); + + A.CallTo(() => snapshotStore.WriteAsync(key, 456, version, 2)) + .MustHaveHappened(); + + Assert.NotNull(message); + Assert.Equal(key, message.Key); + } + + [Fact] + public async Task Should_wrap_exception_when_writing_to_store_with_previous_version() + { + statefulObject.ExpectedVersion = null; + + var version = 1; + + A.CallTo(() => snapshotStore.ReadAsync(key)) + .Returns((123, version)); + + A.CallTo(() => snapshotStore.WriteAsync(key, 123, version, 2)) + .Throws(new InconsistentStateException(1, 1)); + + var actualObject = await sut.GetSynchronizedAsync(key); + + await Assert.ThrowsAsync(() => statefulObject.WriteStateAsync()); + } + + [Fact] + public async Task Should_remove_from_cache_when_invalidation_message_received() + { + statefulObject.ExpectedVersion = null; + + var actualObject = await sut.GetSynchronizedAsync(key); + + await InvalidateCacheAsync(); + + Assert.False(cache.TryGetValue(key, out var t)); + } + + [Fact] + public async Task Should_return_same_instance_for_parallel_requests() + { + statefulObject.ExpectedVersion = null; + + A.CallTo(() => snapshotStore.ReadAsync(key)) + .ReturnsLazily(() => Task.Delay(1).ContinueWith(x => (1, 1L))); + + var tasks = new List>(); + + for (var i = 0; i < 1000; i++) + { + tasks.Add(Task.Run(() => sut.GetSynchronizedAsync(key))); + } + + var retrievedStates = await Task.WhenAll(tasks); + + foreach (var retrievedState in retrievedStates) + { + Assert.Same(retrievedStates[0], retrievedState); + } + + A.CallTo(() => snapshotStore.ReadAsync(key)) + .MustHaveHappened(Repeated.Exactly.Once); + } + + private async Task RemoveFromCacheAsync() + { + cache.Remove(key); + + await Task.Delay(400); + } + + private async Task InvalidateCacheAsync() + { + pubSub.Publish(new InvalidateMessage { Key = key }, true); + + await Task.Delay(400); + } + } +} \ No newline at end of file diff --git a/tests/Squidex.Infrastructure.Tests/States/StatesTests.cs b/tests/Squidex.Infrastructure.Tests/States/StatesTests.cs deleted file mode 100644 index f2c250205..000000000 --- a/tests/Squidex.Infrastructure.Tests/States/StatesTests.cs +++ /dev/null @@ -1,166 +0,0 @@ -// ========================================================================== -// StatesTests.cs -// Squidex Headless CMS -// ========================================================================== -// Copyright (c) Squidex Group -// All rights reserved. -// ========================================================================== - -/* -using System; -using System.Collections.Generic; -using System.Threading.Tasks; -using FakeItEasy; -using Microsoft.Extensions.Caching.Memory; -using Microsoft.Extensions.Options; -using Xunit; - -namespace Squidex.Infrastructure.States -{ - public class StatesTests - { - private class MyStatefulObject : StatefulObject - { - public void SetState(int value) - { - State = value; - } - } - - private readonly string key = Guid.NewGuid().ToString(); - private readonly MyStatefulObject state = new MyStatefulObject(); - private readonly IMemoryCache cache = new MemoryCache(Options.Create(new MemoryCacheOptions())); - private readonly IPubSub pubSub = new InMemoryPubSub(true); - private readonly IServiceProvider services = A.Fake(); - private readonly IStateStore store = A.Fake(); - private readonly StateFactory sut; - - public StatesTests() - { - A.CallTo(() => services.GetService(typeof(MyStatefulObject))) - .Returns(state); - - sut = new StateFactory(pubSub, services, store, cache); - sut.Connect(); - } - - [Fact] - public async Task Should_read_from_store() - { - A.CallTo(() => store.ReadAsync(key)) - .Returns((123, Guid.NewGuid().ToString())); - - var actual = await sut.GetAsync(key); - - Assert.Same(state, actual); - Assert.NotNull(cache.Get(key)); - - Assert.Equal(123, state.State); - } - - [Fact] - public async Task Should_provide_state_from_services_and_add_to_cache() - { - var actual = await sut.GetAsync(key); - - Assert.Same(state, actual); - Assert.NotNull(cache.Get(key)); - } - - [Fact] - public async Task Should_serve_next_request_from_cache() - { - var actual1 = await sut.GetAsync(key); - - Assert.Same(state, actual1); - Assert.NotNull(cache.Get(key)); - - var actual2 = await sut.GetAsync(key); - - Assert.Same(state, actual2); - - A.CallTo(() => services.GetService(typeof(MyStatefulObject))) - .MustHaveHappened(Repeated.Exactly.Once); - } - - [Fact] - public async Task Should_write_to_store_with_previous_etag() - { - var etag = Guid.NewGuid().ToString(); - - InvalidateMessage message = null; - - pubSub.Subscribe(m => - { - message = m; - }); - - A.CallTo(() => store.ReadAsync(key)) - .Returns((123, etag)); - - var actual = await sut.GetAsync(key); - - Assert.Same(state, actual); - Assert.Equal(123, state.State); - - state.SetState(456); - - await state.WriteStateAsync(); - - A.CallTo(() => store.WriteAsync(key, 456, etag, A.That.Matches(x => x != null))) - .MustHaveHappened(); - - Assert.NotNull(message); - Assert.Equal(key, message.Key); - } - - [Fact] - public async Task Should_remove_from_cache_when_invalidation_message_received() - { - var actual = await sut.GetAsync(key); - - await InvalidateCacheAsync(); - - Assert.False(cache.TryGetValue(key, out var t)); - } - - [Fact] - public async Task Should_return_same_instance_for_parallel_requests() - { - A.CallTo(() => store.ReadAsync(key)) - .ReturnsLazily(() => Task.Delay(1).ContinueWith(x => (1, "1"))); - - var tasks = new List>(); - - for (var i = 0; i < 1000; i++) - { - tasks.Add(Task.Run(() => sut.GetAsync(key))); - } - - var retrievedStates = await Task.WhenAll(tasks); - - foreach (var retrievedState in retrievedStates) - { - Assert.Same(retrievedStates[0], retrievedState); - } - - A.CallTo(() => store.ReadAsync(key)) - .MustHaveHappened(Repeated.Exactly.Once); - } - - private async Task RemoveFromCacheAsync() - { - cache.Remove(key); - - await Task.Delay(400); - } - - private async Task InvalidateCacheAsync() - { - pubSub.Publish(new InvalidateMessage { Key = key }, true); - - await Task.Delay(400); - } - } -} -*/ \ No newline at end of file diff --git a/tests/Squidex.Infrastructure.Tests/TypeNameRegistryTests.cs b/tests/Squidex.Infrastructure.Tests/TypeNameRegistryTests.cs index 0f65a5191..bef4a539a 100644 --- a/tests/Squidex.Infrastructure.Tests/TypeNameRegistryTests.cs +++ b/tests/Squidex.Infrastructure.Tests/TypeNameRegistryTests.cs @@ -8,7 +8,7 @@ using System; using System.Reflection; -using Squidex.Infrastructure.CQRS.Events; +using Squidex.Infrastructure.EventSourcing; using Xunit; namespace Squidex.Infrastructure