Skip to content

Commit 8d9af0b

Browse files
committed
fix(inclusion): include relationships for id requests
1 parent ebffd2b commit 8d9af0b

File tree

4 files changed

+47
-24
lines changed

4 files changed

+47
-24
lines changed

src/JsonApiDotNetCore/Controllers/JsonApiController.cs

Lines changed: 26 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
using JsonApiDotNetCore.Models;
88
using JsonApiDotNetCore.Services;
99
using Microsoft.AspNetCore.Mvc;
10+
using Microsoft.EntityFrameworkCore;
1011
using Microsoft.Extensions.Logging;
1112
using Newtonsoft.Json;
1213

@@ -56,22 +57,39 @@ public virtual IActionResult Get()
5657
{
5758
var entities = _entities.Get();
5859

59-
entities = ApplyQuery(entities);
60+
entities = ApplySortAndFilterQuery(entities);
61+
62+
if(_jsonApiContext.QuerySet != null)
63+
entities = IncludeRelationships(entities, _jsonApiContext.QuerySet.IncludedRelationships);
6064

6165
return Ok(entities);
6266
}
6367

6468
[HttpGet("{id}")]
6569
public virtual async Task<IActionResult> GetAsync(TId id)
6670
{
67-
var entity = await _entities.GetAsync(id);
71+
T entity;
72+
if(_jsonApiContext.QuerySet?.IncludedRelationships != null)
73+
entity = await _getWithRelationshipsAsync(id);
74+
else
75+
entity = await _entities.GetAsync(id);
6876

6977
if (entity == null)
7078
return NotFound();
7179

7280
return Ok(entity);
7381
}
7482

83+
private async Task<T> _getWithRelationshipsAsync(TId id)
84+
{
85+
var query = _entities.Get();
86+
_jsonApiContext.QuerySet.IncludedRelationships.ForEach(r =>
87+
{
88+
query = _entities.Include(query, r.ToProperCase());
89+
});
90+
return await query.FirstOrDefaultAsync(e => e.Id.Equals(id));
91+
}
92+
7593
[HttpGet("{id}/relationships/{relationshipName}")]
7694
public virtual async Task<IActionResult> GetRelationshipsAsync(TId id, string relationshipName)
7795
{
@@ -148,19 +166,16 @@ public virtual async Task<IActionResult> DeleteAsync(TId id)
148166
// return Ok("Delete Id/relationship");
149167
// }
150168

151-
private IQueryable<T> ApplyQuery(IQueryable<T> entities)
169+
private IQueryable<T> ApplySortAndFilterQuery(IQueryable<T> entities)
152170
{
153-
if(!HttpContext.Request.Query.Any())
154-
return entities;
155-
156-
var querySet = new QuerySet<T>(_jsonApiContext);
171+
var query = _jsonApiContext.QuerySet;
157172

158-
entities = _entities.Filter(entities, querySet.Filter);
173+
if(_jsonApiContext.QuerySet == null)
174+
return entities;
159175

160-
entities = _entities.Sort(entities, querySet.SortParameters);
176+
entities = _entities.Filter(entities, query.Filter);
161177

162-
if(querySet != null)
163-
entities = IncludeRelationships(entities, querySet.IncludedRelationships);
178+
entities = _entities.Sort(entities, query.SortParameters);
164179

165180
return entities;
166181
}

src/JsonApiDotNetCore/Internal/Query/QuerySet.cs

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,28 @@
11
using System.Collections.Generic;
22
using System.Linq;
3-
using JsonApiDotNetCore.Models;
3+
using JsonApiDotNetCore.Extensions;
44
using JsonApiDotNetCore.Services;
5+
using Microsoft.AspNetCore.Http;
56

67
namespace JsonApiDotNetCore.Internal.Query
78
{
8-
public class QuerySet<T>
9+
public class QuerySet
910
{
1011
IJsonApiContext _jsonApiContext;
1112

12-
public QuerySet(IJsonApiContext jsonApiContext)
13+
public QuerySet(IJsonApiContext jsonApiContext, IQueryCollection query)
1314
{
1415
_jsonApiContext = jsonApiContext;
15-
BuildQuerySet();
16+
BuildQuerySet(query);
1617
}
1718

1819
public FilterQuery Filter { get; set; }
1920
public List<SortQuery> SortParameters { get; set; }
2021
public List<string> IncludedRelationships { get; set; }
2122

22-
private void BuildQuerySet()
23+
private void BuildQuerySet(IQueryCollection query)
2324
{
24-
foreach (var pair in _jsonApiContext.Query)
25+
foreach (var pair in query)
2526
{
2627
if (pair.Key.StartsWith("filter"))
2728
{
@@ -78,7 +79,10 @@ private List<SortQuery> ParseSortParameters(string value)
7879

7980
private List<string> ParseIncludedRelationships(string value)
8081
{
81-
return value.Split(',').ToList();
82+
return value
83+
.Split(',')
84+
.Select(s => s.ToProperCase())
85+
.ToList();
8286
}
8387

8488
private AttrAttribute GetAttribute(string propertyName)

src/JsonApiDotNetCore/Services/IJsonApiContext.cs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
using System.Collections.Generic;
22
using JsonApiDotNetCore.Internal;
3-
using JsonApiDotNetCore.Models;
4-
using Microsoft.AspNetCore.Http;
3+
using JsonApiDotNetCore.Internal.Query;
54

65
namespace JsonApiDotNetCore.Services
76
{
@@ -11,7 +10,7 @@ public interface IJsonApiContext
1110
IContextGraph ContextGraph { get; set; }
1211
ContextEntity RequestEntity { get; set; }
1312
string BasePath { get; set; }
14-
IQueryCollection Query { get; set; }
13+
QuerySet QuerySet { get; set; }
1514
bool IsRelationshipData { get; set; }
1615
List<string> IncludedRelationships { get; set; }
1716
}

src/JsonApiDotNetCore/Services/JsonApiContext.cs

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
using System.Collections.Generic;
2+
using System.Linq;
23
using JsonApiDotNetCore.Builders;
34
using JsonApiDotNetCore.Internal;
4-
using JsonApiDotNetCore.Models;
5+
using JsonApiDotNetCore.Internal.Query;
56
using Microsoft.AspNetCore.Http;
67

78
namespace JsonApiDotNetCore.Services
@@ -20,7 +21,7 @@ public JsonApiContext(
2021
public IContextGraph ContextGraph { get; set; }
2122
public ContextEntity RequestEntity { get; set; }
2223
public string BasePath { get; set; }
23-
public IQueryCollection Query { get; set; }
24+
public QuerySet QuerySet { get; set; }
2425
public bool IsRelationshipData { get; set; }
2526
public List<string> IncludedRelationships { get; set; }
2627

@@ -30,7 +31,11 @@ public IJsonApiContext ApplyContext<T>()
3031

3132
RequestEntity = ContextGraph.GetContextEntity(typeof(T));
3233

33-
Query = context.Request.Query;
34+
if(context.Request.Query.Any())
35+
{
36+
QuerySet = new QuerySet(this, context.Request.Query);
37+
IncludedRelationships = QuerySet.IncludedRelationships;
38+
}
3439

3540
var linkBuilder = new LinkBuilder(this);
3641
BasePath = linkBuilder.GetBasePath(context, RequestEntity.EntityName);

0 commit comments

Comments
 (0)