From 36ea5ed6aee48349bd2e5a27c52956d137c89819 Mon Sep 17 00:00:00 2001 From: Paul Rose Date: Wed, 29 May 2024 10:51:08 -0400 Subject: [PATCH 1/2] FC-29372 For .netcore replace constructor Replace the route prefix string in the constructor to use an settings interface. That way .netcore can use dependency injection. Also - for .net framework - update to 4.8 so we can compile and update master without headaches. --- .../NJsonApi.Common.Test.csproj | 4 +- NJsonApi.Common.Test/packages.config | 10 +-- NJsonApi.Test/NJsonApi.Test.csproj | 4 +- NJsonApi.Test/app.config | 2 +- NJsonApi.Test/packages.config | 10 +-- .../Util-JsonApiSerializer.Common.csproj | 4 +- .../IJsonApiSerializerSettings.cs | 13 ++++ .../JsonApiSerializer.cs | 64 +++++++++++++++++++ .../JsonApiSerializerSettings.cs | 13 ++++ .../Util-JsonApiSerializer.NetCore.csproj | 1 - .../Util-JsonApiSerializer.csproj | 4 +- Util-JsonApiSerializer/app.config | 2 +- 12 files changed, 110 insertions(+), 21 deletions(-) create mode 100644 Util-JsonApiSerializer.NetCore/IJsonApiSerializerSettings.cs create mode 100644 Util-JsonApiSerializer.NetCore/JsonApiSerializer.cs create mode 100644 Util-JsonApiSerializer.NetCore/JsonApiSerializerSettings.cs diff --git a/NJsonApi.Common.Test/NJsonApi.Common.Test.csproj b/NJsonApi.Common.Test/NJsonApi.Common.Test.csproj index 4c82ba8..e67edb6 100644 --- a/NJsonApi.Common.Test/NJsonApi.Common.Test.csproj +++ b/NJsonApi.Common.Test/NJsonApi.Common.Test.csproj @@ -1,4 +1,4 @@ - + @@ -9,7 +9,7 @@ Properties NJsonApi.Common.Test NJsonApi.Common.Test - v4.5 + v4.8 512 {3AC096D0-A1C2-E12C-1390-A8335801FDAB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} 10.0 diff --git a/NJsonApi.Common.Test/packages.config b/NJsonApi.Common.Test/packages.config index df12f33..0489dde 100644 --- a/NJsonApi.Common.Test/packages.config +++ b/NJsonApi.Common.Test/packages.config @@ -1,9 +1,9 @@ - + - + - - - + + + \ No newline at end of file diff --git a/NJsonApi.Test/NJsonApi.Test.csproj b/NJsonApi.Test/NJsonApi.Test.csproj index 484d144..ba6c1c6 100644 --- a/NJsonApi.Test/NJsonApi.Test.csproj +++ b/NJsonApi.Test/NJsonApi.Test.csproj @@ -1,4 +1,4 @@ - + @@ -9,7 +9,7 @@ Properties NJsonApi.Test NJsonApi.Test - v4.5 + v4.8 512 {3AC096D0-A1C2-E12C-1390-A8335801FDAB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} 10.0 diff --git a/NJsonApi.Test/app.config b/NJsonApi.Test/app.config index 244cd95..e1a45ad 100644 --- a/NJsonApi.Test/app.config +++ b/NJsonApi.Test/app.config @@ -8,4 +8,4 @@ - + diff --git a/NJsonApi.Test/packages.config b/NJsonApi.Test/packages.config index 6a8f94d..044cdae 100644 --- a/NJsonApi.Test/packages.config +++ b/NJsonApi.Test/packages.config @@ -1,12 +1,12 @@ - + - + - - - + + + \ No newline at end of file diff --git a/Util-JsonApiSerializer.Common/Util-JsonApiSerializer.Common.csproj b/Util-JsonApiSerializer.Common/Util-JsonApiSerializer.Common.csproj index 01016d8..a2214a9 100644 --- a/Util-JsonApiSerializer.Common/Util-JsonApiSerializer.Common.csproj +++ b/Util-JsonApiSerializer.Common/Util-JsonApiSerializer.Common.csproj @@ -1,4 +1,4 @@ - + @@ -9,7 +9,7 @@ Properties UtilJsonApiSerializer.Common UtilJsonApiSerializer.Common - v4.5 + v4.8 512 ..\..\ diff --git a/Util-JsonApiSerializer.NetCore/IJsonApiSerializerSettings.cs b/Util-JsonApiSerializer.NetCore/IJsonApiSerializerSettings.cs new file mode 100644 index 0000000..a5440e7 --- /dev/null +++ b/Util-JsonApiSerializer.NetCore/IJsonApiSerializerSettings.cs @@ -0,0 +1,13 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Util_JsonApiSerializer.NetCore +{ + public interface IJsonApiSerializerSettings + { + public string RoutePrefix { get; set; } + } +} diff --git a/Util-JsonApiSerializer.NetCore/JsonApiSerializer.cs b/Util-JsonApiSerializer.NetCore/JsonApiSerializer.cs new file mode 100644 index 0000000..5edf0de --- /dev/null +++ b/Util-JsonApiSerializer.NetCore/JsonApiSerializer.cs @@ -0,0 +1,64 @@ + + using Microsoft.AspNetCore.Http; + +using System.Collections.Generic; +using Util_JsonApiSerializer.NetCore; +using UtilJsonApiSerializer.Serialization; +using UtilJsonApiSerializer.Serialization.Documents; +namespace UtilJsonApiSerializer +{ + public class JsonApiSerializer : IJsonApiSerializer + { + private readonly string _routePrefix; + + public ConfigurationBuilder SerializerConfiguration { get; set; } +// In Net Core we do not have access to the Http Context directly, so we need to inject it via httpContextAccessor + + private IHttpContextAccessor _accessor; + private IJsonApiSerializerSettings _settings; + public JsonApiSerializer( + IHttpContextAccessor accessor, + IJsonApiSerializerSettings settings + ) + { + SerializerConfiguration = new ConfigurationBuilder(); + _routePrefix = settings == null ? "" : settings.RoutePrefix; + _accessor = accessor; + } + + public object SerializeObject(ConfigurationBuilder serializerConfig, object obj) + { + var config = serializerConfig.Build(); + RunPreSerializationPipelineModules(config, obj); + + var sut = new JsonApiTransformer() { TransformationHelper = new TransformationHelper(_accessor) }; + + CompoundDocument result = sut.Transform(obj, new Context() { Configuration = config, RoutePrefix = _routePrefix }); + + return result; + } + + private void RunPreSerializationPipelineModules(Configuration config, object objectData) + { + var objectType = TransformationHelper.GetObjectType(objectData); + var preSerializerPipelineModule = config.GetPreSerializerPipelineModule(objectType); + if (preSerializerPipelineModule != null) + { + if (objectData is IEnumerable enumerableData) + { + foreach (var item in enumerableData) + { + preSerializerPipelineModule.Run(item); + } + } + else + { + preSerializerPipelineModule.Run(objectData); + } + + } + } + + + } +} diff --git a/Util-JsonApiSerializer.NetCore/JsonApiSerializerSettings.cs b/Util-JsonApiSerializer.NetCore/JsonApiSerializerSettings.cs new file mode 100644 index 0000000..b7abcc6 --- /dev/null +++ b/Util-JsonApiSerializer.NetCore/JsonApiSerializerSettings.cs @@ -0,0 +1,13 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Util_JsonApiSerializer.NetCore +{ + public class JsonApiSerializerSettings : IJsonApiSerializerSettings + { + public string RoutePrefix { get; set; } = "api"; + } +} diff --git a/Util-JsonApiSerializer.NetCore/Util-JsonApiSerializer.NetCore.csproj b/Util-JsonApiSerializer.NetCore/Util-JsonApiSerializer.NetCore.csproj index 096e286..c6c0ff1 100644 --- a/Util-JsonApiSerializer.NetCore/Util-JsonApiSerializer.NetCore.csproj +++ b/Util-JsonApiSerializer.NetCore/Util-JsonApiSerializer.NetCore.csproj @@ -42,7 +42,6 @@ - diff --git a/Util-JsonApiSerializer/Util-JsonApiSerializer.csproj b/Util-JsonApiSerializer/Util-JsonApiSerializer.csproj index 23d5c7a..ed4a874 100644 --- a/Util-JsonApiSerializer/Util-JsonApiSerializer.csproj +++ b/Util-JsonApiSerializer/Util-JsonApiSerializer.csproj @@ -1,4 +1,4 @@ - + @@ -9,7 +9,7 @@ Properties UtilJsonApiSerializer UtilJsonApiSerializer - v4.5 + v4.8 512 ..\..\ diff --git a/Util-JsonApiSerializer/app.config b/Util-JsonApiSerializer/app.config index 244cd95..e1a45ad 100644 --- a/Util-JsonApiSerializer/app.config +++ b/Util-JsonApiSerializer/app.config @@ -8,4 +8,4 @@ - + From c40c326ba111f51e8783356aec969ab1ea4729fa Mon Sep 17 00:00:00 2001 From: Paul Rose Date: Thu, 30 May 2024 16:58:00 -0400 Subject: [PATCH 2/2] FC-29372 Update .netcore constructor Update for dependency injection and provide the ability to send string for route prefix --- Util-JsonApiSerializer.NetCore/JsonApiSerializer.cs | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/Util-JsonApiSerializer.NetCore/JsonApiSerializer.cs b/Util-JsonApiSerializer.NetCore/JsonApiSerializer.cs index 5edf0de..4eb58de 100644 --- a/Util-JsonApiSerializer.NetCore/JsonApiSerializer.cs +++ b/Util-JsonApiSerializer.NetCore/JsonApiSerializer.cs @@ -26,6 +26,16 @@ IJsonApiSerializerSettings settings _accessor = accessor; } + public JsonApiSerializer(IHttpContextAccessor accessor, string routePrefix) + { + SerializerConfiguration = new ConfigurationBuilder(); + _routePrefix = string.IsNullOrEmpty(routePrefix) ? "" : routePrefix; + _accessor = accessor; + } + + + + public object SerializeObject(ConfigurationBuilder serializerConfig, object obj) { var config = serializerConfig.Build();