Skip to content

Commit 4df60a4

Browse files
committed
data flow approach
On-behalf-of: @SAP [email protected] Signed-off-by: Artem Shcherbatiuk <[email protected]>
1 parent 74eb2d2 commit 4df60a4

File tree

5 files changed

+698
-173
lines changed

5 files changed

+698
-173
lines changed

gateway/resolver/dotted_keys.go

Lines changed: 168 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,168 @@
1+
package resolver
2+
3+
// graphqlToKubernetes converts GraphQL input format to Kubernetes API format
4+
// []Label → map[string]string (for CREATE/UPDATE operations)
5+
func graphqlToKubernetes(obj any) any {
6+
objMap, ok := obj.(map[string]interface{})
7+
if !ok {
8+
return obj
9+
}
10+
11+
// Process metadata.labels and metadata.annotations
12+
if metadata := objMap["metadata"]; metadata != nil {
13+
objMap["metadata"] = processMetadataToMaps(metadata)
14+
}
15+
16+
// Process spec fields
17+
if spec := objMap["spec"]; spec != nil {
18+
objMap["spec"] = processSpecToMaps(spec)
19+
}
20+
21+
return obj
22+
}
23+
24+
// kubernetesToGraphQL converts Kubernetes API format to GraphQL output format
25+
// map[string]string → []Label (for QUERY operations)
26+
func kubernetesToGraphQL(obj any) any {
27+
objMap, ok := obj.(map[string]interface{})
28+
if !ok {
29+
return obj
30+
}
31+
32+
// Process metadata.labels and metadata.annotations
33+
if metadata := objMap["metadata"]; metadata != nil {
34+
objMap["metadata"] = processMetadataToArrays(metadata)
35+
}
36+
37+
// Process spec fields
38+
if spec := objMap["spec"]; spec != nil {
39+
objMap["spec"] = processSpecToArrays(spec)
40+
}
41+
42+
return obj
43+
}
44+
45+
// processMetadataToArrays handles metadata field conversion to arrays
46+
func processMetadataToArrays(metadata any) any {
47+
metadataMap, ok := metadata.(map[string]interface{})
48+
if !ok {
49+
return metadata
50+
}
51+
52+
for k, v := range metadataMap {
53+
if (k == "labels" || k == "annotations") && v != nil {
54+
metadataMap[k] = mapToArray(v)
55+
}
56+
}
57+
return metadata
58+
}
59+
60+
// processMetadataToMaps handles metadata field conversion to maps
61+
func processMetadataToMaps(metadata any) any {
62+
metadataMap, ok := metadata.(map[string]interface{})
63+
if !ok {
64+
return metadata
65+
}
66+
67+
for k, v := range metadataMap {
68+
if (k == "labels" || k == "annotations") && v != nil {
69+
metadataMap[k] = arrayToMap(v)
70+
}
71+
}
72+
return metadata
73+
}
74+
75+
// processSpecToArrays handles spec field conversion to arrays
76+
func processSpecToArrays(spec any) any {
77+
specMap, ok := spec.(map[string]interface{})
78+
if !ok {
79+
return spec
80+
}
81+
82+
for k, v := range specMap {
83+
if k == "nodeSelector" && v != nil {
84+
specMap[k] = mapToArray(v)
85+
} else if k == "selector" && v != nil {
86+
specMap[k] = processSelector(v, true)
87+
}
88+
}
89+
return spec
90+
}
91+
92+
// processSpecToMaps handles spec field conversion to maps
93+
func processSpecToMaps(spec any) any {
94+
specMap, ok := spec.(map[string]interface{})
95+
if !ok {
96+
return spec
97+
}
98+
99+
for k, v := range specMap {
100+
if k == "nodeSelector" && v != nil {
101+
specMap[k] = arrayToMap(v)
102+
} else if k == "selector" && v != nil {
103+
specMap[k] = processSelector(v, false)
104+
}
105+
}
106+
return spec
107+
}
108+
109+
// processSelector handles spec.selector.matchLabels conversion
110+
func processSelector(selector any, toArray bool) any {
111+
selectorMap, ok := selector.(map[string]interface{})
112+
if !ok {
113+
return selector
114+
}
115+
116+
for k, v := range selectorMap {
117+
if k == "matchLabels" && v != nil {
118+
if toArray {
119+
selectorMap[k] = mapToArray(v)
120+
} else {
121+
selectorMap[k] = arrayToMap(v)
122+
}
123+
}
124+
}
125+
return selector
126+
}
127+
128+
// mapToArray converts map[string]string to []Label
129+
func mapToArray(value any) any {
130+
valueMap, ok := value.(map[string]interface{})
131+
if !ok {
132+
return value
133+
}
134+
135+
labelArray := make([]map[string]interface{}, 0, len(valueMap))
136+
for k, v := range valueMap {
137+
if strValue, ok := v.(string); ok {
138+
labelArray = append(labelArray, map[string]interface{}{
139+
"key": k,
140+
"value": strValue,
141+
})
142+
}
143+
}
144+
return labelArray
145+
}
146+
147+
// arrayToMap converts []Label to map[string]string
148+
func arrayToMap(value any) any {
149+
valueArray, ok := value.([]interface{})
150+
if !ok {
151+
return value
152+
}
153+
154+
labelMap := make(map[string]string)
155+
for _, item := range valueArray {
156+
itemMap, ok := item.(map[string]interface{})
157+
if !ok {
158+
continue
159+
}
160+
161+
key, keyOk := itemMap["key"].(string)
162+
val, valOk := itemMap["value"].(string)
163+
if keyOk && valOk {
164+
labelMap[key] = val
165+
}
166+
}
167+
return labelMap
168+
}

0 commit comments

Comments
 (0)