Skip to content

Commit 388a74d

Browse files
authored
Merge pull request #587 from labd/584-modifying-a-subscription-fails
fix: added ordering of subscription messages and changes during update
2 parents d32df79 + 2b3be53 commit 388a74d

File tree

3 files changed

+104
-10
lines changed

3 files changed

+104
-10
lines changed
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
kind: Fixed
2+
body: Added ordering of subscription messages and changes during update
3+
time: 2025-05-09T14:13:07.20165246+02:00

internal/resources/subscription/model.go

Lines changed: 32 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,32 @@ func (s *Subscription) draft() platform.SubscriptionDraft {
102102
return draft
103103
}
104104

105+
// orderChangesAndMessagesActions orders the changes and messages actions. This ensures that if both are present but one
106+
// has an empty list of changes the action with an empty list will be processed last. This is important because
107+
// otherwise Commercetools will throw an error that a subscription with an empty list of changes and messages
108+
func orderChangesAndMessagesActions(
109+
changesAction *platform.SubscriptionSetChangesAction,
110+
messagesAction *platform.SubscriptionSetMessagesAction,
111+
) []platform.SubscriptionUpdateAction {
112+
if changesAction == nil && messagesAction == nil {
113+
return nil
114+
}
115+
116+
if changesAction == nil {
117+
return []platform.SubscriptionUpdateAction{*messagesAction}
118+
}
119+
120+
if messagesAction == nil {
121+
return []platform.SubscriptionUpdateAction{*changesAction}
122+
}
123+
124+
if len(changesAction.Changes) >= len(messagesAction.Messages) {
125+
return []platform.SubscriptionUpdateAction{*changesAction, *messagesAction}
126+
}
127+
128+
return []platform.SubscriptionUpdateAction{*messagesAction, *changesAction}
129+
}
130+
105131
func (s *Subscription) updateActions(plan Subscription) platform.SubscriptionUpdate {
106132
result := platform.SubscriptionUpdate{
107133
Version: int(s.Version.ValueInt64()),
@@ -129,31 +155,27 @@ func (s *Subscription) updateActions(plan Subscription) platform.SubscriptionUpd
129155
}
130156

131157
// setChanges
158+
var changesAction *platform.SubscriptionSetChangesAction
132159
if !reflect.DeepEqual(s.Changes, plan.Changes) {
133160
var changes = make([]platform.ChangeSubscription, 0, len(plan.Changes))
134161
for _, c := range plan.Changes {
135162
changes = append(changes, c.toNative()...)
136163
}
137-
138-
result.Actions = append(
139-
result.Actions,
140-
platform.SubscriptionSetChangesAction{
141-
Changes: changes,
142-
})
164+
changesAction = &platform.SubscriptionSetChangesAction{Changes: changes}
143165
}
144166

145167
// setMessages
168+
var messagesAction *platform.SubscriptionSetMessagesAction
146169
if !reflect.DeepEqual(s.Messages, plan.Messages) {
147170
var messages = make([]platform.MessageSubscription, 0, len(plan.Messages))
148171
for _, m := range plan.Messages {
149172
messages = append(messages, m.toNative())
150173
}
151-
152-
result.Actions = append(
153-
result.Actions,
154-
platform.SubscriptionSetMessagesAction{Messages: messages})
174+
messagesAction = &platform.SubscriptionSetMessagesAction{Messages: messages}
155175
}
156176

177+
result.Actions = append(result.Actions, orderChangesAndMessagesActions(changesAction, messagesAction)...)
178+
157179
return result
158180
}
159181

internal/resources/subscription/model_test.go

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -306,3 +306,72 @@ func TestUpdateActions(t *testing.T) {
306306
})
307307
}
308308
}
309+
310+
func TestOrderChangesAndMessagesActionsEmpty(t *testing.T) {
311+
assert.Nil(t, orderChangesAndMessagesActions(nil, nil))
312+
}
313+
314+
func TestOrderChangesAndMessagesActionsWithChanges(t *testing.T) {
315+
actions := orderChangesAndMessagesActions(&platform.SubscriptionSetChangesAction{
316+
Changes: []platform.ChangeSubscription{
317+
{ResourceTypeId: "test"},
318+
},
319+
}, nil)
320+
assert.Len(t, actions, 1)
321+
}
322+
323+
func TestOrderChangesAndMessagesActionsWithMessages(t *testing.T) {
324+
actions := orderChangesAndMessagesActions(nil, &platform.SubscriptionSetMessagesAction{
325+
Messages: []platform.MessageSubscription{
326+
{ResourceTypeId: "test"},
327+
},
328+
})
329+
assert.Len(t, actions, 1)
330+
}
331+
332+
func TestOrderChangesAndMessagesActionsWithEmptyChanges(t *testing.T) {
333+
actions := orderChangesAndMessagesActions(
334+
&platform.SubscriptionSetChangesAction{
335+
Changes: []platform.ChangeSubscription{},
336+
},
337+
&platform.SubscriptionSetMessagesAction{
338+
Messages: []platform.MessageSubscription{
339+
{ResourceTypeId: "test"},
340+
},
341+
})
342+
assert.Len(t, actions, 2)
343+
assert.IsType(t, platform.SubscriptionSetMessagesAction{}, actions[0])
344+
assert.IsType(t, platform.SubscriptionSetChangesAction{}, actions[1])
345+
}
346+
347+
func TestOrderChangesAndMessagesActionsWithEmptyMessages(t *testing.T) {
348+
actions := orderChangesAndMessagesActions(
349+
&platform.SubscriptionSetChangesAction{
350+
Changes: []platform.ChangeSubscription{
351+
{ResourceTypeId: "test"},
352+
},
353+
},
354+
&platform.SubscriptionSetMessagesAction{
355+
Messages: []platform.MessageSubscription{},
356+
})
357+
assert.Len(t, actions, 2)
358+
assert.IsType(t, platform.SubscriptionSetChangesAction{}, actions[0])
359+
assert.IsType(t, platform.SubscriptionSetMessagesAction{}, actions[1])
360+
}
361+
362+
func TestOrderChangesAndMessagesActionsWithBoth(t *testing.T) {
363+
actions := orderChangesAndMessagesActions(
364+
&platform.SubscriptionSetChangesAction{
365+
Changes: []platform.ChangeSubscription{
366+
{ResourceTypeId: "test"},
367+
},
368+
},
369+
&platform.SubscriptionSetMessagesAction{
370+
Messages: []platform.MessageSubscription{
371+
{ResourceTypeId: "test"},
372+
},
373+
})
374+
assert.Len(t, actions, 2)
375+
assert.IsType(t, platform.SubscriptionSetChangesAction{}, actions[0])
376+
assert.IsType(t, platform.SubscriptionSetMessagesAction{}, actions[1])
377+
}

0 commit comments

Comments
 (0)