Skip to content

Commit 3ee6e88

Browse files
authored
Fix OnReturn secondary resource pipeline for HasOne relationships (#929)
Fix OnReturn secondary resource pipeline for HasOne relationships
1 parent 816c58a commit 3ee6e88

File tree

3 files changed

+31
-3
lines changed

3 files changed

+31
-3
lines changed

src/Examples/JsonApiDotNetCoreExample/Definitions/PassportHooksDefinition.cs

+5
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,11 @@ public override void BeforeImplicitUpdateRelationship(IRelationshipsDictionary<P
3232
resourcesByRelationship.GetByRelationship<Person>().ToList().ForEach(kvp => DoesNotTouchLockedPassports(kvp.Value));
3333
}
3434

35+
public override IEnumerable<Passport> OnReturn(HashSet<Passport> resources, ResourcePipeline pipeline)
36+
{
37+
return resources.Where(p => !p.IsLocked);
38+
}
39+
3540
private void DoesNotTouchLockedPassports(IEnumerable<Passport> resources)
3641
{
3742
foreach (var passport in resources ?? Enumerable.Empty<Passport>())

src/JsonApiDotNetCore/Hooks/Internal/ResourceHookExecutorFacade.cs

+3-3
Original file line numberDiff line numberDiff line change
@@ -125,10 +125,10 @@ public object OnReturnRelationship(object resourceOrResources)
125125
return _resourceHookExecutor.OnReturn(resources, ResourcePipeline.GetRelationship).ToArray();
126126
}
127127

128-
if (resourceOrResources is IIdentifiable identifiable)
128+
if (resourceOrResources is IIdentifiable)
129129
{
130-
var resources = ToList(identifiable);
131-
return _resourceHookExecutor.OnReturn(resources, ResourcePipeline.GetRelationship).Single();
130+
var resources = ToList((dynamic)resourceOrResources);
131+
return Enumerable.SingleOrDefault(_resourceHookExecutor.OnReturn(resources, ResourcePipeline.GetRelationship));
132132
}
133133

134134
return resourceOrResources;

test/JsonApiDotNetCoreExampleTests/Acceptance/ResourceDefinitions/ResourceDefinitionTests.cs

+23
Original file line numberDiff line numberDiff line change
@@ -241,6 +241,29 @@ public async Task Article_Through_Secondary_Endpoint_Is_Hidden()
241241
Assert.DoesNotContain(toBeExcluded, body);
242242
}
243243

244+
[Fact]
245+
public async Task Passport_Through_Secondary_Endpoint_Is_Hidden()
246+
{
247+
// Arrange
248+
var person = _personFaker.Generate();
249+
person.Passport = new Passport(_dbContext) {IsLocked = true};
250+
251+
_dbContext.People.Add(person);
252+
await _dbContext.SaveChangesAsync();
253+
254+
var route = $"/api/v1/people/{person.Id}/passport";
255+
256+
// Act
257+
var response = await _client.GetAsync(route);
258+
259+
// Assert
260+
var body = await response.Content.ReadAsStringAsync();
261+
Assert.True(HttpStatusCode.OK == response.StatusCode, $"{route} returned {response.StatusCode} status code with body: {body}");
262+
var document = JsonConvert.DeserializeObject<Document>(body);
263+
Assert.Null(document.Data);
264+
265+
}
266+
244267
[Fact]
245268
public async Task Tag_Is_Hidden()
246269
{

0 commit comments

Comments
 (0)