Skip to content

Commit 820b2dc

Browse files
committed
breaking(Document): introduce RO and RIO from spec
DocumentData becomes ResourceObject and dictionary in Relationship becomes strongly type ResourceIdentifierObject
1 parent 3447bae commit 820b2dc

File tree

8 files changed

+77
-53
lines changed

8 files changed

+77
-53
lines changed

src/JsonApiDotNetCore/Builders/DocumentBuilder.cs

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -234,32 +234,32 @@ private bool RelationshipIsIncluded(string relationshipName)
234234
_jsonApiContext.IncludedRelationships.Contains(relationshipName);
235235
}
236236

237-
private List<Dictionary<string, object>> GetRelationships(IEnumerable<object> entities)
237+
private List<ResourceIdentifierObject> GetRelationships(IEnumerable<object> entities)
238238
{
239239
var objType = entities.GetElementType();
240240

241241
var typeName = _jsonApiContext.ContextGraph.GetContextEntity(objType);
242242

243-
var relationships = new List<Dictionary<string, object>>();
243+
var relationships = new List<ResourceIdentifierObject>();
244244
foreach (var entity in entities)
245245
{
246-
relationships.Add(new Dictionary<string, object> {
247-
{"type", typeName.EntityName },
248-
{"id", ((IIdentifiable)entity).StringId }
246+
relationships.Add(new ResourceIdentifierObject {
247+
Type = typeName.EntityName,
248+
Id = ((IIdentifiable)entity).StringId
249249
});
250250
}
251251
return relationships;
252252
}
253-
private Dictionary<string, object> GetRelationship(object entity)
253+
private ResourceIdentifierObject GetRelationship(object entity)
254254
{
255255
var objType = entity.GetType();
256256

257257
var typeName = _jsonApiContext.ContextGraph.GetContextEntity(objType);
258258

259-
return new Dictionary<string, object> {
260-
{"type", typeName.EntityName },
261-
{"id", ((IIdentifiable)entity).StringId }
262-
};
259+
return new ResourceIdentifierObject {
260+
Type = typeName.EntityName,
261+
Id = ((IIdentifiable)entity).StringId
262+
};
263263
}
264264
}
265265
}
Lines changed: 3 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,5 @@
1-
using System.Collections.Generic;
2-
using Newtonsoft.Json;
3-
41
namespace JsonApiDotNetCore.Models
52
{
6-
public class DocumentData
7-
{
8-
[JsonProperty("type")]
9-
public object Type { get; set; }
10-
11-
[JsonProperty("id")]
12-
public object Id { get; set; }
13-
14-
[JsonProperty("attributes")]
15-
public Dictionary<string, object> Attributes { get; set; }
16-
17-
[JsonProperty("relationships", NullValueHandling = NullValueHandling.Ignore)]
18-
public Dictionary<string, RelationshipData> Relationships { get; set; }
19-
}
20-
}
3+
// TODO: deprecate DocumentData in favor of ResourceObject
4+
public class DocumentData : ResourceObject { }
5+
}

src/JsonApiDotNetCore/Models/RelationshipData.cs

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
using System.Collections;
21
using System.Collections.Generic;
32
using Newtonsoft.Json;
43
using Newtonsoft.Json.Linq;
@@ -22,9 +21,9 @@ public object ExposedData
2221
set
2322
{
2423
if (value is JObject jObject)
25-
SingleData = jObject.ToObject<Dictionary<string, object>>();
26-
else if (value is Dictionary<string, object> dict)
27-
SingleData = (Dictionary<string, object>)value;
24+
SingleData = jObject.ToObject<ResourceIdentifierObject>();
25+
else if (value is ResourceIdentifierObject dict)
26+
SingleData = (ResourceIdentifierObject)value;
2827
else
2928
SetManyData(value);
3029
}
@@ -34,16 +33,16 @@ private void SetManyData(object value)
3433
{
3534
IsHasMany = true;
3635
if (value is JArray jArray)
37-
ManyData = jArray.ToObject<List<Dictionary<string, object>>>();
36+
ManyData = jArray.ToObject<List<ResourceIdentifierObject>>();
3837
else
39-
ManyData = (List<Dictionary<string, object>>)value;
38+
ManyData = (List<ResourceIdentifierObject>)value;
4039
}
4140

4241
[JsonIgnore]
43-
public List<Dictionary<string, object>> ManyData { get; set; }
42+
public List<ResourceIdentifierObject> ManyData { get; set; }
4443

4544
[JsonIgnore]
46-
public Dictionary<string, object> SingleData { get; set; }
45+
public ResourceIdentifierObject SingleData { get; set; }
4746

