package models import ( "context" "time" ) type Task struct { ID string `json:"id" db:"task_id"` UserID string `json:"-" db:"user_id"` ItemID string `json:"itemId" db:"item_id"` ProjectID string `json:"projectId" db:"project_id"` ItemAmount int `json:"itemAmount" db:"item_amount"` Name string `json:"name" db:"name"` Description string `json:"description" db:"description"` Icon string `json:"icon" db:"icon"` Active bool `json:"active" db:"active"` CreatedTime time.Time `json:"createdTime" db:"created_time"` EndTime *time.Time `json:"endTime" db:"end_time"` StatusTag *string `json:"statusTag" db:"status_tag"` } func (task *Task) Update(update TaskUpdate) { if update.ItemID != nil { task.ItemID = *update.ItemID } if update.ItemAmount != nil { task.ItemAmount = *update.ItemAmount } if update.Name != nil { task.Name = *update.Name } if update.Description != nil { task.Description = *update.Description } if update.Active != nil { task.Active = *update.Active } if update.EndTime != nil { endTimeCopy := update.EndTime.UTC() task.EndTime = &endTimeCopy } if update.ClearEndTime { task.EndTime = nil } if update.StatusTag != nil { task.StatusTag = update.StatusTag } if update.ClearStatusTag { task.StatusTag = nil } if update.ProjectID != nil { task.ProjectID = *update.ProjectID } } type TaskUpdate struct { ItemID *string `json:"itemId"` ItemAmount *int `json:"itemAmount"` Name *string `json:"name"` Description *string `json:"description"` Active *bool `json:"active"` EndTime *time.Time `json:"endTime"` ClearEndTime bool `json:"clearEndTime"` StatusTag *string `json:"statusTag"` ClearStatusTag bool `json:"clearStatusTag"` ProjectID *string `json:"projectId"` } type TaskLink struct { TaskID string `json:"taskId" db:"task_id"` ProjectID string `json:"projectId" db:"project_id"` } type TaskWithProject struct { Task Project *Project `json:"project,omitempty"` } type TaskResult struct { Task Item *Item `json:"item"` Logs []*Log `json:"logs"` CompletedAmount int `json:"completedAmount"` Project *Project `json:"project,omitempty"` } type TaskFilter struct { UserID string Active *bool Expiring *bool IDs []string ItemIDs []string ProjectIDs []string } type TaskRepository interface { Find(ctx context.Context, id string) (*Task, error) List(ctx context.Context, filter TaskFilter) ([]*Task, error) ListWithLinks(ctx context.Context, filter TaskFilter) ([]*Task, []*TaskLink, error) Insert(ctx context.Context, task Task) error Update(ctx context.Context, task Task) error CreateLink(ctx context.Context, link TaskLink) error DeleteLink(ctx context.Context, link TaskLink) error UnlinkTask(ctx context.Context, task Task) error UnlinkProject(ctx context.Context, project Project) error Delete(ctx context.Context, task Task) error }