From 3a065fa9a1ceb37d7631ff2336fb1e839ee73382 Mon Sep 17 00:00:00 2001 From: MikhailLipanin Date: Sun, 2 Jun 2024 23:58:31 +0300 Subject: [PATCH] #3089 generate populateMany method for explicit_requires --- plugin/federation/federation.go | 12 ++++++++---- plugin/federation/federation.gotpl | 9 +++++++++ plugin/federation/requires.gotpl | 4 ++++ 3 files changed, 21 insertions(+), 4 deletions(-) diff --git a/plugin/federation/federation.go b/plugin/federation/federation.go index fd33255b61..da792ba416 100644 --- a/plugin/federation/federation.go +++ b/plugin/federation/federation.go @@ -136,7 +136,7 @@ func (f *federation) InjectSourceEarly() *ast.Source { directive @interfaceObject on OBJECT directive @link(import: [String!], url: String!) repeatable on SCHEMA directive @override(from: String!, label: String) on FIELD_DEFINITION - directive @policy(policies: [[federation__Policy!]!]!) on + directive @policy(policies: [[federation__Policy!]!]!) on | FIELD_DEFINITION | OBJECT | INTERFACE @@ -144,7 +144,7 @@ func (f *federation) InjectSourceEarly() *ast.Source { | ENUM directive @provides(fields: FieldSet!) on FIELD_DEFINITION directive @requires(fields: FieldSet!) on FIELD_DEFINITION - directive @requiresScopes(scopes: [[federation__Scope!]!]!) on + directive @requiresScopes(scopes: [[federation__Scope!]!]!) on | FIELD_DEFINITION | OBJECT | INTERFACE @@ -366,8 +366,12 @@ func (f *federation) GenerateCode(data *codegen.Data) error { for name, entity := range requiresEntities { populator := Populator{ - FuncName: fmt.Sprintf("Populate%sRequires", name), - Entity: entity, + Entity: entity, + } + if entity.Multi { + populator.FuncName = fmt.Sprintf("PopulateMany%sRequires", name) + } else { + populator.FuncName = fmt.Sprintf("Populate%sRequires", name) } populator.Comment = strings.TrimSpace(strings.TrimLeft(rewriter.GetMethodComment("executionContext", populator.FuncName), `\`)) diff --git a/plugin/federation/federation.gotpl b/plugin/federation/federation.gotpl index 119bab5b73..04f7f9a81c 100644 --- a/plugin/federation/federation.gotpl +++ b/plugin/federation/federation.gotpl @@ -170,13 +170,22 @@ func (ec *executionContext) __resolve_entities(ctx context.Context, representati return err } + {{ if and (index $options "explicit_requires") $entity.Requires }} + err = ec.PopulateMany{{$entity.Def.Name}}Requires(ctx, {{- if (not $usePointers) -}}&{{- end -}}entities, reps) + if err != nil { + return fmt.Errorf(`populating requires for Entity "{{$entity.Def.Name}}": %w`, err) + } + {{- end }} + for i, entity := range entities { + {{ if not (and (index $options "explicit_requires") $entity.Requires) }} {{- range $entity.Requires }} entity.{{.Field.JoinGo `.`}}, err = ec.{{.Type.UnmarshalFunc}}(ctx, reps[i]["{{.Field.Join `"].(map[string]interface{})["`}}"]) if err != nil { return err } {{- end}} + {{- end }} list[idx[i]] = entity } return nil diff --git a/plugin/federation/requires.gotpl b/plugin/federation/requires.gotpl index 1737710473..b03af283e7 100644 --- a/plugin/federation/requires.gotpl +++ b/plugin/federation/requires.gotpl @@ -12,7 +12,11 @@ {{- else -}} // {{.FuncName}} is the requires populator for the {{.Entity.Def.Name}} entity. {{- end }} +{{- if .Entity.Multi -}} +func (ec *executionContext) {{.FuncName}}(ctx context.Context, entities []*{{.Entity.GetTypeInfo}}, reps []map[string]interface{}) error { +{{- else }} func (ec *executionContext) {{.FuncName}}(ctx context.Context, entity *{{.Entity.GetTypeInfo}}, reps map[string]interface{}) error { +{{- end }} {{.Implementation}} } {{ end }}