Skip to content

Commit 1d3a947

Browse files
committed
feat: get relationship behaves different in OnReturn
1 parent 4190368 commit 1d3a947

File tree

3 files changed

+25
-5
lines changed

3 files changed

+25
-5
lines changed

src/JsonApiDotNetCore/Hooks/ResourceHookExecutor.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -200,7 +200,7 @@ public virtual IEnumerable<TEntity> OnReturn<TEntity>(IEnumerable<TEntity> entit
200200
{
201201
var hookContainer = _meta.GetResourceHookContainer<TEntity>(ResourceHook.OnReturn);
202202
var layer = _layerFactory.CreateLayer(entities);
203-
if (hookContainer != null)
203+
if (hookContainer != null && pipeline != ResourceAction.GetRelationship)
204204
{
205205
var uniqueEntities = layer.GetAllUniqueEntities().Cast<TEntity>();
206206
var filteredUniqueEntities = hookContainer.OnReturn(uniqueEntities, pipeline);

src/JsonApiDotNetCore/Services/EntityResourceService.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -164,18 +164,17 @@ public virtual async Task<TResource> GetAsync(TId id)
164164

165165
}
166166

167-
// triggered by route /articles/1/relationships/{relationshipName}
167+
// triggered by GET /articles/1/relationships/{relationshipName}
168168
public virtual async Task<object> GetRelationshipsAsync(TId id, string relationshipName) => await GetRelationshipAsync(id, relationshipName);
169169

170-
// triggered by route /articles/1/{relationshipName}
170+
// triggered by GET /articles/1/{relationshipName}
171171
public virtual async Task<object> GetRelationshipAsync(TId id, string relationshipName)
172172
{
173173

174174
_hookExecutor?.BeforeRead<TEntity>(ResourceAction.GetRelationship, id.ToString());
175175
var entity = await _entities.GetAndIncludeAsync(id, relationshipName);
176176
if (!IsNull(_hookExecutor, entity))
177177
{
178-
// TODO: should not fire after read for L=0
179178
_hookExecutor.AfterRead(AsList(entity), ResourceAction.GetRelationship);
180179
entity = _hookExecutor.OnReturn(AsList(entity), ResourceAction.GetRelationship).SingleOrDefault();
181180
}
@@ -216,6 +215,7 @@ public virtual async Task<TResource> UpdateAsync(TId id, TResource resource)
216215
return MapOut(entity);
217216
}
218217

218+
// triggered by PATCH /articles/1/relationships/{relationshipName}
219219
public virtual async Task UpdateRelationshipsAsync(TId id, string relationshipName, List<ResourceObject> relationships)
220220
{
221221
var entity = await _entities.GetAndIncludeAsync(id, relationshipName);
@@ -248,7 +248,7 @@ public virtual async Task UpdateRelationshipsAsync(TId id, string relationshipNa
248248

249249
entity = IsNull(_hookExecutor) ? entity : _hookExecutor.BeforeUpdate(AsList(entity), ResourceAction.PatchRelationship).SingleOrDefault();
250250
await _entities.UpdateRelationshipsAsync(entity, relationship, relationshipIds);
251-
if (!IsNull(_hookExecutor, entity)) _hookExecutor.AfterUpdate(AsList(entity), ResourceAction.Patch);
251+
if (!IsNull(_hookExecutor, entity)) _hookExecutor.AfterUpdate(AsList(entity), ResourceAction.PatchRelationship);
252252

253253
relationship.Type = relationshipType;
254254
}

test/UnitTests/ResourceHooks/ResourceHookExecutor/IdentifiableManyToMany_OnReturnTests.cs

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,26 @@ public void OnReturn()
3232
VerifyNoOtherCalls(articleResourceMock, joinResourceMock, tagResourceMock);
3333
}
3434

35+
[Fact]
36+
public void OnReturn_GetRelationship()
37+
{
38+
// arrange
39+
var articleDiscovery = SetDiscoverableHooks<Article>(targetHooks, DisableDbValues);
40+
var joinDiscovery = SetDiscoverableHooks<IdentifiableArticleTag>(targetHooks, DisableDbValues);
41+
var tagDiscovery = SetDiscoverableHooks<Tag>(targetHooks, DisableDbValues);
42+
(var contextMock, var hookExecutor, var articleResourceMock,
43+
var joinResourceMock, var tagResourceMock) = CreateTestObjects(articleDiscovery, joinDiscovery, tagDiscovery);
44+
(var articles, var joins, var tags) = CreateIdentifiableManyToManyData();
45+
46+
// act
47+
hookExecutor.OnReturn(articles, ResourceAction.GetRelationship);
48+
49+
// assert
50+
joinResourceMock.Verify(rd => rd.OnReturn(It.Is<IEnumerable<IdentifiableArticleTag>>((collection) => !collection.Except(joins).Any()), ResourceAction.GetRelationship), Times.Once());
51+
tagResourceMock.Verify(rd => rd.OnReturn(It.Is<IEnumerable<Tag>>((collection) => !collection.Except(tags).Any()), ResourceAction.GetRelationship), Times.Once());
52+
VerifyNoOtherCalls(articleResourceMock, joinResourceMock, tagResourceMock);
53+
}
54+
3555
[Fact]
3656
public void OnReturn_Without_Parent_Hook_Implemented()
3757
{

0 commit comments

Comments
 (0)