diff --git a/backend/src/Squidex.Domain.Apps.Entities/Contents/GraphQL/GraphQLExecutionContext.cs b/backend/src/Squidex.Domain.Apps.Entities/Contents/GraphQL/GraphQLExecutionContext.cs index 6f60fb39d..45dc5d8cc 100644 --- a/backend/src/Squidex.Domain.Apps.Entities/Contents/GraphQL/GraphQLExecutionContext.cs +++ b/backend/src/Squidex.Domain.Apps.Entities/Contents/GraphQL/GraphQLExecutionContext.cs @@ -80,12 +80,19 @@ namespace Squidex.Domain.Apps.Entities.Contents.GraphQL return await dataLoader.LoadAsync(id).GetResultAsync(ct); } - public async Task FindContentAsync(DomainId id, + public async Task FindContentAsync(DomainId schemaId, DomainId id, CancellationToken ct) { var dataLoader = GetContentsLoader(); - return await dataLoader.LoadAsync(id).GetResultAsync(ct); + var content = await dataLoader.LoadAsync(id).GetResultAsync(ct); + + if (content?.SchemaId.Id != schemaId) + { + content = null; + } + + return content; } public Task> GetReferencedAssetsAsync(IJsonValue value, diff --git a/backend/src/Squidex.Domain.Apps.Entities/Contents/GraphQL/Types/Contents/ContentActions.cs b/backend/src/Squidex.Domain.Apps.Entities/Contents/GraphQL/Types/Contents/ContentActions.cs index f1c45f3b6..c1e3bdcd5 100644 --- a/backend/src/Squidex.Domain.Apps.Entities/Contents/GraphQL/Types/Contents/ContentActions.cs +++ b/backend/src/Squidex.Domain.Apps.Entities/Contents/GraphQL/Types/Contents/ContentActions.cs @@ -78,17 +78,18 @@ namespace Squidex.Domain.Apps.Entities.Contents.GraphQL.Types.Contents public static readonly IFieldResolver Resolver = Resolvers.Async(async (_, fieldContext, context) => { var contentId = fieldContext.GetArgument("id"); + var contentSchema = fieldContext.FieldDefinition.SchemaId(); var version = fieldContext.GetArgument("version"); if (version >= 0) { - return await context.FindContentAsync(fieldContext.FieldDefinition.SchemaId(), contentId, version.Value, + return await context.FindContentAsync(contentSchema, contentId, version.Value, fieldContext.CancellationToken); } else { - return await context.FindContentAsync(contentId, + return await context.FindContentAsync(DomainId.Create(contentSchema), contentId, fieldContext.CancellationToken); } }); diff --git a/backend/tests/Squidex.Domain.Apps.Entities.Tests/Contents/GraphQL/GraphQLQueriesTests.cs b/backend/tests/Squidex.Domain.Apps.Entities.Tests/Contents/GraphQL/GraphQLQueriesTests.cs index fa3151445..7247a8bed 100644 --- a/backend/tests/Squidex.Domain.Apps.Entities.Tests/Contents/GraphQL/GraphQLQueriesTests.cs +++ b/backend/tests/Squidex.Domain.Apps.Entities.Tests/Contents/GraphQL/GraphQLQueriesTests.cs @@ -121,7 +121,7 @@ namespace Squidex.Domain.Apps.Entities.Contents.GraphQL } [Fact] - public async Task Should_return_null_single_asset_if_not_found() + public async Task Should_return_null_if_single_asset_not_found() { var assetId = DomainId.NewGuid(); @@ -284,7 +284,7 @@ namespace Squidex.Domain.Apps.Entities.Contents.GraphQL } [Fact] - public async Task Should_return_null_single_content_if_not_found() + public async Task Should_return_null_if_single_content_not_found() { var contentId = DomainId.NewGuid(); @@ -311,6 +311,35 @@ namespace Squidex.Domain.Apps.Entities.Contents.GraphQL AssertResult(expected, result); } + [Fact] + public async Task Should_return_null_if_single_content_from_another_schema() + { + var contentId = DomainId.NewGuid(); + var content = TestContent.CreateRef(TestSchemas.Ref1Id, contentId, "ref1-field", "ref1"); + + var query = CreateQuery(@" + query { + findMySchemaContent(id: '') { + id + } + }", contentId); + + A.CallTo(() => contentQuery.QueryAsync(MatchsContentContext(), A.That.HasIdsWithoutTotal(contentId), A._)) + .Returns(ResultList.CreateFrom(10, content)); + + var result = await ExecuteAsync(new ExecutionOptions { Query = query }); + + var expected = new + { + data = new + { + findMySchemaContent = (object?)null + } + }; + + AssertResult(expected, result); + } + [Fact] public async Task Should_return_single_content_if_finding_content() {