Skip to content

Commit ba67d24

Browse files
committed
refactor(relationships): provide a more specific definition
1 parent e816b9c commit ba67d24

File tree

5 files changed

+47
-10
lines changed

5 files changed

+47
-10
lines changed

src/JsonApiDotNetCore/Builders/DocumentBuilder.cs

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
using System.Collections.Generic;
2+
using JsonApiDotNetCore.Extensions;
23
using JsonApiDotNetCore.Internal;
34
using JsonApiDotNetCore.Models;
45
using JsonApiDotNetCore.Services;
@@ -59,7 +60,7 @@ private DocumentData _getData(ContextEntity contextEntity, IIdentifiable entity)
5960
return data;
6061

6162
data.Attributes = new Dictionary<string, object>();
62-
data.Relationships = new Dictionary<string, Dictionary<string, object>>();
63+
data.Relationships = new Dictionary<string, RelationshipData>();
6364

6465
contextEntity.Attributes.ForEach(attr =>
6566
{
@@ -76,10 +77,13 @@ private void _addRelationships(DocumentData data, ContextEntity contextEntity, I
7677
var linkBuilder = new LinkBuilder(_jsonApiContext);
7778

7879
contextEntity.Relationships.ForEach(r => {
79-
data.Relationships.Add("links", new Dictionary<string,object> {
80-
{"self", linkBuilder.GetSelfRelationLink(contextEntity.EntityName, entity.Id.ToString(), r.RelationshipName)},
81-
{"related", linkBuilder.GetRelatedRelationLink(contextEntity.EntityName, entity.Id.ToString(), r.RelationshipName)},
82-
});
80+
var relationshipData = new RelationshipData {
81+
Links = new Dictionary<string, string> {
82+
{"self", linkBuilder.GetSelfRelationLink(contextEntity.EntityName, entity.Id.ToString(), r.RelationshipName)},
83+
{"related", linkBuilder.GetRelatedRelationLink(contextEntity.EntityName, entity.Id.ToString(), r.RelationshipName)}
84+
}
85+
};
86+
data.Relationships.Add(r.RelationshipName.Dasherize(), relationshipData);
8387
});
8488
}
8589
}

src/JsonApiDotNetCore/Models/DocumentData.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,6 @@ public string Type
2323

2424

2525
[JsonProperty("relationships")]
26-
public Dictionary<string, Dictionary<string, object>> Relationships { get; set; }
26+
public Dictionary<string, RelationshipData> Relationships { get; set; }
2727
}
2828
}
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
using System.Collections;
2+
using System.Collections.Generic;
3+
using Newtonsoft.Json;
4+
5+
namespace JsonApiDotNetCore.Models
6+
{
7+
public class RelationshipData
8+
{
9+
[JsonProperty("links")]
10+
public Dictionary<string, string> Links { get; set; }
11+
12+
[JsonProperty("data")]
13+
public object ExposedData {
14+
get {
15+
if(ManyData != null)
16+
return ManyData;
17+
return SingleData;
18+
}
19+
set {
20+
if(value is IEnumerable)
21+
ManyData = (List<Dictionary<string, string>>)value;
22+
else
23+
SingleData = (Dictionary<string, string>)value;
24+
}
25+
}
26+
27+
[JsonIgnore]
28+
public List<Dictionary<string, string>> ManyData { get; set; }
29+
30+
[JsonIgnore]
31+
public Dictionary<string, string> SingleData { get; set; }
32+
}
33+
}

src/JsonApiDotNetCore/Serialization/JsonApiDeSerializer.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ private static object _setEntityAttributes(
5454
}
5555

5656
private static object _setRelationships(
57-
object entity, ContextEntity contextEntity, Dictionary<string, Dictionary<string, object>> relationships)
57+
object entity, ContextEntity contextEntity, Dictionary<string, RelationshipData> relationships)
5858
{
5959
if(relationships == null)
6060
return entity;
@@ -68,10 +68,10 @@ private static object _setRelationships(
6868
if (entityProperty == null)
6969
throw new ArgumentException($"{contextEntity.EntityType.Name} does not contain an relationsip named {attr.RelationshipName}", nameof(entity));
7070

71-
Dictionary<string, object> relationshipData;
71+
RelationshipData relationshipData;
7272
if (relationships.TryGetValue(attr.RelationshipName.Dasherize(), out relationshipData))
7373
{
74-
var data = ((JObject)relationshipData["data"]).ToObject<Dictionary<string,string>>();
74+
var data = (Dictionary<string,string>)relationshipData.ExposedData;
7575
var newValue = data["id"];
7676
var convertedValue = Convert.ChangeType(newValue, entityProperty.PropertyType);
7777
entityProperty.SetValue(entity, convertedValue);

src/JsonApiDotNetCoreExample/README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323
- [ ] Dasherized route support
2424
- [ ] Sorting/Filtering should be handled by the repository so that it is not dependeny on EF ?
2525
- [ ] Rename ContextEntity ??
26-
- [ ] Refactor relationships links to use an POCO that contains data and links objects
26+
- [x] Refactor relationships links to use an POCO that contains data and links objects
2727

2828
## Usage
2929

0 commit comments

Comments
 (0)