You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							134 lines
						
					
					
						
							3.7 KiB
						
					
					
				
			
		
		
		
			
			
			
				
					
				
				
					
				
			
		
		
	
	
							134 lines
						
					
					
						
							3.7 KiB
						
					
					
				| package models | |
| 
 | |
| import ( | |
| 	"context" | |
| 	"strings" | |
| 	"time" | |
| ) | |
| 
 | |
| type Goal struct { | |
| 	ID              string    `json:"id" db:"goal_id"` | |
| 	UserID          string    `json:"-" db:"user_id"` | |
| 	GroupID         string    `json:"groupId" db:"group_id"` | |
| 	ItemID          *string   `json:"itemId" db:"item_id"` | |
| 	StartTime       time.Time `json:"startTime" db:"start_time"` | |
| 	EndTime         time.Time `json:"endTime" db:"end_time"` | |
| 	Amount          int       `json:"amount" db:"amount"` | |
| 	Unweighted      bool      `json:"unweighted" db:"unweighted"` | |
| 	Name            string    `json:"name" db:"name"` | |
| 	Description     string    `json:"description" db:"description"` | |
| 	CompositionMode string    `json:"compositionMode" db:"composition_mode"` | |
| 	TaskFilter      *string   `json:"taskFilter" db:"task_filter"` | |
| 	ItemFilter      *string   `json:"itemFilter" db:"item_filter"` | |
| } | |
| 
 | |
| func (goal *Goal) Accepts(item *Item, task *Task) bool { | |
| 	if item.GroupID != goal.GroupID { | |
| 		return false | |
| 	} | |
| 	if goal.ItemID != nil && item.ID != *goal.ItemID { | |
| 		return false | |
| 	} | |
| 	if goal.TaskFilter != nil && !strings.Contains(strings.ToLower(task.Name), *goal.TaskFilter) { | |
| 		return false | |
| 	} | |
| 	if goal.ItemFilter != nil && !strings.Contains(strings.ToLower(item.Name), *goal.ItemFilter) { | |
| 		return false | |
| 	} | |
| 
 | |
| 	return true | |
| } | |
| 
 | |
| func (goal *Goal) Update(update GoalUpdate) { | |
| 	if update.Amount != nil { | |
| 		goal.Amount = *update.Amount | |
| 	} | |
| 	if update.StartTime != nil { | |
| 		goal.StartTime = *update.StartTime | |
| 	} | |
| 	if update.EndTime != nil { | |
| 		goal.EndTime = *update.EndTime | |
| 	} | |
| 	if update.Name != nil { | |
| 		goal.Name = *update.Name | |
| 	} | |
| 	if update.Description != nil { | |
| 		goal.Description = *update.Description | |
| 	} | |
| 	if update.Unweighted != nil { | |
| 		goal.Unweighted = *update.Unweighted | |
| 	} | |
| 	if update.CompositionMode != nil { | |
| 		goal.CompositionMode = *update.CompositionMode | |
| 	} | |
| 	if update.ItemID != nil { | |
| 		goal.ItemID = update.ItemID | |
| 	} | |
| 	if update.ClearItemID { | |
| 		goal.ItemID = nil | |
| 	} | |
| 	if update.TaskFilter != nil { | |
| 		goal.TaskFilter = update.TaskFilter | |
| 	} | |
| 	if update.ClearTaskFilter { | |
| 		goal.TaskFilter = nil | |
| 	} | |
| 	if update.ItemFilter != nil { | |
| 		goal.ItemFilter = update.ItemFilter | |
| 	} | |
| 	if update.ClearItemFilter { | |
| 		goal.ItemFilter = nil | |
| 	} | |
| } | |
| 
 | |
| type GoalUpdate struct { | |
| 	StartTime       *time.Time `json:"startTime"` | |
| 	EndTime         *time.Time `json:"endTime"` | |
| 	Amount          *int       `json:"amount"` | |
| 	Name            *string    `json:"name"` | |
| 	Description     *string    `json:"description"` | |
| 	ItemID          *string    `json:"itemId"` | |
| 	ClearItemID     bool       `json:"clearItemID"` | |
| 	Unweighted      *bool      `json:"unweighted"` | |
| 	CompositionMode *string    `json:"compositionMode"` | |
| 	TaskFilter      *string    `json:"taskFilter"` | |
| 	ClearTaskFilter bool       `json:"clearTaskFilter"` | |
| 	ItemFilter      *string    `json:"itemFilter"` | |
| 	ClearItemFilter bool       `json:"clearItemFilter"` | |
| } | |
| 
 | |
| type GoalResult struct { | |
| 	Goal | |
| 	Group           *Group            `json:"group"` | |
| 	Items           []*GoalResultItem `json:"items"` | |
| 	Logs            []*GoalResultLog  `json:"logs"` | |
| 	CompletedAmount int               `json:"completedAmount"` | |
| } | |
| 
 | |
| type GoalResultLog struct { | |
| 	LogResult | |
| 	ItemCounted          bool `json:"itemCounted"` | |
| 	SecondaryItemCounted bool `json:"secondaryItemCounted"` | |
| } | |
| 
 | |
| type GoalResultItem struct { | |
| 	Item | |
| 	CompletedAmount int `json:"completedAmount"` | |
| } | |
| 
 | |
| type GoalFilter struct { | |
| 	UserID       string | |
| 	GroupIDs     []string | |
| 	IncludesTime *time.Time | |
| 	MinTime      *time.Time | |
| 	MaxTime      *time.Time | |
| 	IDs          []string | |
| } | |
| 
 | |
| type GoalRepository interface { | |
| 	Find(ctx context.Context, id string) (*Goal, error) | |
| 	List(ctx context.Context, filter GoalFilter) ([]*Goal, error) | |
| 	Insert(ctx context.Context, goal Goal) error | |
| 	Update(ctx context.Context, goal Goal) error | |
| 	Delete(ctx context.Context, goal Goal) error | |
| }
 |