diff --git a/services/actions/schedule_tasks.go b/services/actions/schedule_tasks.go index b2dc3f98407..3a0dff490a4 100644 --- a/services/actions/schedule_tasks.go +++ b/services/actions/schedule_tasks.go @@ -132,14 +132,22 @@ func CreateScheduleTask(ctx context.Context, spec *actions_model.ActionScheduleS } func withScheduleInEventPayload(eventPayload, schedule string) string { - if schedule == "" || eventPayload == "" { + if schedule == "" { return eventPayload } - event := map[string]any{} - if err := json.Unmarshal([]byte(eventPayload), &event); err != nil { - log.Error("withScheduleInEventPayload: unmarshal: %v", err) - return eventPayload + // eventPayload originates from json.Marshal(input.Payload) in handleSchedules, + // so a nil payload is stored as the literal "null" and pre-existing rows may be + // empty. Both cases start from a fresh map so the schedule field can still be set. + var event map[string]any + if eventPayload != "" { + if err := json.Unmarshal([]byte(eventPayload), &event); err != nil { + log.Error("withScheduleInEventPayload: unmarshal: %v", err) + return eventPayload + } + } + if event == nil { + event = map[string]any{} } event["schedule"] = schedule diff --git a/services/actions/schedule_tasks_test.go b/services/actions/schedule_tasks_test.go index 770b8426232..f2c7e656e65 100644 --- a/services/actions/schedule_tasks_test.go +++ b/services/actions/schedule_tasks_test.go @@ -22,9 +22,20 @@ func TestWithScheduleInEventPayload(t *testing.T) { assert.Equal(t, "refs/heads/main", event["ref"]) }) - t.Run("keeps empty payload", func(t *testing.T) { + t.Run("adds schedule to null payload", func(t *testing.T) { + updated := withScheduleInEventPayload("null", "37 12 5 1 2") + + event := map[string]any{} + assert.NoError(t, json.Unmarshal([]byte(updated), &event)) + assert.Equal(t, "37 12 5 1 2", event["schedule"]) + }) + + t.Run("adds schedule to empty payload", func(t *testing.T) { updated := withScheduleInEventPayload("", "37 12 5 1 2") - assert.Empty(t, updated) + + event := map[string]any{} + assert.NoError(t, json.Unmarshal([]byte(updated), &event)) + assert.Equal(t, "37 12 5 1 2", event["schedule"]) }) t.Run("keeps payload when schedule empty", func(t *testing.T) {