package models import "time" type Item struct { ID int `json:"id"` ScopeID int `json:"scopeId"` OwnerID string `json:"ownerId"` ProjectID *int `json:"projectId,omitempty"` ProjectRequirementID *int `json:"projectRequirementId,omitempty"` Name string `json:"name"` Description string `json:"description"` CreatedTime time.Time `json:"createdTime"` AcquiredTime *time.Time `json:"acquiredTime"` ScheduledDate *Date `json:"scheduledDate"` Stats []StatProgressEntry `json:"stats,omitempty"` } func (item *Item) ApplyUpdate(update ItemUpdate) { if update.ProjectRequirementID != nil { item.ProjectRequirementID = update.ProjectRequirementID } if update.OwnerID != nil { item.OwnerID = *update.OwnerID } if update.Name != nil { item.Name = *update.Name } if update.Description != nil { item.Description = *update.Description } if update.AcquiredTime != nil { item.AcquiredTime = update.AcquiredTime } if update.ScheduledDate != nil { item.ScheduledDate = update.ScheduledDate } if update.ClearScheduledDate { item.ScheduledDate = nil } if update.ClearProjectRequirementID { item.ProjectRequirementID = nil } if update.ClearAcquiredTime { item.AcquiredTime = nil } deleteList := make([]int, 0, len(update.Stats)) for i, stat := range update.Stats { if stat.Acquired == 0 && stat.Required == 0 { deleteList = append(deleteList, i-len(deleteList)) } found := false for j := range item.Stats { if item.Stats[j].ID == stat.ID { item.Stats[j].Required = stat.Required item.Stats[j].Acquired = stat.Acquired found = true break } } if !found { item.Stats = append(item.Stats, stat) } } } type ItemUpdate struct { ProjectRequirementID *int `json:"projectRequirementId"` OwnerID *string `json:"ownerId"` Name *string `json:"name"` Description *string `json:"description"` AcquiredTime *time.Time `json:"acquiredTime"` ScheduledDate *Date `json:"scheduledDate"` Stats []StatProgressEntry `json:"stats"` ClearProjectRequirementID bool `json:"clearProjectRequirementId"` ClearAcquiredTime bool `json:"clearAcquiredTime"` ClearScheduledDate bool `json:"clearScheduledDate"` }