From de2ba37d994341a9efe056c57d1f5c3de0288a70 Mon Sep 17 00:00:00 2001 From: maurei Date: Thu, 21 Jan 2021 09:54:36 +0100 Subject: [PATCH 1/2] Fix OnReturn secondary resource pipeline for HasOne relationships --- .../Definitions/PassportHooksDefinition.cs | 5 +++++ .../Internal/ResourceHookExecutorFacade.cs | 6 ++--- .../ResourceDefinitionTests.cs | 22 +++++++++++++++++++ 3 files changed, 30 insertions(+), 3 deletions(-) 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..4e3c62be3c 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 _resourceHookExecutor.OnReturn(resources, ResourcePipeline.GetRelationship).SingleOrDefault(); } return resourceOrResources; diff --git a/test/JsonApiDotNetCoreExampleTests/Acceptance/ResourceDefinitions/ResourceDefinitionTests.cs b/test/JsonApiDotNetCoreExampleTests/Acceptance/ResourceDefinitions/ResourceDefinitionTests.cs index ac589aa0a8..639ed65e8c 100644 --- a/test/JsonApiDotNetCoreExampleTests/Acceptance/ResourceDefinitions/ResourceDefinitionTests.cs +++ b/test/JsonApiDotNetCoreExampleTests/Acceptance/ResourceDefinitions/ResourceDefinitionTests.cs @@ -241,6 +241,28 @@ 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(); + var passport = new Passport(_dbContext) {IsLocked = true}; + person.Passport = passport; + + _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(); + var document = JsonConvert.DeserializeObject(body); + Assert.Null(document.Data); + } + [Fact] public async Task Tag_Is_Hidden() { From 66a22af60e972477bbc9f54223c8ab05a8dac742 Mon Sep 17 00:00:00 2001 From: maurei Date: Tue, 26 Jan 2021 17:59:36 +0100 Subject: [PATCH 2/2] review --- .../Hooks/Internal/ResourceHookExecutorFacade.cs | 4 ++-- .../ResourceDefinitions/ResourceDefinitionTests.cs | 5 +++-- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/JsonApiDotNetCore/Hooks/Internal/ResourceHookExecutorFacade.cs b/src/JsonApiDotNetCore/Hooks/Internal/ResourceHookExecutorFacade.cs index 4e3c62be3c..5b0cd4bccc 100644 --- a/src/JsonApiDotNetCore/Hooks/Internal/ResourceHookExecutorFacade.cs +++ b/src/JsonApiDotNetCore/Hooks/Internal/ResourceHookExecutorFacade.cs @@ -127,8 +127,8 @@ public object OnReturnRelationship(object resourceOrResources) if (resourceOrResources is IIdentifiable) { - var resources = ToList((dynamic) resourceOrResources); - return _resourceHookExecutor.OnReturn(resources, ResourcePipeline.GetRelationship).SingleOrDefault(); + 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 639ed65e8c..fa7b5a36f1 100644 --- a/test/JsonApiDotNetCoreExampleTests/Acceptance/ResourceDefinitions/ResourceDefinitionTests.cs +++ b/test/JsonApiDotNetCoreExampleTests/Acceptance/ResourceDefinitions/ResourceDefinitionTests.cs @@ -246,8 +246,7 @@ public async Task Passport_Through_Secondary_Endpoint_Is_Hidden() { // Arrange var person = _personFaker.Generate(); - var passport = new Passport(_dbContext) {IsLocked = true}; - person.Passport = passport; + person.Passport = new Passport(_dbContext) {IsLocked = true}; _dbContext.People.Add(person); await _dbContext.SaveChangesAsync(); @@ -259,8 +258,10 @@ public async Task Passport_Through_Secondary_Endpoint_Is_Hidden() // 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]