Skip to content

Commit 15ce5d2

Browse files
authored
[Fusion] Refactored RequireInvalidFieldsRule (used source schemas) (#8218)
1 parent b6797c0 commit 15ce5d2

File tree

2 files changed

+43
-55
lines changed

2 files changed

+43
-55
lines changed

src/HotChocolate/Fusion-vnext/src/Fusion.Composition/Logging/LogEntryHelper.cs

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -875,23 +875,22 @@ public static LogEntry QueryRootTypeInaccessible(
875875
}
876876

877877
public static LogEntry RequireInvalidFields(
878-
Directive fusionRequiresDirective,
878+
Directive requireDirective,
879879
string argumentName,
880880
string fieldName,
881881
string typeName,
882-
string sourceSchemaName,
883-
MutableSchemaDefinition schema,
882+
MutableSchemaDefinition sourceSchema,
884883
ImmutableArray<string> errors)
885884
{
886885
var coordinate = new SchemaCoordinate(typeName, fieldName, argumentName);
887886

888887
return new LogEntry(
889-
string.Format(LogEntryHelper_RequireInvalidFields, coordinate, sourceSchemaName),
888+
string.Format(LogEntryHelper_RequireInvalidFields, coordinate, sourceSchema.Name),
890889
LogEntryCodes.RequireInvalidFields,
891890
LogSeverity.Error,
892891
coordinate,
893-
fusionRequiresDirective,
894-
schema,
892+
requireDirective,
893+
sourceSchema,
895894
errors);
896895
}
897896

src/HotChocolate/Fusion-vnext/src/Fusion.Composition/PostMergeValidationRules/RequireInvalidFieldsRule.cs

Lines changed: 38 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,14 @@
11
using HotChocolate.Fusion.Events;
22
using HotChocolate.Fusion.Events.Contracts;
33
using HotChocolate.Fusion.Extensions;
4+
using HotChocolate.Fusion.Info;
45
using HotChocolate.Fusion.Language;
56
using HotChocolate.Fusion.Validators;
6-
using HotChocolate.Language;
7+
using HotChocolate.Types;
8+
using HotChocolate.Types.Mutable;
79
using static HotChocolate.Fusion.Logging.LogEntryHelper;
810
using static HotChocolate.Fusion.WellKnownArgumentNames;
911
using static HotChocolate.Fusion.WellKnownDirectiveNames;
10-
using static HotChocolate.Language.Utf8GraphQLParser.Syntax;
1112

1213
namespace HotChocolate.Fusion.PostMergeValidationRules;
1314

@@ -20,62 +21,50 @@ namespace HotChocolate.Fusion.PostMergeValidationRules;
2021
/// <seealso href="https://graphql.github.io/composite-schemas-spec/draft/#sec-Require-Invalid-Fields">
2122
/// Specification
2223
/// </seealso>
23-
internal sealed class RequireInvalidFieldsRule : IEventHandler<OutputFieldEvent>
24+
internal sealed class RequireInvalidFieldsRule : IEventHandler<SchemaEvent>
2425
{
25-
public void Handle(OutputFieldEvent @event, CompositionContext context)
26+
public void Handle(SchemaEvent @event, CompositionContext context)
2627
{
27-
var (field, type, schema) = @event;
28+
var schema = @event.Schema;
2829

29-
if (field.HasFusionInaccessibleDirective()
30-
|| type.HasFusionInaccessibleDirective()
31-
|| !field.HasFusionRequiresDirective())
32-
{
33-
return;
34-
}
30+
var sourceArgumentGroup = context.SchemaDefinitions
31+
.SelectMany(s => s.Types.OfType<MutableObjectTypeDefinition>(), (s, o) => (s, o))
32+
.SelectMany(x => x.o.Fields.AsEnumerable(), (x, f) => (x.s, x.o, f))
33+
.SelectMany(
34+
x => x.f.Arguments.AsEnumerable().Where(a => a.HasRequireDirective()),
35+
(x, a) => new FieldArgumentInfo(a, x.f, x.o, x.s));
3536

3637
var validator = new FieldSelectionMapValidator(schema);
37-
var fusionRequiresDirectives = field.Directives[FusionRequires];
3838

39-
foreach (var fusionRequiresDirective in fusionRequiresDirectives)
39+
foreach (var (sourceArgument, sourceField, sourceType, sourceSchema) in sourceArgumentGroup)
4040
{
41-
var sourceSchemaName = (string)fusionRequiresDirective.Arguments[Schema].Value!;
42-
var fieldArgumentValue = (string)fusionRequiresDirective.Arguments[Field].Value!;
43-
var fieldDefinition = ParseFieldDefinition(fieldArgumentValue);
44-
var arguments = fieldDefinition.Arguments;
45-
var map = (ListValueNode)fusionRequiresDirective.Arguments[Map];
46-
47-
for (var i = 0; i < arguments.Count; i++)
48-
{
49-
var selectionMap = (string?)map.Items[i].Value;
41+
var requireDirective = sourceArgument.Directives[Require].First();
42+
var fieldArgumentValue = (string)requireDirective.Arguments[Field].Value!;
43+
var fieldSelectionMapParser = new FieldSelectionMapParser(fieldArgumentValue);
44+
var fieldSelectionMap = fieldSelectionMapParser.Parse();
45+
var inputType = schema.Types[sourceArgument.Type.AsTypeDefinition().Name];
46+
var outputType = schema.Types[sourceType.Name];
47+
var errors =
48+
validator.Validate(
49+
fieldSelectionMap,
50+
inputType,
51+
outputType,
52+
out var selectedFields);
5053

51-
if (selectionMap is null)
52-
{
53-
continue;
54-
}
54+
// A selected field is defined in the same schema as the `require` directive.
55+
var selectedFieldSameSchema =
56+
selectedFields.Any(f => f.GetSchemaNames().Contains(sourceSchema.Name));
5557

56-
var fieldSelectionMapParser = new FieldSelectionMapParser(selectionMap);
57-
var fieldSelectionMap = fieldSelectionMapParser.Parse();
58-
var argument = arguments[i];
59-
var inputType = schema.Types[argument.Type.NamedType().Name.Value];
60-
var errors =
61-
validator.Validate(fieldSelectionMap, inputType, type, out var selectedFields);
62-
63-
// A selected field is defined in the same schema as the `require` directive.
64-
var selectedFieldSameSchema =
65-
selectedFields.Any(f => f.GetSchemaNames().Contains(sourceSchemaName));
66-
67-
if (errors.Any() || selectedFieldSameSchema)
68-
{
69-
context.Log.Write(
70-
RequireInvalidFields(
71-
fusionRequiresDirective,
72-
argument.Name.Value,
73-
field.Name,
74-
type.Name,
75-
sourceSchemaName,
76-
schema,
77-
errors));
78-
}
58+
if (errors.Any() || selectedFieldSameSchema)
59+
{
60+
context.Log.Write(
61+
RequireInvalidFields(
62+
requireDirective,
63+
sourceArgument.Name,
64+
sourceField.Name,
65+
sourceType.Name,
66+
sourceSchema,
67+
errors));
7968
}
8069
}
8170
}

0 commit comments

Comments
 (0)