Skip to content

Commit eb893a3

Browse files
committed
add relationships object to datum; rename routeBuilder to documentBuilder
1 parent 4f016ab commit eb893a3

File tree

4 files changed

+62
-40
lines changed

4 files changed

+62
-40
lines changed

JsonApiDotNetCore/Configuration/JsonApiModelConfiguration.cs

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,8 @@
11
using System;
22
using System.Collections.Generic;
3-
using System.ComponentModel;
43
using System.Linq;
54
using System.Reflection;
65
using AutoMapper;
7-
using JsonApiDotNetCore.Abstractions;
8-
using JsonApiDotNetCore.Attributes;
9-
using JsonApiDotNetCore.Controllers;
106
using JsonApiDotNetCore.Routing;
117
using Microsoft.AspNetCore.Http;
128
using Microsoft.EntityFrameworkCore;
@@ -16,12 +12,11 @@ namespace JsonApiDotNetCore.Configuration
1612
public class JsonApiModelConfiguration : IJsonApiModelConfiguration
1713
{
1814
public string Namespace;
19-
private readonly List<RouteDefinition> _routes = new List<RouteDefinition>();
20-
2115
public IMapper ResourceMaps;
22-
2316
public Type ContextType { get; set; }
2417

18+
private readonly List<RouteDefinition> _routes = new List<RouteDefinition>();
19+
2520
public void SetDefaultNamespace(string ns)
2621
{
2722
Namespace = ns;
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
using System.Collections.Generic;
2+
3+
namespace JsonApiDotNetCore.JsonApi
4+
{
5+
public static class DocumentBuilder
6+
{
7+
public static Dictionary<string, string> BuildSelfLink(string protocol, string host, string nameSpace, string modelRouteName, string resourceId)
8+
{
9+
var id = resourceId != null ? $"/{resourceId}" : string.Empty;
10+
return new Dictionary<string, string>
11+
{
12+
{
13+
"self", $"{protocol}://{host}/{nameSpace}/{modelRouteName}{id}"
14+
}
15+
};
16+
}
17+
public static Dictionary<string, string> BuildSelfLink(string nameSpace, string modelRouteName)
18+
{
19+
return new Dictionary<string, string>
20+
{
21+
{
22+
"self", $"/{nameSpace}/{modelRouteName}"
23+
}
24+
};
25+
}
26+
public static Dictionary<string, string> BuildRelationshipLinks(string protocol, string host, string nameSpace, string modelRouteName, string resourceId, string relationshipName)
27+
{
28+
return new Dictionary<string, string>
29+
{
30+
{"self", $"{protocol}://{host}/{nameSpace}/{modelRouteName}/{resourceId}/relationships/{relationshipName}"},
31+
{"related", $"{protocol}://{host}/{nameSpace}/{modelRouteName}/{resourceId}/{relationshipName}"}
32+
};
33+
}
34+
}
35+
}

JsonApiDotNetCore/Routing/RouteBuilder.cs

Lines changed: 0 additions & 15 deletions
This file was deleted.

JsonApiDotNetCore/Services/JsonApiService.cs

Lines changed: 25 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
using JsonApiDotNetCore.Extensions;
1616
using JsonApiDotNetCore.JsonApi;
1717
using JsonApiDotNetCore.Routing;
18+
using Microsoft.EntityFrameworkCore;
1819

1920
namespace JsonApiDotNetCore.Services
2021
{
@@ -121,7 +122,8 @@ private JsonApiDatum ResourceToJsonApiDatum(JsonApiContext context, IJsonApiReso
121122
Type = context.Route.RouteDefinition.ContextPropertyName.ToCamelCase(),
122123
Id = resource.Id,
123124
Attributes = GetAttributesFromResource(resource),
124-
Links = GetJsonApiDatumLinks(context, resource)
125+
Links = GetJsonApiDatumLinks(context, resource),
126+
Relationships = BuildRelationshipsObject(context, resource)
125127
};
126128
}
127129

@@ -147,28 +149,33 @@ private Dictionary<string, string> GetJsonApiDocumentLinks(JsonApiContext jsonAp
147149
var request = jsonApiContext.HttpContext.Request;
148150
var route = jsonApiContext.Route;
149151

150-
var links = new Dictionary<string, string>
151-
{
152-
{
153-
"self",
154-
RouteBuilder.BuildRoute(request.Scheme, request.Host.ToString(), _jsonApiModelConfiguration.Namespace,
155-
route.RouteDefinition.ContextPropertyName.ToCamelCase(), route.ResourceId)
156-
}
157-
};
158-
return links;
152+
return DocumentBuilder.BuildSelfLink(request.Scheme, request.Host.ToString(), _jsonApiModelConfiguration.Namespace,
153+
route.RouteDefinition.ContextPropertyName.ToCamelCase(), route.ResourceId);
159154
}
160155

161156
private Dictionary<string, string> GetJsonApiDatumLinks(JsonApiContext jsonApiContext, IJsonApiResource resource)
162157
{
163-
var links = new Dictionary<string, string>
164-
{
158+
return DocumentBuilder.BuildSelfLink(jsonApiContext.HttpContext.Request.Scheme,
159+
jsonApiContext.HttpContext.Request.Host.ToString(), _jsonApiModelConfiguration.Namespace,
160+
jsonApiContext.Route.RouteDefinition.ContextPropertyName.ToCamelCase(), resource.Id);
161+
}
162+
163+
private Dictionary<string, object> BuildRelationshipsObject(JsonApiContext jsonApiContext, IJsonApiResource resource)
164+
{
165+
var relationships = new Dictionary<string, object>();
166+
jsonApiContext.Route.Model.GetProperties().Where(propertyInfo => propertyInfo.GetMethod.IsVirtual).ToList().ForEach(
167+
virtualProperty =>
165168
{
166-
"self",
167-
RouteBuilder.BuildRoute(jsonApiContext.HttpContext.Request.Scheme, jsonApiContext.HttpContext.Request.Host.ToString(), _jsonApiModelConfiguration.Namespace,
168-
jsonApiContext.Route.RouteDefinition.ContextPropertyName.ToCamelCase(), resource.Id)
169-
}
170-
};
171-
return links;
169+
relationships.Add(virtualProperty.Name, GetRelationshipLinks(jsonApiContext, resource, virtualProperty.Name));
170+
});
171+
return relationships;
172+
}
173+
174+
private Dictionary<string, string> GetRelationshipLinks(JsonApiContext jsonApiContext, IJsonApiResource resource, string relationshipName)
175+
{
176+
return DocumentBuilder.BuildRelationshipLinks(jsonApiContext.HttpContext.Request.Scheme,
177+
jsonApiContext.HttpContext.Request.Host.ToString(), _jsonApiModelConfiguration.Namespace,
178+
jsonApiContext.Route.RouteDefinition.ContextPropertyName.ToCamelCase(), resource.Id, relationshipName);
172179
}
173180
}
174181
}

0 commit comments

Comments
 (0)