4847
[JsonIgnore]
4948
public bool IsHasMany { get; private set; }
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
using Newtonsoft.Json;
2+
3+
namespace JsonApiDotNetCore.Models
4+
{
5+
public class ResourceIdentifierObject
6+
{
7+
[JsonProperty("type")]
8+
public string Type { get; set; }
9+
10+
[JsonProperty("id")]
11+
public string Id { get; set; }
12+
13+
[JsonProperty("lid")]
14+
public string LocalId { get; set; }
15+
}
16+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
using System.Collections.Generic;
2+
using Newtonsoft.Json;
3+
4+
namespace JsonApiDotNetCore.Models
5+
{
6+
public class ResourceObject : ResourceIdentifierObject
7+
{
8+
[JsonProperty("attributes")]
9+
public Dictionary<string, object> Attributes { get; set; }
10+
11+
[JsonProperty("relationships", NullValueHandling = NullValueHandling.Ignore)]
12+
public Dictionary<string, RelationshipData> Relationships { get; set; }
13+
}
14+
}

src/JsonApiDotNetCore/Serialization/JsonApiDeSerializer.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -218,7 +218,9 @@ private object SetHasManyRelationship(object entity,
218218
if (data == null) return entity;
219219

220220
var genericProcessor = _genericProcessorFactory.GetProcessor<IGenericProcessor>(typeof(GenericProcessor<>), attr.Type);
221-
var ids = relationshipData.ManyData.Select(r => r["id"].ToString());
221+
222+
var ids = relationshipData.ManyData.Select(r => r.Id);
223+
222224
genericProcessor.SetRelationships(entity, attr, ids);
223225
}
224226

test/UnitTests/Models/RelationshipDataTests.cs

Lines changed: 23 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
1-
using JsonApiDotNetCore.Models;
2-
using System.Collections.Generic;
3-
using Xunit;
1+
using System.Collections.Generic;
2+
using JsonApiDotNetCore.Models;
43
using Newtonsoft.Json.Linq;
4+
using Xunit;
55

66
namespace UnitTests.Models
77
{
@@ -12,9 +12,10 @@ public void Setting_ExposedData_To_List_Sets_ManyData()
1212
{
1313
// arrange
1414
var relationshipData = new RelationshipData();
15-
var relationships = new List<Dictionary<string, object>> {
16-
new Dictionary<string, object> {
17-
{ "authors", new { } }
15+
var relationships = new List<ResourceIdentifierObject> {
16+
new ResourceIdentifierObject {
17+
Id = "9",
18+
Type = "authors"
1819
}
1920
};
2021

@@ -23,7 +24,8 @@ public void Setting_ExposedData_To_List_Sets_ManyData()
2324

2425
// assert
2526
Assert.NotEmpty(relationshipData.ManyData);
26-
Assert.True(relationshipData.ManyData[0].ContainsKey("authors"));
27+
Assert.Equal("authors", relationshipData.ManyData[0].Type);
28+
Assert.Equal("9", relationshipData.ManyData[0].Id);
2729
Assert.True(relationshipData.IsHasMany);
2830
}
2931

@@ -34,7 +36,8 @@ public void Setting_ExposedData_To_JArray_Sets_ManyData()
3436
var relationshipData = new RelationshipData();
3537
var relationshipsJson = @"[
3638
{
37-
""authors"": {}
39+
""type"": ""authors"",
40+
""id"": ""9""
3841
}
3942
]";
4043

@@ -45,25 +48,28 @@ public void Setting_ExposedData_To_JArray_Sets_ManyData()
4548

4649
// assert
4750
Assert.NotEmpty(relationshipData.ManyData);
48-
Assert.True(relationshipData.ManyData[0].ContainsKey("authors"));
51+
Assert.Equal("authors", relationshipData.ManyData[0].Type);
52+
Assert.Equal("9", relationshipData.ManyData[0].Id);
4953
Assert.True(relationshipData.IsHasMany);
5054
}
5155

5256
[Fact]
53-
public void Setting_ExposedData_To_Dictionary_Sets_SingleData()
57+
public void Setting_ExposedData_To_RIO_Sets_SingleData()
5458
{
5559
// arrange
5660
var relationshipData = new RelationshipData();
57-
var relationship = new Dictionary<string, object> {
58-
{ "authors", new { } }
61+
var relationship = new ResourceIdentifierObject {
62+
Id = "9",
63+
Type = "authors"
5964
};
6065

6166
// act
6267
relationshipData.ExposedData = relationship;
6368

6469
// assert
6570
Assert.NotNull(relationshipData.SingleData);
66-
Assert.True(relationshipData.SingleData.ContainsKey("authors"));
71+
Assert.Equal("authors", relationshipData.SingleData.Type);
72+
Assert.Equal("9", relationshipData.SingleData.Id);
6773
Assert.False(relationshipData.IsHasMany);
6874
}
6975

@@ -73,7 +79,8 @@ public void Setting_ExposedData_To_JObject_Sets_SingleData()
7379
// arrange
7480
var relationshipData = new RelationshipData();
7581
var relationshipJson = @"{
76-
""authors"": {}
82+
""id"": ""9"",
83+
""type"": ""authors""
7784
}";
7885

7986
var relationship = JObject.Parse(relationshipJson);
@@ -83,7 +90,8 @@ public void Setting_ExposedData_To_JObject_Sets_SingleData()
8390

8491
// assert
8592
Assert.NotNull(relationshipData.SingleData);
86-
Assert.True(relationshipData.SingleData.ContainsKey("authors"));
93+
Assert.Equal("authors", relationshipData.SingleData.Type);
94+
Assert.Equal("9", relationshipData.SingleData.Id);
8795
Assert.False(relationshipData.IsHasMany);
8896
}
8997
}

test/UnitTests/Services/Operations/OperationsProcessorTests.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,7 @@ public async Task ProcessAsync_Performs_Pointer_ReplacementAsync()
9898
m => m.ProcessAsync(
9999
It.Is<Operation>(o =>
100100
o.DataObject.Type.ToString() == "articles"
101-
&& o.DataObject.Relationships["author"].SingleData["id"].ToString() == "9"
101+
&& o.DataObject.Relationships["author"].SingleData.Id == "9"
102102
)
103103
)
104104
);

0 commit comments

Comments
 (0)