diff --git a/Squidex.ruleset b/Squidex.ruleset index a90cb38ec..71faa1a84 100644 --- a/Squidex.ruleset +++ b/Squidex.ruleset @@ -74,8 +74,9 @@ + - + \ No newline at end of file diff --git a/Squidex.sln.DotSettings b/Squidex.sln.DotSettings index dd880d5ac..0f875a4d0 100644 --- a/Squidex.sln.DotSettings +++ b/Squidex.sln.DotSettings @@ -8,6 +8,5 @@ ========================================================================== Copyright (c) Squidex Group All rights reserved. -========================================================================== - +========================================================================== \ No newline at end of file diff --git a/src/Squidex.Domain.Apps.Core/Schemas/AssetsFieldProperties.cs b/src/Squidex.Domain.Apps.Core/Schemas/AssetsFieldProperties.cs index 9043bea08..b57ebb249 100644 --- a/src/Squidex.Domain.Apps.Core/Schemas/AssetsFieldProperties.cs +++ b/src/Squidex.Domain.Apps.Core/Schemas/AssetsFieldProperties.cs @@ -12,7 +12,7 @@ using Squidex.Infrastructure; namespace Squidex.Domain.Apps.Core.Schemas { - [TypeName("AssetsField")] + [TypeName(nameof(AssetsField))] public sealed class AssetsFieldProperties : FieldProperties { private int? minItems; diff --git a/src/Squidex.Domain.Apps.Core/Schemas/BooleanFieldProperties.cs b/src/Squidex.Domain.Apps.Core/Schemas/BooleanFieldProperties.cs index 949ddcb95..8a3baa590 100644 --- a/src/Squidex.Domain.Apps.Core/Schemas/BooleanFieldProperties.cs +++ b/src/Squidex.Domain.Apps.Core/Schemas/BooleanFieldProperties.cs @@ -12,7 +12,7 @@ using Squidex.Infrastructure; namespace Squidex.Domain.Apps.Core.Schemas { - [TypeName("BooleanField")] + [TypeName(nameof(BooleanField))] public sealed class BooleanFieldProperties : FieldProperties { private BooleanFieldEditor editor; diff --git a/src/Squidex.Domain.Apps.Core/Schemas/DateTimeFieldProperties.cs b/src/Squidex.Domain.Apps.Core/Schemas/DateTimeFieldProperties.cs index 97fc37d2d..b725debe4 100644 --- a/src/Squidex.Domain.Apps.Core/Schemas/DateTimeFieldProperties.cs +++ b/src/Squidex.Domain.Apps.Core/Schemas/DateTimeFieldProperties.cs @@ -14,7 +14,7 @@ using Squidex.Infrastructure; namespace Squidex.Domain.Apps.Core.Schemas { - [TypeName("DateTime")] + [TypeName(nameof(DateTimeField))] public sealed class DateTimeFieldProperties : FieldProperties { private DateTimeFieldEditor editor; diff --git a/src/Squidex.Domain.Apps.Core/Schemas/FieldRegistry.cs b/src/Squidex.Domain.Apps.Core/Schemas/FieldRegistry.cs index 9bb178828..aedfb23cb 100644 --- a/src/Squidex.Domain.Apps.Core/Schemas/FieldRegistry.cs +++ b/src/Squidex.Domain.Apps.Core/Schemas/FieldRegistry.cs @@ -78,6 +78,9 @@ namespace Squidex.Domain.Apps.Core.Schemas Add( (id, name, partitioning, properties) => new GeolocationField(id, name, partitioning, (GeolocationFieldProperties)properties)); + + typeNameRegistry.MapObsolete(typeof(ReferencesFieldProperties), "DateTime"); + typeNameRegistry.MapObsolete(typeof(DateTimeFieldProperties), "References"); } private void Add(FactoryFunction fieldFactory) diff --git a/src/Squidex.Domain.Apps.Core/Schemas/GeolocationFieldProperties.cs b/src/Squidex.Domain.Apps.Core/Schemas/GeolocationFieldProperties.cs index 701f5d23b..d52f124d2 100644 --- a/src/Squidex.Domain.Apps.Core/Schemas/GeolocationFieldProperties.cs +++ b/src/Squidex.Domain.Apps.Core/Schemas/GeolocationFieldProperties.cs @@ -12,7 +12,7 @@ using Squidex.Infrastructure; namespace Squidex.Domain.Apps.Core.Schemas { - [TypeName("GeolocationField")] + [TypeName(nameof(GeolocationField))] public sealed class GeolocationFieldProperties : FieldProperties { private GeolocationFieldEditor editor; diff --git a/src/Squidex.Domain.Apps.Core/Schemas/JsonFieldProperties.cs b/src/Squidex.Domain.Apps.Core/Schemas/JsonFieldProperties.cs index a6db0b1d1..3dfcf1252 100644 --- a/src/Squidex.Domain.Apps.Core/Schemas/JsonFieldProperties.cs +++ b/src/Squidex.Domain.Apps.Core/Schemas/JsonFieldProperties.cs @@ -12,7 +12,7 @@ using Squidex.Infrastructure; namespace Squidex.Domain.Apps.Core.Schemas { - [TypeName("JsonField")] + [TypeName(nameof(JsonField))] public sealed class JsonFieldProperties : FieldProperties { public override JToken GetDefaultValue() diff --git a/src/Squidex.Domain.Apps.Core/Schemas/NumberFieldProperties.cs b/src/Squidex.Domain.Apps.Core/Schemas/NumberFieldProperties.cs index 594ec2834..3d4cf9ff4 100644 --- a/src/Squidex.Domain.Apps.Core/Schemas/NumberFieldProperties.cs +++ b/src/Squidex.Domain.Apps.Core/Schemas/NumberFieldProperties.cs @@ -13,7 +13,7 @@ using Squidex.Infrastructure; namespace Squidex.Domain.Apps.Core.Schemas { - [TypeName("NumberField")] + [TypeName(nameof(NumberField))] public sealed class NumberFieldProperties : FieldProperties { private double? maxValue; diff --git a/src/Squidex.Domain.Apps.Core/Schemas/ReferencesFieldProperties.cs b/src/Squidex.Domain.Apps.Core/Schemas/ReferencesFieldProperties.cs index 25d73d70e..22279b93d 100644 --- a/src/Squidex.Domain.Apps.Core/Schemas/ReferencesFieldProperties.cs +++ b/src/Squidex.Domain.Apps.Core/Schemas/ReferencesFieldProperties.cs @@ -13,7 +13,7 @@ using Squidex.Infrastructure; namespace Squidex.Domain.Apps.Core.Schemas { - [TypeName("References")] + [TypeName(nameof(ReferencesField))] public sealed class ReferencesFieldProperties : FieldProperties { private int? minItems; diff --git a/src/Squidex.Domain.Apps.Core/Schemas/StringFieldProperties.cs b/src/Squidex.Domain.Apps.Core/Schemas/StringFieldProperties.cs index 5750a8480..eb70680ac 100644 --- a/src/Squidex.Domain.Apps.Core/Schemas/StringFieldProperties.cs +++ b/src/Squidex.Domain.Apps.Core/Schemas/StringFieldProperties.cs @@ -13,7 +13,7 @@ using Squidex.Infrastructure; namespace Squidex.Domain.Apps.Core.Schemas { - [TypeName("StringField")] + [TypeName(nameof(StringField))] public sealed class StringFieldProperties : FieldProperties { private int? minLength; diff --git a/src/Squidex.Domain.Apps.Events/Apps/AppClientAttached.cs b/src/Squidex.Domain.Apps.Events/Apps/AppClientAttached.cs index b6e0bb1e1..04c07f839 100644 --- a/src/Squidex.Domain.Apps.Events/Apps/AppClientAttached.cs +++ b/src/Squidex.Domain.Apps.Events/Apps/AppClientAttached.cs @@ -6,11 +6,11 @@ // All rights reserved. // ========================================================================== -using Squidex.Infrastructure; +using Squidex.Infrastructure.CQRS.Events; namespace Squidex.Domain.Apps.Events.Apps { - [TypeName("AppClientAttachedEvent")] + [EventType(nameof(AppClientAttached))] public sealed class AppClientAttached : AppEvent { public string Id { get; set; } diff --git a/src/Squidex.Domain.Apps.Events/Apps/AppClientChanged.cs b/src/Squidex.Domain.Apps.Events/Apps/AppClientChanged.cs index ed785ff5d..89aeb2b7a 100644 --- a/src/Squidex.Domain.Apps.Events/Apps/AppClientChanged.cs +++ b/src/Squidex.Domain.Apps.Events/Apps/AppClientChanged.cs @@ -6,11 +6,11 @@ // All rights reserved. // ========================================================================== -using Squidex.Infrastructure; +using Squidex.Infrastructure.CQRS.Events; namespace Squidex.Domain.Apps.Events.Apps { - [TypeName("AppClientChangedEvent")] + [EventType(nameof(AppClientChanged))] public sealed class AppClientChanged : AppEvent { public string Id { get; set; } diff --git a/src/Squidex.Domain.Apps.Events/Apps/AppClientRenamed.cs b/src/Squidex.Domain.Apps.Events/Apps/AppClientRenamed.cs index bc4f8fd79..7e238f4b5 100644 --- a/src/Squidex.Domain.Apps.Events/Apps/AppClientRenamed.cs +++ b/src/Squidex.Domain.Apps.Events/Apps/AppClientRenamed.cs @@ -6,11 +6,11 @@ // All rights reserved. // ========================================================================== -using Squidex.Infrastructure; +using Squidex.Infrastructure.CQRS.Events; namespace Squidex.Domain.Apps.Events.Apps { - [TypeName("AppClientRenamedEvent")] + [EventType(nameof(AppClientRenamed))] public sealed class AppClientRenamed : AppEvent { public string Id { get; set; } diff --git a/src/Squidex.Domain.Apps.Events/Apps/AppClientRevoked.cs b/src/Squidex.Domain.Apps.Events/Apps/AppClientRevoked.cs index 2f669017a..4dedfa106 100644 --- a/src/Squidex.Domain.Apps.Events/Apps/AppClientRevoked.cs +++ b/src/Squidex.Domain.Apps.Events/Apps/AppClientRevoked.cs @@ -6,11 +6,11 @@ // All rights reserved. // ========================================================================== -using Squidex.Infrastructure; +using Squidex.Infrastructure.CQRS.Events; namespace Squidex.Domain.Apps.Events.Apps { - [TypeName("AppClientRevokedEvent")] + [EventType(nameof(AppClientRevoked))] public sealed class AppClientRevoked : AppEvent { public string Id { get; set; } diff --git a/src/Squidex.Domain.Apps.Events/Apps/AppContributorAssigned.cs b/src/Squidex.Domain.Apps.Events/Apps/AppContributorAssigned.cs index 256748e6c..3924c2ef1 100644 --- a/src/Squidex.Domain.Apps.Events/Apps/AppContributorAssigned.cs +++ b/src/Squidex.Domain.Apps.Events/Apps/AppContributorAssigned.cs @@ -7,11 +7,11 @@ // ========================================================================== using Squidex.Domain.Apps.Core.Apps; -using Squidex.Infrastructure; +using Squidex.Infrastructure.CQRS.Events; namespace Squidex.Domain.Apps.Events.Apps { - [TypeName("AppContributorAssignedEvent")] + [EventType(nameof(AppContributorAssigned))] public sealed class AppContributorAssigned : AppEvent { public string ContributorId { get; set; } diff --git a/src/Squidex.Domain.Apps.Events/Apps/AppContributorRemoved.cs b/src/Squidex.Domain.Apps.Events/Apps/AppContributorRemoved.cs index 48de37e3e..ade3e8582 100644 --- a/src/Squidex.Domain.Apps.Events/Apps/AppContributorRemoved.cs +++ b/src/Squidex.Domain.Apps.Events/Apps/AppContributorRemoved.cs @@ -6,11 +6,11 @@ // All rights reserved. // ========================================================================== -using Squidex.Infrastructure; +using Squidex.Infrastructure.CQRS.Events; namespace Squidex.Domain.Apps.Events.Apps { - [TypeName("AppContributorRemovedEvent")] + [EventType(nameof(AppContributorRemoved))] public sealed class AppContributorRemoved : AppEvent { public string ContributorId { get; set; } diff --git a/src/Squidex.Domain.Apps.Events/Apps/AppCreated.cs b/src/Squidex.Domain.Apps.Events/Apps/AppCreated.cs index 803bc435f..6ec2efb8d 100644 --- a/src/Squidex.Domain.Apps.Events/Apps/AppCreated.cs +++ b/src/Squidex.Domain.Apps.Events/Apps/AppCreated.cs @@ -6,11 +6,11 @@ // All rights reserved. // ========================================================================== -using Squidex.Infrastructure; +using Squidex.Infrastructure.CQRS.Events; namespace Squidex.Domain.Apps.Events.Apps { - [TypeName("AppCreatedEvent")] + [EventType(nameof(AppCreated))] public sealed class AppCreated : AppEvent { public string Name { get; set; } diff --git a/src/Squidex.Domain.Apps.Events/Apps/AppLanguageAdded.cs b/src/Squidex.Domain.Apps.Events/Apps/AppLanguageAdded.cs index 5ac9af148..72c6a2b88 100644 --- a/src/Squidex.Domain.Apps.Events/Apps/AppLanguageAdded.cs +++ b/src/Squidex.Domain.Apps.Events/Apps/AppLanguageAdded.cs @@ -7,10 +7,11 @@ // ========================================================================== using Squidex.Infrastructure; +using Squidex.Infrastructure.CQRS.Events; namespace Squidex.Domain.Apps.Events.Apps { - [TypeName("AppLanguageAddedEvent")] + [EventType(nameof(AppLanguageAdded))] public sealed class AppLanguageAdded : AppEvent { public Language Language { get; set; } diff --git a/src/Squidex.Domain.Apps.Events/Apps/AppLanguageRemoved.cs b/src/Squidex.Domain.Apps.Events/Apps/AppLanguageRemoved.cs index 90b6cfc3e..740023863 100644 --- a/src/Squidex.Domain.Apps.Events/Apps/AppLanguageRemoved.cs +++ b/src/Squidex.Domain.Apps.Events/Apps/AppLanguageRemoved.cs @@ -7,10 +7,11 @@ // ========================================================================== using Squidex.Infrastructure; +using Squidex.Infrastructure.CQRS.Events; namespace Squidex.Domain.Apps.Events.Apps { - [TypeName("AppLanguageRemovedEvent")] + [EventType(nameof(AppLanguageRemoved))] public sealed class AppLanguageRemoved : AppEvent { public Language Language { get; set; } diff --git a/src/Squidex.Domain.Apps.Events/Apps/AppMasterLanguageSet.cs b/src/Squidex.Domain.Apps.Events/Apps/AppMasterLanguageSet.cs index 28ed5df9b..14000e296 100644 --- a/src/Squidex.Domain.Apps.Events/Apps/AppMasterLanguageSet.cs +++ b/src/Squidex.Domain.Apps.Events/Apps/AppMasterLanguageSet.cs @@ -7,10 +7,11 @@ // ========================================================================== using Squidex.Infrastructure; +using Squidex.Infrastructure.CQRS.Events; namespace Squidex.Domain.Apps.Events.Apps { - [TypeName("AppMasterLanguageSetEvent")] + [EventType(nameof(AppMasterLanguageSet))] public sealed class AppMasterLanguageSet : AppEvent { public Language Language { get; set; } diff --git a/src/Squidex.Domain.Apps.Events/Assets/AssetCreated.cs b/src/Squidex.Domain.Apps.Events/Assets/AssetCreated.cs index ba4a266ed..3af7d4e33 100644 --- a/src/Squidex.Domain.Apps.Events/Assets/AssetCreated.cs +++ b/src/Squidex.Domain.Apps.Events/Assets/AssetCreated.cs @@ -6,11 +6,11 @@ // All rights reserved. // ========================================================================== -using Squidex.Infrastructure; +using Squidex.Infrastructure.CQRS.Events; namespace Squidex.Domain.Apps.Events.Assets { - [TypeName("AssetCreatedEvent")] + [EventType(nameof(AssetCreated))] public sealed class AssetCreated : AssetEvent { public string FileName { get; set; } diff --git a/src/Squidex.Domain.Apps.Events/Assets/AssetDeleted.cs b/src/Squidex.Domain.Apps.Events/Assets/AssetDeleted.cs index b0b3bd2cf..5dba605e0 100644 --- a/src/Squidex.Domain.Apps.Events/Assets/AssetDeleted.cs +++ b/src/Squidex.Domain.Apps.Events/Assets/AssetDeleted.cs @@ -6,11 +6,11 @@ // All rights reserved. // ========================================================================== -using Squidex.Infrastructure; +using Squidex.Infrastructure.CQRS.Events; namespace Squidex.Domain.Apps.Events.Assets { - [TypeName("AssetDeletedEvent")] + [EventType(nameof(AssetDeleted))] public sealed class AssetDeleted : AssetEvent { public long DeletedSize { get; set; } diff --git a/src/Squidex.Domain.Apps.Events/Assets/AssetRenamed.cs b/src/Squidex.Domain.Apps.Events/Assets/AssetRenamed.cs index 3f82732a6..fe6b65184 100644 --- a/src/Squidex.Domain.Apps.Events/Assets/AssetRenamed.cs +++ b/src/Squidex.Domain.Apps.Events/Assets/AssetRenamed.cs @@ -6,11 +6,11 @@ // All rights reserved. // ========================================================================== -using Squidex.Infrastructure; +using Squidex.Infrastructure.CQRS.Events; namespace Squidex.Domain.Apps.Events.Assets { - [TypeName("AssetRenamedEvent")] + [EventType(nameof(AssetRenamed))] public sealed class AssetRenamed : AssetEvent { public string FileName { get; set; } diff --git a/src/Squidex.Domain.Apps.Events/Contents/ContentCreated.cs b/src/Squidex.Domain.Apps.Events/Contents/ContentCreated.cs index 6c43803d5..61d5b8ce2 100644 --- a/src/Squidex.Domain.Apps.Events/Contents/ContentCreated.cs +++ b/src/Squidex.Domain.Apps.Events/Contents/ContentCreated.cs @@ -7,11 +7,11 @@ // ========================================================================== using Squidex.Domain.Apps.Core.Contents; -using Squidex.Infrastructure; +using Squidex.Infrastructure.CQRS.Events; namespace Squidex.Domain.Apps.Events.Contents { - [TypeName("ContentCreatedEvent")] + [EventType(nameof(ContentCreated))] public sealed class ContentCreated : ContentEvent { public NamedContentData Data { get; set; } diff --git a/src/Squidex.Domain.Apps.Events/Contents/ContentDeleted.cs b/src/Squidex.Domain.Apps.Events/Contents/ContentDeleted.cs index bcad5c030..568deb9a3 100644 --- a/src/Squidex.Domain.Apps.Events/Contents/ContentDeleted.cs +++ b/src/Squidex.Domain.Apps.Events/Contents/ContentDeleted.cs @@ -6,11 +6,11 @@ // All rights reserved. // ========================================================================== -using Squidex.Infrastructure; +using Squidex.Infrastructure.CQRS.Events; namespace Squidex.Domain.Apps.Events.Contents { - [TypeName("ContentDeletedEvent")] + [EventType(nameof(ContentDeleted))] public sealed class ContentDeleted : ContentEvent { } diff --git a/src/Squidex.Domain.Apps.Events/Contents/ContentPublished.cs b/src/Squidex.Domain.Apps.Events/Contents/ContentPublished.cs index dd2f077a5..f8b6f8278 100644 --- a/src/Squidex.Domain.Apps.Events/Contents/ContentPublished.cs +++ b/src/Squidex.Domain.Apps.Events/Contents/ContentPublished.cs @@ -6,11 +6,11 @@ // All rights reserved. // ========================================================================== -using Squidex.Infrastructure; +using Squidex.Infrastructure.CQRS.Events; namespace Squidex.Domain.Apps.Events.Contents { - [TypeName("ContentPublishedEvent")] + [EventType(nameof(ContentPublished))] public sealed class ContentPublished : ContentEvent { } diff --git a/src/Squidex.Domain.Apps.Events/Contents/ContentUnpublished.cs b/src/Squidex.Domain.Apps.Events/Contents/ContentUnpublished.cs index e2e564ba2..2b8d0306d 100644 --- a/src/Squidex.Domain.Apps.Events/Contents/ContentUnpublished.cs +++ b/src/Squidex.Domain.Apps.Events/Contents/ContentUnpublished.cs @@ -6,11 +6,11 @@ // All rights reserved. // ========================================================================== -using Squidex.Infrastructure; +using Squidex.Infrastructure.CQRS.Events; namespace Squidex.Domain.Apps.Events.Contents { - [TypeName("ContentUnpublishedEvent")] + [EventType(nameof(ContentUnpublished))] public sealed class ContentUnpublished : ContentEvent { } diff --git a/src/Squidex.Domain.Apps.Events/Contents/ContentUpdated.cs b/src/Squidex.Domain.Apps.Events/Contents/ContentUpdated.cs index c6148021d..0a9c993a1 100644 --- a/src/Squidex.Domain.Apps.Events/Contents/ContentUpdated.cs +++ b/src/Squidex.Domain.Apps.Events/Contents/ContentUpdated.cs @@ -7,11 +7,11 @@ // ========================================================================== using Squidex.Domain.Apps.Core.Contents; -using Squidex.Infrastructure; +using Squidex.Infrastructure.CQRS.Events; namespace Squidex.Domain.Apps.Events.Contents { - [TypeName("ContentUpdatedEvent")] + [EventType(nameof(ContentUpdated))] public sealed class ContentUpdated : ContentEvent { public NamedContentData Data { get; set; } diff --git a/src/Squidex.Domain.Apps.Events/Schemas/FieldAdded.cs b/src/Squidex.Domain.Apps.Events/Schemas/FieldAdded.cs index 3e61be21d..91a7e3f63 100644 --- a/src/Squidex.Domain.Apps.Events/Schemas/FieldAdded.cs +++ b/src/Squidex.Domain.Apps.Events/Schemas/FieldAdded.cs @@ -7,11 +7,11 @@ // ========================================================================== using Squidex.Domain.Apps.Core.Schemas; -using Squidex.Infrastructure; +using Squidex.Infrastructure.CQRS.Events; namespace Squidex.Domain.Apps.Events.Schemas { - [TypeName("FieldAddedEvent")] + [EventType(nameof(FieldAdded))] public sealed class FieldAdded : FieldEvent { public string Name { get; set; } diff --git a/src/Squidex.Domain.Apps.Events/Schemas/FieldDeleted.cs b/src/Squidex.Domain.Apps.Events/Schemas/FieldDeleted.cs index fa4cb0e72..01f6bc92d 100644 --- a/src/Squidex.Domain.Apps.Events/Schemas/FieldDeleted.cs +++ b/src/Squidex.Domain.Apps.Events/Schemas/FieldDeleted.cs @@ -6,11 +6,11 @@ // All rights reserved. // ========================================================================== -using Squidex.Infrastructure; +using Squidex.Infrastructure.CQRS.Events; namespace Squidex.Domain.Apps.Events.Schemas { - [TypeName("FieldDeletedEvent")] + [EventType(nameof(FieldDeleted))] public sealed class FieldDeleted : FieldEvent { } diff --git a/src/Squidex.Domain.Apps.Events/Schemas/FieldDisabled.cs b/src/Squidex.Domain.Apps.Events/Schemas/FieldDisabled.cs index 7df2c668b..c58198b4d 100644 --- a/src/Squidex.Domain.Apps.Events/Schemas/FieldDisabled.cs +++ b/src/Squidex.Domain.Apps.Events/Schemas/FieldDisabled.cs @@ -6,11 +6,11 @@ // All rights reserved. // ========================================================================== -using Squidex.Infrastructure; +using Squidex.Infrastructure.CQRS.Events; namespace Squidex.Domain.Apps.Events.Schemas { - [TypeName("FieldDisabledEvent")] + [EventType(nameof(FieldDisabled))] public sealed class FieldDisabled : FieldEvent { } diff --git a/src/Squidex.Domain.Apps.Events/Schemas/FieldEnabled.cs b/src/Squidex.Domain.Apps.Events/Schemas/FieldEnabled.cs index 3123f5b0f..0a72075f3 100644 --- a/src/Squidex.Domain.Apps.Events/Schemas/FieldEnabled.cs +++ b/src/Squidex.Domain.Apps.Events/Schemas/FieldEnabled.cs @@ -6,11 +6,11 @@ // All rights reserved. // ========================================================================== -using Squidex.Infrastructure; +using Squidex.Infrastructure.CQRS.Events; namespace Squidex.Domain.Apps.Events.Schemas { - [TypeName("FieldEnabledEvent")] + [EventType(nameof(FieldEnabled))] public sealed class FieldEnabled : FieldEvent { } diff --git a/src/Squidex.Domain.Apps.Events/Schemas/FieldHidden.cs b/src/Squidex.Domain.Apps.Events/Schemas/FieldHidden.cs index db7c8e953..3b6aeacca 100644 --- a/src/Squidex.Domain.Apps.Events/Schemas/FieldHidden.cs +++ b/src/Squidex.Domain.Apps.Events/Schemas/FieldHidden.cs @@ -6,11 +6,11 @@ // All rights reserved. // ========================================================================== -using Squidex.Infrastructure; +using Squidex.Infrastructure.CQRS.Events; namespace Squidex.Domain.Apps.Events.Schemas { - [TypeName("FieldHiddenEvent")] + [EventType(nameof(FieldHidden))] public sealed class FieldHidden : FieldEvent { } diff --git a/src/Squidex.Domain.Apps.Events/Schemas/FieldLocked.cs b/src/Squidex.Domain.Apps.Events/Schemas/FieldLocked.cs index be4c6b7e1..5a8437b62 100644 --- a/src/Squidex.Domain.Apps.Events/Schemas/FieldLocked.cs +++ b/src/Squidex.Domain.Apps.Events/Schemas/FieldLocked.cs @@ -6,11 +6,11 @@ // All rights reserved. // ========================================================================== -using Squidex.Infrastructure; +using Squidex.Infrastructure.CQRS.Events; namespace Squidex.Domain.Apps.Events.Schemas { - [TypeName("FieldLockedEvent")] + [EventType(nameof(FieldLocked))] public sealed class FieldLocked : FieldEvent { } diff --git a/src/Squidex.Domain.Apps.Events/Schemas/FieldShown.cs b/src/Squidex.Domain.Apps.Events/Schemas/FieldShown.cs index 734111436..fc9f67d02 100644 --- a/src/Squidex.Domain.Apps.Events/Schemas/FieldShown.cs +++ b/src/Squidex.Domain.Apps.Events/Schemas/FieldShown.cs @@ -6,11 +6,11 @@ // All rights reserved. // ========================================================================== -using Squidex.Infrastructure; +using Squidex.Infrastructure.CQRS.Events; namespace Squidex.Domain.Apps.Events.Schemas { - [TypeName("FieldShownEvent")] + [EventType(nameof(FieldShown))] public sealed class FieldShown : FieldEvent { } diff --git a/src/Squidex.Domain.Apps.Events/Schemas/FieldUpdated.cs b/src/Squidex.Domain.Apps.Events/Schemas/FieldUpdated.cs index dbdfe5153..bc530def2 100644 --- a/src/Squidex.Domain.Apps.Events/Schemas/FieldUpdated.cs +++ b/src/Squidex.Domain.Apps.Events/Schemas/FieldUpdated.cs @@ -7,11 +7,11 @@ // ========================================================================== using Squidex.Domain.Apps.Core.Schemas; -using Squidex.Infrastructure; +using Squidex.Infrastructure.CQRS.Events; namespace Squidex.Domain.Apps.Events.Schemas { - [TypeName("FieldUpdatedEvent")] + [EventType(nameof(FieldUpdated))] public sealed class FieldUpdated : FieldEvent { public FieldProperties Properties { get; set; } diff --git a/src/Squidex.Domain.Apps.Events/Schemas/Old/WebhookAdded.cs b/src/Squidex.Domain.Apps.Events/Schemas/Old/WebhookAdded.cs index 3cfa9e0d0..39926a737 100644 --- a/src/Squidex.Domain.Apps.Events/Schemas/Old/WebhookAdded.cs +++ b/src/Squidex.Domain.Apps.Events/Schemas/Old/WebhookAdded.cs @@ -7,11 +7,11 @@ // ========================================================================== using System; -using Squidex.Infrastructure; +using Squidex.Infrastructure.CQRS.Events; namespace Squidex.Domain.Apps.Events.Schemas.Old { - [TypeName("WebhookAddedEvent")] + [EventType(nameof(WebhookAdded))] [Obsolete] public sealed class WebhookAdded : SchemaEvent { diff --git a/src/Squidex.Domain.Apps.Events/Schemas/Old/WebhookDeleted.cs b/src/Squidex.Domain.Apps.Events/Schemas/Old/WebhookDeleted.cs index 367cc3fb5..df94a1e4c 100644 --- a/src/Squidex.Domain.Apps.Events/Schemas/Old/WebhookDeleted.cs +++ b/src/Squidex.Domain.Apps.Events/Schemas/Old/WebhookDeleted.cs @@ -7,11 +7,11 @@ // ========================================================================== using System; -using Squidex.Infrastructure; +using Squidex.Infrastructure.CQRS.Events; namespace Squidex.Domain.Apps.Events.Schemas.Old { - [TypeName("WebhookDeletedEvent")] + [EventType(nameof(WebhookDeleted))] [Obsolete] public sealed class WebhookDeleted : SchemaEvent { diff --git a/src/Squidex.Domain.Apps.Events/Schemas/SchemaCreated.cs b/src/Squidex.Domain.Apps.Events/Schemas/SchemaCreated.cs index eaa3a18ee..85afd34bd 100644 --- a/src/Squidex.Domain.Apps.Events/Schemas/SchemaCreated.cs +++ b/src/Squidex.Domain.Apps.Events/Schemas/SchemaCreated.cs @@ -7,12 +7,12 @@ // ========================================================================== using Squidex.Domain.Apps.Core.Schemas; -using Squidex.Infrastructure; +using Squidex.Infrastructure.CQRS.Events; using SchemaFields = System.Collections.Generic.List; namespace Squidex.Domain.Apps.Events.Schemas { - [TypeName("SchemaCreatedEvent")] + [EventType(nameof(SchemaCreated))] public sealed class SchemaCreated : SchemaEvent { public string Name { get; set; } diff --git a/src/Squidex.Domain.Apps.Events/Schemas/SchemaDeleted.cs b/src/Squidex.Domain.Apps.Events/Schemas/SchemaDeleted.cs index abe401aae..2de168b39 100644 --- a/src/Squidex.Domain.Apps.Events/Schemas/SchemaDeleted.cs +++ b/src/Squidex.Domain.Apps.Events/Schemas/SchemaDeleted.cs @@ -6,11 +6,11 @@ // All rights reserved. // ========================================================================== -using Squidex.Infrastructure; +using Squidex.Infrastructure.CQRS.Events; namespace Squidex.Domain.Apps.Events.Schemas { - [TypeName("SchemaDeletedEvent")] + [EventType(nameof(SchemaDeleted))] public sealed class SchemaDeleted : SchemaEvent { } diff --git a/src/Squidex.Domain.Apps.Events/Schemas/SchemaFieldsReordered.cs b/src/Squidex.Domain.Apps.Events/Schemas/SchemaFieldsReordered.cs index 50d5affdb..6d96e0752 100644 --- a/src/Squidex.Domain.Apps.Events/Schemas/SchemaFieldsReordered.cs +++ b/src/Squidex.Domain.Apps.Events/Schemas/SchemaFieldsReordered.cs @@ -7,11 +7,11 @@ // ========================================================================== using System.Collections.Generic; -using Squidex.Infrastructure; +using Squidex.Infrastructure.CQRS.Events; namespace Squidex.Domain.Apps.Events.Schemas { - [TypeName("SchemaFieldsReorderedEvent")] + [EventType(nameof(SchemaFieldsReordered))] public sealed class SchemaFieldsReordered : SchemaEvent { public List FieldIds { get; set; } diff --git a/src/Squidex.Domain.Apps.Events/Schemas/SchemaPublished.cs b/src/Squidex.Domain.Apps.Events/Schemas/SchemaPublished.cs index cc0aa8554..d6c9ee1c9 100644 --- a/src/Squidex.Domain.Apps.Events/Schemas/SchemaPublished.cs +++ b/src/Squidex.Domain.Apps.Events/Schemas/SchemaPublished.cs @@ -6,11 +6,11 @@ // All rights reserved. // ========================================================================== -using Squidex.Infrastructure; +using Squidex.Infrastructure.CQRS.Events; namespace Squidex.Domain.Apps.Events.Schemas { - [TypeName("SchemaPublishedEvent")] + [EventType(nameof(SchemaPublished))] public sealed class SchemaPublished : SchemaEvent { } diff --git a/src/Squidex.Domain.Apps.Events/Schemas/SchemaUnpublished.cs b/src/Squidex.Domain.Apps.Events/Schemas/SchemaUnpublished.cs index 14d023525..1618d63b2 100644 --- a/src/Squidex.Domain.Apps.Events/Schemas/SchemaUnpublished.cs +++ b/src/Squidex.Domain.Apps.Events/Schemas/SchemaUnpublished.cs @@ -6,11 +6,11 @@ // All rights reserved. // ========================================================================== -using Squidex.Infrastructure; +using Squidex.Infrastructure.CQRS.Events; namespace Squidex.Domain.Apps.Events.Schemas { - [TypeName("SchemaUnpublishedEvent")] + [EventType(nameof(SchemaUnpublished))] public sealed class SchemaUnpublished : SchemaEvent { } diff --git a/src/Squidex.Domain.Apps.Events/Schemas/SchemaUpdated.cs b/src/Squidex.Domain.Apps.Events/Schemas/SchemaUpdated.cs index 300058870..aebed5b61 100644 --- a/src/Squidex.Domain.Apps.Events/Schemas/SchemaUpdated.cs +++ b/src/Squidex.Domain.Apps.Events/Schemas/SchemaUpdated.cs @@ -7,11 +7,11 @@ // ========================================================================== using Squidex.Domain.Apps.Core.Schemas; -using Squidex.Infrastructure; +using Squidex.Infrastructure.CQRS.Events; namespace Squidex.Domain.Apps.Events.Schemas { - [TypeName("SchemaUpdatedEvent")] + [EventType(nameof(SchemaUpdated))] public sealed class SchemaUpdated : SchemaEvent { public SchemaProperties Properties { get; set; } diff --git a/src/Squidex.Domain.Apps.Events/Schemas/ScriptsConfigured.cs b/src/Squidex.Domain.Apps.Events/Schemas/ScriptsConfigured.cs index e0160a330..093197d28 100644 --- a/src/Squidex.Domain.Apps.Events/Schemas/ScriptsConfigured.cs +++ b/src/Squidex.Domain.Apps.Events/Schemas/ScriptsConfigured.cs @@ -6,11 +6,11 @@ // All rights reserved. // ========================================================================== -using Squidex.Infrastructure; +using Squidex.Infrastructure.CQRS.Events; namespace Squidex.Domain.Apps.Events.Schemas { - [TypeName("ScriptsConfiguredEvent")] + [EventType(nameof(ScriptsConfigured))] public sealed class ScriptsConfigured : SchemaEvent { public string ScriptQuery { get; set; } diff --git a/src/Squidex.Domain.Apps.Events/Webhooks/WebhookCreated.cs b/src/Squidex.Domain.Apps.Events/Webhooks/WebhookCreated.cs index e65f9ca56..1cab7fdce 100644 --- a/src/Squidex.Domain.Apps.Events/Webhooks/WebhookCreated.cs +++ b/src/Squidex.Domain.Apps.Events/Webhooks/WebhookCreated.cs @@ -6,11 +6,11 @@ // All rights reserved. // ========================================================================== -using Squidex.Infrastructure; +using Squidex.Infrastructure.CQRS.Events; namespace Squidex.Domain.Apps.Events.Webhooks { - [TypeName("WebhookCreatedEvent")] + [EventType(nameof(WebhookCreated))] public sealed class WebhookCreated : WebhookEditEvent { public string SharedSecret { get; set; } diff --git a/src/Squidex.Domain.Apps.Events/Webhooks/WebhookDeleted.cs b/src/Squidex.Domain.Apps.Events/Webhooks/WebhookDeleted.cs index c958c8272..a01d60dc3 100644 --- a/src/Squidex.Domain.Apps.Events/Webhooks/WebhookDeleted.cs +++ b/src/Squidex.Domain.Apps.Events/Webhooks/WebhookDeleted.cs @@ -7,10 +7,11 @@ // ========================================================================== using Squidex.Infrastructure; +using Squidex.Infrastructure.CQRS.Events; namespace Squidex.Domain.Apps.Events.Webhooks { - [TypeName("WebhookDeletedEventV2")] + [EventType(nameof(WebhookUpdated), 2)] public sealed class WebhookDeleted : WebhookEvent { } diff --git a/src/Squidex.Domain.Apps.Events/Webhooks/WebhookUpdated.cs b/src/Squidex.Domain.Apps.Events/Webhooks/WebhookUpdated.cs index d05fd1a09..c40793935 100644 --- a/src/Squidex.Domain.Apps.Events/Webhooks/WebhookUpdated.cs +++ b/src/Squidex.Domain.Apps.Events/Webhooks/WebhookUpdated.cs @@ -6,11 +6,11 @@ // All rights reserved. // ========================================================================== -using Squidex.Infrastructure; +using Squidex.Infrastructure.CQRS.Events; namespace Squidex.Domain.Apps.Events.Webhooks { - [TypeName("WebhookUpdatedEvent")] + [EventType(nameof(WebhookUpdated))] public sealed class WebhookUpdated : WebhookEditEvent { } diff --git a/src/Squidex.Infrastructure/CQRS/Events/EventTypeAttribute.cs b/src/Squidex.Infrastructure/CQRS/Events/EventTypeAttribute.cs new file mode 100644 index 000000000..9723c1bdf --- /dev/null +++ b/src/Squidex.Infrastructure/CQRS/Events/EventTypeAttribute.cs @@ -0,0 +1,26 @@ +// ========================================================================== +// EventTypeAttribute.cs +// Squidex Headless CMS +// ========================================================================== +// Copyright (c) Squidex Group +// All rights reserved. +// ========================================================================== + +using System; + +namespace Squidex.Infrastructure.CQRS.Events +{ + [AttributeUsage(AttributeTargets.Class, Inherited = false)] + public sealed class EventTypeAttribute : TypeNameAttribute + { + public EventTypeAttribute(string typeName, int version = 1) + : base(CreateTypeName(typeName, version)) + { + } + + private static string CreateTypeName(string typeName, int version) + { + return $"{typeName}Event" + (version > 1 ? $"V{version}" : string.Empty); + } + } +} diff --git a/src/Squidex.Infrastructure/TypeNameAttribute.cs b/src/Squidex.Infrastructure/TypeNameAttribute.cs index 6eee44aec..068a78f15 100644 --- a/src/Squidex.Infrastructure/TypeNameAttribute.cs +++ b/src/Squidex.Infrastructure/TypeNameAttribute.cs @@ -11,7 +11,7 @@ using System; namespace Squidex.Infrastructure { [AttributeUsage(AttributeTargets.Class, Inherited = false)] - public sealed class TypeNameAttribute : Attribute + public class TypeNameAttribute : Attribute { public string TypeName { get; } diff --git a/src/Squidex.Infrastructure/TypeNameRegistry.cs b/src/Squidex.Infrastructure/TypeNameRegistry.cs index 3027139c8..8a457010f 100644 --- a/src/Squidex.Infrastructure/TypeNameRegistry.cs +++ b/src/Squidex.Infrastructure/TypeNameRegistry.cs @@ -31,6 +31,31 @@ namespace Squidex.Infrastructure return this; } + public TypeNameRegistry MapObsolete(Type type, string name) + { + Guard.NotNull(type, nameof(type)); + Guard.NotNull(name, nameof(name)); + + lock (namesByType) + { + try + { + typesByName.Add(name, type); + } + catch (ArgumentException) + { + if (typesByName[name] != type) + { + var message = $"The name '{name}' is already registered with type '{typesByName[name]}'"; + + throw new ArgumentException(message, nameof(type)); + } + } + } + + return this; + } + public TypeNameRegistry Map(Type type, string name) { Guard.NotNull(type, nameof(type)); diff --git a/src/Squidex/Controllers/Api/Docs/DocsController.cs b/src/Squidex/Controllers/Api/Docs/DocsController.cs index 738aaec07..0a37fbb9d 100644 --- a/src/Squidex/Controllers/Api/Docs/DocsController.cs +++ b/src/Squidex/Controllers/Api/Docs/DocsController.cs @@ -20,9 +20,9 @@ namespace Squidex.Controllers.Api.Docs [ApiCosts(0)] public IActionResult Docs() { - ViewBag.Specification = "~/swagger/v1/swagger.json"; + var vm = new DocsVM { Specification = "~/swagger/v1/swagger.json" }; - return View("Docs"); + return View(nameof(Docs), vm); } } } diff --git a/src/Squidex/Controllers/ContentApi/ContentSwaggerController.cs b/src/Squidex/Controllers/ContentApi/ContentSwaggerController.cs index f3e531248..fe86d7a5b 100644 --- a/src/Squidex/Controllers/ContentApi/ContentSwaggerController.cs +++ b/src/Squidex/Controllers/ContentApi/ContentSwaggerController.cs @@ -17,6 +17,7 @@ using Squidex.Pipeline; namespace Squidex.Controllers.ContentApi { [ApiExceptionFilter] + [AppApi(false)] [SwaggerIgnore] public sealed class ContentSwaggerController : ControllerBase { @@ -35,9 +36,9 @@ namespace Squidex.Controllers.ContentApi [ApiCosts(0)] public IActionResult Docs(string app) { - ViewBag.Specification = $"~/content/{app}/swagger/v1/swagger.json"; + var vm = new DocsVM { Specification = $"~/content/{app}/swagger/v1/swagger.json" }; - return View("Docs"); + return View(nameof(Docs), vm); } [HttpGet] diff --git a/src/Squidex/Controllers/DocsVM.cs b/src/Squidex/Controllers/DocsVM.cs new file mode 100644 index 000000000..f71fd1b58 --- /dev/null +++ b/src/Squidex/Controllers/DocsVM.cs @@ -0,0 +1,15 @@ +// ========================================================================== +// DocsVM.cs +// Squidex Headless CMS +// ========================================================================== +// Copyright (c) Squidex Group +// All rights reserved. +// ========================================================================== + +namespace Squidex.Controllers +{ + public sealed class DocsVM + { + public string Specification { get; set; } + } +} diff --git a/src/Squidex/Controllers/UI/Account/AccountController.cs b/src/Squidex/Controllers/UI/Account/AccountController.cs index 8f8b8856e..97cbc1b77 100644 --- a/src/Squidex/Controllers/UI/Account/AccountController.cs +++ b/src/Squidex/Controllers/UI/Account/AccountController.cs @@ -79,11 +79,18 @@ namespace Squidex.Controllers.UI.Account throw new SecurityException("User is not allowed to login."); } + [HttpGet] + [Route("account/lockedout")] + public IActionResult LockedOut() + { + return View(); + } + [HttpGet] [Route("account/accessdenied")] public IActionResult AccessDenied() { - return View("AccessDenied"); + return View(); } [HttpGet] @@ -177,7 +184,7 @@ namespace Squidex.Controllers.UI.Account ReturnUrl = returnUrl }; - return View("Login", vm); + return View(nameof(Login), vm); } [HttpPost] @@ -206,7 +213,7 @@ namespace Squidex.Controllers.UI.Account if (!result.Succeeded && result.IsLockedOut) { - return View("LockedOut"); + return View(nameof(LockedOut)); } var isLoggedIn = result.Succeeded; @@ -238,7 +245,7 @@ namespace Squidex.Controllers.UI.Account if (user.IsLocked) { - return View("LockedOut"); + return View(nameof(LockedOut)); } } } diff --git a/src/Squidex/Controllers/UI/Profile/ProfileController.cs b/src/Squidex/Controllers/UI/Profile/ProfileController.cs index 1e83e891f..c13227dcb 100644 --- a/src/Squidex/Controllers/UI/Profile/ProfileController.cs +++ b/src/Squidex/Controllers/UI/Profile/ProfileController.cs @@ -155,7 +155,7 @@ namespace Squidex.Controllers.UI.Profile if (!ModelState.IsValid) { - return View("Profile", await GetProfileVM(user, model)); + return View(nameof(Profile), await GetProfileVM(user, model)); } string errorMessage; @@ -177,7 +177,7 @@ namespace Squidex.Controllers.UI.Profile errorMessage = "An unexpected exception occurred."; } - return View("Profile", await GetProfileVM(user, model, errorMessage)); + return View(nameof(Profile), await GetProfileVM(user, model, errorMessage)); } private async Task GetProfileVM(IUser user, ChangeProfileModel model = null, string errorMessage = null, string successMessage = null) diff --git a/src/Squidex/Pipeline/AppApiAttribute.cs b/src/Squidex/Pipeline/AppApiAttribute.cs index d0e6fff8a..20b92b65b 100644 --- a/src/Squidex/Pipeline/AppApiAttribute.cs +++ b/src/Squidex/Pipeline/AppApiAttribute.cs @@ -12,9 +12,12 @@ namespace Squidex.Pipeline { public sealed class AppApiAttribute : ServiceFilterAttribute { - public AppApiAttribute() + public bool CheckPermissions { get; } + + public AppApiAttribute(bool checkPermissions = true) : base(typeof(AppApiFilter)) { + CheckPermissions = checkPermissions; } } } diff --git a/src/Squidex/Pipeline/AppApiFilter.cs b/src/Squidex/Pipeline/AppApiFilter.cs index 6ab3a979b..96eb967c8 100644 --- a/src/Squidex/Pipeline/AppApiFilter.cs +++ b/src/Squidex/Pipeline/AppApiFilter.cs @@ -21,12 +21,22 @@ using Squidex.Shared.Identity; namespace Squidex.Pipeline { - public sealed class AppApiFilter : IAsyncAuthorizationFilter + public sealed class AppApiFilter : IAsyncAuthorizationFilter, IFilterContainer { private readonly IAppProvider appProvider; private readonly IAppPlansProvider appPlanProvider; private readonly IUsageTracker usageTracker; + IFilterMetadata IFilterContainer.FilterDefinition { get; set; } + + public AppApiAttribute FilterDefinition + { + get + { + return (AppApiAttribute)((IFilterContainer)this).FilterDefinition; + } + } + public AppApiFilter(IAppProvider appProvider, IAppPlansProvider appPlanProvider, IUsageTracker usageTracker) { this.appProvider = appProvider; @@ -49,6 +59,12 @@ namespace Squidex.Pipeline return; } + if (!FilterDefinition.CheckPermissions) + { + context.HttpContext.Features.Set(new AppFeature(app)); + return; + } + var user = context.HttpContext.User; var permission = diff --git a/src/Squidex/Views/Shared/Docs.cshtml b/src/Squidex/Views/Shared/Docs.cshtml index 9e0837507..15b0e282a 100644 --- a/src/Squidex/Views/Shared/Docs.cshtml +++ b/src/Squidex/Views/Shared/Docs.cshtml @@ -1,4 +1,6 @@ -@{ +@model Squidex.Controllers.DocsVM + +@{ Layout = null; } @@ -31,7 +33,7 @@ - + diff --git a/tests/Squidex.Infrastructure.Tests/TypeNameRegistryTests.cs b/tests/Squidex.Infrastructure.Tests/TypeNameRegistryTests.cs index 3f6ab1eea..d798a3957 100644 --- a/tests/Squidex.Infrastructure.Tests/TypeNameRegistryTests.cs +++ b/tests/Squidex.Infrastructure.Tests/TypeNameRegistryTests.cs @@ -8,6 +8,7 @@ using System; using System.Reflection; +using Squidex.Infrastructure.CQRS.Events; using Xunit; namespace Squidex.Infrastructure @@ -21,6 +22,11 @@ namespace Squidex.Infrastructure { } + [EventType(nameof(MyAdded), 2)] + public sealed class MyAdded + { + } + [Fact] public void Should_register_and_retrieve_types() { @@ -57,6 +63,28 @@ namespace Squidex.Infrastructure Assert.Equal(typeof(MyType), sut.GetType("My")); } + [Fact] + public void Should_register_event_type_from_assembly() + { + sut.Map(typeof(TypeNameRegistryTests).GetTypeInfo().Assembly); + + Assert.Equal("MyAddedEventV2", sut.GetName()); + Assert.Equal("MyAddedEventV2", sut.GetName(typeof(MyAdded))); + + Assert.Equal(typeof(MyAdded), sut.GetType("myAddedEventV2")); + Assert.Equal(typeof(MyAdded), sut.GetType("MyAddedEventV2")); + } + + [Fact] + public void Should_register_fallback_name() + { + sut.Map(typeof(MyType)); + sut.MapObsolete(typeof(MyType), "my-old"); + + Assert.Equal(typeof(MyType), sut.GetType("my")); + Assert.Equal(typeof(MyType), sut.GetType("my-old")); + } + [Fact] public void Should_not_throw_exception_if_type_is_already_registered_with_same_name() { @@ -80,6 +108,14 @@ namespace Squidex.Infrastructure Assert.Throws(() => sut.Map(typeof(byte), "short")); } + [Fact] + public void Should_throw_exception_if_obsolete_name_is_already_registered() + { + sut.MapObsolete(typeof(short), "short2"); + + Assert.Throws(() => sut.MapObsolete(typeof(byte), "short2")); + } + [Fact] public void Should_throw_exception_if_name_is_not_supported() {