Browse Source

* Formatting improved

* Known type shit improved.
pull/241/head
Sebastian Stehle 8 years ago
parent
commit
0924c16550
  1. 2
      src/Squidex.Infrastructure/Http/DumpFormatter.cs
  2. 45
      src/Squidex/Areas/Api/Controllers/JsonInheritanceConverter.cs
  3. 18
      src/Squidex/Areas/Api/Controllers/Rules/Models/RuleActionDto.cs
  4. 15
      src/Squidex/Areas/Api/Controllers/Rules/Models/RuleTriggerDto.cs
  5. 22
      src/Squidex/Areas/Api/Controllers/Schemas/Models/FieldPropertiesDto.cs

2
src/Squidex.Infrastructure/Http/DumpFormatter.cs

@ -66,7 +66,7 @@ namespace Squidex.Infrastructure.Http
writer.AppendLine(responseBody); writer.AppendLine(responseBody);
} }
if (response != null) if (response != null && elapsed != TimeSpan.Zero)
{ {
writer.AppendLine(); writer.AppendLine();
writer.AppendLine($"Elapsed: {elapsed}"); writer.AppendLine($"Elapsed: {elapsed}");

45
src/Squidex/Areas/Api/Controllers/JsonInheritanceConverter.cs

@ -6,9 +6,9 @@
// ========================================================================== // ==========================================================================
using System; using System;
using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Reflection; using System.Reflection;
using System.Runtime.Serialization;
using Newtonsoft.Json; using Newtonsoft.Json;
using Newtonsoft.Json.Linq; using Newtonsoft.Json.Linq;
using NJsonSchema.Annotations; using NJsonSchema.Annotations;
@ -20,6 +20,8 @@ namespace Squidex.Areas.Api.Controllers
public sealed class JsonInheritanceConverter : JsonConverter public sealed class JsonInheritanceConverter : JsonConverter
{ {
private readonly string discriminator; private readonly string discriminator;
private readonly Dictionary<string, Type> mapNameToType = new Dictionary<string, Type>(StringComparer.OrdinalIgnoreCase);
private readonly Dictionary<Type, string> mapTypeToName = new Dictionary<Type, string>();
[ThreadStatic] [ThreadStatic]
private static bool IsReading; private static bool IsReading;
@ -53,9 +55,17 @@ namespace Squidex.Areas.Api.Controllers
} }
} }
public JsonInheritanceConverter(string discriminator) public JsonInheritanceConverter(string discriminator, Type baseType)
{ {
this.discriminator = discriminator; this.discriminator = discriminator;
foreach (var type in baseType.Assembly.GetTypes().Where(x => x != baseType && baseType.IsAssignableFrom(x)))
{
var name = type.GetTypeInfo().GetCustomAttribute<JsonSchemaAttribute>()?.Name ?? type.Name;
mapTypeToName[type] = name;
mapNameToType[name] = type;
}
} }
public override bool CanConvert(Type objectType) public override bool CanConvert(Type objectType)
@ -70,7 +80,7 @@ namespace Squidex.Areas.Api.Controllers
{ {
var jsonObject = JObject.FromObject(value, serializer); var jsonObject = JObject.FromObject(value, serializer);
jsonObject.AddFirst(new JProperty(discriminator, GetSchemaName(value.GetType()))); jsonObject.AddFirst(new JProperty(discriminator, mapTypeToName[value.GetType()]));
writer.WriteToken(jsonObject.CreateReader()); writer.WriteToken(jsonObject.CreateReader());
} }
@ -94,11 +104,9 @@ namespace Squidex.Areas.Api.Controllers
return null; return null;
} }
var subType = GetObjectSubtype(objectType, subName); if (subName == null || !mapNameToType.TryGetValue(subName, out var subType))
if (subType == null)
{ {
return null; throw new InvalidOperationException($"Could not find subtype of '{objectType.Name}' with discriminator '{subName}'.");
} }
return serializer.Deserialize(jsonObject.CreateReader(), subType); return serializer.Deserialize(jsonObject.CreateReader(), subType);
@ -108,28 +116,5 @@ namespace Squidex.Areas.Api.Controllers
IsReading = false; IsReading = false;
} }
} }
private static Type GetObjectSubtype(Type objectType, string discriminatorValue)
{
var knownTypeAttribute =
objectType.GetTypeInfo().GetCustomAttributes<KnownTypeAttribute>()
.FirstOrDefault(a => IsKnownType(a, discriminatorValue));
return knownTypeAttribute?.Type;
}
private static bool IsKnownType(KnownTypeAttribute attribute, string discriminator)
{
var type = attribute.Type;
return type != null && GetSchemaName(type) == discriminator;
}
private static string GetSchemaName(Type type)
{
var schenaName = type.GetTypeInfo().GetCustomAttribute<JsonSchemaAttribute>()?.Name;
return schenaName ?? type.Name;
}
} }
} }

18
src/Squidex/Areas/Api/Controllers/Rules/Models/RuleActionDto.cs

