11using System ;
22using System . IO ;
3+ using System . Linq ;
4+ using System . Reflection ;
35using JsonApiDotNetCore . Abstractions ;
46using JsonApiDotNetCore . Configuration ;
7+ using JsonApiDotNetCore . Extensions ;
58using JsonApiDotNetCore . JsonApi ;
69using Newtonsoft . Json ;
710using Newtonsoft . Json . Linq ;
11+ using System . Collections . Generic ;
812
913namespace JsonApiDotNetCore . Services
1014{
@@ -18,21 +22,57 @@ public JsonApiDeserializer(JsonApiContext jsonApiContext)
1822
1923 public object GetEntityFromRequest ( )
2024 {
21- var body = GetRequestBody ( _context . HttpContext . Request . Body ) ;
22- var document = JsonConvert . DeserializeObject < JsonApiDocument > ( body ) ;
2325 var entity = Activator . CreateInstance ( _context . GetEntityType ( ) ) ;
24- var datum = ( ( JsonApiDatum ) ( ( JObject ) document . Data ) . ToObject ( typeof ( JsonApiDatum ) ) ) ;
26+ var datum = GetSignularJsonApiDatum ( ) ;
2527 var attributes = datum . Attributes ;
2628 var relationships = datum . Relationships ;
2729 return ModelAccessor . SetValuesOnModelInstance ( entity , attributes , relationships ) ;
2830 }
2931
30- private static string GetRequestBody ( Stream body )
32+ private JsonApiDatum GetSignularJsonApiDatum ( )
3133 {
32- using ( var reader = new StreamReader ( body ) )
34+ var document = GetJsonApiDocument ( ) ;
35+ return ( ( JsonApiDatum ) ( ( JObject ) document . Data ) . ToObject ( typeof ( JsonApiDatum ) ) ) ;
36+ }
37+
38+ private JsonApiDocument GetJsonApiDocument ( )
39+ {
40+ var body = GetRequestBody ( ) ;
41+ return JsonConvert . DeserializeObject < JsonApiDocument > ( body ) ;
42+ }
43+
44+ private string GetRequestBody ( )
45+ {
46+ using ( var reader = new StreamReader ( _context . HttpContext . Request . Body ) )
3347 {
3448 return reader . ReadToEnd ( ) ;
3549 }
3650 }
51+
52+ public Dictionary < PropertyInfo , object > GetEntityPatch ( )
53+ {
54+ var datum = GetSignularJsonApiDatum ( ) ;
55+ var attributes = datum . Attributes ;
56+ // var relationships = datum.Relationships;
57+
58+ var patchDefinitions = new Dictionary < PropertyInfo , object > ( ) ;
59+
60+ var modelProperties = _context . GetEntityType ( ) . GetProperties ( ) . ToList ( ) ;
61+
62+ foreach ( var attribute in attributes )
63+ {
64+ modelProperties . ForEach ( pI =>
65+ {
66+ if ( pI . Name . ToProperCase ( ) == attribute . Key . ToProperCase ( ) )
67+ {
68+ var convertedValue = Convert . ChangeType ( attribute . Value , pI . PropertyType ) ;
69+ patchDefinitions . Add ( pI , convertedValue ) ;
70+ }
71+ } ) ;
72+ }
73+
74+ return patchDefinitions ;
75+ }
76+
3777 }
3878}
0 commit comments