diff --git a/src/Examples/JsonApiDotNetCoreExample/Definitions/PassportHooksDefinition.cs b/src/Examples/JsonApiDotNetCoreExample/Definitions/PassportHooksDefinition.cs index 2e211305ca..4ecc08dec3 100644 --- a/src/Examples/JsonApiDotNetCoreExample/Definitions/PassportHooksDefinition.cs +++ b/src/Examples/JsonApiDotNetCoreExample/Definitions/PassportHooksDefinition.cs @@ -32,6 +32,11 @@ public override void BeforeImplicitUpdateRelationship(IRelationshipsDictionary

().ToList().ForEach(kvp => DoesNotTouchLockedPassports(kvp.Value)); } + public override IEnumerable OnReturn(HashSet resources, ResourcePipeline pipeline) + { + return resources.Where(p => !p.IsLocked); + } + private void DoesNotTouchLockedPassports(IEnumerable resources) { foreach (var passport in resources ?? Enumerable.Empty()) diff --git a/src/JsonApiDotNetCore/Hooks/Internal/ResourceHookExecutorFacade.cs b/src/JsonApiDotNetCore/Hooks/Internal/ResourceHookExecutorFacade.cs index e6e642e564..5b0cd4bccc 100644 --- a/src/JsonApiDotNetCore/Hooks/Internal/ResourceHookExecutorFacade.cs +++ b/src/JsonApiDotNetCore/Hooks/Internal/ResourceHookExecutorFacade.cs @@ -125,10 +125,10 @@ public object OnReturnRelationship(object resourceOrResources) return _resourceHookExecutor.OnReturn(resources, ResourcePipeline.GetRelationship).ToArray(); } - if (resourceOrResources is IIdentifiable identifiable) + if (resourceOrResources is IIdentifiable) { - var resources = ToList(identifiable); - return _resourceHookExecutor.OnReturn(resources, ResourcePipeline.GetRelationship).Single(); + var resources = ToList((dynamic)resourceOrResources); + return Enumerable.SingleOrDefault(_resourceHookExecutor.OnReturn(resources, ResourcePipeline.GetRelationship)); } return resourceOrResources; diff --git a/test/JsonApiDotNetCoreExampleTests/Acceptance/ResourceDefinitions/ResourceDefinitionTests.cs b/test/JsonApiDotNetCoreExampleTests/Acceptance/ResourceDefinitions/ResourceDefinitionTests.cs index ac589aa0a8..fa7b5a36f1 100644 --- a/test/JsonApiDotNetCoreExampleTests/Acceptance/ResourceDefinitions/ResourceDefinitionTests.cs +++ b/test/JsonApiDotNetCoreExampleTests/Acceptance/ResourceDefinitions/ResourceDefinitionTests.cs @@ -241,6 +241,29 @@ public async Task Article_Through_Secondary_Endpoint_Is_Hidden() Assert.DoesNotContain(toBeExcluded, body); } + [Fact] + public async Task Passport_Through_Secondary_Endpoint_Is_Hidden() + { + // Arrange + var person = _personFaker.Generate(); + person.Passport = new Passport(_dbContext) {IsLocked = true}; + + _dbContext.People.Add(person); + await _dbContext.SaveChangesAsync(); + + var route = $"/api/v1/people/{person.Id}/passport"; + + // Act + var response = await _client.GetAsync(route); + + // Assert + var body = await response.Content.ReadAsStringAsync(); + Assert.True(HttpStatusCode.OK == response.StatusCode, $"{route} returned {response.StatusCode} status code with body: {body}"); + var document = JsonConvert.DeserializeObject(body); + Assert.Null(document.Data); + + } + [Fact] public async Task Tag_Is_Hidden() {