@ -5,21 +5,23 @@
// All rights reserved. Licensed under the MIT license. // All rights reserved. Licensed under the MIT license.
// ========================================================================== // ==========================================================================
using System.Runtime.Serialization; using System;
using System.Linq;
using Newtonsoft.Json; using Newtonsoft.Json;
using Squidex.Areas.Api.Controllers.Rules.Models.Actions;
using Squidex.Domain.Apps.Core.Rules; using Squidex.Domain.Apps.Core.Rules;
namespace Squidex.Areas.Api.Controllers.Rules.Models namespace Squidex.Areas.Api.Controllers.Rules.Models
{ {
[JsonConverter(typeof(JsonInheritanceConverter), "actionType")] [JsonConverter(typeof(JsonInheritanceConverter), "actionType", typeof(RuleActionDto))]
[KnownType(typeof(AlgoliaActionDto))]
[KnownType(typeof(AzureQueueActionDto))]
[KnownType(typeof(FastlyActionDto))]
[KnownType(typeof(SlackActionDto))]
[KnownType(typeof(WebhookActionDto))]
public abstract class RuleActionDto public abstract class RuleActionDto
{ {
public abstract RuleAction ToAction(); public abstract RuleAction ToAction();
public static Type[] Subtypes()
{
var type = typeof(RuleActionDto);
return type.Assembly.GetTypes().Where(type.IsAssignableFrom).ToArray();
}
} }
} }

15
src/Squidex/Areas/Api/Controllers/Rules/Models/RuleTriggerDto.cs

@ -5,18 +5,25 @@
// All rights reserved. Licensed under the MIT license. // All rights reserved. Licensed under the MIT license.
// ========================================================================== // ==========================================================================
using System;
using System.Linq;
using System.Runtime.Serialization; using System.Runtime.Serialization;
using Newtonsoft.Json; using Newtonsoft.Json;
using Squidex.Areas.Api.Controllers.Rules.Models.Triggers;
using Squidex.Domain.Apps.Core.Rules; using Squidex.Domain.Apps.Core.Rules;
namespace Squidex.Areas.Api.Controllers.Rules.Models namespace Squidex.Areas.Api.Controllers.Rules.Models
{ {
[JsonConverter(typeof(JsonInheritanceConverter), "triggerType")] [JsonConverter(typeof(JsonInheritanceConverter), "triggerType", typeof(RuleTriggerDto))]
[KnownType(typeof(AssetChangedTriggerDto))] [KnownType("Subtypes")]
[KnownType(typeof(ContentChangedTriggerDto))]
public abstract class RuleTriggerDto public abstract class RuleTriggerDto
{ {
public abstract RuleTrigger ToTrigger(); public abstract RuleTrigger ToTrigger();
public static Type[] Subtypes()
{
var type = typeof(RuleTriggerDto);
return type.Assembly.GetTypes().Where(type.IsAssignableFrom).ToArray();
}
} }
} }

22
src/Squidex/Areas/Api/Controllers/Schemas/Models/FieldPropertiesDto.cs

@ -5,24 +5,15 @@
// All rights reserved. Licensed under the MIT license. // All rights reserved. Licensed under the MIT license.
// ========================================================================== // ==========================================================================
using System;
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations;
using System.Runtime.Serialization; using System.Linq;
using Newtonsoft.Json; using Newtonsoft.Json;
using Squidex.Areas.Api.Controllers.Schemas.Models.Fields;
using Squidex.Domain.Apps.Core.Schemas; using Squidex.Domain.Apps.Core.Schemas;
namespace Squidex.Areas.Api.Controllers.Schemas.Models namespace Squidex.Areas.Api.Controllers.Schemas.Models
{ {
[JsonConverter(typeof(JsonInheritanceConverter), "fieldType")] [JsonConverter(typeof(JsonInheritanceConverter), "fieldType", typeof(FieldPropertiesDto))]
[KnownType(typeof(AssetsFieldPropertiesDto))]
[KnownType(typeof(BooleanFieldPropertiesDto))]
[KnownType(typeof(DateTimeFieldPropertiesDto))]
[KnownType(typeof(GeolocationFieldPropertiesDto))]
[KnownType(typeof(JsonFieldPropertiesDto))]
[KnownType(typeof(NumberFieldPropertiesDto))]
[KnownType(typeof(ReferencesFieldPropertiesDto))]
[KnownType(typeof(StringFieldPropertiesDto))]
[KnownType(typeof(TagsFieldPropertiesDto))]
public abstract class FieldPropertiesDto public abstract class FieldPropertiesDto
{ {
/// <summary> /// <summary>
@ -59,5 +50,12 @@ namespace Squidex.Areas.Api.Controllers.Schemas.Models
public string Partitioning { get; set; } public string Partitioning { get; set; }
public abstract FieldProperties ToProperties(); public abstract FieldProperties ToProperties();
public static Type[] Subtypes()
{
var type = typeof(SchemaPropertiesDto);
return type.Assembly.GetTypes().Where(type.IsAssignableFrom).ToArray();
}
} }
} }

Loading…
Cancel
Save