From 7a70b56ec2180bd2ac0920665880b1baeeb2118d Mon Sep 17 00:00:00 2001 From: Sipke Schoorstra Date: Wed, 28 Apr 2021 22:24:14 +0200 Subject: [PATCH] Use endpoint-specific JSON serialization settings, also fixing that enum values were converted to numbers instead of strings --- .../Endpoints/Activities/List.cs | 7 ++-- .../Endpoints/WebhookDefinitions/Get.cs | 9 ++--- .../Endpoints/WebhookDefinitions/List.cs | 9 ++--- .../Extensions/ServiceCollectionExtensions.cs | 2 +- ...dpointContentSerializerSettingsProvider.cs | 33 +++++++++++++++++++ ...dpointContentSerializerSettingsProvider.cs | 9 +++++ 6 files changed, 58 insertions(+), 11 deletions(-) create mode 100644 src/server/Elsa.Server.Api/Services/EndpointContentSerializerSettingsProvider.cs create mode 100644 src/server/Elsa.Server.Api/Services/IEndpointContentSerializerSettingsProvider.cs diff --git a/src/server/Elsa.Server.Api/Endpoints/Activities/List.cs b/src/server/Elsa.Server.Api/Endpoints/Activities/List.cs index 7ac42eb18..3d36652ee 100644 --- a/src/server/Elsa.Server.Api/Endpoints/Activities/List.cs +++ b/src/server/Elsa.Server.Api/Endpoints/Activities/List.cs @@ -3,6 +3,7 @@ using System.Linq; using System.Threading; using System.Threading.Tasks; using Elsa.Metadata; +using Elsa.Server.Api.Services; using Elsa.Services; using Elsa.Services.Models; using Microsoft.AspNetCore.Http; @@ -18,10 +19,12 @@ namespace Elsa.Server.Api.Endpoints.Activities public class List : Controller { private readonly IActivityTypeService _activityTypeService; + private readonly IEndpointContentSerializerSettingsProvider _serializerSettingsProvider; - public List(IActivityTypeService activityTypeService) + public List(IActivityTypeService activityTypeService, IEndpointContentSerializerSettingsProvider serializerSettingsProvider) { _activityTypeService = activityTypeService; + _serializerSettingsProvider = serializerSettingsProvider; } [HttpGet] @@ -37,7 +40,7 @@ namespace Elsa.Server.Api.Endpoints.Activities var activityTypes = await _activityTypeService.GetActivityTypesAsync(cancellationToken); var tasks = activityTypes.Where(x => x.IsBrowsable).Select(x => DescribeActivity(x, cancellationToken)).ToList(); var descriptors = await Task.WhenAll(tasks); - return Json(descriptors); + return Json(descriptors, _serializerSettingsProvider.GetSettings()); } private async Task DescribeActivity(ActivityType activityType, CancellationToken cancellationToken) => await _activityTypeService.DescribeActivityType(activityType, cancellationToken); diff --git a/src/server/Elsa.Server.Api/Endpoints/WebhookDefinitions/Get.cs b/src/server/Elsa.Server.Api/Endpoints/WebhookDefinitions/Get.cs index f803bce15..6f6af2469 100644 --- a/src/server/Elsa.Server.Api/Endpoints/WebhookDefinitions/Get.cs +++ b/src/server/Elsa.Server.Api/Endpoints/WebhookDefinitions/Get.cs @@ -6,6 +6,7 @@ using Elsa.Activities.Webhooks.Persistence; using Elsa.Models; using Elsa.Persistence.Specifications; using Elsa.Serialization; +using Elsa.Server.Api.Services; using Elsa.Server.Api.Swagger.Examples; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; @@ -21,12 +22,12 @@ namespace Elsa.Server.Api.Endpoints.WebhookDefinitions public class Get : Controller { private readonly IWebhookDefinitionStore _webhookDefinitionStore; - private readonly IContentSerializer _serializer; + private readonly IEndpointContentSerializerSettingsProvider _serializerSettingsProvider; - public Get(IWebhookDefinitionStore webhookDefinitionStore, IContentSerializer serializer) + public Get(IWebhookDefinitionStore webhookDefinitionStore, IEndpointContentSerializerSettingsProvider serializerSettingsProvider) { _webhookDefinitionStore = webhookDefinitionStore; - _serializer = serializer; + _serializerSettingsProvider = serializerSettingsProvider; } [HttpGet] @@ -42,7 +43,7 @@ namespace Elsa.Server.Api.Endpoints.WebhookDefinitions public async Task Handle(string webhookDefinitionId, CancellationToken cancellationToken = default) { var webhookDefinition = await _webhookDefinitionStore.FindAsync(new EntityIdSpecification(webhookDefinitionId), cancellationToken); - return webhookDefinition == null ? (IActionResult) NotFound() : Json(webhookDefinition, _serializer.GetSettings()); + return webhookDefinition == null ? (IActionResult) NotFound() : Json(webhookDefinition, _serializerSettingsProvider.GetSettings()); } } } \ No newline at end of file diff --git a/src/server/Elsa.Server.Api/Endpoints/WebhookDefinitions/List.cs b/src/server/Elsa.Server.Api/Endpoints/WebhookDefinitions/List.cs index 48f358329..e3529626e 100644 --- a/src/server/Elsa.Server.Api/Endpoints/WebhookDefinitions/List.cs +++ b/src/server/Elsa.Server.Api/Endpoints/WebhookDefinitions/List.cs @@ -8,6 +8,7 @@ using Elsa.Models; using Elsa.Persistence.Specifications; using Elsa.Serialization; using Elsa.Server.Api.Models; +using Elsa.Server.Api.Services; using Elsa.Server.Api.Swagger.Examples; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; @@ -23,12 +24,12 @@ namespace Elsa.Server.Api.Endpoints.WebhookDefinitions public class List : Controller { private readonly IWebhookDefinitionStore _webhookDefinitionStore; - private readonly IContentSerializer _serializer; + private readonly IEndpointContentSerializerSettingsProvider _serializerSettingsProvider; - public List(IWebhookDefinitionStore webhookDefinitionStore, IContentSerializer serializer) + public List(IWebhookDefinitionStore webhookDefinitionStore, IEndpointContentSerializerSettingsProvider serializerSettingsProvider) { _webhookDefinitionStore = webhookDefinitionStore; - _serializer = serializer; + _serializerSettingsProvider = serializerSettingsProvider; } [HttpGet] @@ -45,7 +46,7 @@ namespace Elsa.Server.Api.Endpoints.WebhookDefinitions var specification = Specification.Identity; var items = await _webhookDefinitionStore.FindManyAsync(specification, cancellationToken: cancellationToken); - return Json(items, _serializer.GetSettings()); + return Json(items, _serializerSettingsProvider.GetSettings()); } } } \ No newline at end of file diff --git a/src/server/Elsa.Server.Api/Extensions/ServiceCollectionExtensions.cs b/src/server/Elsa.Server.Api/Extensions/ServiceCollectionExtensions.cs index 14e384b8f..6cab4d065 100644 --- a/src/server/Elsa.Server.Api/Extensions/ServiceCollectionExtensions.cs +++ b/src/server/Elsa.Server.Api/Extensions/ServiceCollectionExtensions.cs @@ -19,7 +19,6 @@ namespace Microsoft.Extensions.DependencyInjection { setupNewtonsoftJson ??= _ => { }; services.AddControllers().AddNewtonsoftJson(setupNewtonsoftJson); - services.AddRouting(options => options.LowercaseUrls = true); services.AddVersionedApiExplorer(o => @@ -39,6 +38,7 @@ namespace Microsoft.Extensions.DependencyInjection services.AddSingleton(); services.AddSingleton(); services.AddSingleton(); + services.AddSingleton(); services.AddAutoMapperProfile(); return services; } diff --git a/src/server/Elsa.Server.Api/Services/EndpointContentSerializerSettingsProvider.cs b/src/server/Elsa.Server.Api/Services/EndpointContentSerializerSettingsProvider.cs new file mode 100644 index 000000000..e226ebc30 --- /dev/null +++ b/src/server/Elsa.Server.Api/Services/EndpointContentSerializerSettingsProvider.cs @@ -0,0 +1,33 @@ +using Elsa.Serialization.Converters; +using Newtonsoft.Json; +using Newtonsoft.Json.Serialization; +using NodaTime; +using NodaTime.Serialization.JsonNet; + +namespace Elsa.Server.Api.Services +{ + public class EndpointContentSerializerSettingsProvider : IEndpointContentSerializerSettingsProvider + { + private readonly JsonSerializerSettings _serializerSettings; + + public EndpointContentSerializerSettingsProvider() + { + _serializerSettings = new JsonSerializerSettings(); + _serializerSettings.ConfigureForNodaTime(DateTimeZoneProviders.Tzdb); + _serializerSettings.NullValueHandling = NullValueHandling.Ignore; + _serializerSettings.TypeNameAssemblyFormatHandling = TypeNameAssemblyFormatHandling.Simple; + _serializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver + { + NamingStrategy = new CamelCaseNamingStrategy + { + ProcessDictionaryKeys = false, + ProcessExtensionDataNames = true, + OverrideSpecifiedNames = false + } + }; + _serializerSettings.Converters.Add(new FlagEnumConverter(new DefaultNamingStrategy())); + } + + public JsonSerializerSettings GetSettings() => _serializerSettings; + } +} \ No newline at end of file diff --git a/src/server/Elsa.Server.Api/Services/IEndpointContentSerializerSettingsProvider.cs b/src/server/Elsa.Server.Api/Services/IEndpointContentSerializerSettingsProvider.cs new file mode 100644 index 000000000..0df414ae3 --- /dev/null +++ b/src/server/Elsa.Server.Api/Services/IEndpointContentSerializerSettingsProvider.cs @@ -0,0 +1,9 @@ +using Newtonsoft.Json; + +namespace Elsa.Server.Api.Services +{ + public interface IEndpointContentSerializerSettingsProvider + { + JsonSerializerSettings GetSettings(); + } +} \ No newline at end of file