Browse Source

Type name fixes.

pull/346/head
Sebastian Stehle 7 years ago
parent
commit
a4f0374f29
  1. 34
      extensions/Squidex.Extensions/Actions/RuleElementRegistry.cs
  2. 2
      src/Squidex.Domain.Apps.Core.Model/Rules/Triggers/AssetChangedTriggerV2.cs
  3. 2
      src/Squidex.Domain.Apps.Core.Model/Rules/Triggers/ContentChangedTriggerV2.cs
  4. 2
      src/Squidex.Domain.Apps.Core.Model/Rules/Triggers/UsageTrigger.cs
  5. 2
      src/Squidex.Domain.Apps.Core.Model/Schemas/ArrayFieldProperties.cs
  6. 2
      src/Squidex.Domain.Apps.Core.Model/Schemas/AssetsFieldProperties.cs
  7. 3
      src/Squidex.Domain.Apps.Core.Model/Schemas/BooleanFieldProperties.cs
  8. 2
      src/Squidex.Domain.Apps.Core.Model/Schemas/DateTimeFieldProperties.cs
  9. 20
      src/Squidex.Domain.Apps.Core.Model/Schemas/FieldRegistry.cs
  10. 3
      src/Squidex.Domain.Apps.Core.Model/Schemas/GeolocationFieldProperties.cs
  11. 2
      src/Squidex.Domain.Apps.Core.Model/Schemas/JsonFieldProperties.cs
  12. 2
      src/Squidex.Domain.Apps.Core.Model/Schemas/NumberFieldProperties.cs
  13. 2
      src/Squidex.Domain.Apps.Core.Model/Schemas/ReferencesFieldProperties.cs
  14. 2
      src/Squidex.Domain.Apps.Core.Model/Schemas/StringFieldProperties.cs
  15. 2
      src/Squidex.Domain.Apps.Core.Model/Schemas/TagsFieldProperties.cs
  16. 46
      src/Squidex.Domain.Apps.Core.Operations/HandleRules/RuleRegistry.cs
  17. 2
      src/Squidex.Infrastructure/Json/Newtonsoft/TypeNameSerializationBinder.cs
  18. 14
      src/Squidex.Infrastructure/States/DefaultStreamNameResolver.cs
  19. 34
      src/Squidex.Infrastructure/TypeNameBuilder.cs
  20. 8
      src/Squidex/Config/Domain/SerializationServices.cs
  21. 3
      tests/Squidex.Domain.Apps.Core.Tests/Model/Rules/RuleTests.cs
  22. 7
      tests/Squidex.Domain.Apps.Core.Tests/TestUtils.cs

34
extensions/Squidex.Extensions/Actions/RuleElementRegistry.cs

