@@ -22,6 +22,7 @@ import (
2222 _ "embed"
2323 "encoding/json"
2424 "fmt"
25+ "strings"
2526 "time"
2627
2728 "github.com/pkg/errors"
@@ -95,14 +96,52 @@ func (svc *ResourceGroupsService) List() (response ResourceGroupsResponse, err e
9596 return rawResponse , err
9697 }
9798
99+ err = sanitizeFieldsInRawResponseList (& rawResponse , & response )
100+ if err != nil {
101+ return rawResponse , err
102+ }
103+
98104 return rawResponse , nil
99105}
100106
107+ func sanitizeFieldsInRawResponse (rawResponse * ResourceGroupResponse , response interface {}) error {
108+ // update filters keys to match the query template
109+ updateFiltersKeys (& rawResponse .Data )
110+
111+ j , err := json .Marshal (rawResponse )
112+ if err != nil {
113+ return err
114+ }
115+
116+ return json .Unmarshal (j , & response )
117+ }
118+
119+ func sanitizeFieldsInRawResponseList (rawResponse * ResourceGroupsResponse , response interface {}) error {
120+ for i := range rawResponse .Data {
121+ // update filters keys to match the query template
122+ updateFiltersKeys (& rawResponse .Data [i ])
123+ }
124+
125+ j , err := json .Marshal (rawResponse )
126+ if err != nil {
127+ return err
128+ }
129+
130+ return json .Unmarshal (j , & response )
131+ }
132+
101133func (svc * ResourceGroupsService ) Create (group ResourceGroupData ) (
102134 response ResourceGroupResponse ,
103135 err error ,
104136) {
105- err = svc .create (group , & response )
137+ var rawResponse ResourceGroupResponse
138+ err = svc .create (group , & rawResponse )
139+ if err != nil {
140+ return
141+ }
142+
143+ err = sanitizeFieldsInRawResponse (& rawResponse , & response )
144+
106145 return
107146}
108147
@@ -117,14 +156,58 @@ func (svc *ResourceGroupsService) Update(data *ResourceGroupData) (
117156 guid := data .ID ()
118157 data .ResetResourceGUID ()
119158
120- err = svc .update (guid , data , & response )
159+ var rawResponse ResourceGroupResponse
160+ err = svc .update (guid , data , & rawResponse )
161+
121162 if err != nil {
122163 return
123164 }
124165
166+ err = sanitizeFieldsInRawResponse (& rawResponse , & response )
167+
125168 return
126169}
127170
171+ func collectFilterNames (children []* RGChild , filterNames map [string ]string ) {
172+ for _ , child := range children {
173+ if child .FilterName != "" {
174+ normalizedKey := strings .ReplaceAll (strings .ToLower (child .FilterName ), "_" , "" )
175+ filterNames [normalizedKey ] = child .FilterName
176+ }
177+ if len (child .Children ) > 0 {
178+ collectFilterNames (child .Children , filterNames )
179+ }
180+ }
181+ }
182+
183+ /*
184+ updateFiltersKeys updates the keys in the Filters map of ResourceGroupData to ensure they match the filter names
185+ defined in the nested children of the query expression. This is necessary because JSON decoding/encoding can
186+ convert keys to camel case, causing mismatches. The function normalizes the keys by removing underscores and
187+ converting them to lower case, then compares them with the filter names. If a mismatch is found, the key is
188+ updated to the value in RGExpression.Children
189+ */
190+ func updateFiltersKeys (data * ResourceGroupData ) {
191+ if data .Query == nil || data .Query .Expression == nil {
192+ return
193+ }
194+
195+ filterNames := make (map [string ]string )
196+ collectFilterNames (data .Query .Expression .Children , filterNames )
197+
198+ updatedFilters := make (map [string ]* RGFilter )
199+ for key , value := range data .Query .Filters {
200+ normalizedKey := strings .ReplaceAll (strings .ToLower (key ), "_" , "" )
201+ if _ , exists := filterNames [normalizedKey ]; exists {
202+ updatedFilters [filterNames [normalizedKey ]] = value
203+ } else {
204+ updatedFilters [key ] = value
205+ }
206+ }
207+
208+ data .Query .Filters = updatedFilters
209+ }
210+
128211func (group * ResourceGroupData ) ResetResourceGUID () {
129212 group .ResourceGroupGuid = ""
130213 group .UpdatedBy = ""
@@ -149,20 +232,17 @@ func (svc *ResourceGroupsService) Delete(guid string) error {
149232
150233func (svc * ResourceGroupsService ) Get (guid string , response interface {}) error {
151234 var rawResponse ResourceGroupResponse
235+
152236 err := svc .get (guid , & rawResponse )
153237 if err != nil {
154238 return err
155239 }
156240
157- j , err := json . Marshal ( rawResponse )
241+ err = sanitizeFieldsInRawResponse ( & rawResponse , response )
158242 if err != nil {
159243 return err
160244 }
161245
162- err = json .Unmarshal (j , & response )
163- if err != nil {
164- return err
165- }
166246 return nil
167247}
168248
0 commit comments