Skip to content

Commit 1352210

Browse files
committed
RoleRelation
On-behalf-of: @SAP [email protected] Signed-off-by: Artem Shcherbatiuk <[email protected]>
1 parent 6bebfc7 commit 1352210

File tree

2 files changed

+71
-58
lines changed

2 files changed

+71
-58
lines changed

gateway/resolver/relationships.go

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -173,6 +173,49 @@ func (r *RelationshipResolver) CreateRelationsResolver(sourceGVK schema.GroupVer
173173
}
174174
}
175175

176+
// CreateSingleRelationResolver creates a GraphQL field resolver for a single relation field
177+
func (r *RelationshipResolver) CreateSingleRelationResolver(sourceGVK schema.GroupVersionKind, fieldName string) graphql.FieldResolveFn {
178+
return func(p graphql.ResolveParams) (interface{}, error) {
179+
_, span := otel.Tracer("").Start(p.Context, "ResolveSingleRelation",
180+
trace.WithAttributes(
181+
attribute.String("sourceKind", sourceGVK.Kind),
182+
attribute.String("fieldName", fieldName),
183+
))
184+
defer span.End()
185+
186+
// Get the source object from the parent resolver
187+
sourceObj, ok := p.Source.(map[string]interface{})
188+
if !ok {
189+
return nil, fmt.Errorf("expected source to be map[string]interface{}, got %T", p.Source)
190+
}
191+
192+
// Extract the relationship reference from the source object
193+
refValue, found, err := unstructured.NestedFieldNoCopy(sourceObj, fieldName)
194+
if err != nil {
195+
r.log.Debug().Err(err).Str("field", fieldName).Msg("Error accessing relationship field")
196+
return nil, nil // Return nil for optional field
197+
}
198+
if !found {
199+
return nil, nil // Field not present, return nil
200+
}
201+
202+
refMap, ok := refValue.(map[string]interface{})
203+
if !ok {
204+
r.log.Debug().Str("field", fieldName).Msg("Relationship field is not a map")
205+
return nil, nil
206+
}
207+
208+
// Create enhanced reference
209+
enhancedRef, err := r.createEnhancedRef(refMap, sourceObj, sourceGVK, fieldName)
210+
if err != nil {
211+
r.log.Debug().Err(err).Str("field", fieldName).Msg("Error creating enhanced reference")
212+
return nil, nil
213+
}
214+
215+
return enhancedRef, nil
216+
}
217+
}
218+
176219
// parseRelationshipRef parses a relationship reference from a map
177220
func (r *RelationshipResolver) parseRelationshipRef(refMap map[string]interface{}, sourceObj map[string]interface{}, sourceGVK schema.GroupVersionKind, fieldName string) (*RelationshipRef, error) {
178221
ref := &RelationshipRef{}

gateway/schema/schema.go

Lines changed: 28 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -390,40 +390,44 @@ func (g *Gateway) generateGraphQLFields(resourceScheme *spec.Schema, typePrefix
390390
}
391391
}
392392

393-
// Add relations field if we have relationship fields
393+
// Add individual relationship fields if we have them
394394
if len(relationshipFields) > 0 && currentGVK != nil {
395395
g.log.Info().
396396
Str("typePrefix", typePrefix).
397397
Strs("relationshipFields", relationshipFields).
398398
Str("currentGVK", fmt.Sprintf("%+v", currentGVK)).
399-
Msg("Attempting to create relations field")
400-
401-
relationsType := g.createRelationsType(typePrefix, relationshipFields)
402-
if relationsType != nil {
403-
g.log.Info().
404-
Str("typePrefix", typePrefix).
405-
Msg("Successfully created relations type")
406-
407-
relationshipResolver := g.resolver.GetRelationshipResolver()
408-
if relationshipResolver != nil {
409-
fields["relations"] = &graphql.Field{
410-
Type: relationsType,
411-
Resolve: relationshipResolver.CreateRelationsResolver(*currentGVK, relationshipFields),
399+
Msg("Attempting to create individual relation fields")
400+
401+
relationshipResolver := g.resolver.GetRelationshipResolver()
402+
if relationshipResolver != nil {
403+
for _, fieldName := range relationshipFields {
404+
targetKind := g.extractTargetKind(fieldName)
405+
relationFieldName := strings.ToLower(string(targetKind[0])) + targetKind[1:] + "Relation"
406+
407+
relationFieldType := g.createEnhancedRefType(targetKind)
408+
if relationFieldType != nil {
409+
fields[relationFieldName] = &graphql.Field{
410+
Type: relationFieldType,
411+
Resolve: relationshipResolver.CreateSingleRelationResolver(*currentGVK, fieldName),
412+
}
413+
g.log.Info().
414+
Str("typePrefix", typePrefix).
415+
Str("fieldName", fieldName).
416+
Str("targetKind", targetKind).
417+
Str("relationFieldName", relationFieldName).
418+
Msg("Added individual relation field")
419+
} else {
420+
g.log.Info().
421+
Str("typePrefix", typePrefix).
422+
Str("fieldName", fieldName).
423+
Str("targetKind", targetKind).
424+
Msg("Failed to create relation field type")
412425
}
413-
414-
g.log.Info().
415-
Str("typePrefix", typePrefix).
416-
Strs("relationshipFields", relationshipFields).
417-
Msg("Added relations field to type")
418-
} else {
419-
g.log.Info().
420-
Str("typePrefix", typePrefix).
421-
Msg("No relationship resolver available")
422426
}
423427
} else {
424428
g.log.Info().
425429
Str("typePrefix", typePrefix).
426-
Msg("Failed to create relations type")
430+
Msg("No relationship resolver available")
427431
}
428432
} else {
429433
if len(relationshipFields) == 0 {
@@ -735,40 +739,6 @@ func (g *Gateway) getOrCreateTargetResourceType(targetKind string, sourceGVK *sc
735739
return nil, fmt.Errorf("could not find or create GraphQL type for target kind: %s", targetKind)
736740
}
737741

738-
// createRelationsType creates a GraphQL type for the relations field
739-
func (g *Gateway) createRelationsType(typePrefix string, relationshipFields []string) graphql.Output {
740-
relationFields := graphql.Fields{}
741-
742-
for _, fieldName := range relationshipFields {
743-
targetKind := g.extractTargetKind(fieldName)
744-
if targetKind == "" {
745-
continue
746-
}
747-
748-
// Create field without "Ref" suffix
749-
relationName := strings.TrimSuffix(fieldName, "Ref")
750-
relationFields[relationName] = &graphql.Field{
751-
Type: g.createEnhancedRefType(targetKind),
752-
}
753-
754-
g.log.Debug().
755-
Str("fieldName", fieldName).
756-
Str("relationName", relationName).
757-
Str("targetKind", targetKind).
758-
Msg("Added field to relations type")
759-
}
760-
761-
if len(relationFields) == 0 {
762-
return nil
763-
}
764-
765-
relationsTypeName := typePrefix + "Relations"
766-
return graphql.NewObject(graphql.ObjectConfig{
767-
Name: relationsTypeName,
768-
Fields: relationFields,
769-
})
770-
}
771-
772742
// createEnhancedRefType creates a GraphQL type for enhanced references
773743
func (g *Gateway) createEnhancedRefType(targetKind string) graphql.Output {
774744
typeName := targetKind + "Relation"

0 commit comments

Comments
 (0)