diff --git a/src/Examples/JsonApiDotNetCoreExample/Definitions/TodoItemHooksDefinition.cs b/src/Examples/JsonApiDotNetCoreExample/Definitions/TodoItemHooksDefinition.cs index 33fa998337..f9e15f6547 100644 --- a/src/Examples/JsonApiDotNetCoreExample/Definitions/TodoItemHooksDefinition.cs +++ b/src/Examples/JsonApiDotNetCoreExample/Definitions/TodoItemHooksDefinition.cs @@ -29,5 +29,10 @@ public override void BeforeImplicitUpdateRelationship(IRelationshipsDictionary todos = resourcesByRelationship.GetByRelationship().SelectMany(kvp => kvp.Value).ToList(); DisallowLocked(todos); } + + public override IEnumerable OnReturn(HashSet resources, ResourcePipeline pipeline) + { + return resources.Where(t => t.Description != "This should not be included"); + } } } diff --git a/src/JsonApiDotNetCore/Hooks/Internal/ResourceHookExecutorFacade.cs b/src/JsonApiDotNetCore/Hooks/Internal/ResourceHookExecutorFacade.cs index 5b0cd4bccc..2f41667a97 100644 --- a/src/JsonApiDotNetCore/Hooks/Internal/ResourceHookExecutorFacade.cs +++ b/src/JsonApiDotNetCore/Hooks/Internal/ResourceHookExecutorFacade.cs @@ -122,7 +122,7 @@ public object OnReturnRelationship(object resourceOrResources) if (resourceOrResources is IEnumerable) { dynamic resources = resourceOrResources; - return _resourceHookExecutor.OnReturn(resources, ResourcePipeline.GetRelationship).ToArray(); + return Enumerable.ToArray(_resourceHookExecutor.OnReturn(resources, ResourcePipeline.GetRelationship)); } if (resourceOrResources is IIdentifiable) diff --git a/test/JsonApiDotNetCoreExampleTests/IntegrationTests/ResourceHooks/ResourceHookTests.cs b/test/JsonApiDotNetCoreExampleTests/IntegrationTests/ResourceHooks/ResourceHookTests.cs index 897461c6af..62bd8491e3 100644 --- a/test/JsonApiDotNetCoreExampleTests/IntegrationTests/ResourceHooks/ResourceHookTests.cs +++ b/test/JsonApiDotNetCoreExampleTests/IntegrationTests/ResourceHooks/ResourceHookTests.cs @@ -202,6 +202,31 @@ await _testContext.RunOnDatabaseAsync(async dbContext => responseDocument.Should().NotContain(toBeExcluded); } + [Fact] + public async Task Can_hide_secondary_resource_from_ToOne_relationship_using_OnReturn_hook() + { + // Arrange + var person = _fakers.Person.Generate(); + person.Passport = new Passport {IsLocked = true}; + + await _testContext.RunOnDatabaseAsync(async dbContext => + { + dbContext.People.Add(person); + await dbContext.SaveChangesAsync(); + }); + + var route = $"/api/v1/people/{person.Id}/passport"; + + // Act + var (httpResponse, responseDocument) = await _testContext.ExecuteGetAsync(route); + + // Assert + httpResponse.Should().HaveStatusCode(HttpStatusCode.OK); + + responseDocument.Data.Should().BeNull(); + } + + [Fact] public async Task Can_hide_secondary_resource_from_ToMany_List_relationship_using_OnReturn_hook() { @@ -233,8 +258,11 @@ await _testContext.RunOnDatabaseAsync(async dbContext => public async Task Can_hide_secondary_resource_from_ToMany_Set_relationship_using_OnReturn_hook() { // Arrange + string toBeExcluded = "This should not be included"; + var person = _fakers.Person.Generate(); - person.Passport = new Passport {IsLocked = true}; + person.TodoItems = _fakers.TodoItem.Generate(3).ToHashSet(); + person.TodoItems.First().Description = toBeExcluded; await _testContext.RunOnDatabaseAsync(async dbContext => { @@ -242,15 +270,15 @@ await _testContext.RunOnDatabaseAsync(async dbContext => await dbContext.SaveChangesAsync(); }); - var route = $"/api/v1/people/{person.Id}/passport"; + var route = $"/api/v1/people/{person.Id}/todoItems"; // Act - var (httpResponse, responseDocument) = await _testContext.ExecuteGetAsync(route); + var (httpResponse, responseDocument) = await _testContext.ExecuteGetAsync(route); // Assert httpResponse.Should().HaveStatusCode(HttpStatusCode.OK); - responseDocument.Data.Should().BeNull(); + responseDocument.Should().NotContain(toBeExcluded); } [Fact]