@ -17,26 +17,31 @@ namespace Squidex.Extensions.Actions
{
public static class RuleElementRegistry
{
private const string Suffix = "Action";
private const string ActionSuffix = "Action";
private const string ActionSuffixV2 = "Action";
private const string TriggerSuffix = "Trigger";
private const string TriggerSuffixV2 = "TriggerV2";
private static readonly HashSet<Type> ActionHandlerTypes = new HashSet<Type>();
private static readonly Dictionary<string, RuleElement> ActionTypes = new Dictionary<string, RuleElement>();
private static readonly Dictionary<string, RuleElement> TriggerTypes = new Dictionary<string, RuleElement>
{
[ContentChangedTriggerV2.Name] = new RuleElement
[GetTriggerName(typeof(ContentChangedTriggerV2))] = new RuleElement
{
IconImage = "<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 28 28'><path d='M21.875 28H6.125A6.087 6.087 0 0 1 0 21.875V6.125A6.087 6.087 0 0 1 6.125 0h15.75A6.087 6.087 0 0 1 28 6.125v15.75A6.088 6.088 0 0 1 21.875 28zM6.125 1.75A4.333 4.333 0 0 0 1.75 6.125v15.75a4.333 4.333 0 0 0 4.375 4.375h15.75a4.333 4.333 0 0 0 4.375-4.375V6.125a4.333 4.333 0 0 0-4.375-4.375H6.125z'/><path d='M13.125 12.25H7.35c-1.575 0-2.888-1.313-2.888-2.888V7.349c0-1.575 1.313-2.888 2.888-2.888h5.775c1.575 0 2.887 1.313 2.887 2.888v2.013c0 1.575-1.312 2.888-2.887 2.888zM7.35 6.212c-.613 0-1.138.525-1.138 1.138v2.012A1.16 1.16 0 0 0 7.35 10.5h5.775a1.16 1.16 0 0 0 1.138-1.138V7.349a1.16 1.16 0 0 0-1.138-1.138H7.35zM22.662 16.713H5.337c-.525 0-.875-.35-.875-.875s.35-.875.875-.875h17.237c.525 0 .875.35.875.875s-.35.875-.787.875zM15.138 21.262h-9.8c-.525 0-.875-.35-.875-.875s.35-.875.875-.875h9.713c.525 0 .875.35.875.875s-.35.875-.787.875z'/></svg>",
IconColor = "#3389ff",
Display = "Content changed",
Description = "For content changes like created, updated, published, unpublished..."
},
[AssetChangedTriggerV2.Name] = new RuleElement
[GetTriggerName(typeof(AssetChangedTriggerV2))] = new RuleElement
{
IconImage = "<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 28 28'><path d='M21.875 28H6.125A6.087 6.087 0 0 1 0 21.875V6.125A6.087 6.087 0 0 1 6.125 0h15.75A6.087 6.087 0 0 1 28 6.125v15.75A6.088 6.088 0 0 1 21.875 28zM6.125 1.75A4.333 4.333 0 0 0 1.75 6.125v15.75a4.333 4.333 0 0 0 4.375 4.375h15.75a4.333 4.333 0 0 0 4.375-4.375V6.125a4.333 4.333 0 0 0-4.375-4.375H6.125z'/><path d='M21.088 23.537H9.1c-.35 0-.612-.175-.787-.525s-.088-.7.088-.962l8.225-9.713c.175-.175.438-.35.7-.35s.525.175.7.35l5.25 7.525c.088.087.088.175.088.262.438 1.225.087 2.012-.175 2.45-.613.875-1.925.963-2.1.963zm-10.063-1.75h10.15c.175 0 .612-.088.7-.262.088-.088.088-.35 0-.7l-4.55-6.475-6.3 7.438zM9.1 13.737c-2.1 0-3.85-1.75-3.85-3.85S7 6.037 9.1 6.037s3.85 1.75 3.85 3.85-1.663 3.85-3.85 3.85zm0-5.949c-1.138 0-2.1.875-2.1 2.1s.962 2.1 2.1 2.1 2.1-.962 2.1-2.1-.875-2.1-2.1-2.1z'/></svg>",
IconColor = "#3389ff",
Display = "Asset changed",
Description = "For asset changes like uploaded, updated (reuploaded), renamed, deleted..."
},
[UsageTrigger.Name] = new RuleElement
[GetTriggerName(typeof(UsageTrigger))] = new RuleElement
{
IconImage = "<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'><path d='M21.2 11.4c-.2 0-.4-.1-.6-.2-.5-.3-.6-.9-.3-1.4L22 7.2c.3-.5.9-.6 1.4-.3.6.4.7 1.1.4 1.5L22.1 11c-.2.3-.5.4-.9.4zM16 20.9h-.2c-1-.1-2-.6-2.5-1.5l-6-8.7c-.3-.3-.3-.8 0-1.2.3-.3.8-.4 1.2-.2l9.2 5.4c.9.5 1.5 1.4 1.6 2.4.1 1-.2 2-.9 2.8-.6.7-1.5 1-2.4 1zm-4.6-7.5l3.4 5c.2.3.6.6 1 .6s.8-.1 1.1-.4c.3-.3.4-.7.3-1.1-.1-.4-.3-.7-.6-1zM25.9 32H6.1C2.8 32 0 29.2 0 25.9v-10C0 7.1 7.1 0 15.8 0 24.8 0 32 7.2 32 16.2v9.7c0 3.3-2.8 6.1-6.1 6.1zM15.8 2C8.2 2 2 8.2 2 15.8v10C2 28.1 3.9 30 6.1 30h19.7c2.3 0 4.1-1.9 4.1-4.1v-9.7C30 8.4 23.6 2 15.8 2z'/></svg>",
IconColor = "#3389ff",
@ -72,12 +77,7 @@ namespace Squidex.Extensions.Actions
foreach (var actionType in actionTypes)
{
var name = actionType.Name;
if (name.EndsWith(Suffix, StringComparison.Ordinal))
{
name = name.Substring(0, name.Length - Suffix.Length);
}
var name = GetActionName(actionType);
var metadata = actionType.GetCustomAttribute<RuleActionAttribute>();
@ -96,12 +96,24 @@ namespace Squidex.Extensions.Actions
}
}
public static void RegisterTypes(TypeNameRegistry typeNameRegistry)
public static TypeNameRegistry MapRuleActions(this TypeNameRegistry typeNameRegistry)
{
foreach (var actionType in ActionTypes.Values)
{
typeNameRegistry.Map(actionType.Type, actionType.Type.Name);
}
return typeNameRegistry;
}
private static string GetActionName(Type type)
{
return type.TypeName(false, ActionSuffix, ActionSuffixV2);
}
private static string GetTriggerName(Type type)
{
return type.TypeName(false, TriggerSuffix, TriggerSuffixV2);
}
}
}

2
src/Squidex.Domain.Apps.Core.Model/Rules/Triggers/AssetChangedTriggerV2.cs

@ -12,8 +12,6 @@ namespace Squidex.Domain.Apps.Core.Rules.Triggers
[TypeName(nameof(AssetChangedTriggerV2))]
public sealed class AssetChangedTriggerV2 : RuleTrigger
{
public const string Name = "AssetChanged";
public string Condition { get; set; }
public override T Accept<T>(IRuleTriggerVisitor<T> visitor)

2
src/Squidex.Domain.Apps.Core.Model/Rules/Triggers/ContentChangedTriggerV2.cs

@ -13,8 +13,6 @@ namespace Squidex.Domain.Apps.Core.Rules.Triggers
[TypeName(nameof(ContentChangedTriggerV2))]
public sealed class ContentChangedTriggerV2 : RuleTrigger
{
public const string Name = "ContentChanged";
public ReadOnlyCollection<ContentChangedTriggerSchemaV2> Schemas { get; set; }
public bool HandleAll { get; set; }

2
src/Squidex.Domain.Apps.Core.Model/Rules/Triggers/UsageTrigger.cs

@ -12,8 +12,6 @@ namespace Squidex.Domain.Apps.Core.Rules.Triggers
[TypeName(nameof(UsageTrigger))]
public sealed class UsageTrigger : RuleTrigger
{
public const string Name = "Usage";
public int Limit { get; set; }
public int? NumDays { get; set; }

2
src/Squidex.Domain.Apps.Core.Model/Schemas/ArrayFieldProperties.cs

@ -6,11 +6,9 @@
// ==========================================================================
using System;
using Squidex.Infrastructure;
namespace Squidex.Domain.Apps.Core.Schemas
{
[TypeName("ArrayField")]
public sealed class ArrayFieldProperties : FieldProperties
{
public int? MinItems { get; set; }

2
src/Squidex.Domain.Apps.Core.Model/Schemas/AssetsFieldProperties.cs

@ -5,12 +5,10 @@
// All rights reserved. Licensed under the MIT license.
// ==========================================================================
using Squidex.Infrastructure;
using System.Collections.ObjectModel;
namespace Squidex.Domain.Apps.Core.Schemas
{
[TypeName("AssetsField")]
public sealed class AssetsFieldProperties : FieldProperties
{
public bool MustBeImage { get; set; }

3
src/Squidex.Domain.Apps.Core.Model/Schemas/BooleanFieldProperties.cs

@ -5,11 +5,8 @@
// All rights reserved. Licensed under the MIT license.
// ==========================================================================
using Squidex.Infrastructure;
namespace Squidex.Domain.Apps.Core.Schemas
{
[TypeName("BooleanField")]
public sealed class BooleanFieldProperties : FieldProperties
{
public bool? DefaultValue { get; set; }

2
src/Squidex.Domain.Apps.Core.Model/Schemas/DateTimeFieldProperties.cs

@ -6,11 +6,9 @@
// ==========================================================================
using NodaTime;
using Squidex.Infrastructure;
namespace Squidex.Domain.Apps.Core.Schemas
{
[TypeName("DateTimeField")]
public sealed class DateTimeFieldProperties : FieldProperties
{
public Instant? MaxValue { get; set; }

20
src/Squidex.Domain.Apps.Core.Model/Schemas/FieldRegistry.cs

@ -14,24 +14,26 @@ namespace Squidex.Domain.Apps.Core.Schemas
{
public static class FieldRegistry
{
public static void Setup(TypeNameRegistry typeNameRegistry)
{
Guard.NotNull(typeNameRegistry, nameof(typeNameRegistry));
private const string Suffix = "Properties";
private const string SuffixOld = "FieldProperties";
var types = typeof(FieldRegistry).Assembly.GetTypes().Where(x => x.BaseType == typeof(FieldProperties));
public static TypeNameRegistry MapFields(this TypeNameRegistry typeNameRegistry)
{
var types = typeof(FieldRegistry).Assembly.GetTypes().Where(x => typeof(FieldProperties).IsAssignableFrom(x) && !x.IsAbstract);
var supportedFields = new HashSet<Type>();
var addedTypes = new HashSet<Type>();
foreach (var type in types)
{
if (supportedFields.Add(type))
if (addedTypes.Add(type))
{
typeNameRegistry.Map(type);
typeNameRegistry.Map(type, type.TypeName(false, Suffix));
typeNameRegistry.MapObsolete(type, type.TypeName(false, SuffixOld));
}
}
typeNameRegistry.MapObsolete(typeof(ReferencesFieldProperties), "References");
typeNameRegistry.MapObsolete(typeof(DateTimeFieldProperties), "DateTime");
return typeNameRegistry;
}
}
}

3
src/Squidex.Domain.Apps.Core.Model/Schemas/GeolocationFieldProperties.cs

@ -5,11 +5,8 @@
// All rights reserved. Licensed under the MIT license.
// ==========================================================================
using Squidex.Infrastructure;
namespace Squidex.Domain.Apps.Core.Schemas
{
[TypeName("GeolocationField")]
public sealed class GeolocationFieldProperties : FieldProperties
{
public GeolocationFieldEditor Editor { get; set; }

2
src/Squidex.Domain.Apps.Core.Model/Schemas/JsonFieldProperties.cs

@ -5,11 +5,9 @@
// All rights reserved. Licensed under the MIT license.
// ==========================================================================
using Squidex.Infrastructure;
namespace Squidex.Domain.Apps.Core.Schemas
{
[TypeName("JsonField")]
public sealed class JsonFieldProperties : FieldProperties
{
public override T Accept<T>(IFieldPropertiesVisitor<T> visitor)

2
src/Squidex.Domain.Apps.Core.Model/Schemas/NumberFieldProperties.cs

@ -5,12 +5,10 @@
// All rights reserved. Licensed under the MIT license.
// ==========================================================================
using Squidex.Infrastructure;
using System.Collections.ObjectModel;
namespace Squidex.Domain.Apps.Core.Schemas
{
[TypeName("NumberField")]
public sealed class NumberFieldProperties : FieldProperties
{
public ReadOnlyCollection<double> AllowedValues { get; set; }

2
src/Squidex.Domain.Apps.Core.Model/Schemas/ReferencesFieldProperties.cs

@ -6,11 +6,9 @@
// ==========================================================================
using System;
using Squidex.Infrastructure;
namespace Squidex.Domain.Apps.Core.Schemas
{
[TypeName("ReferencesField")]
public sealed class ReferencesFieldProperties : FieldProperties
{
public int? MinItems { get; set; }

2
src/Squidex.Domain.Apps.Core.Model/Schemas/StringFieldProperties.cs

@ -5,12 +5,10 @@
// All rights reserved. Licensed under the MIT license.
// ==========================================================================
using Squidex.Infrastructure;
using System.Collections.ObjectModel;
namespace Squidex.Domain.Apps.Core.Schemas
{
[TypeName("StringField")]
public sealed class StringFieldProperties : FieldProperties
{
public ReadOnlyCollection<string> AllowedValues { get; set; }

2
src/Squidex.Domain.Apps.Core.Model/Schemas/TagsFieldProperties.cs

@ -5,12 +5,10 @@
// All rights reserved. Licensed under the MIT license.
// ==========================================================================
using Squidex.Infrastructure;
using System.Collections.ObjectModel;
namespace Squidex.Domain.Apps.Core.Schemas
{
[TypeName("TagsField")]
public sealed class TagsFieldProperties : FieldProperties
{
public ReadOnlyCollection<string> AllowedValues { get; set; }

46
src/Squidex.Domain.Apps.Core.Operations/HandleRules/RuleRegistry.cs

@ -0,0 +1,46 @@
// ==========================================================================
// Squidex Headless CMS
// ==========================================================================
// Copyright (c) Squidex UG (haftungsbeschraenkt)
// All rights reserved. Licensed under the MIT license.
// ==========================================================================
using System;
using System.Collections.Generic;
using System.Linq;
using Squidex.Domain.Apps.Core.HandleRules.EnrichedEvents;
using Squidex.Domain.Apps.Core.Rules;
using Squidex.Infrastructure;
namespace Squidex.Domain.Apps.Core.HandleRules
{
public static class RuleRegistry
{
public static TypeNameRegistry MapRules(this TypeNameRegistry typeNameRegistry)
{
var eventTypes = typeof(EnrichedEvent).Assembly.GetTypes().Where(x => typeof(EnrichedEvent).IsAssignableFrom(x) && !x.IsAbstract);
var addedTypes = new HashSet<Type>();
foreach (var type in eventTypes)
{
if (addedTypes.Add(type))
{
typeNameRegistry.Map(type, type.Name);
}
}
var triggerTypes = typeof(RuleTrigger).Assembly.GetTypes().Where(x => typeof(RuleTrigger).IsAssignableFrom(x) && !x.IsAbstract);
foreach (var type in triggerTypes)
{
if (addedTypes.Add(type))
{
typeNameRegistry.Map(type, type.Name);
}
}
return typeNameRegistry;
}
}
}

2
src/Squidex.Infrastructure/Json/Newtonsoft/TypeNameSerializationBinder.cs

@ -35,7 +35,7 @@ namespace Squidex.Infrastructure.Json.Newtonsoft
if (typeName == null)
{
throw new JsonException("Trying to serialize object with type name.");
throw new JsonException($"Trying to serialize object with type name {serializedType}.");
}
}
}

14
src/Squidex.Infrastructure/States/DefaultStreamNameResolver.cs

@ -18,19 +18,7 @@ namespace Squidex.Infrastructure.States
Guard.NotNullOrEmpty(id, nameof(id));
Guard.NotNull(aggregateType, nameof(aggregateType));
var typeName = char.ToLower(aggregateType.Name[0]) + aggregateType.Name.Substring(1);
foreach (var suffix in Suffixes)
{
if (typeName.EndsWith(suffix, StringComparison.Ordinal))
{
typeName = typeName.Substring(0, typeName.Length - suffix.Length);
break;
}
}
return $"{typeName}-{id}";
return $"{aggregateType.TypeName(true, Suffixes)}-{id}";
}
public string WithNewId(string streamName, Func<string, string> idGenerator)

34
src/Squidex.Infrastructure/TypeNameBuilder.cs

@ -0,0 +1,34 @@
// ==========================================================================
// Squidex Headless CMS
// ==========================================================================
// Copyright (c) Squidex UG (haftungsbeschraenkt)
// All rights reserved. Licensed under the MIT license.
// ==========================================================================
using System;
namespace Squidex.Infrastructure
{
public static class TypeNameBuilder
{
public static string TypeName(this Type type, bool camelCase, params string[] suffixes)
{
var typeName = type.Name;
if (suffixes != null)
{
foreach (var suffix in suffixes)
{
if (typeName.EndsWith(suffix, StringComparison.Ordinal))
{
typeName = typeName.Substring(0, typeName.Length - suffix.Length);
break;
}
}
}
return camelCase ? typeName.ToCamelCase() : typeName;
}
}
}

8
src/Squidex/Config/Domain/SerializationServices.cs

@ -11,6 +11,7 @@ using Newtonsoft.Json;
using Newtonsoft.Json.Converters;
using Squidex.Domain.Apps.Core;
using Squidex.Domain.Apps.Core.Apps.Json;
using Squidex.Domain.Apps.Core.HandleRules;
using Squidex.Domain.Apps.Core.Rules.Json;
using Squidex.Domain.Apps.Core.Schemas;
using Squidex.Domain.Apps.Core.Schemas.Json;
@ -26,6 +27,9 @@ namespace Squidex.Config.Domain
{
private static readonly TypeNameRegistry TypeNameRegistry =
new TypeNameRegistry()
.MapFields()
.MapRules()
.MapRuleActions()
.MapUnmapped(SquidexCoreModel.Assembly)
.MapUnmapped(SquidexEvents.Assembly)
.MapUnmapped(SquidexInfrastructure.Assembly)
@ -36,8 +40,6 @@ namespace Squidex.Config.Domain
private static void ConfigureJson(JsonSerializerSettings settings, TypeNameHandling typeNameHandling)
{
RuleElementRegistry.RegisterTypes(TypeNameRegistry);
settings.SerializationBinder = new TypeNameSerializationBinder(TypeNameRegistry);
settings.ContractResolver = new ConverterContractResolver(
@ -69,8 +71,6 @@ namespace Squidex.Config.Domain
static SerializationServices()
{
FieldRegistry.Setup(TypeNameRegistry);
ConfigureJson(DefaultJsonSettings, TypeNameHandling.Auto);
DefaultJsonSerializer = JsonSerializer.Create(DefaultJsonSettings);

3
tests/Squidex.Domain.Apps.Core.Tests/Model/Rules/RuleTests.cs

@ -11,6 +11,7 @@ using System.Linq;
using FluentAssertions;
using Squidex.Domain.Apps.Core.Rules;
using Squidex.Domain.Apps.Core.Rules.Triggers;
using Squidex.Infrastructure;
using Xunit;
#pragma warning disable SA1310 // Field names must not contain underscore
@ -36,11 +37,13 @@ namespace Squidex.Domain.Apps.Core.Model.Rules
}
}
[TypeName(nameof(TestAction1))]
public sealed class TestAction1 : RuleAction
{
public string Property { get; set; }
}
[TypeName(nameof(TestAction2))]
public sealed class TestAction2 : RuleAction
{
public string Property { get; set; }

7
tests/Squidex.Domain.Apps.Core.Tests/TestUtils.cs

@ -11,6 +11,7 @@ using System.Reflection;
using Newtonsoft.Json;
using Newtonsoft.Json.Converters;
using Squidex.Domain.Apps.Core.Apps.Json;
using Squidex.Domain.Apps.Core.HandleRules;
using Squidex.Domain.Apps.Core.Rules.Json;
using Squidex.Domain.Apps.Core.Schemas;
using Squidex.Domain.Apps.Core.Schemas.Json;
@ -28,7 +29,11 @@ namespace Squidex.Domain.Apps.Core
public static IJsonSerializer CreateSerializer(TypeNameHandling typeNameHandling = TypeNameHandling.Auto)
{
var typeNameRegistry = new TypeNameRegistry();
var typeNameRegistry =
new TypeNameRegistry()
.MapFields()
.MapRules()
.MapUnmapped(typeof(TestUtils).Assembly);
var serializerSettings = new JsonSerializerSettings
{

Loading…
Cancel
Save