From 6e91e6412624772fc0e190ee0cd57cd10fc81333 Mon Sep 17 00:00:00 2001 From: Jeff Ortel Date: Sat, 8 Jun 2024 00:50:09 -0500 Subject: [PATCH] :ghost: Task.Data revert back to any. (#646) Signed-off-by: Jeff Ortel --- addon/task.go | 2 +- api/task.go | 22 +++++++++++----------- api/taskgroup.go | 6 +++--- migration/v13/model/core.go | 24 +++++++++++++++++++----- model/pkg.go | 1 + model/serializer.go | 13 +++++++++++++ 6 files changed, 48 insertions(+), 20 deletions(-) diff --git a/addon/task.go b/addon/task.go index ddb9142a3..87bcc9c9d 100644 --- a/addon/task.go +++ b/addon/task.go @@ -82,7 +82,7 @@ func (h *Task) Addon(inject bool) (r *api.Addon, err error) { } // Data returns the addon data. -func (h *Task) Data() (d api.Map) { +func (h *Task) Data() (d any) { d = h.task.Data return } diff --git a/api/task.go b/api/task.go index dbd3d8113..180034240 100644 --- a/api/task.go +++ b/api/task.go @@ -586,7 +586,7 @@ type Task struct { Priority int `json:"priority,omitempty" yaml:",omitempty"` Policy TaskPolicy `json:"policy,omitempty" yaml:",omitempty"` TTL TTL `json:"ttl,omitempty" yaml:",omitempty"` - Data Map `json:"data,omitempty" yaml:",omitempty"` + Data any `json:"data,omitempty" yaml:",omitempty"` Application *Ref `json:"application,omitempty" yaml:",omitempty"` Actions []string `json:"actions,omitempty" yaml:",omitempty"` Bucket *Ref `json:"bucket,omitempty" yaml:",omitempty"` @@ -612,16 +612,16 @@ func (r *Task) With(m *model.Task) { r.Priority = m.Priority r.Policy = TaskPolicy(m.Policy) r.TTL = TTL(m.TTL) - r.Data = m.Data + r.Data = m.Data.Any r.Application = r.refPtr(m.ApplicationID, m.Application) r.Bucket = r.refPtr(m.BucketID, m.Bucket) r.Pod = m.Pod r.Retries = m.Retries r.Started = m.Started r.Terminated = m.Terminated - r.Events = nil - r.Errors = nil - r.Attached = nil + r.Events = make([]TaskEvent, 0) + r.Errors = make([]TaskError, 0) + r.Attached = make([]Attachment, 0) for _, event := range m.Events { r.Events = append(r.Events, TaskEvent(event)) } @@ -662,10 +662,10 @@ func (r *Task) Model() (m *model.Task) { Priority: r.Priority, Policy: model.TaskPolicy(r.Policy), TTL: model.TTL(r.TTL), - Data: r.Data, ApplicationID: r.idPtr(r.Application), } m.ID = r.ID + m.Data.Any = r.Data return } @@ -717,7 +717,7 @@ type TaskReport struct { Completed int `json:"completed,omitempty" yaml:",omitempty"` Activity []string `json:"activity,omitempty" yaml:",omitempty"` Attached []Attachment `json:"attached,omitempty" yaml:",omitempty"` - Result Map `json:"result,omitempty" yaml:",omitempty"` + Result any `json:"result,omitempty" yaml:",omitempty"` TaskID uint `json:"task"` } @@ -729,9 +729,9 @@ func (r *TaskReport) With(m *model.TaskReport) { r.Completed = m.Completed r.TaskID = m.TaskID r.Activity = m.Activity - r.Result = m.Result - r.Errors = nil - r.Attached = nil + r.Result = m.Result.Any + r.Errors = make([]TaskError, 0) + r.Attached = make([]Attachment, 0) for _, err := range m.Errors { r.Errors = append(r.Errors, TaskError(err)) } @@ -750,10 +750,10 @@ func (r *TaskReport) Model() (m *model.TaskReport) { Total: r.Total, Completed: r.Completed, Activity: r.Activity, - Result: r.Result, TaskID: r.TaskID, } m.ID = r.ID + m.Result.Any = r.Result for _, err := range r.Errors { m.Errors = append(m.Errors, model.TaskError(err)) } diff --git a/api/taskgroup.go b/api/taskgroup.go index a8c8b9750..f5bb2b8c7 100644 --- a/api/taskgroup.go +++ b/api/taskgroup.go @@ -477,7 +477,7 @@ type TaskGroup struct { State string `json:"state"` Priority int `json:"priority,omitempty" yaml:",omitempty"` Policy TaskPolicy `json:"policy,omitempty" yaml:",omitempty"` - Data Map `json:"data" swaggertype:"object" binding:"required"` + Data any `json:"data" swaggertype:"object" binding:"required"` Bucket *Ref `json:"bucket,omitempty"` Tasks []Task `json:"tasks"` } @@ -492,7 +492,7 @@ func (r *TaskGroup) With(m *model.TaskGroup) { r.State = m.State r.Priority = m.Priority r.Policy = TaskPolicy(m.Policy) - r.Data = m.Data + r.Data = m.Data.Any r.Bucket = r.refPtr(m.BucketID, m.Bucket) r.Tasks = []Task{} switch m.State { @@ -525,9 +525,9 @@ func (r *TaskGroup) Model() (m *model.TaskGroup) { State: r.State, Priority: r.Priority, Policy: model.TaskPolicy(r.Policy), - Data: r.Data, } m.ID = r.ID + m.Data.Any = r.Data for _, task := range r.Tasks { m.List = append(m.List, *task.Model()) } diff --git a/migration/v13/model/core.go b/migration/v13/model/core.go index 4d5165f46..828545aae 100644 --- a/migration/v13/model/core.go +++ b/migration/v13/model/core.go @@ -126,7 +126,7 @@ type Task struct { Priority int Policy TaskPolicy `gorm:"type:json;serializer:json"` TTL TTL `gorm:"type:json;serializer:json"` - Data Map `gorm:"type:json;serializer:json"` + Data Data `gorm:"type:json;serializer:json"` Started *time.Time Terminated *time.Time Errors []TaskError `gorm:"type:json;serializer:json"` @@ -157,6 +157,14 @@ type TaskEvent struct { // Map alias. type Map = map[string]any +// Any alias. +type Any any + +// Data json any field. +type Data struct { + Any +} + // TTL time-to-live. type TTL struct { Created int `json:"created,omitempty" yaml:",omitempty"` @@ -200,7 +208,7 @@ type TaskReport struct { Activity []string `gorm:"type:json;serializer:json"` Errors []TaskError `gorm:"type:json;serializer:json"` Attached []Attachment `gorm:"type:json;serializer:json" ref:"[]file"` - Result Map `gorm:"type:json;serializer:json"` + Result Data `gorm:"type:json;serializer:json"` TaskID uint `gorm:"<-:create;uniqueIndex"` Task *Task } @@ -215,7 +223,7 @@ type TaskGroup struct { State string Priority int Policy TaskPolicy `gorm:"type:json;serializer:json"` - Data Map `gorm:"type:json;serializer:json"` + Data Data `gorm:"type:json;serializer:json"` List []Task `gorm:"type:json;serializer:json"` Tasks []Task `gorm:"constraint:OnDelete:CASCADE"` } @@ -231,8 +239,14 @@ func (m *TaskGroup) Propagate() (err error) { task.Policy = m.Policy task.State = m.State task.SetBucket(m.BucketID) - if m.Data != nil { - task.Data = m.merge(m.Data, task.Data) + if m.Data.Any != nil { + mA, castA := m.Data.Any.(map[string]any) + mB, castB := task.Data.Any.(map[string]any) + if castA && castB { + task.Data.Any = m.merge(mA, mB) + } else { + task.Data.Any = m.Data + } } } diff --git a/model/pkg.go b/model/pkg.go index 659925692..073a8bbc5 100644 --- a/model/pkg.go +++ b/model/pkg.go @@ -49,6 +49,7 @@ type Tracker = model.Tracker type TTL = model.TTL type Ref = model.Ref type Map = model.Map +type Data = model.Data type TaskError = model.TaskError type TaskEvent = model.TaskEvent diff --git a/model/serializer.go b/model/serializer.go index 1edc38995..95c019f16 100644 --- a/model/serializer.go +++ b/model/serializer.go @@ -32,7 +32,15 @@ func (r jsonSerializer) Scan(ctx context.Context, field *schema.Field, dst refle } if len(b) > 0 { ptr := fieldValue.Interface() + switch d := ptr.(type) { + case *Data: + ptr = &d.Any + default: + } err = json.Unmarshal(b, ptr) + if err != nil { + return + } } } v := fieldValue.Elem() @@ -43,6 +51,11 @@ func (r jsonSerializer) Scan(ctx context.Context, field *schema.Field, dst refle // Value implements serializer. func (r jsonSerializer) Value(_ context.Context, _ *schema.Field, _ reflect.Value, fieldValue any) (v any, err error) { mp := r.jMap(fieldValue) + switch d := mp.(type) { + case Data: + mp = d.Any + default: + } v, err = json.Marshal(mp) return }